Skip to content

Commit 2ab30f3

Browse files
pass handlers around instead of a boolean
1 parent 2c43ee7 commit 2ab30f3

10 files changed

Lines changed: 95 additions & 32 deletions

File tree

src/main/java/gregtech/api/capability/INotifiableHandler.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ public interface INotifiableHandler {
1515
* @param isExport boolean specifying if a handler is an output handler
1616
*/
1717

18-
default void notifyMetaTileEntityOfChange(MetaTileEntity metaTileEntity, boolean isExport) {
18+
default <T> void addToNotifiedList(MetaTileEntity metaTileEntity, T handler, boolean isExport) {
1919
if (metaTileEntity != null && metaTileEntity.isValid()) {
20-
if (isExport) metaTileEntity.setOutputsDirty(true);
21-
else metaTileEntity.setInputsDirty(true);
20+
if (isExport) metaTileEntity.addNotifiedOutput(handler);
21+
else metaTileEntity.addNotifiedInput(handler);
2222
}
2323
}
2424

src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -130,19 +130,30 @@ protected boolean shouldSearchForRecipes() {
130130
return canWorkWithInputs() && canFitNewOutputs();
131131
}
132132

133+
protected boolean hasNotifiedInputs() {
134+
return (metaTileEntity.getNotifiedItemInputList().size() > 0 ||
135+
metaTileEntity.getNotifiedFluidInputList().size() > 0);
136+
}
137+
138+
protected boolean hasNotifiedOutputs() {
139+
return (metaTileEntity.getNotifiedItemOutputList().size() > 0 ||
140+
metaTileEntity.getNotifiedFluidOutputList().size() > 0);
141+
}
142+
133143
protected boolean canFitNewOutputs() {
134144
// if the output is full check if the output changed so we can process recipes results again.
135-
if (this.isOutputsFull && !metaTileEntity.isOutputsDirty()) return false;
145+
if (this.isOutputsFull && !hasNotifiedOutputs()) return false;
136146
else {
137147
this.isOutputsFull = false;
138-
metaTileEntity.setOutputsDirty(false);
148+
metaTileEntity.removeNotifiedOutput(getOutputInventory());
149+
metaTileEntity.removeNotifiedOutput(getOutputTank());
139150
}
140151
return true;
141152
}
142153

143154
protected boolean canWorkWithInputs() {
144155
// if the inputs were bad last time, check if they've changed before trying to find a new recipe.
145-
if (this.invalidInputsForRecipes && !metaTileEntity.isInputsDirty()) return false;
156+
if (this.invalidInputsForRecipes && !hasNotifiedInputs()) return false;
146157
else {
147158
this.invalidInputsForRecipes = false;
148159
}
@@ -198,7 +209,8 @@ protected void trySearchNewRecipe() {
198209
if (currentRecipe != null && setupAndConsumeRecipeInputs(currentRecipe))
199210
setupRecipe(currentRecipe);
200211
// Inputs have been inspected.
201-
metaTileEntity.setInputsDirty(false);
212+
metaTileEntity.removeNotifiedInput(importInventory);
213+
metaTileEntity.removeNotifiedInput(importFluids);
202214
}
203215

204216
public void forceRecipeRecheck() {
@@ -221,12 +233,12 @@ protected Recipe findRecipe(long maxVoltage, IItemHandlerModifiable inputs, IMul
221233
}
222234

223235
/**
224-
* @deprecated Use {@link MetaTileEntity#isInputsDirty() } instead
236+
* @deprecated Use {@link #hasNotifiedInputs() } instead
225237
* Left here for binary compatibility purposes
226238
*/
227239
@Deprecated
228240
protected boolean checkRecipeInputsDirty(IItemHandler inputs, IMultipleTankHandler fluidInputs) {
229-
return this.getMetaTileEntity().isInputsDirty();
241+
return this.hasNotifiedInputs();
230242
}
231243

232244
protected static boolean areItemStacksEqual(ItemStack stackA, ItemStack stackB) {
@@ -369,7 +381,7 @@ protected void setActive(boolean active) {
369381
this.isActive = active;
370382
metaTileEntity.markDirty();
371383
World world = metaTileEntity.getWorld();
372-
if (world != null && world.isRemote) {
384+
if (world != null && !world.isRemote) {
373385
writeCustomData(1, buf -> buf.writeBoolean(active));
374386
}
375387
}

src/main/java/gregtech/api/capability/impl/MultiblockRecipeLogic.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,18 @@ protected boolean setupAndConsumeRecipeInputs(Recipe recipe) {
6060
} else return false;
6161
}
6262

63+
@Override
64+
protected boolean hasNotifiedInputs() {
65+
return (metaTileEntity.getNotifiedItemInputList().size() > 0 ||
66+
metaTileEntity.getNotifiedFluidInputList().size() > 0);
67+
}
68+
69+
@Override
70+
protected boolean hasNotifiedOutputs() {
71+
return (metaTileEntity.getNotifiedItemOutputList().size() > 0 ||
72+
metaTileEntity.getNotifiedFluidOutputList().size() > 0);
73+
}
74+
6375
@Override
6476
protected long getEnergyStored() {
6577
return getEnergyContainer().getEnergyStored();

src/main/java/gregtech/api/capability/impl/NotifiableFilteredFluidHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public NotifiableFilteredFluidHandler(int capacity, MetaTileEntity entityToNotif
1717
@Override
1818
protected void onContentsChanged() {
1919
super.onContentsChanged();
20-
notifyMetaTileEntityOfChange(notifiableEntity, isExport);
20+
addToNotifiedList(notifiableEntity, this, isExport);
2121
}
2222

2323
@Override

src/main/java/gregtech/api/capability/impl/NotifiableFluidTank.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public NotifiableFluidTank(int capacity, MetaTileEntity entityToNotify, boolean
1818
@Override
1919
protected void onContentsChanged() {
2020
super.onContentsChanged();
21-
notifyMetaTileEntityOfChange(notifiableEntity, isExport);
21+
addToNotifiedList(notifiableEntity, this, isExport);
2222
}
2323

2424
@Override

src/main/java/gregtech/api/capability/impl/NotifiableItemStackHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public NotifiableItemStackHandler(int slots, MetaTileEntity entityToNotify, bool
1919
@Override
2020
public void onContentsChanged(int slot) {
2121
super.onContentsChanged(slot);
22-
notifyMetaTileEntityOfChange(notifiableEntity, isExport);
22+
addToNotifiedList(notifiableEntity, this, isExport);
2323
}
2424

2525
@Override

src/main/java/gregtech/api/metatileentity/MetaTileEntity.java

Lines changed: 53 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,7 @@
1212
import gregtech.api.GregTechAPI;
1313
import gregtech.api.capability.GregtechTileCapabilities;
1414
import gregtech.api.capability.IEnergyContainer;
15-
import gregtech.api.capability.impl.FluidHandlerProxy;
16-
import gregtech.api.capability.impl.FluidTankList;
17-
import gregtech.api.capability.impl.ItemHandlerProxy;
15+
import gregtech.api.capability.impl.*;
1816
import gregtech.api.cover.CoverBehavior;
1917
import gregtech.api.cover.CoverDefinition;
2018
import gregtech.api.cover.ICoverable;
@@ -42,6 +40,7 @@
4240
import net.minecraftforge.common.util.Constants.NBT;
4341
import net.minecraftforge.fluids.FluidActionResult;
4442
import net.minecraftforge.fluids.FluidStack;
43+
import net.minecraftforge.fluids.FluidTank;
4544
import net.minecraftforge.fluids.FluidUtil;
4645
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
4746
import net.minecraftforge.fluids.capability.IFluidHandler;
@@ -52,8 +51,7 @@
5251
import org.apache.commons.lang3.tuple.Pair;
5352

5453
import javax.annotation.Nullable;
55-
import java.util.ArrayList;
56-
import java.util.List;
54+
import java.util.*;
5755
import java.util.function.Consumer;
5856

5957
import static gregtech.api.util.InventoryUtils.simulateItemStackMerge;
@@ -90,8 +88,10 @@ public abstract class MetaTileEntity implements ICoverable {
9088
protected boolean isFragile = false;
9189

9290
private final CoverBehavior[] coverBehaviors = new CoverBehavior[6];
93-
protected boolean outputDirty;
94-
protected boolean inputDirty;
91+
protected List<IItemHandlerModifiable> notifiedItemOutputList = new ArrayList<>();
92+
protected List<IItemHandlerModifiable> notifiedItemInputList = new ArrayList<>();
93+
protected List<IFluidHandler> notifiedFluidInputList = new ArrayList<>();
94+
protected List<IFluidHandler> notifiedFluidOutputList = new ArrayList<>();
9595

9696
public MetaTileEntity(ResourceLocation metaTileEntityId) {
9797
this.metaTileEntityId = metaTileEntityId;
@@ -259,20 +259,42 @@ public final String getMetaFullName() {
259259
return getMetaName() + ".name";
260260
}
261261

262-
public void setInputsDirty(boolean dirty) {
263-
this.inputDirty = dirty;
262+
public <T> void addNotifiedInput (T input) {
263+
if (input instanceof IItemHandlerModifiable) {
264+
if (!notifiedItemInputList.contains(input)) {
265+
this.notifiedItemInputList.add((IItemHandlerModifiable) input);
266+
}
267+
} else if (input instanceof FluidTank) {
268+
if (!notifiedFluidInputList.contains(input)) {
269+
this.notifiedFluidInputList.add((FluidTank) input);
270+
}
271+
}
264272
}
265273

266-
public boolean isInputsDirty() {
267-
return this.inputDirty;
274+
public <T> void addNotifiedOutput (T output) {
275+
if (output instanceof IItemHandlerModifiable) {
276+
if (!notifiedItemOutputList.contains(output)) {
277+
this.notifiedItemOutputList.add((IItemHandlerModifiable) output);
278+
}
279+
} else if (output instanceof NotifiableFluidTank) {
280+
if (!notifiedFluidOutputList.contains(output)) {
281+
this.notifiedFluidOutputList.add((NotifiableFluidTank) output);
282+
}
283+
}
268284
}
269285

270-
public void setOutputsDirty(boolean dirty) {
271-
this.outputDirty = dirty;
286+
public <T> void removeNotifiedInput (T input) {
287+
if (input instanceof IItemHandlerModifiable)
288+
this.notifiedItemInputList.remove(input);
289+
else if (input instanceof FluidTank)
290+
this.notifiedFluidInputList.remove(input);
272291
}
273292

274-
public boolean isOutputsDirty() {
275-
return this.outputDirty;
293+
public <T> void removeNotifiedOutput (T input) {
294+
if (input instanceof IItemHandlerModifiable)
295+
this.notifiedItemOutputList.remove(input);
296+
else if (input instanceof FluidTank)
297+
this.notifiedFluidOutputList.remove(input);
276298
}
277299

278300
/**
@@ -1231,6 +1253,22 @@ public FluidTankList getExportFluids() {
12311253
return exportFluids;
12321254
}
12331255

1256+
public List<IItemHandlerModifiable> getNotifiedItemOutputList() {
1257+
return notifiedItemOutputList;
1258+
}
1259+
1260+
public List<IItemHandlerModifiable> getNotifiedItemInputList() {
1261+
return notifiedItemInputList;
1262+
}
1263+
1264+
public List<IFluidHandler> getNotifiedFluidInputList() {
1265+
return notifiedFluidInputList;
1266+
}
1267+
1268+
public List<IFluidHandler> getNotifiedFluidOutputList() {
1269+
return notifiedFluidOutputList;
1270+
}
1271+
12341272
public boolean isFragile() {
12351273
return isFragile;
12361274
}

src/main/java/gregtech/common/metatileentities/electric/multiblockpart/MetaTileEntityFluidHatch.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ else if (!isExportHatch && getImportFluids().getFluidTanks().get(0) instanceof N
117117
handler = (NotifiableFluidTank) getImportFluids().getFluidTanks().get(0);
118118
if (handler != null) {
119119
handler.setNotifiableMetaTileEntity(metaTileEntity);
120-
handler.notifyMetaTileEntityOfChange(this, isExportHatch);
120+
handler.addToNotifiedList(this, handler, isExportHatch);
121121
}
122122
}
123123

src/main/java/gregtech/common/metatileentities/electric/multiblockpart/MetaTileEntityItemBus.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ else if (!isExportHatch && getImportItems() instanceof NotifiableItemStackHandle
9696
handler = (NotifiableItemStackHandler) getImportItems();
9797
if (handler != null) {
9898
handler.setNotifiableMetaTileEntity(metaTileEntity);
99-
handler.notifyMetaTileEntityOfChange(this, isExportHatch);
99+
handler.addToNotifiedList(this, handler, isExportHatch);
100100
}
101101
}
102102

src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiFurnace.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ protected void trySearchNewRecipe() {
103103
//for MultiSmelter, we can reuse previous recipe if inputs didn't change
104104
//otherwise, we need to recompute it for new ingredients
105105
//but technically, it means we can cache multi smelter recipe, but changing inputs have more priority
106-
if (metaTileEntity.isInputsDirty() ||
106+
if (hasNotifiedInputs() ||
107107
previousRecipe == null ||
108108
!previousRecipe.matches(false,importInventory,importFluids)) {
109109
//Inputs changed, try searching new recipe for given inputs
@@ -119,7 +119,8 @@ protected void trySearchNewRecipe() {
119119
if (currentRecipe != null && setupAndConsumeRecipeInputs(currentRecipe))
120120
setupRecipe(currentRecipe);
121121
// Inputs have been inspected.
122-
metaTileEntity.setInputsDirty(false);
122+
metaTileEntity.getNotifiedItemInputList().clear();
123+
metaTileEntity.getNotifiedFluidOutputList().clear();
123124
}
124125

125126
@Override

0 commit comments

Comments
 (0)