Skip to content

Commit

Permalink
Fix the cleanroom multiblock overriding the cleanroom provider set by…
Browse files Browse the repository at this point in the history
… cleaning hatches. (#2706)
  • Loading branch information
Zorbatron authored Feb 1, 2025
1 parent 219277e commit b9e8b49
Show file tree
Hide file tree
Showing 8 changed files with 64 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ public abstract class WorkableTieredMetaTileEntity extends TieredMetaTileEntity

public final boolean handlesRecipeOutputs;

@Nullable
private ICleanroomProvider cleanroom;

public WorkableTieredMetaTileEntity(ResourceLocation metaTileEntityId, RecipeMap<?> recipeMap,
Expand Down Expand Up @@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package gregtech.api.metatileentity.multiblock;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

/**
Expand All @@ -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();
}
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ public abstract class RecipeMapMultiblockController extends MultiblockWithDispla

private boolean isDistinct = false;

@Nullable
private ICleanroomProvider cleanroom;

public RecipeMapMultiblockController(ResourceLocation metaTileEntityId, RecipeMap<?> recipeMap) {
Expand Down Expand Up @@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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);
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}

Expand Down

0 comments on commit b9e8b49

Please sign in to comment.