From b9e8b4962662a7df97922e0cbebeaa4f3fedc7de Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Fri, 31 Jan 2025 22:42:41 -0500 Subject: [PATCH] Fix the cleanroom multiblock overriding the cleanroom provider set by cleaning hatches. (#2706) --- .../WorkableTieredMetaTileEntity.java | 8 ++++++- .../multiblock/DummyCleanroom.java | 7 +++++++ .../multiblock/ICleanroomProvider.java | 9 ++++++++ .../multiblock/ICleanroomReceiver.java | 9 +++++++- .../RecipeMapMultiblockController.java | 12 +++++++++-- .../electric/MetaTileEntityCleanroom.java | 6 +++++- .../MetaTileEntityProcessingArray.java | 21 ++++++++++++++----- ...etaTileEntityCleaningMaintenanceHatch.java | 5 ++--- 8 files changed, 64 insertions(+), 13 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/WorkableTieredMetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/WorkableTieredMetaTileEntity.java index 5e648be0f60..88651b9e9cc 100644 --- a/src/main/java/gregtech/api/metatileentity/WorkableTieredMetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/WorkableTieredMetaTileEntity.java @@ -47,6 +47,7 @@ public abstract class WorkableTieredMetaTileEntity extends TieredMetaTileEntity public final boolean handlesRecipeOutputs; + @Nullable private ICleanroomProvider cleanroom; public WorkableTieredMetaTileEntity(ResourceLocation metaTileEntityId, RecipeMap recipeMap, @@ -210,7 +211,12 @@ public ICleanroomProvider getCleanroom() { } @Override - public void setCleanroom(ICleanroomProvider provider) { + public void setCleanroom(@NotNull ICleanroomProvider provider) { this.cleanroom = provider; } + + @Override + public void unsetCleanroom() { + this.cleanroom = null; + } } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/DummyCleanroom.java b/src/main/java/gregtech/api/metatileentity/multiblock/DummyCleanroom.java index 6b51624ed4c..eba7d877af3 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/DummyCleanroom.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/DummyCleanroom.java @@ -64,4 +64,11 @@ public void setCleanAmount(int amount) {} @Override public void adjustCleanAmount(int amount) {} + + // Have a higher priority than the cleanroom multiblock (which doesn't override getPriority so it'll return 0) + // doesn't replace the set cleanroom in multiblocks. + @Override + public int getPriority() { + return Integer.MAX_VALUE; + } } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ICleanroomProvider.java b/src/main/java/gregtech/api/metatileentity/multiblock/ICleanroomProvider.java index ea9c6a65324..39f223bee38 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ICleanroomProvider.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ICleanroomProvider.java @@ -49,4 +49,13 @@ public interface ICleanroomProvider { * @return the tier {@link gregtech.api.GTValues#V} of energy the cleanroom uses at minimum */ int getEnergyTier(); + + /** + * Get the priority of this cleanroom provider to determine which should be used. + * + * @return the priority this cleanroom provider should have over other cleanrooms. + */ + default int getPriority() { + return 0; + } } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ICleanroomReceiver.java b/src/main/java/gregtech/api/metatileentity/multiblock/ICleanroomReceiver.java index af729726b23..c6bfa155936 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ICleanroomReceiver.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ICleanroomReceiver.java @@ -1,5 +1,6 @@ package gregtech.api.metatileentity.multiblock; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** @@ -19,5 +20,11 @@ public interface ICleanroomReceiver { * * @param provider the cleanroom to assign to this machine */ - void setCleanroom(ICleanroomProvider provider); + void setCleanroom(@NotNull ICleanroomProvider provider); + + /** + * Set the receiver's reference to null. Use instead of passing {@code null} to + * {@link ICleanroomReceiver#setCleanroom(ICleanroomProvider)} + */ + void unsetCleanroom(); } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java index 4949074c91a..06032732857 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java @@ -51,6 +51,7 @@ public abstract class RecipeMapMultiblockController extends MultiblockWithDispla private boolean isDistinct = false; + @Nullable private ICleanroomProvider cleanroom; public RecipeMapMultiblockController(ResourceLocation metaTileEntityId, RecipeMap recipeMap) { @@ -320,7 +321,14 @@ public ICleanroomProvider getCleanroom() { } @Override - public void setCleanroom(ICleanroomProvider provider) { - this.cleanroom = provider; + public void setCleanroom(@NotNull ICleanroomProvider provider) { + if (cleanroom == null || provider.getPriority() > cleanroom.getPriority()) { + this.cleanroom = provider; + } + } + + @Override + public void unsetCleanroom() { + this.cleanroom = null; } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java index 22c6909ca35..99f1d89726e 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java @@ -150,7 +150,11 @@ public void invalidateStructure() { resetTileAbilities(); this.cleanroomLogic.invalidate(); this.cleanAmount = MIN_CLEAN_AMOUNT; - cleanroomReceivers.forEach(receiver -> receiver.setCleanroom(null)); + cleanroomReceivers.forEach(receiver -> { + if (receiver.getCleanroom() == this) { + receiver.unsetCleanroom(); + } + }); cleanroomReceivers.clear(); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java index 4759bb1dec7..0a06b0fb546 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java @@ -239,13 +239,20 @@ public int getItemOutputLimit() { } @Override - public void setCleanroom(ICleanroomProvider provider) { + public void setCleanroom(@NotNull ICleanroomProvider provider) { super.setCleanroom(provider); // Sync Cleanroom Change to Internal Workable MTE ((ProcessingArrayWorkable) this.recipeMapWorkable).updateCleanroom(); } + @Override + public void unsetCleanroom() { + super.unsetCleanroom(); + + ((ProcessingArrayWorkable) this.recipeMapWorkable).updateCleanroom(); + } + @SuppressWarnings("InnerClassMayBeStatic") protected class ProcessingArrayWorkable extends MultiblockRecipeLogic { @@ -269,8 +276,8 @@ public void invalidate() { super.invalidate(); // invalidate mte's cleanroom reference - if (mte != null && mte instanceof ICleanroomReceiver) { - ((ICleanroomReceiver) mte).setCleanroom(null); + if (mte != null && mte instanceof ICleanroomReceiver cleanroomMTE) { + cleanroomMTE.unsetCleanroom(); } // Reset locally cached variables upon invalidation @@ -284,7 +291,7 @@ public void invalidate() { /** * Checks if a provided Recipe Map is valid to be used in the processing array - * Will filter out anything in the config blacklist, and also any non-singleblock machines + * Will filter out anything in the config blacklist, and also any non-single block machines * * @param recipeMap The recipeMap to check * @return {@code true} if the provided recipeMap is valid for use @@ -360,7 +367,11 @@ private void updateCleanroom() { receiver.setCleanroom(DUMMY_CLEANROOM); } else { ICleanroomProvider provider = ((RecipeMapMultiblockController) metaTileEntity).getCleanroom(); - if (provider != null) receiver.setCleanroom(provider); + if (provider == null) { + receiver.unsetCleanroom(); + } else { + receiver.setCleanroom(provider); + } } } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityCleaningMaintenanceHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityCleaningMaintenanceHatch.java index c7e24cb6649..5996b8ab11f 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityCleaningMaintenanceHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityCleaningMaintenanceHatch.java @@ -52,9 +52,8 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity tileEntity) { @Override public void addToMultiBlock(MultiblockControllerBase controllerBase) { super.addToMultiBlock(controllerBase); - if (controllerBase instanceof ICleanroomReceiver && - ((ICleanroomReceiver) controllerBase).getCleanroom() == null) { - ((ICleanroomReceiver) controllerBase).setCleanroom(DUMMY_CLEANROOM); + if (controllerBase instanceof ICleanroomReceiver cleanroomReceiver) { + cleanroomReceiver.setCleanroom(DUMMY_CLEANROOM); } }