diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaVacuumFreezer.java b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaVacuumFreezer.java index 0a2464de5e7..5551de0e401 100644 --- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaVacuumFreezer.java +++ b/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaVacuumFreezer.java @@ -26,12 +26,20 @@ import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages; import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Optional; + +import javax.annotation.Nonnull; + import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; import com.github.bartimaeusnek.bartworks.common.configs.ConfigHandler; import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; @@ -40,15 +48,22 @@ import com.gtnewhorizon.structurelib.structure.StructureDefinition; import gregtech.api.GregTech_API; +import gregtech.api.enums.Materials; +import gregtech.api.enums.MaterialsUEVplus; import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.metatileentity.IMetaTileEntity; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.logic.ProcessingLogic; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_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_OverclockCalculator; +import gregtech.api.util.GT_Recipe; import gregtech.api.util.GT_Utility; +import gregtech.api.util.shutdown.ShutDownReasonRegistry; +import gregtech.common.blocks.GT_Block_Casings_Abstract; public class GT_TileEntity_MegaVacuumFreezer extends GT_TileEntity_MegaMultiBlockBase implements ISurvivalConstructable { @@ -66,70 +81,153 @@ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { return new GT_TileEntity_MegaVacuumFreezer(this.mName); } - private int mCasing = 0; + private int mCasingFrostProof = 0; + private int mTier = 1; + + private static class SubspaceCoolingFluid { + + public Materials material; + public int perfectOverclocks; + // Consumption per second of runtime + public long amount; + + public SubspaceCoolingFluid(Materials material, int perfectOverclocks, long amount) { + this.material = material; + this.perfectOverclocks = perfectOverclocks; + this.amount = amount; + } + + public FluidStack getStack() { + FluidStack stack = material.getFluid(amount); + // FUCK THIS FUCK THIS FUCK THIS + if (stack == null) { + return material.getMolten(amount); + } + return stack; + } + } + + private static final ArrayList SUBSPACE_COOLING_FLUIDS = new ArrayList<>( + Arrays.asList( + new SubspaceCoolingFluid(MaterialsUEVplus.SpaceTime, 1, 7500), + new SubspaceCoolingFluid(MaterialsUEVplus.Space, 2, 5000), + new SubspaceCoolingFluid(MaterialsUEVplus.Eternity, 3, 2500))); + + private SubspaceCoolingFluid currentCoolingFluid = null; private static final int CASING_INDEX = 17; + private static final int CASING_INDEX_T2 = ((GT_Block_Casings_Abstract) GregTech_API.sBlockCasings8) + .getTextureIndex(14); private static final String STRUCTURE_PIECE_MAIN = "main"; + private static final String STRUCTURE_PIECE_MAIN_T2 = "main_t2"; + + private static final String[][] structure = transpose( + new String[][] { + { "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", + "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", + "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "AAAAAAAAAAAAAAA" }, + { "AAAAAAA~AAAAAAA", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", + "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", + "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAA" } }); + private static final String[][] structure_tier2 = new String[][] { + { "AAAAAAAAAAAAAAA", "ABBBBBBBBBBBBBA", "ABAAAAAAAAAAABA", "ABABBBBBBBBBABA", "ABABAAAAAAABABA", + "ABABABBBBBABABA", "ABABABAAABABABA", "ABABABA~ABABABA", "ABABABAAABABABA", "ABABABBBBBABABA", + "ABABAAAAAAABABA", "ABABBBBBBBBBABA", "ABAAAAAAAAAAABA", "ABBBBBBBBBBBBBA", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "B B", "B B", "B B", "B B", + "B B", "B B", "B B", "B B", "B B", + "B B", "B B", "B B", "B B", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "B B", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "B B", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "B B", "A A", "B B", "B B", + "B B", "B B", "B B", "B B", "B B", + "B B", "B B", "A A", "B B", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "B B", "A A", "B B", "A A", + "A A", "A A", "A A", "A A", "A A", + "A A", "B B", "A A", "B B", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "B B", "A A", "B B", "A A", + "B B", "B B", "B B", "B B", "B B", + "A A", "B B", "A A", "B B", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "B B", "A A", "B B", "A A", + "B B", "A A", "A A", "A A", "B B", + "A A", "B B", "A A", "B B", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "B B", "A A", "B B", "A A", + "B B", "A A", "A A", "A A", "B B", + "A A", "B B", "A A", "B B", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "B B", "A A", "B B", "A A", + "B B", "A A", "A A", "A A", "B B", + "A A", "B B", "A A", "B B", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "B B", "A A", "B B", "A A", + "B B", "B B", "B B", "B B", "B B", + "A A", "B B", "A A", "B B", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "B B", "A A", "B B", "A A", + "A A", "A A", "A A", "A A", "A A", + "A A", "B B", "A A", "B B", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "B B", "A A", "B B", "B B", + "B B", "B B", "B B", "B B", "B B", + "B B", "B B", "A A", "B B", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "B B", "A A", "A A", "A A", + "A A", "A A", "A A", "A A", "A A", + "A A", "A A", "A A", "B B", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "B B", "B B", "B B", "B B", + "B B", "B B", "B B", "B B", "B B", + "B B", "B B", "B B", "B B", "AAAAAAAAAAAAAAA" }, + { "AAAAAAAAAAAAAAA", "ABBBBBBBBBBBBBA", "ABAAAAAAAAAAABA", "ABABBBBBBBBBABA", "ABABAAAAAAABABA", + "ABABABBBBBABABA", "ABABABAAABABABA", "ABABABAAABABABA", "ABABABAAABABABA", "ABABABBBBBABABA", + "ABABAAAAAAABABA", "ABABBBBBBBBBABA", "ABAAAAAAAAAAABA", "ABBBBBBBBBBBBBA", "AAAAAAAAAAAAAAA" } }; + private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition .builder() - .addShape( - STRUCTURE_PIECE_MAIN, - transpose( - new String[][] { - { "ccccccccccccccc", "ccccccccccccccc", "ccccccccccccccc", "ccccccccccccccc", "ccccccccccccccc", - "ccccccccccccccc", "ccccccccccccccc", "ccccccccccccccc", "ccccccccccccccc", "ccccccccccccccc", - "ccccccccccccccc", "ccccccccccccccc", "ccccccccccccccc", "ccccccccccccccc", "ccccccccccccccc" }, - { "ccccccccccccccc", "c=============c", "c=============c", "c=============c", "c=============c", - "c=============c", "c=============c", "c=============c", "c=============c", "c=============c", - "c=============c", "c=============c", "c=============c", "c=============c", "ccccccccccccccc" }, - { "ccccccccccccccc", "c=============c", "c=============c", "c=============c", "c=============c", - "c=============c", "c=============c", "c=============c", "c=============c", "c=============c", - "c=============c", "c=============c", "c=============c", "c=============c", "ccccccccccccccc" }, - { "ccccccccccccccc", "c=============c", "c=============c", "c=============c", "c=============c", - "c=============c", "c=============c", "c=============c", "c=============c", "c=============c", - "c=============c", "c=============c", "c=============c", "c=============c", "ccccccccccccccc" }, - { "ccccccccccccccc", "c=============c", "c=============c", "c=============c", "c=============c", - "c=============c", "c=============c", "c=============c", "c=============c", "c=============c", - "c=============c", "c=============c", "c=============c", "c=============c", "ccccccccccccccc" }, - { "ccccccccccccccc", "c=============c", "c=============c", "c=============c", "c=============c", - "c=============c", "c=============c", "c=============c", "c=============c", "c=============c", - "c=============c", "c=============c", "c=============c", "c=============c", "ccccccccccccccc" }, - { "ccccccccccccccc", "c=============c", "c=============c", "c=============c", "c=============c", - "c=============c", "c=============c", "c=============c", "c=============c", "c=============c", - "c=============c", "c=============c", "c=============c", "c=============c", "ccccccccccccccc" }, - { "ccccccc~ccccccc", "c=============c", "c=============c", "c=============c", "c=============c", - "c=============c", "c=============c", "c=============c", "c=============c", "c=============c", - "c=============c", "c=============c", "c=============c", "c=============c", "ccccccccccccccc" }, - { "ccccccccccccccc", "c=============c", "c=============c", "c=============c", "c=============c", - "c=============c", "c=============c", "c=============c", "c=============c", "c=============c", - "c=============c", "c=============c", "c=============c", "c=============c", "ccccccccccccccc" }, - { "ccccccccccccccc", "c=============c", "c=============c", "c=============c", "c=============c", - "c=============c", "c=============c", "c=============c", "c=============c", "c=============c", - "c=============c", "c=============c", "c=============c", "c=============c", "ccccccccccccccc" }, - { "ccccccccccccccc", "c=============c", "c=============c", "c=============c", "c=============c", - "c=============c", "c=============c", "c=============c", "c=============c", "c=============c", - "c=============c", "c=============c", "c=============c", "c=============c", "ccccccccccccccc" }, - { "ccccccccccccccc", "c=============c", "c=============c", "c=============c", "c=============c", - "c=============c", "c=============c", "c=============c", "c=============c", "c=============c", - "c=============c", "c=============c", "c=============c", "c=============c", "ccccccccccccccc" }, - { "ccccccccccccccc", "c=============c", "c=============c", "c=============c", "c=============c", - "c=============c", "c=============c", "c=============c", "c=============c", "c=============c", - "c=============c", "c=============c", "c=============c", "c=============c", "ccccccccccccccc" }, - { "ccccccccccccccc", "c=============c", "c=============c", "c=============c", "c=============c", - "c=============c", "c=============c", "c=============c", "c=============c", "c=============c", - "c=============c", "c=============c", "c=============c", "c=============c", "ccccccccccccccc" }, - { "ccccccccccccccc", "ccccccccccccccc", "ccccccccccccccc", "ccccccccccccccc", "ccccccccccccccc", - "ccccccccccccccc", "ccccccccccccccc", "ccccccccccccccc", "ccccccccccccccc", "ccccccccccccccc", - "ccccccccccccccc", "ccccccccccccccc", "ccccccccccccccc", "ccccccccccccccc", - "ccccccccccccccc" } })) - .addElement('=', StructureElementAirNoHint.getInstance()) + .addShape(STRUCTURE_PIECE_MAIN, structure) + .addShape(STRUCTURE_PIECE_MAIN_T2, structure_tier2) .addElement( - 'c', + 'A', buildHatchAdder(GT_TileEntity_MegaVacuumFreezer.class) .atLeast(Energy.or(ExoticEnergy), InputHatch, InputBus, OutputHatch, OutputBus, Maintenance) .casingIndex(CASING_INDEX) .dot(1) - .buildAndChain(onElementPass(x -> x.mCasing++, ofBlock(GregTech_API.sBlockCasings2, 1)))) + .buildAndChain(onElementPass(x -> x.mCasingFrostProof++, ofBlock(GregTech_API.sBlockCasings2, 1)))) + // Infinity Cooled Casing + .addElement('B', ofBlock(GregTech_API.sBlockCasings8, 14)) .build(); @Override @@ -139,15 +237,92 @@ protected GT_Multiblock_Tooltip_Builder createTooltip() { .addInfo("Controller Block for the Mega Vacuum Freezer") .addInfo("Cools hot ingots and cells") .addSeparator() + .addInfo("Upgrade to Tier 2 to unlock " + EnumChatFormatting.LIGHT_PURPLE + "Subspace Cooling.") + .addInfo( + "To activate " + EnumChatFormatting.LIGHT_PURPLE + + "Subspace Cooling " + + EnumChatFormatting.GRAY + + "supply a coolant while running recipes.") + .addInfo( + EnumChatFormatting.RED + "7500 L/s " + + EnumChatFormatting.DARK_PURPLE + + "Molten SpaceTime" + + EnumChatFormatting.GRAY + + ": " + + EnumChatFormatting.RED + + "1" + + EnumChatFormatting.GRAY + + " perfect overclock.") + .addInfo( + EnumChatFormatting.RED + "5000 L/s " + + EnumChatFormatting.DARK_PURPLE + + "Spatially Enlarged Fluid" + + EnumChatFormatting.GRAY + + ": " + + EnumChatFormatting.RED + + "2" + + EnumChatFormatting.GRAY + + " perfect overclocks.") + .addInfo( + EnumChatFormatting.RED + "2500 L/s " + + EnumChatFormatting.DARK_PURPLE + + "Molten Eternity" + + EnumChatFormatting.GRAY + + ": " + + EnumChatFormatting.RED + + "3" + + EnumChatFormatting.GRAY + + " perfect overclocks.") + .addSeparator() + .addInfo( + EnumChatFormatting.LIGHT_PURPLE + "Reinforcing the structure allows the injection of exotic coolants,") + .addInfo( + EnumChatFormatting.LIGHT_PURPLE + + "enabling the capture of heat energy in miniature tears in spacetime,") + .addInfo(EnumChatFormatting.LIGHT_PURPLE + "massively increasing the efficiency of the cooling process.") + .addSeparator() .beginStructureBlock(15, 15, 15, true) .addController("Front center") - .addCasingInfoMin("Frost Proof Machine Casing", 900, false) - .addEnergyHatch("Any casing", 1) - .addMaintenanceHatch("Any casing", 1) - .addInputHatch("Any casing", 1) - .addOutputHatch("Any casing", 1) - .addInputBus("Any casing", 1) - .addOutputBus("Any casing", 1) + .addEnergyHatch("Any Frost Proof Machine Casing", 1) + .addMaintenanceHatch("Any Frost Proof Machine Casing", 1) + .addInputHatch("Any Frost Proof Machine Casing", 1) + .addOutputHatch("Any Frost Proof Machine Casing", 1) + .addInputBus("Any Frost Proof Machine Casing", 1) + .addOutputBus("Any Frost Proof Machine Casing", 1) + .addStructureInfo( + EnumChatFormatting.BLUE + "Base Multi (Tier " + + EnumChatFormatting.DARK_PURPLE + + 1 + + EnumChatFormatting.BLUE + + "):") + .addCasingInfoMinColored( + "Frost Proof Machine Casing", + EnumChatFormatting.GRAY, + 800, + EnumChatFormatting.GOLD, + false) + .addStructureInfo( + EnumChatFormatting.BLUE + "Tier " + + EnumChatFormatting.DARK_PURPLE + + 2 + + EnumChatFormatting.BLUE + + " (Upgrades from Tier " + + EnumChatFormatting.DARK_PURPLE + + 1 + + EnumChatFormatting.BLUE + + "):") + .addCasingInfoMinColored( + "Frost Proof Machine Casing", + EnumChatFormatting.GRAY, + 800, + EnumChatFormatting.GOLD, + false) + .addCasingInfoExactlyColored( + "Infinity Cooled Casing", + EnumChatFormatting.GRAY, + 384, + EnumChatFormatting.GOLD, + false) .toolTipFinisher(MULTIBLOCK_ADDED_BY_BARTWORKS); return tt; } @@ -159,15 +334,33 @@ public IStructureDefinition getStructureDefinit @Override public void construct(ItemStack aStack, boolean aHintsOnly) { - this.buildPiece(STRUCTURE_PIECE_MAIN, aStack, aHintsOnly, 7, 7, 0); + if (aStack.stackSize == 1) { + this.buildPiece(STRUCTURE_PIECE_MAIN, aStack, aHintsOnly, 7, 7, 0); + } else { + this.buildPiece(STRUCTURE_PIECE_MAIN_T2, aStack, aHintsOnly, 7, 7, 0); + } } @Override public int survivalConstruct(ItemStack stackSize, int elementBudget, IItemSource source, EntityPlayerMP actor) { if (this.mMachine) return -1; int realBudget = elementBudget >= 200 ? elementBudget : Math.min(200, elementBudget * 5); - return this - .survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 7, 7, 0, realBudget, source, actor, false, true); + if (stackSize.stackSize == 1) { + return this + .survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 7, 7, 0, realBudget, source, actor, false, true); + } else { + return this.survivialBuildPiece( + STRUCTURE_PIECE_MAIN_T2, + stackSize, + 7, + 7, + 0, + realBudget, + source, + actor, + false, + true); + } } @Override @@ -183,6 +376,11 @@ public void loadNBTData(NBTTagCompound aNBT) { } } + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + } + @Override public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer, float aX, float aY, float aZ) { @@ -198,18 +396,80 @@ public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrench return false; } + public SubspaceCoolingFluid findSubspaceCoolingFluid() { + // Loop over all hatches and find the first match with a valid fluid + for (GT_MetaTileEntity_Hatch_Input hatch : mInputHatches) { + Optional fluid = SUBSPACE_COOLING_FLUIDS.stream() + .filter(candidate -> drain(hatch, candidate.getStack(), false)) + .findFirst(); + if (fluid.isPresent()) return fluid.get(); + } + return null; + } + @Override protected ProcessingLogic createProcessingLogic() { - return new ProcessingLogic().setMaxParallel(ConfigHandler.megaMachinesMax); + return new ProcessingLogic() { + + @Nonnull + @Override + protected GT_OverclockCalculator createOverclockCalculator(@Nonnull GT_Recipe recipe) { + // Check if the freezer is T2 + if (mTier == 1) return super.createOverclockCalculator(recipe); + + // First try to detect the current fluid used for subspace cooling. + currentCoolingFluid = findSubspaceCoolingFluid(); + + return super.createOverclockCalculator(recipe) + .setMachineHeat(currentCoolingFluid == null ? 0 : currentCoolingFluid.perfectOverclocks * 1800) + .setRecipeHeat(0) + .setHeatOC(true) + .setHeatDiscount(false); + } + }.setMaxParallel(ConfigHandler.megaMachinesMax); + } + + @Override + protected void runMachine(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.runMachine(aBaseMetaTileEntity, aTick); + // Every second while running, consume subspace coolant fluid + if (mMaxProgresstime > 0 && aTick % 20 == 0) { + // Subspace cooling only allowed for T2 freezer + if (mTier == 2) { + // Try to drain the coolant fluid if it exists. If failed, stop the machine with an error + if (this.currentCoolingFluid != null) { + FluidStack fluid = this.currentCoolingFluid.getStack(); + for (GT_MetaTileEntity_Hatch_Input hatch : mInputHatches) { + if (drain(hatch, fluid, false)) { + drain(hatch, fluid, true); + return; + } + } + // If we exited this loop without returning from the function, no matching fluid was found, so + // stop the machine - we ran out of coolant + stopMachine(ShutDownReasonRegistry.outOfFluid(fluid)); + } + } + } } // -------------- TEC TECH COMPAT ---------------- @Override public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - this.mCasing = 0; - if (!this.checkPiece(STRUCTURE_PIECE_MAIN, 7, 7, 0)) return false; - return this.mMaintenanceHatches.size() == 1 && this.mCasing >= 900; + this.mCasingFrostProof = 0; + this.mTier = 1; + // If check for T1 fails, also do a check for T2 structure + if (!this.checkPiece(STRUCTURE_PIECE_MAIN, 7, 7, 0)) { + // Reset mCasing in between checks, so they don't count again + this.mCasingFrostProof = 0; + if (!this.checkPiece(STRUCTURE_PIECE_MAIN_T2, 7, 7, 0)) { + return false; + } + // Structure is Tier 2 + this.mTier = 2; + } + return this.mMaintenanceHatches.size() == 1 && this.mCasingFrostProof >= 800; } @Override @@ -244,6 +504,25 @@ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirec return rTexture; } + @Override + public String[] getInfoData() { + ArrayList info = new ArrayList<>(Arrays.asList(super.getInfoData())); + info.add("Tier: " + mTier); + if (mTier == 2) { + if (currentCoolingFluid != null) { + info.add( + "Subspace cooling: " + EnumChatFormatting.GREEN + + "Active (" + + currentCoolingFluid.getStack() + .getLocalizedName() + + ")"); + } else { + info.add("Subspace cooling: " + EnumChatFormatting.RED + "Inactive"); + } + } + return info.toArray(new String[] {}); + } + @Override public boolean supportsBatchMode() { return true;