From 91b1909427bb0cab0f72505c325b07f8fb39c62e Mon Sep 17 00:00:00 2001 From: Raven Szewczyk Date: Sat, 25 May 2024 14:13:58 +0100 Subject: Move GoodGen sources --- .../blocks/tileEntity/ComponentAssemblyLine.java | 403 +++++++++++ .../blocks/tileEntity/CoolantTower.java | 225 +++++++ .../blocks/tileEntity/EssentiaHatch.java | 244 +++++++ .../blocks/tileEntity/EssentiaOutputHatch.java | 179 +++++ .../blocks/tileEntity/EssentiaOutputHatch_ME.java | 150 +++++ .../blocks/tileEntity/ExtremeHeatExchanger.java | 416 ++++++++++++ .../blocks/tileEntity/FuelRefineFactory.java | 376 +++++++++++ .../GTMetaTileEntity/DieselGenerator.java | 214 ++++++ .../GTMetaTileEntity/NeutronAccelerator.java | 48 ++ .../tileEntity/GTMetaTileEntity/NeutronSensor.java | 277 ++++++++ .../tileEntity/GTMetaTileEntity/YOTTAHatch.java | 470 +++++++++++++ .../blocks/tileEntity/LargeEssentiaGenerator.java | 511 ++++++++++++++ .../blocks/tileEntity/LargeEssentiaSmeltery.java | 558 ++++++++++++++++ .../blocks/tileEntity/LargeFusionComputer1.java | 170 +++++ .../blocks/tileEntity/LargeFusionComputer2.java | 171 +++++ .../blocks/tileEntity/LargeFusionComputer3.java | 172 +++++ .../blocks/tileEntity/LargeFusionComputer4.java | 227 +++++++ .../blocks/tileEntity/LargeFusionComputer5.java | 231 +++++++ .../blocks/tileEntity/MultiNqGenerator.java | 471 +++++++++++++ .../blocks/tileEntity/NeutronActivator.java | 515 +++++++++++++++ .../blocks/tileEntity/PreciseAssembler.java | 491 ++++++++++++++ .../tileEntity/SupercriticalFluidTurbine.java | 184 ++++++ .../tileEntity/UniversalChemicalFuelEngine.java | 393 +++++++++++ .../blocks/tileEntity/YottaFluidTank.java | 709 ++++++++++++++++++++ .../base/GT_MetaTileEntity_LargeTurbineBase.java | 345 ++++++++++ ...GT_MetaTileEntity_TooltipMultiBlockBase_EM.java | 62 ++ .../tileEntity/base/LargeFusionComputer.java | 733 +++++++++++++++++++++ .../tileEntity/base/LargeFusionComputerPP.java | 53 ++ 28 files changed, 8998 insertions(+) create mode 100644 src/main/java/goodgenerator/blocks/tileEntity/ComponentAssemblyLine.java create mode 100644 src/main/java/goodgenerator/blocks/tileEntity/CoolantTower.java create mode 100644 src/main/java/goodgenerator/blocks/tileEntity/EssentiaHatch.java create mode 100644 src/main/java/goodgenerator/blocks/tileEntity/EssentiaOutputHatch.java create mode 100644 src/main/java/goodgenerator/blocks/tileEntity/EssentiaOutputHatch_ME.java create mode 100644 src/main/java/goodgenerator/blocks/tileEntity/ExtremeHeatExchanger.java create mode 100644 src/main/java/goodgenerator/blocks/tileEntity/FuelRefineFactory.java create mode 100644 src/main/java/goodgenerator/blocks/tileEntity/GTMetaTileEntity/DieselGenerator.java create mode 100644 src/main/java/goodgenerator/blocks/tileEntity/GTMetaTileEntity/NeutronAccelerator.java create mode 100644 src/main/java/goodgenerator/blocks/tileEntity/GTMetaTileEntity/NeutronSensor.java create mode 100644 src/main/java/goodgenerator/blocks/tileEntity/GTMetaTileEntity/YOTTAHatch.java create mode 100644 src/main/java/goodgenerator/blocks/tileEntity/LargeEssentiaGenerator.java create mode 100644 src/main/java/goodgenerator/blocks/tileEntity/LargeEssentiaSmeltery.java create mode 100644 src/main/java/goodgenerator/blocks/tileEntity/LargeFusionComputer1.java create mode 100644 src/main/java/goodgenerator/blocks/tileEntity/LargeFusionComputer2.java create mode 100644 src/main/java/goodgenerator/blocks/tileEntity/LargeFusionComputer3.java create mode 100644 src/main/java/goodgenerator/blocks/tileEntity/LargeFusionComputer4.java create mode 100644 src/main/java/goodgenerator/blocks/tileEntity/LargeFusionComputer5.java create mode 100644 src/main/java/goodgenerator/blocks/tileEntity/MultiNqGenerator.java create mode 100644 src/main/java/goodgenerator/blocks/tileEntity/NeutronActivator.java create mode 100644 src/main/java/goodgenerator/blocks/tileEntity/PreciseAssembler.java create mode 100644 src/main/java/goodgenerator/blocks/tileEntity/SupercriticalFluidTurbine.java create mode 100644 src/main/java/goodgenerator/blocks/tileEntity/UniversalChemicalFuelEngine.java create mode 100644 src/main/java/goodgenerator/blocks/tileEntity/YottaFluidTank.java create mode 100644 src/main/java/goodgenerator/blocks/tileEntity/base/GT_MetaTileEntity_LargeTurbineBase.java create mode 100644 src/main/java/goodgenerator/blocks/tileEntity/base/GT_MetaTileEntity_TooltipMultiBlockBase_EM.java create mode 100644 src/main/java/goodgenerator/blocks/tileEntity/base/LargeFusionComputer.java create mode 100644 src/main/java/goodgenerator/blocks/tileEntity/base/LargeFusionComputerPP.java (limited to 'src/main/java/goodgenerator/blocks/tileEntity') diff --git a/src/main/java/goodgenerator/blocks/tileEntity/ComponentAssemblyLine.java b/src/main/java/goodgenerator/blocks/tileEntity/ComponentAssemblyLine.java new file mode 100644 index 0000000000..618477d09c --- /dev/null +++ b/src/main/java/goodgenerator/blocks/tileEntity/ComponentAssemblyLine.java @@ -0,0 +1,403 @@ +package goodgenerator.blocks.tileEntity; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.*; +import static goodgenerator.util.DescTextLocalization.BLUE_PRINT_INFO; +import static gregtech.api.enums.GT_HatchElement.*; +import static gregtech.api.enums.Textures.BlockIcons.*; + +import java.util.stream.Collectors; +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 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 goodgenerator.api.recipe.GoodGeneratorRecipeMaps; +import goodgenerator.loader.Loaders; +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.logic.ProcessingLogic; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ExtendedPowerMultiBlockBase; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.recipe.check.CheckRecipeResultRegistry; +import gregtech.api.render.TextureFactory; +import gregtech.api.util.GT_Multiblock_Tooltip_Builder; +import gregtech.api.util.GT_Recipe; +import gregtech.api.util.GT_StructureUtility; +import gregtech.api.util.GT_Utility; + +public class ComponentAssemblyLine extends GT_MetaTileEntity_ExtendedPowerMultiBlockBase + implements ISurvivalConstructable { + + private int casingTier; + protected static final String STRUCTURE_PIECE_MAIN = "main"; + private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition + .builder() + .addShape( + STRUCTURE_PIECE_MAIN, + new String[][] { + { " ", " III ", " HHI~IHH ", "HH III HH", "H H", "H H", "H JJJ H", + "H JJJ H", "H N N H", "HHHHHHHHH" }, + { " ", " ELHHHLE ", "E E", "H H", "A A", "A A", "A A", + "A HHH A", "A A", "MHHHHHHHM" }, + { " HBH ", " EL LE ", "E E", "HC CH", "AC CA", "AC CA", "A D D A", + "A HHH A", "A A", "MHHHHHHHM" }, + { " HBH ", " EL LE ", "E E", "H H", "A A", "A A", "A A", + "A HHH A", "A A", "MHHHHHHHM" }, + { " BBB ", " EL LE ", "E GGDGG E", "HGG D GGH", "AG C GA", "AG GA", "AG GA", + "AG HHH GA", "AG GA", "MHHHHHHHM" }, + { " HBH ", " EL LE ", "E E", "H H", "A A", "A A", "A A", + "A HHH A", "A A", "MHHHHHHHM" }, + { " HBH ", " EL LE ", "E E", "HC CH", "AC CA", "AC CA", "A D D A", + "A HHH A", "A A", "MHHHHHHHM" }, + { " HBH ", " EL LE ", "E E", "H H", "A A", "A A", "A A", + "A HHH A", "A A", "MHHHHHHHM" }, + { " BBB ", " EL LE ", "E GGDGG E", "HGG D GGH", "HG C GH", "HG GH", "HG GH", + "HG HHH GH", "HG GH", "MHHHHHHHM" }, + { " HBH ", " EL LE ", "E E", "H H", "A A", "A A", "A A", + "A HHH A", "A A", "MHHHHHHHM" }, + { " HBH ", " EL LE ", "E E", "HC CH", "AC CA", "AC CA", "A D D A", + "A HHH A", "A A", "MHHHHHHHM" }, + { " HBH ", " EL LE ", "E E", "H H", "A A", "A A", "A A", + "A HHH A", "A A", "MHHHHHHHM" }, + { " BBB ", " EL LE ", "E GGDGG E", "HGG D GGH", "AG C GA", "AG GA", "AG GA", + "AG HHH GA", "AG GA", "MHHHHHHHM" }, + { " HBH ", " EL LE ", "E E", "H H", "A A", "A A", "A A", + "A HHH A", "A A", "MHHHHHHHM" }, + { " HBH ", " EL LE ", "E E", "HC CH", "AC CA", "AC CA", "A D D A", + "A HHH A", "A A", "MHHHHHHHM" }, + { " HBH ", " EL LE ", "E E", "H H", "A A", "A A", "A A", + "A HHH A", "A A", "MHHHHHHHM" }, + { " BBB ", " EL LE ", "E GGDGG E", "HGG D GGH", "HG C GH", "HG GH", "HG GH", + "HG HHH GH", "HG GH", "MHHHHHHHM" }, + { " HBH ", " EL LE ", "E E", "H H", "A A", "A A", "A A", + "A HHH A", "A A", "MHHHHHHHM" }, + { " HBH ", " EL LE ", "E E", "HC CH", "AC CA", "AC CA", "A D D A", + "A HHH A", "A A", "MHHHHHHHM" }, + { " HBH ", " EL LE ", "E E", "H H", "A A", "A A", "A A", + "A HHH A", "A A", "MHHHHHHHM" }, + { " BBB ", " EL LE ", "E GGDGG E", "HGG D GGH", "AG C GA", "AG GA", "AG GA", + "AG HHH GA", "AG GA", "MHHHHHHHM" }, + { " HBH ", " EL LE ", "E E", "H H", "A A", "A A", "A A", + "A HHH A", "A A", "MHHHHHHHM" }, + { " HBH ", " EL LE ", "E E", "HC CH", "AC CA", "AC CA", "A D D A", + "A HHH A", "A A", "MHHHHHHHM" }, + { " HBH ", " EL LE ", "E E", "H H", "A A", "A A", "A A", + "A HHH A", "A A", "MHHHHHHHM" }, + { " BBB ", " EL LE ", "E GGDGG E", "HGG D GGH", "HG C GH", "HG GH", "HG GH", + "HG HHH GH", "HG GH", "MHHHHHHHM" }, + { " HBH ", " EL LE ", "E E", "H H", "A A", "A A", "A A", + "A HHH A", "A A", "MHHHHHHHM" }, + { " HBH ", " EL LE ", "E E", "HC CH", "AC CA", "AC CA", "A D D A", + "A HHH A", "A A", "MHHHHHHHM" }, + { " HBH ", " EL LE ", "E E", "H H", "A A", "A A", "A A", + "A HHH A", "A A", "MHHHHHHHM" }, + { " BBB ", " EL LE ", "E GGDGG E", "HGG D GGH", "AG C GA", "AG GA", "AG GA", + "AG HHH GA", "AG GA", "MHHHHHHHM" }, + { " HBH ", " EL LE ", "E E", "H H", "A A", "A A", "A A", + "A HHH A", "A n n A", "MHHHHHHHM" }, + { " HBH ", " EL LE ", "E E", "HC CH", "AC CA", "AC CA", "A D D A", + "A HHH A", "A A", "MHHHHHHHM" }, + { " ", " ELHHHLE ", "E E", "H H", "A A", "A A", "A A", + "A HHH A", "A A", "MHHHHHHHM" }, + { " ", " ", " HHHHHHH ", "HH HH", "H H", "H H", "H H", + "H H", "H KKK H", "HHHHHHHHH" } }) + .addElement( + 'A', + ofChain( + ofBlockUnlocalizedName("bartworks", "BW_GlasBlocks", 5), + ofBlockUnlocalizedName("bartworks", "BW_GlasBlocks", 13), + ofBlockUnlocalizedName("bartworks", "BW_GlasBlocks", 14), + ofBlockUnlocalizedName("bartworks", "BW_GlasBlocks", 15), + ofBlockUnlocalizedName("bartworks", "BW_GlasBlocks2", 0))) + .addElement('H', ofBlock(GregTech_API.sBlockCasings8, 7)) + .addElement('C', ofBlock(GregTech_API.sBlockCasings2, 5)) + .addElement('D', ofBlock(GregTech_API.sBlockCasings2, 9)) + .addElement('G', ofBlock(GregTech_API.sBlockCasings9, 0)) + .addElement('E', ofBlock(GregTech_API.sBlockCasings9, 1)) + .addElement('F', ofBlock(GregTech_API.sBlockCasings4, 1)) + .addElement( + 'B', + ofBlocksTiered( + (block, meta) -> block == Loaders.componentAssemblylineCasing ? meta : -1, + IntStream.range(0, 14) + .mapToObj(i -> Pair.of(Loaders.componentAssemblylineCasing, i)) + .collect(Collectors.toList()), + -2, + (t, meta) -> t.casingTier = meta, + t -> t.casingTier)) + .addElement( + 'J', + GT_StructureUtility.buildHatchAdder(ComponentAssemblyLine.class) + .atLeast(InputBus) + .dot(1) + .casingIndex(183) + .buildAndChain(GregTech_API.sBlockCasings8, 7)) + .addElement( + 'N', + GT_StructureUtility.buildHatchAdder(ComponentAssemblyLine.class) + .atLeast(InputBus) + .dot(1) + .casingIndex(183) + .buildAndChain(GT_StructureUtility.ofFrame(Materials.TungstenSteel))) + .addElement( + 'K', + GT_StructureUtility.buildHatchAdder(ComponentAssemblyLine.class) + .atLeast(OutputBus) + .dot(2) + .casingIndex(183) + .buildAndChain(GregTech_API.sBlockCasings8, 7)) + .addElement( + 'L', + GT_StructureUtility.buildHatchAdder(ComponentAssemblyLine.class) + .atLeast(Energy, ExoticEnergy) + .dot(3) + .casingIndex(183) + .buildAndChain(GregTech_API.sBlockCasings8, 7)) + .addElement( + 'I', + GT_StructureUtility.buildHatchAdder(ComponentAssemblyLine.class) + .atLeast(Maintenance) + .dot(4) + .casingIndex(183) + .buildAndChain(GregTech_API.sBlockCasings8, 7)) + .addElement( + 'M', + GT_StructureUtility.buildHatchAdder(ComponentAssemblyLine.class) + .atLeast(InputHatch) + .dot(5) + .casingIndex(183) + .buildAndChain(GregTech_API.sBlockCasings8, 7)) + .addElement('n', GT_StructureUtility.ofFrame(Materials.TungstenSteel)) + .build(); + + public ComponentAssemblyLine(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public ComponentAssemblyLine(String aName) { + super(aName); + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 4, 2, 0); + } + + @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("High-Capacity Component Assembler") + .addInfo("Controller block for the Component Assembly Line.") + .addInfo("Assembles basic components (motors, pumps, etc.) in large batches.") + .addInfo( + "The " + EnumChatFormatting.BOLD + + EnumChatFormatting.YELLOW + + "Component Assembly Line Casing " + + EnumChatFormatting.RESET + + EnumChatFormatting.GRAY + + "limits the recipes the machine can perform. See the NEI pages for details.") + .addInfo( + "Supports " + EnumChatFormatting.BLUE + + "Tec" + + EnumChatFormatting.DARK_BLUE + + "Tech" + + EnumChatFormatting.GRAY + + " laser and multi-amp hatches!") + .addInfo("Supports overclocking beyond MAX!") + .addInfo(EnumChatFormatting.ITALIC + "Much more efficient than other competing brands!") + .addInfo("The structure is too complex!") + .addInfo(BLUE_PRINT_INFO) + .addSeparator() + .beginStructureBlock(9, 10, 33, false) + .addStructureInfo("This structure is too complex! See schematic for details.") + .addOtherStructurePart("Borosilicate Glass", "Can be UV tier or higher") + .addInputBus("Start of conveyor belt", 1) + .addOutputBus("End of conveyor belt", 2) + .addEnergyHatch("Second-top layer", 3) + .addMaintenanceHatch("Around the controller", 4) + .addInputHatch("Bottom left and right corners", 5) + .toolTipFinisher( + EnumChatFormatting.AQUA + "MadMan310" + + EnumChatFormatting.GRAY + + " via " + + EnumChatFormatting.GREEN + + "Good Generator"); + + return tt; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new ComponentAssemblyLine(mName); + } + + /** + * Changes and adds new information to the default info data for the scanner. + */ + @Override + public String[] getInfoData() { + String[] origin = super.getInfoData(); + String[] ret = new String[origin.length + 1]; + System.arraycopy(origin, 0, ret, 0, origin.length); + ret[origin.length] = StatCollector.translateToLocal("scanner.info.CASS.tier") + + (casingTier >= 0 ? GT_Values.VN[casingTier + 1] : "None!"); + return ret; + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing, + int colorIndex, boolean aActive, boolean aRedstone) { + if (side == facing) { + if (aActive) return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(183), + 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(183), 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(183) }; + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @Override + protected ProcessingLogic createProcessingLogic() { + return new ProcessingLogic() { + + @NotNull + @Override + protected CheckRecipeResult validateRecipe(@NotNull GT_Recipe recipe) { + if (recipe.mSpecialValue > casingTier + 1) { + return CheckRecipeResultRegistry.insufficientMachineTier(recipe.mSpecialValue); + } + return CheckRecipeResultRegistry.SUCCESSFUL; + } + }; + } + + @Override + protected void setProcessingLogicPower(ProcessingLogic logic) { + logic.setAvailableVoltage(getMaxInputEu()); + logic.setAvailableAmperage(1); + } + + @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, 4, 2, 0, realBudget, env, false, true); + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + casingTier = -2; + return checkPiece(STRUCTURE_PIECE_MAIN, 4, 2, 0); + } + + @Override + public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + inputSeparation = !inputSeparation; + GT_Utility.sendChatToPlayer( + aPlayer, + StatCollector.translateToLocal("GT5U.machines.separatebus") + " " + inputSeparation); + } + + @Override + public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer, + float aX, float aY, float aZ, ItemStack aTool) { + if (aPlayer.isSneaking()) { + batchMode = !batchMode; + if (batchMode) { + GT_Utility.sendChatToPlayer(aPlayer, "Batch recipes."); + } else { + GT_Utility.sendChatToPlayer(aPlayer, "Don't batch recipes."); + } + } + + return true; + } + + @Override + public boolean supportsInputSeparation() { + return true; + } + + @Override + public boolean supportsBatchMode() { + 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 RecipeMap getRecipeMap() { + return GoodGeneratorRecipeMaps.componentAssemblyLineRecipes; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setInteger("casingTier", casingTier); + } + + @Override + public void loadNBTData(final NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + casingTier = aNBT.getInteger("casingTier"); + if (!aNBT.hasKey(INPUT_SEPARATION_NBT_KEY)) { + inputSeparation = aNBT.getBoolean("mSeparate"); + } + } +} diff --git a/src/main/java/goodgenerator/blocks/tileEntity/CoolantTower.java b/src/main/java/goodgenerator/blocks/tileEntity/CoolantTower.java new file mode 100644 index 0000000000..ae3395ffb9 --- /dev/null +++ b/src/main/java/goodgenerator/blocks/tileEntity/CoolantTower.java @@ -0,0 +1,225 @@ +package goodgenerator.blocks.tileEntity; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.*; +import static goodgenerator.util.DescTextLocalization.BLUE_PRINT_INFO; +import static gregtech.api.enums.Textures.BlockIcons.*; +import static gregtech.api.util.GT_StructureUtility.*; +import static gregtech.api.util.GT_Utility.filterValidMTEs; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; + +import org.jetbrains.annotations.NotNull; + +import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM; +import com.gtnewhorizon.structurelib.alignment.constructable.IConstructable; +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; + +import goodgenerator.blocks.tileEntity.base.GT_MetaTileEntity_TooltipMultiBlockBase_EM; +import goodgenerator.util.DescTextLocalization; +import gregtech.api.GregTech_API; +import gregtech.api.enums.GT_HatchElement; +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_Input; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_MultiInput; +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_Utility; + +public class CoolantTower extends GT_MetaTileEntity_TooltipMultiBlockBase_EM + implements IConstructable, ISurvivalConstructable { + + protected IStructureDefinition multiDefinition = null; + private final int CASING_INDEX = 1542; + + public CoolantTower(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public CoolantTower(String name) { + super(name); + } + + @Override + public IStructureDefinition getStructure_EM() { + if (multiDefinition == null) { + multiDefinition = StructureDefinition.builder() + .addShape( + mName, + transpose( + new String[][] { + { " ", " ", " BBB ", " B B ", " B B ", " B B ", + " B B ", " B B ", " BBB ", " ", " " }, + { " ", " ", " BBB ", " BBBBB ", " BB BB ", " BB BB ", + " BB BB ", " BBBBB ", " BBB ", " ", " " }, + { " ", " ", " ", " BBB ", " B B ", " B B ", + " B B ", " BBB ", " ", " ", " " }, + { " ", " ", " ", " BBB ", " B B ", " B B ", + " B B ", " BBB ", " ", " ", " " }, + { " ", " ", " ", " BBB ", " B B ", " B B ", + " B B ", " BBB ", " ", " ", " " }, + { " ", " ", " BBB ", " BBBBB ", " BB BB ", " BB BB ", + " BB BB ", " BBBBB ", " BBB ", " ", " " }, + { " ", " ", " BBB ", " B B ", " B B ", " B B ", + " B B ", " B B ", " BBB ", " ", " " }, + { " ", " ", " BBB ", " B B ", " B B ", " B B ", + " B B ", " B B ", " BBB ", " ", " " }, + { " ", " BBB ", " BBBBB ", " BB BB ", " BB BB ", " BB BB ", + " BB BB ", " BB BB ", " BBBBB ", " BBB ", " " }, + { " ", " BBB ", " B B ", " B B ", " B B ", " B B ", + " B B ", " B B ", " B B ", " BBB ", " " }, + { " ", " BBBBB ", " BB BB ", " BB BB ", " B B ", " B B ", + " B B ", " BB BB ", " BB BB ", " BBBBB ", " " }, + { " HH~HH ", " HBBBBBH ", " HB BH ", "HB BH", "HB BH", "HB BH", + "HB BH", "HB BH", " HB BH ", " HBBBBBH ", " HHHHH " }, + { " CCCCC ", " C C ", " C C ", "C C", "C C", "C C", + "C C", "C C", " C C ", " C C ", " CCCCC " }, })) + .addElement('B', ofBlockAnyMeta(GregTech_API.sBlockConcretes, 8)) + .addElement('C', ofFrame(Materials.TungstenCarbide)) + .addElement( + 'H', + buildHatchAdder(CoolantTower.class).atLeast(GT_HatchElement.InputHatch, GT_HatchElement.OutputHatch) + .casingIndex(CASING_INDEX) + .dot(1) + .buildAndChain(ofBlockAnyMeta(GregTech_API.sBlockConcretes, 8))) + .build(); + } + return multiDefinition; + } + + @Override + public boolean checkMachine_EM(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + mWrench = true; + mScrewdriver = true; + mSoftHammer = true; + mHardHammer = true; + mSolderingTool = true; + mCrowbar = true; + return structureCheck_EM(mName, 5, 11, 0); + } + + @Override + protected GT_Multiblock_Tooltip_Builder createTooltip() { + final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); + tt.addMachineType("Coolant Tower") + .addInfo("Controller block for the Coolant Tower.") + .addInfo("Turn Steam back to Distilled Water.") + .addInfo(BLUE_PRINT_INFO) + .addSeparator() + .addController("Mid of the second layer.") + .addInputHatch("Input Hatch", 1) + .addOutputHatch("Output Hatch", 1) + .toolTipFinisher("Good Generator"); + return tt; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + structureBuild_EM(mName, 5, 11, 0, stackSize, hintsOnly); + } + + @Override + public String[] getStructureDescription(ItemStack stackSize) { + return DescTextLocalization.addText("CoolantTower.hint", 3); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new CoolantTower(mName); + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPostTick(aBaseMetaTileEntity, aTick); + if (aTick % 72000 == 0) { + mWrench = true; + mScrewdriver = true; + mSoftHammer = true; + mHardHammer = true; + mSolderingTool = true; + mCrowbar = true; + } + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return 10000; + } + + @Override + public boolean onRunningTick(ItemStack aStack) { + return true; + } + + @Override + protected @NotNull CheckRecipeResult checkProcessing_EM() { + this.mMaxProgresstime = 20; + int steam = 0; + + for (GT_MetaTileEntity_Hatch_Input tHatch : filterValidMTEs(mInputHatches)) { + steam += maybeDrainHatch(tHatch); + } + addOutput(GT_ModHandler.getDistilledWater(steam / 160)); + return CheckRecipeResultRegistry.SUCCESSFUL; + } + + private int maybeDrainHatch(GT_MetaTileEntity_Hatch_Input tHatch) { + if (tHatch instanceof GT_MetaTileEntity_Hatch_MultiInput) { + int drained = 0; + for (FluidStack maybeSteam : ((GT_MetaTileEntity_Hatch_MultiInput) tHatch).getStoredFluid()) { + drained += maybeDrainSteam(tHatch, maybeSteam); + } + return drained; + } + return maybeDrainSteam(tHatch, tHatch.getFillableStack()); + } + + private int maybeDrainSteam(GT_MetaTileEntity_Hatch_Input tHatch, FluidStack maybeSteam) { + if (maybeSteam == null) return 0; + if (!GT_Utility.areFluidsEqual(maybeSteam, GT_ModHandler.getSteam(1))) return 0; + FluidStack defoSteam = tHatch.drain(ForgeDirection.UNKNOWN, maybeSteam, true); + return defoSteam.amount; + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing, + int colorIndex, boolean aActive, boolean aRedstone) { + if (side == facing) { + if (aActive) return new ITexture[] { casingTexturePages[12][6], 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[12][6], TextureFactory.builder() + .addIcon(OVERLAY_FRONT_HEAT_EXCHANGER) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_HEAT_EXCHANGER_GLOW) + .extFacing() + .glow() + .build() }; + } + return new ITexture[] { casingTexturePages[12][6] }; + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + if (mMachine) return -1; + return survivialBuildPiece(mName, stackSize, 5, 11, 0, elementBudget, env, false, true); + } +} diff --git a/src/main/java/goodgenerator/blocks/tileEntity/EssentiaHatch.java b/src/main/java/goodgenerator/blocks/tileEntity/EssentiaHatch.java new file mode 100644 index 0000000000..f9eab80f03 --- /dev/null +++ b/src/main/java/goodgenerator/blocks/tileEntity/EssentiaHatch.java @@ -0,0 +1,244 @@ +package goodgenerator.blocks.tileEntity; + +import java.util.ArrayList; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +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 goodgenerator.crossmod.thaumcraft.LargeEssentiaEnergyData; +import thaumcraft.api.ThaumcraftApiHelper; +import thaumcraft.api.aspects.Aspect; +import thaumcraft.api.aspects.AspectList; +import thaumcraft.api.aspects.IAspectContainer; +import thaumcraft.api.aspects.IEssentiaTransport; + +public class EssentiaHatch extends TileEntity implements IAspectContainer, IEssentiaTransport { + + private Aspect mLocked; + private AspectList current = new AspectList(); + public int mState = 0; + + public void setLockedAspect(Aspect aAspect) { + this.mLocked = aAspect; + } + + @Override + public void readFromNBT(NBTTagCompound tagCompound) { + super.readFromNBT(tagCompound); + + this.mLocked = Aspect.getAspect(tagCompound.getString("mLocked")); + this.mState = tagCompound.getInteger("mState"); + current = new AspectList(); + NBTTagList tlist = tagCompound.getTagList("Aspects", 10); + for (int j = 0; j < tlist.tagCount(); ++j) { + NBTTagCompound rs = tlist.getCompoundTagAt(j); + if (rs.hasKey("key")) { + current.add(Aspect.getAspect(rs.getString("key")), rs.getInteger("amount")); + } + } + } + + @Override + public void writeToNBT(NBTTagCompound tagCompound) { + super.writeToNBT(tagCompound); + + tagCompound.setString("mLocked", this.mLocked == null ? "" : this.mLocked.getTag()); + tagCompound.setInteger("mState", mState); + NBTTagList tlist = new NBTTagList(); + Aspect[] aspectA = current.getAspects(); + for (Aspect aspect : aspectA) { + if (aspect != null) { + NBTTagCompound f = new NBTTagCompound(); + f.setString("key", aspect.getTag()); + f.setInteger("amount", current.getAmount(aspect)); + tlist.appendTag(f); + } + } + tagCompound.setTag("Aspects", tlist); + } + + public final Packet getDescriptionPacket() { + NBTTagCompound nbt = new NBTTagCompound(); + writeToNBT(nbt); + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbt); + } + + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + NBTTagCompound nbt = pkt.func_148857_g(); + readFromNBT(nbt); + } + + public void markDirty() { + super.markDirty(); + if (this.worldObj.isRemote) { + return; + } + this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord); + } + + @Override + public void updateEntity() { + fillfrompipe(); + } + + public void fillfrompipe() { + if (getEssentiaAmount(null) >= 1000) return; + TileEntity[] te = new TileEntity[ForgeDirection.VALID_DIRECTIONS.length]; + for (int i = 0; i < ForgeDirection.VALID_DIRECTIONS.length; i++) { + te[i] = ThaumcraftApiHelper.getConnectableTile( + this.worldObj, + this.xCoord, + this.yCoord, + this.zCoord, + ForgeDirection.VALID_DIRECTIONS[i]); + if (te[i] != null) { + IEssentiaTransport pipe = (IEssentiaTransport) te[i]; + if (!pipe.canOutputTo(ForgeDirection.VALID_DIRECTIONS[i])) { + continue; + } + if ((pipe.getEssentiaType(ForgeDirection.VALID_DIRECTIONS[i].getOpposite()) != null) + && (pipe.getSuctionAmount(ForgeDirection.VALID_DIRECTIONS[i]) + < getSuctionAmount(ForgeDirection.VALID_DIRECTIONS[i]))) { + Aspect readyInput = pipe.getEssentiaType(ForgeDirection.VALID_DIRECTIONS[i].getOpposite()); + int type = LargeEssentiaEnergyData.getAspectTypeIndex(readyInput); + if (type != -1 && (mState & (1 << type)) == 0) continue; + if (readyInput.equals(mLocked)) { + addToContainer(mLocked, pipe.takeEssentia(mLocked, 1, ForgeDirection.VALID_DIRECTIONS[i])); + } + if (mLocked == null) addToContainer( + pipe.getEssentiaType(ForgeDirection.VALID_DIRECTIONS[i]), + pipe.takeEssentia( + pipe.getEssentiaType(ForgeDirection.VALID_DIRECTIONS[i]), + 1, + ForgeDirection.VALID_DIRECTIONS[i])); + } + } + } + } + + @Override + public AspectList getAspects() { + return current; + } + + @Override + public void setAspects(AspectList aspectList) { + this.current.add(aspectList); + } + + @Override + public boolean doesContainerAccept(Aspect aspect) { + int type = LargeEssentiaEnergyData.getAspectTypeIndex(aspect); + if (type != -1 && (mState & (1 << type)) == 0) return false; + return (mLocked == null || mLocked.equals(aspect)) && getEssentiaAmount(null) <= 1000; + } + + @Override + public int addToContainer(Aspect aspect, int i) { + int type = LargeEssentiaEnergyData.getAspectTypeIndex(aspect); + if (type != -1 && (mState & (1 << type)) == 0) return i; + int ready = Math.min(1000 - getEssentiaAmount(null), i); + if ((mLocked == null || mLocked.equals(aspect)) && ready > 0) { + current.add(aspect, ready); + this.markDirty(); + return i - ready; + } + this.markDirty(); + return i; + } + + @Override + public boolean takeFromContainer(Aspect aspect, int i) { + return false; + } + + @Override + public boolean takeFromContainer(AspectList aspectList) { + return false; + } + + @Override + public boolean doesContainerContainAmount(Aspect aspect, int i) { + return current.aspects.containsKey(aspect) && i <= current.getAmount(aspect); + } + + @Override + public boolean doesContainerContain(AspectList aspectList) { + ArrayList ret = new ArrayList(); + for (Aspect a : aspectList.aspects.keySet()) ret.add(current.aspects.containsKey(a)); + return !ret.contains(false); + } + + @Override + public int containerContains(Aspect aspect) { + return current.aspects.containsKey(aspect) ? current.getAmount(aspect) : 0; + } + + @Override + public boolean isConnectable(ForgeDirection forgeDirection) { + return true; + } + + @Override + public boolean canInputFrom(ForgeDirection forgeDirection) { + return true; + } + + @Override + public boolean canOutputTo(ForgeDirection forgeDirection) { + return false; + } + + @Override + public void setSuction(Aspect aspect, int i) {} + + @Override + public Aspect getSuctionType(ForgeDirection forgeDirection) { + return this.mLocked; + } + + @Override + public int getSuctionAmount(ForgeDirection forgeDirection) { + return 256; + } + + @Override + public int takeEssentia(Aspect aspect, int i, ForgeDirection forgeDirection) { + return 0; + } + + @Override + public int addEssentia(Aspect aspect, int i, ForgeDirection forgeDirection) { + return i - addToContainer(aspect, i); + } + + @Override + public Aspect getEssentiaType(ForgeDirection forgeDirection) { + if (current == null || current.size() < 1) return null; + return current.getAspects()[0]; + } + + @Override + public int getEssentiaAmount(ForgeDirection forgeDirection) { + int ret = 0; + for (final Aspect A : current.aspects.keySet()) { + ret += current.getAmount(A); + } + return ret; + } + + @Override + public int getMinimumSuction() { + return Integer.MAX_VALUE; + } + + @Override + public boolean renderExtendedTube() { + return true; + } +} diff --git a/src/main/java/goodgenerator/blocks/tileEntity/EssentiaOutputHatch.java b/src/main/java/goodgenerator/blocks/tileEntity/EssentiaOutputHatch.java new file mode 100644 index 0000000000..93cec4672c --- /dev/null +++ b/src/main/java/goodgenerator/blocks/tileEntity/EssentiaOutputHatch.java @@ -0,0 +1,179 @@ +package goodgenerator.blocks.tileEntity; + +import java.util.Map; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraftforge.common.util.ForgeDirection; + +import thaumcraft.api.TileThaumcraft; +import thaumcraft.api.aspects.Aspect; +import thaumcraft.api.aspects.AspectList; +import thaumcraft.api.aspects.IAspectContainer; +import thaumcraft.api.aspects.IEssentiaTransport; + +public class EssentiaOutputHatch extends TileThaumcraft implements IAspectContainer, IEssentiaTransport { + + public static final int CAPACITY = 256; + protected AspectList mAspects = new AspectList(); + + public void clear() { + this.mAspects.aspects.clear(); + } + + @Override + public void markDirty() { + super.markDirty(); + if (this.worldObj.isRemote) return; + this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord); + } + + @Override + public void readFromNBT(NBTTagCompound nbttagcompound) { + super.readFromNBT(nbttagcompound); + this.mAspects.aspects.clear(); + NBTTagList tlist = nbttagcompound.getTagList("Aspects", 10); + for (int j = 0; j < tlist.tagCount(); ++j) { + NBTTagCompound rs = tlist.getCompoundTagAt(j); + if (rs.hasKey("key")) mAspects.add(Aspect.getAspect(rs.getString("key")), rs.getInteger("amount")); + } + } + + @Override + public void writeToNBT(NBTTagCompound nbttagcompound) { + super.writeToNBT(nbttagcompound); + Aspect[] aspectA = this.mAspects.getAspects(); + NBTTagList nbtTagList = new NBTTagList(); + for (Aspect aspect : aspectA) { + if (aspect != null) { + NBTTagCompound f = new NBTTagCompound(); + f.setString("key", aspect.getTag()); + f.setInteger("amount", this.mAspects.getAmount(aspect)); + nbtTagList.appendTag(f); + } + } + nbttagcompound.setTag("Aspects", nbtTagList); + } + + private int remainingCapacity() { + return CAPACITY - this.getEssentiaAmount(null); + } + + @Override + public AspectList getAspects() { + return this.mAspects; + } + + @Override + public void setAspects(AspectList aspectList) { + for (Map.Entry entry : aspectList.aspects.entrySet()) { + this.addEssentia(entry.getKey(), entry.getValue(), null); + } + } + + @Override + public boolean doesContainerAccept(Aspect var1) { + return true; + } + + @Override + public int addToContainer(Aspect aspect, int amount) { + int remaining = 0; + if (amount > this.remainingCapacity()) { + remaining = amount - this.remainingCapacity(); + this.mAspects.add(aspect, this.remainingCapacity()); + } else this.mAspects.add(aspect, amount); + this.markDirty(); + return remaining; + } + + @Override + public boolean takeFromContainer(Aspect aspect, int amount) { + if (this.mAspects != null && this.mAspects.getAmount(aspect) >= amount) { + this.mAspects.remove(aspect, amount); + this.markDirty(); + return true; + } else return false; + } + + @Override + public boolean takeFromContainer(AspectList aspects) { + return true; + } + + @Override + public boolean doesContainerContainAmount(Aspect aspect, int amount) { + return this.mAspects.getAmount(aspect) >= amount; + } + + @Override + public boolean doesContainerContain(AspectList aspectList) { + for (Map.Entry entry : aspectList.aspects.entrySet()) { + if (this.mAspects.getAmount(entry.getKey()) < entry.getValue()) return false; + } + return true; + } + + @Override + public int containerContains(Aspect aspect) { + return this.mAspects.getAmount(aspect); + } + + @Override + public boolean isConnectable(ForgeDirection var1) { + return true; + } + + @Override + public boolean canInputFrom(ForgeDirection var1) { + return false; + } + + @Override + public boolean canOutputTo(ForgeDirection var1) { + return true; + } + + @Override + public void setSuction(Aspect var1, int var2) {} + + @Override + public Aspect getSuctionType(ForgeDirection var1) { + return null; + } + + @Override + public int getSuctionAmount(ForgeDirection var1) { + return 0; + } + + @Override + public int takeEssentia(Aspect aspect, int amount, ForgeDirection var3) { + return this.takeFromContainer(aspect, amount) ? amount : 0; + } + + @Override + public int addEssentia(Aspect aspect, int amount, ForgeDirection direction) { + return amount - addToContainer(aspect, amount); + } + + @Override + public Aspect getEssentiaType(ForgeDirection var1) { + return this.mAspects.size() > 0 ? this.mAspects.getAspects()[0] : null; + } + + @Override + public int getEssentiaAmount(ForgeDirection var1) { + return this.mAspects.visSize(); + } + + @Override + public int getMinimumSuction() { + return 0; + } + + @Override + public boolean renderExtendedTube() { + return true; + } +} diff --git a/src/main/java/goodgenerator/blocks/tileEntity/EssentiaOutputHatch_ME.java b/src/main/java/goodgenerator/blocks/tileEntity/EssentiaOutputHatch_ME.java new file mode 100644 index 0000000000..b576b44e7f --- /dev/null +++ b/src/main/java/goodgenerator/blocks/tileEntity/EssentiaOutputHatch_ME.java @@ -0,0 +1,150 @@ +package goodgenerator.blocks.tileEntity; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; + +import appeng.api.config.Actionable; +import appeng.api.networking.GridFlags; +import appeng.api.networking.IGrid; +import appeng.api.networking.IGridNode; +import appeng.api.networking.security.IActionHost; +import appeng.api.networking.security.MachineSource; +import appeng.api.util.AECableType; +import appeng.api.util.DimensionalCoord; +import appeng.me.helpers.AENetworkProxy; +import appeng.me.helpers.IGridProxyable; +import appeng.tile.TileEvent; +import appeng.tile.events.TileEventType; +import goodgenerator.util.ItemRefer; +import thaumcraft.api.aspects.Aspect; +import thaumcraft.api.aspects.AspectList; +import thaumicenergistics.api.grid.IEssentiaGrid; +import thaumicenergistics.api.grid.IMEEssentiaMonitor; + +public class EssentiaOutputHatch_ME extends EssentiaOutputHatch implements IActionHost, IGridProxyable { + + private AENetworkProxy gridProxy = null; + private IMEEssentiaMonitor monitor = null; + private MachineSource asMachineSource = new MachineSource(this); + + @Override + public void updateEntity() { + getProxy(); + super.updateEntity(); + } + + @Override + public void invalidate() { + super.invalidate(); + this.invalidateAE(); + } + + @Override + public void onChunkUnload() { + super.onChunkUnload(); + this.onChunkUnloadAE(); + } + + @TileEvent(TileEventType.WORLD_NBT_READ) + public void readFromNBT_AENetwork(final NBTTagCompound data) { + AENetworkProxy gp = getProxy(); + if (gp != null) getProxy().readFromNBT(data); + } + + @TileEvent(TileEventType.WORLD_NBT_WRITE) + public void writeToNBT_AENetwork(final NBTTagCompound data) { + AENetworkProxy gp = getProxy(); + if (gp != null) gp.writeToNBT(data); + } + + void onChunkUnloadAE() { + AENetworkProxy gp = getProxy(); + if (gp != null) gp.onChunkUnload(); + } + + void invalidateAE() { + AENetworkProxy gp = getProxy(); + if (gp != null) gp.invalidate(); + } + + @Override + public IGridNode getGridNode(ForgeDirection forgeDirection) { + AENetworkProxy gp = getProxy(); + return gp != null ? gp.getNode() : null; + } + + @Override + public void gridChanged() {} + + @Override + public AECableType getCableConnectionType(ForgeDirection forgeDirection) { + return AECableType.SMART; + } + + @Override + public void securityBreak() {} + + @Override + public AENetworkProxy getProxy() { + if (gridProxy == null) { + gridProxy = new AENetworkProxy(this, "proxy", ItemRefer.Essentia_Output_Hatch_ME.get(1), true); + gridProxy.onReady(); + gridProxy.setFlags(GridFlags.REQUIRE_CHANNEL); + } + return this.gridProxy; + } + + @Override + public DimensionalCoord getLocation() { + return new DimensionalCoord(this.worldObj, this.xCoord, this.yCoord, this.zCoord); + } + + @Override + public IGridNode getActionableNode() { + AENetworkProxy gp = getProxy(); + return gp != null ? gp.getNode() : null; + } + + @Override + public boolean takeFromContainer(AspectList aspects) { + return false; + } + + @Override + public boolean takeFromContainer(Aspect aspect, int amount) { + return false; + } + + @Override + public int addEssentia(Aspect aspect, int amount, ForgeDirection side) { + return this.addEssentia(aspect, amount, side, Actionable.MODULATE); + } + + public int addEssentia(Aspect aspect, int amount, ForgeDirection side, Actionable mode) { + long rejectedAmount = amount; + if (this.getEssentiaMonitor()) { + rejectedAmount = this.monitor.injectEssentia(aspect, amount, mode, this.getMachineSource(), true); + } + + long acceptedAmount = (long) amount - rejectedAmount; + return (int) acceptedAmount; + } + + protected boolean getEssentiaMonitor() { + IMEEssentiaMonitor essentiaMonitor = null; + IGrid grid = null; + IGridNode node = this.getProxy() + .getNode(); + + if (node != null) { + grid = node.getGrid(); + if (grid != null) essentiaMonitor = grid.getCache(IEssentiaGrid.class); + } + this.monitor = essentiaMonitor; + return (this.monitor != null); + } + + public MachineSource getMachineSource() { + return this.asMachineSource; + } +} diff --git a/src/main/java/goodgenerator/blocks/tileEntity/ExtremeHeatExchanger.java b/src/main/java/goodgenerator/blocks/tileEntity/ExtremeHeatExchanger.java new file mode 100644 index 0000000000..af1fd82030 --- /dev/null +++ b/src/main/java/goodgenerator/blocks/tileEntity/ExtremeHeatExchanger.java @@ -0,0 +1,416 @@ +package goodgenerator.blocks.tileEntity; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.*; +import static goodgenerator.util.DescTextLocalization.BLUE_PRINT_INFO; +import static gregtech.api.enums.GT_Values.V; +import static gregtech.api.enums.Textures.BlockIcons.*; +import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +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.Constants; +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.gtnewhorizon.structurelib.alignment.constructable.IConstructable; +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; + +import goodgenerator.api.recipe.ExtremeHeatExchangerRecipe; +import goodgenerator.api.recipe.GoodGeneratorRecipeMaps; +import goodgenerator.blocks.tileEntity.base.GT_MetaTileEntity_TooltipMultiBlockBase_EM; +import goodgenerator.loader.Loaders; +import goodgenerator.util.DescTextLocalization; +import gregtech.api.GregTech_API; +import gregtech.api.enums.GT_HatchElement; +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_Output; +import gregtech.api.multitileentity.multiblock.casing.Glasses; +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_Log; +import gregtech.api.util.GT_ModHandler; +import gregtech.api.util.GT_Multiblock_Tooltip_Builder; +import gregtech.api.util.GT_Utility; +import gregtech.api.util.IGT_HatchAdder; + +public class ExtremeHeatExchanger extends GT_MetaTileEntity_TooltipMultiBlockBase_EM + implements IConstructable, ISurvivalConstructable { + + protected IStructureDefinition multiDefinition = null; + + public static double penalty_per_config = 0.015d; + protected int casingAmount = 0; + protected GT_MetaTileEntity_Hatch_Input mHotFluidHatch; + protected GT_MetaTileEntity_Hatch_Output mCooledFluidHatch; + private boolean transformed = false; + private String hotName; + private ExtremeHeatExchangerRecipe tRunningRecipe; + + public ExtremeHeatExchanger(String name) { + super(name); + } + + public ExtremeHeatExchanger(int id, String name, String nameRegional) { + super(id, name, nameRegional); + } + + @Override + public IStructureDefinition getStructure_EM() { + if (multiDefinition == null) { + multiDefinition = StructureDefinition.builder() + .addShape( + mName, + transpose( + new String[][] { + // spotless:off + { " CCC ", "TTTTT", "TTTTT", "TTTTT", "TTTTT", "TTTTT", "TTTTT", "TTTTT", "TTTTT", "TTTTT", " CCC " }, + { " CCC ", "GPPPG", "GWWWG", "GPPPG", "GWWWG", "GPPPG", "GWWWG", "GPPPG", "GWWWG", "GPPPG", " CCC " }, + { " CFC ", "GPPPG", "GWWWG", "GPPPG", "GWWWG", "GPPPG", "GWWWG", "GPPPG", "GWWWG", "GPPPG", " CEC " }, + { " CCC ", "GPPPG", "GWWWG", "GPPPG", "GWWWG", "GPPPG", "GWWWG", "GPPPG", "GWWWG", "GPPPG", " CCC " }, + { " CCC ", "GPPPG", "GWWWG", "GPPPG", "GWWWG", "GPPPG", "GWWWG", "GPPPG", "GWWWG", "GPPPG", " CCC " }, + { " C~C ", "BBBBB", "BBBBB", "BBBBB", "BBBBB", "BBBBB", "BBBBB", "BBBBB", "BBBBB", "BBBBB", " CCC " }, + //spotless:on + })) + .addElement( + 'B', + ofChain( + buildHatchAdder(ExtremeHeatExchanger.class) + .atLeast(GT_HatchElement.InputHatch, GT_HatchElement.Maintenance) + .casingIndex(48) + .dot(1) + .build(), + onElementPass(x -> x.casingAmount++, ofBlock(GregTech_API.sBlockCasings4, 0)))) + .addElement( + 'T', + ofChain( + buildHatchAdder(ExtremeHeatExchanger.class) + .atLeast(GT_HatchElement.OutputHatch, GT_HatchElement.Maintenance) + .casingIndex(48) + .dot(2) + .build(), + onElementPass(x -> x.casingAmount++, ofBlock(GregTech_API.sBlockCasings4, 0)))) + .addElement('F', EHEHatches.HotInputHatch.newAny(48, 3)) + .addElement('E', EHEHatches.ColdOutputHatch.newAny(48, 4)) + .addElement( + 'C', + ofChain( + buildHatchAdder(ExtremeHeatExchanger.class).atLeast(GT_HatchElement.Maintenance) + .casingIndex(48) + .dot(5) + .build(), + onElementPass(x -> x.casingAmount++, ofBlock(GregTech_API.sBlockCasings4, 0)))) + .addElement('G', Glasses.chainAllGlasses()) + .addElement('P', ofBlock(GregTech_API.sBlockCasings2, 15)) + .addElement('W', ofBlock(Loaders.pressureResistantWalls, 0)) + .build(); + } + return multiDefinition; + } + + 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); + mHotFluidHatch = (GT_MetaTileEntity_Hatch_Input) aMetaTileEntity; + return true; + } + return false; + } + + 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); + mCooledFluidHatch = (GT_MetaTileEntity_Hatch_Output) aMetaTileEntity; + return true; + } + return false; + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + transformed = aNBT.getBoolean("transformed"); + if (aNBT.hasKey("hotName", Constants.NBT.TAG_STRING)) { + String loadedHotName = aNBT.getString("hotName"); + Fluid hotFluid = FluidRegistry.getFluid(loadedHotName); + if (hotFluid != null) { + hotName = loadedHotName; + tRunningRecipe = (ExtremeHeatExchangerRecipe) GoodGeneratorRecipeMaps.extremeHeatExchangerFuels + .getBackend() + .findFuel(hotFluid); + } + } else { + hotName = null; + tRunningRecipe = null; + } + super.loadNBTData(aNBT); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + aNBT.setBoolean("transformed", transformed); + if (hotName != null) aNBT.setString("hotName", hotName); + super.saveNBTData(aNBT); + } + + @Override + public RecipeMap getRecipeMap() { + return GoodGeneratorRecipeMaps.extremeHeatExchangerFuels; + } + + @Override + protected void clearHatches_EM() { + super.clearHatches_EM(); + mCooledFluidHatch = null; + mHotFluidHatch = null; + } + + @Override + public boolean checkMachine_EM(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + this.casingAmount = 0; + return structureCheck_EM(mName, 2, 5, 0) && mMaintenanceHatches.size() == 1 && casingAmount >= 25; + } + + @Override + protected GT_Multiblock_Tooltip_Builder createTooltip() { + final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); + tt.addMachineType("Heat Exchanger/Plasma Heat Exchanger") + .addInfo("Controller block for the Extreme Heat Exchanger.") + .addInfo("Accept Hot fluid like lava, hot coolant or plasma.") + .addInfo("Output SC Steam/SH Steam/Steam.") + .addInfo("Check NEI for more info.") + .addInfo(BLUE_PRINT_INFO) + .addSeparator() + .addController("Front botto