Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix the cleanroom multiblock overriding the cleanroom provider set by cleaning hatches. #2706

Merged
merged 4 commits into from
Feb 1, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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