Skip to content

Commit a5d6054

Browse files
committed
Refactor some notifiable stuff to try and unify it a little bit
1 parent 95e4050 commit a5d6054

File tree

8 files changed

+97
-86
lines changed

8 files changed

+97
-86
lines changed

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

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,15 @@
1212
import net.minecraftforge.items.IItemHandler;
1313
import net.minecraftforge.items.IItemHandlerModifiable;
1414

15+
import com.google.common.collect.ImmutableList;
1516
import org.jetbrains.annotations.NotNull;
1617

1718
import java.util.ArrayList;
19+
import java.util.Collection;
1820
import java.util.List;
1921

20-
public class DualHandler implements IItemHandlerModifiable, IMultipleTankHandler, INotifiableHandler {
22+
public class DualHandler implements IItemHandlerModifiable, IMultipleTankHandler, INotifiableHandler,
23+
IMultipleNotifiableHandler {
2124

2225
@NotNull
2326
private static final ItemStackHashStrategy strategy = ItemStackHashStrategy.comparingAll();
@@ -203,6 +206,25 @@ public void removeNotifiableMetaTileEntity(MetaTileEntity metaTileEntity) {
203206
return fluidDelegate;
204207
}
205208

209+
@Override
210+
public @NotNull Collection<INotifiableHandler> getBackingNotifiers() {
211+
ImmutableList.Builder<INotifiableHandler> handlerList = ImmutableList.builder();
212+
213+
if (itemDelegate instanceof IMultipleNotifiableHandler multipleNotifiableHandler) {
214+
handlerList.addAll(multipleNotifiableHandler.getBackingNotifiers());
215+
} else if (itemDelegate instanceof INotifiableHandler notifiableHandler) {
216+
handlerList.add(notifiableHandler);
217+
}
218+
219+
for (var tank : fluidDelegate) {
220+
if (tank instanceof INotifiableHandler notifiableHandler) {
221+
handlerList.add(notifiableHandler);
222+
}
223+
}
224+
225+
return handlerList.build();
226+
}
227+
206228
public static class DualEntry implements ITankEntry, INotifiableHandler {
207229

208230
@NotNull
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package gregtech.api.capability;
2+
3+
import org.jetbrains.annotations.NotNull;
4+
5+
import java.util.Collection;
6+
7+
public interface IMultipleNotifiableHandler {
8+
9+
@NotNull
10+
Collection<INotifiableHandler> getBackingNotifiers();
11+
}

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

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
package gregtech.api.capability.impl;
22

3+
import gregtech.api.capability.IMultipleNotifiableHandler;
4+
import gregtech.api.capability.INotifiableHandler;
5+
36
import net.minecraft.item.ItemStack;
47
import net.minecraftforge.items.IItemHandler;
58
import net.minecraftforge.items.IItemHandlerModifiable;
69

10+
import com.google.common.collect.ImmutableList;
711
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
812
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
913
import it.unimi.dsi.fastutil.objects.Object2IntArrayMap;
@@ -15,7 +19,7 @@
1519
/**
1620
* Efficiently delegates calls into multiple item handlers
1721
*/
18-
public class ItemHandlerList implements IItemHandlerModifiable {
22+
public class ItemHandlerList implements IItemHandlerModifiable, IMultipleNotifiableHandler {
1923

2024
private final Int2ObjectMap<IItemHandler> handlerBySlotIndex = new Int2ObjectOpenHashMap<>();
2125
private final Object2IntMap<IItemHandler> baseIndexOffset = new Object2IntArrayMap<>();
@@ -93,6 +97,19 @@ public Collection<IItemHandler> getBackingHandlers() {
9397
return Collections.unmodifiableCollection(baseIndexOffset.keySet());
9498
}
9599

100+
@Override
101+
public @NotNull Collection<INotifiableHandler> getBackingNotifiers() {
102+
ImmutableList.Builder<INotifiableHandler> notifiableHandlers = ImmutableList.builder();
103+
104+
for (var handler : getBackingHandlers()) {
105+
if (handler instanceof INotifiableHandler notifiableHandler) {
106+
notifiableHandlers.add(notifiableHandler);
107+
}
108+
}
109+
110+
return notifiableHandlers.build();
111+
}
112+
96113
private boolean invalidSlot(int slot) {
97114
return slot < 0 && slot >= this.getSlots();
98115
}

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import gregtech.api.capability.DualHandler;
55
import gregtech.api.capability.IEnergyContainer;
66
import gregtech.api.capability.IMultiblockController;
7+
import gregtech.api.capability.IMultipleNotifiableHandler;
78
import gregtech.api.capability.IMultipleRecipeMaps;
89
import gregtech.api.capability.IMultipleTankHandler;
910
import gregtech.api.metatileentity.multiblock.MultiblockAbility;
@@ -146,9 +147,9 @@ protected boolean canWorkWithInputs() {
146147
Iterator<IItemHandlerModifiable> invalidatedIter = invalidatedInputList.iterator();
147148
while (invalidatedIter.hasNext()) {
148149
IItemHandler invalidatedHandler = invalidatedIter.next();
149-
if (invalidatedHandler instanceof ItemHandlerList) {
150-
for (IItemHandler ih : ((ItemHandlerList) invalidatedHandler).getBackingHandlers()) {
151-
if (ih == bus) {
150+
if (invalidatedHandler instanceof IMultipleNotifiableHandler multipleNotifiableHandler) {
151+
for (var notifiableHandler : multipleNotifiableHandler.getBackingNotifiers()) {
152+
if (notifiableHandler == bus) {
152153
canWork = true;
153154
invalidatedIter.remove();
154155
break;

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

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
import gregtech.api.metatileentity.multiblock.AbilityInstances;
1717
import gregtech.api.metatileentity.multiblock.IMultiblockAbilityPart;
1818
import gregtech.api.metatileentity.multiblock.MultiblockAbility;
19-
import gregtech.api.metatileentity.multiblock.MultiblockControllerBase;
2019
import gregtech.api.mui.GTGuiTextures;
2120
import gregtech.api.mui.GTGuis;
2221
import gregtech.api.mui.widget.GhostCircuitSlotWidget;
@@ -359,20 +358,6 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager)
359358
.bindPlayerInventory();
360359
}
361360

362-
@Override
363-
public void addToMultiBlock(MultiblockControllerBase controllerBase) {
364-
super.addToMultiBlock(controllerBase);
365-
if (hasGhostCircuitInventory())
366-
this.circuitInventory.addNotifiableMetaTileEntity(controllerBase);
367-
}
368-
369-
@Override
370-
public void removeFromMultiBlock(MultiblockControllerBase controllerBase) {
371-
super.removeFromMultiBlock(controllerBase);
372-
if (hasGhostCircuitInventory())
373-
this.circuitInventory.removeNotifiableMetaTileEntity(controllerBase);
374-
}
375-
376361
@Override
377362
public void addInformation(ItemStack stack, @Nullable World player, @NotNull List<String> tooltip,
378363
boolean advanced) {

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

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import gregtech.api.metatileentity.multiblock.AbilityInstances;
1212
import gregtech.api.metatileentity.multiblock.IMultiblockAbilityPart;
1313
import gregtech.api.metatileentity.multiblock.MultiblockAbility;
14-
import gregtech.api.metatileentity.multiblock.MultiblockControllerBase;
1514
import gregtech.api.mui.GTGuiTextures;
1615
import gregtech.api.mui.GTGuis;
1716
import gregtech.api.mui.widget.GhostCircuitSlotWidget;
@@ -33,7 +32,6 @@
3332
import net.minecraft.util.text.TextComponentTranslation;
3433
import net.minecraft.world.World;
3534
import net.minecraftforge.common.capabilities.Capability;
36-
import net.minecraftforge.items.IItemHandler;
3735
import net.minecraftforge.items.IItemHandlerModifiable;
3836

3937
import codechicken.lib.raytracer.CuboidRayTraceResult;
@@ -100,31 +98,6 @@ public IItemHandlerModifiable getImportItems() {
10098
return this.actualImportItems == null ? super.getImportItems() : this.actualImportItems;
10199
}
102100

103-
@Override
104-
public void addToMultiBlock(MultiblockControllerBase controllerBase) {
105-
super.addToMultiBlock(controllerBase);
106-
if (hasGhostCircuitInventory() && this.actualImportItems instanceof ItemHandlerList) {
107-
for (IItemHandler handler : ((ItemHandlerList) this.actualImportItems).getBackingHandlers()) {
108-
if (handler instanceof INotifiableHandler notifiable) {
109-
notifiable.addNotifiableMetaTileEntity(controllerBase);
110-
notifiable.addToNotifiedList(this, handler, isExportHatch);
111-
}
112-
}
113-
}
114-
}
115-
116-
@Override
117-
public void removeFromMultiBlock(MultiblockControllerBase controllerBase) {
118-
super.removeFromMultiBlock(controllerBase);
119-
if (hasGhostCircuitInventory() && this.actualImportItems instanceof ItemHandlerList) {
120-
for (IItemHandler handler : ((ItemHandlerList) this.actualImportItems).getBackingHandlers()) {
121-
if (handler instanceof INotifiableHandler notifiable) {
122-
notifiable.removeNotifiableMetaTileEntity(controllerBase);
123-
}
124-
}
125-
}
126-
}
127-
128101
@Override
129102
public void update() {
130103
super.update();

src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiblockNotifiablePart.java

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
package gregtech.common.metatileentities.multi.multiblockpart;
22

3+
import gregtech.api.capability.IMultipleNotifiableHandler;
34
import gregtech.api.capability.IMultipleTankHandler;
45
import gregtech.api.capability.INotifiableHandler;
56
import gregtech.api.capability.impl.FluidTankList;
67
import gregtech.api.capability.impl.ItemHandlerList;
8+
import gregtech.api.metatileentity.multiblock.AbilityInstances;
9+
import gregtech.api.metatileentity.multiblock.IMultiblockAbilityPart;
10+
import gregtech.api.metatileentity.multiblock.MultiblockAbility;
711
import gregtech.api.metatileentity.multiblock.MultiblockControllerBase;
812

913
import net.minecraft.util.ResourceLocation;
@@ -49,28 +53,50 @@ private FluidTankList getFluidHandlers() {
4953
}
5054

5155
private List<INotifiableHandler> getPartHandlers() {
52-
List<INotifiableHandler> handlerList = new ArrayList<>();
56+
List<INotifiableHandler> notifiableHandlers = new ArrayList<>();
5357

54-
for (var notif : getItemHandlers()) {
55-
if (notif.size() > 0) {
56-
handlerList.add(notif);
58+
if (this instanceof IMultiblockAbilityPart<?>abilityPart) {
59+
List<MultiblockAbility<?>> abilities = abilityPart.getAbilities();
60+
for (var ability : abilities) {
61+
AbilityInstances instances = new AbilityInstances(ability);
62+
abilityPart.registerAbilities(instances);
63+
for (var handler : instances) {
64+
if (handler instanceof IMultipleNotifiableHandler multipleNotifiableHandler) {
65+
notifiableHandlers.addAll(multipleNotifiableHandler.getBackingNotifiers());
66+
} else if (handler instanceof IMultipleTankHandler multipleTankHandler) {
67+
for (var tank : multipleTankHandler.getFluidTanks()) {
68+
if (tank instanceof INotifiableHandler notifiableTank) {
69+
notifiableHandlers.add(notifiableTank);
70+
}
71+
}
72+
} else if (handler instanceof INotifiableHandler notifiableHandler) {
73+
notifiableHandlers.add(notifiableHandler);
74+
}
75+
}
76+
}
77+
} else {
78+
for (var notif : getItemHandlers()) {
79+
if (notif.size() > 0) {
80+
notifiableHandlers.add(notif);
81+
}
5782
}
58-
}
5983

60-
if (this.fluidInventory.getTankProperties().length > 0) {
61-
FluidTankList fluidTankList = getFluidHandlers();
62-
if (fluidTankList != null) {
63-
for (IFluidTank fluidTank : fluidTankList) {
64-
if (fluidTank instanceof IMultipleTankHandler.ITankEntry entry) {
65-
fluidTank = entry.getDelegate();
66-
}
67-
if (fluidTank instanceof INotifiableHandler) {
68-
handlerList.add((INotifiableHandler) fluidTank);
84+
if (this.fluidInventory.getTankProperties().length > 0) {
85+
FluidTankList fluidTankList = getFluidHandlers();
86+
if (fluidTankList != null) {
87+
for (IFluidTank fluidTank : fluidTankList) {
88+
if (fluidTank instanceof IMultipleTankHandler.ITankEntry entry) {
89+
fluidTank = entry.getDelegate();
90+
}
91+
if (fluidTank instanceof INotifiableHandler) {
92+
notifiableHandlers.add((INotifiableHandler) fluidTank);
93+
}
6994
}
7095
}
7196
}
7297
}
73-
return handlerList;
98+
99+
return notifiableHandlers;
74100
}
75101

76102
@Override

src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import gregtech.api.capability.GregtechTileCapabilities;
66
import gregtech.api.capability.IDataStickIntractable;
77
import gregtech.api.capability.IGhostSlotConfigurable;
8-
import gregtech.api.capability.INotifiableHandler;
98
import gregtech.api.capability.impl.GhostCircuitItemStackHandler;
109
import gregtech.api.capability.impl.ItemHandlerList;
1110
import gregtech.api.capability.impl.NotifiableItemStackHandler;
@@ -18,7 +17,6 @@
1817
import gregtech.api.metatileentity.multiblock.AbilityInstances;
1918
import gregtech.api.metatileentity.multiblock.IMultiblockAbilityPart;
2019
import gregtech.api.metatileentity.multiblock.MultiblockAbility;
21-
import gregtech.api.metatileentity.multiblock.MultiblockControllerBase;
2220
import gregtech.api.util.GTUtility;
2321
import gregtech.client.renderer.texture.Textures;
2422
import gregtech.common.gui.widget.appeng.AEItemConfigWidget;
@@ -38,7 +36,6 @@
3836
import net.minecraft.util.text.TextComponentTranslation;
3937
import net.minecraft.world.World;
4038
import net.minecraftforge.common.capabilities.Capability;
41-
import net.minecraftforge.items.IItemHandler;
4239
import net.minecraftforge.items.IItemHandlerModifiable;
4340

4441
import appeng.api.config.Actionable;
@@ -161,27 +158,6 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity iGregTechTileEnti
161158
return new MetaTileEntityMEInputBus(metaTileEntityId);
162159
}
163160

164-
@Override
165-
public void addToMultiBlock(MultiblockControllerBase controllerBase) {
166-
super.addToMultiBlock(controllerBase);
167-
for (IItemHandler handler : this.actualImportItems.getBackingHandlers()) {
168-
if (handler instanceof INotifiableHandler notifiable) {
169-
notifiable.addNotifiableMetaTileEntity(controllerBase);
170-
notifiable.addToNotifiedList(this, handler, false);
171-
}
172-
}
173-
}
174-
175-
@Override
176-
public void removeFromMultiBlock(MultiblockControllerBase controllerBase) {
177-
super.removeFromMultiBlock(controllerBase);
178-
for (IItemHandler handler : this.actualImportItems.getBackingHandlers()) {
179-
if (handler instanceof INotifiableHandler notifiable) {
180-
notifiable.removeNotifiableMetaTileEntity(controllerBase);
181-
}
182-
}
183-
}
184-
185161
@Override
186162
protected final ModularUI createUI(EntityPlayer player) {
187163
ModularUI.Builder builder = createUITemplate(player);

0 commit comments

Comments
 (0)