From b019050f328a7fe6dbbeeee2ea63ea281c35e895 Mon Sep 17 00:00:00 2001 From: Fox_white Date: Tue, 8 Aug 2023 02:01:03 +0800 Subject: [PATCH] fix: uses IInterfaceTerminalSupport for interface terminal fix custom target not registered in ae2fc wireless interface terminal --- .../gui/GuiInterfaceTerminalWireless.java | 8 +- .../container/ContainerInterfaceWireless.java | 167 ++++++++---------- 2 files changed, 75 insertions(+), 100 deletions(-) diff --git a/src/main/java/com/glodblock/github/client/gui/GuiInterfaceTerminalWireless.java b/src/main/java/com/glodblock/github/client/gui/GuiInterfaceTerminalWireless.java index 0ae7e218..4cb72969 100644 --- a/src/main/java/com/glodblock/github/client/gui/GuiInterfaceTerminalWireless.java +++ b/src/main/java/com/glodblock/github/client/gui/GuiInterfaceTerminalWireless.java @@ -520,8 +520,9 @@ public class GuiInterfaceTerminalWireless extends FCBaseMEGui implements IDropTo try { final long id = Long.parseLong(key.substring(1), Character.MAX_RADIX); final NBTTagCompound invData = in.getCompoundTag(key); + int size = invData.getInteger("size"); final ClientDCInternalInv current = this - .getById(id, invData.getLong("sortBy"), invData.getString("un")); + .getById(id, invData.getLong("sortBy"), invData.getString("un"), size); int X = invData.getInteger("x"); int Y = invData.getInteger("y"); int Z = invData.getInteger("z"); @@ -724,11 +725,12 @@ public class GuiInterfaceTerminalWireless extends FCBaseMEGui implements IDropTo : Integer.MAX_VALUE; } - private ClientDCInternalInv getById(final long id, final long sortBy, final String unlocalizedName) { + private ClientDCInternalInv getById(final long id, final long sortBy, final String unlocalizedName, + final int sizeInit) { ClientDCInternalInv o = this.byId.get(id); if (o == null) { - this.byId.put(id, o = new ClientDCInternalInv(9, id, sortBy, unlocalizedName)); + this.byId.put(id, o = new ClientDCInternalInv(sizeInit, id, sortBy, unlocalizedName)); this.refreshList = true; } diff --git a/src/main/java/com/glodblock/github/client/gui/container/ContainerInterfaceWireless.java b/src/main/java/com/glodblock/github/client/gui/container/ContainerInterfaceWireless.java index 644b917e..3a7ac2e0 100644 --- a/src/main/java/com/glodblock/github/client/gui/container/ContainerInterfaceWireless.java +++ b/src/main/java/com/glodblock/github/client/gui/container/ContainerInterfaceWireless.java @@ -11,27 +11,20 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.util.ForgeDirection; import com.glodblock.github.client.gui.container.base.FCBaseContainer; -import com.glodblock.github.common.parts.PartFluidInterface; -import com.glodblock.github.common.tile.TileFluidInterface; import com.glodblock.github.inventory.item.IWirelessTerminal; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; -import appeng.api.config.*; import appeng.api.networking.IGrid; import appeng.api.networking.IGridNode; import appeng.api.networking.security.IActionHost; +import appeng.api.util.DimensionalCoord; import appeng.core.sync.network.NetworkHandler; import appeng.core.sync.packets.PacketCompressedNBT; -import appeng.helpers.DualityInterface; -import appeng.helpers.IInterfaceHost; -import appeng.helpers.InventoryAction; +import appeng.helpers.*; import appeng.items.misc.ItemEncodedPattern; import appeng.parts.AEBasePart; -import appeng.parts.misc.PartInterface; -import appeng.parts.p2p.PartP2PInterface; import appeng.tile.inventory.AppEngInternalInventory; -import appeng.tile.misc.TileInterface; import appeng.util.InventoryAdaptor; import appeng.util.Platform; import appeng.util.inv.AdaptorIInventory; @@ -46,7 +39,8 @@ public class ContainerInterfaceWireless extends FCBaseContainer { */ private static long autoBase = Long.MIN_VALUE; - private final Multimap diList = HashMultimap.create(); + private final Multimap supportedInterfaces = HashMultimap + .create(); private final Map byId = new HashMap<>(); private IGrid grid; private NBTTagCompound data = new NBTTagCompound(); @@ -60,16 +54,6 @@ public class ContainerInterfaceWireless extends FCBaseContainer { this.bindPlayerInventory(ip, 14, 0); } - private Set getMachineNodes() { - Set union = new HashSet<>(); - this.grid.getMachines(TileFluidInterface.class).forEach(union::add); - this.grid.getMachines(TileInterface.class).forEach(union::add); - this.grid.getMachines(PartFluidInterface.class).forEach(union::add); - this.grid.getMachines(PartInterface.class).forEach(union::add); - this.grid.getMachines(PartP2PInterface.class).forEach(union::add); - return union; - } - @Override public void detectAndSendChanges() { if (Platform.isClient()) { @@ -88,19 +72,28 @@ public class ContainerInterfaceWireless extends FCBaseContainer { if (host != null) { final IGridNode agn = host.getActionableNode(); if (agn != null && agn.isActive()) { - for (final IGridNode gn : this.getMachineNodes()) { - ContainerInterfaceWireless.InterfaceCheck interfaceCheck = new ContainerInterfaceWireless.InterfaceCheck() - .invoke(gn); - total += interfaceCheck.getTotal(); - missing |= interfaceCheck.isMissing(); + for (var clz : InterfaceTerminalSupportedClassProvider.getSupportedClasses()) { + for (final IGridNode gn : this.grid.getMachines(clz)) { + final IInterfaceTerminalSupport interfaceTerminalSupport = (IInterfaceTerminalSupport) gn + .getMachine(); + if (!gn.isActive() || !interfaceTerminalSupport.shouldDisplay()) continue; + + final Collection t = supportedInterfaces.get(interfaceTerminalSupport); + final String name = interfaceTerminalSupport.getName(); + missing = t.isEmpty() || t.stream().anyMatch(it -> !it.unlocalizedName.equals(name)); + total += interfaceTerminalSupport.getPatternsConfigurations().length; + if (missing) break; + } + // we can stop if any is missing. The value of `total` is not important if `missing == true` + if (missing) break; } } } - if (total != this.diList.size() || missing) { + if (total != this.supportedInterfaces.size() || missing) { this.regenList(this.data); } else { - for (final ContainerInterfaceWireless.InvTracker inv : diList.values()) { + for (final ContainerInterfaceWireless.InvTracker inv : supportedInterfaces.values()) { for (int x = 0; x < inv.client.getSizeInventory(); x++) { if (this.isDifferent(inv.server.getStackInSlot(inv.offset + x), inv.client.getStackInSlot(x))) { this.addItems(this.data, inv, x, 1); @@ -244,25 +237,23 @@ public class ContainerInterfaceWireless extends FCBaseContainer { private void regenList(final NBTTagCompound data) { this.byId.clear(); - this.diList.clear(); + this.supportedInterfaces.clear(); final IActionHost host = this.getActionHost(); if (host != null) { final IGridNode agn = host.getActionableNode(); if (agn != null && agn.isActive()) { - for (final IGridNode gn : this.getMachineNodes()) { - final IInterfaceHost ih = (IInterfaceHost) gn.getMachine(); - final DualityInterface dual = ih.getInterfaceDuality(); - if (gn.isActive() && dual.getConfigManager().getSetting(Settings.INTERFACE_TERMINAL) == YesNo.YES) { - for (int i = 0; i <= dual.getInstalledUpgrades(Upgrades.PATTERN_CAPACITY); ++i) { - this.diList.put( - ih, - new ContainerInterfaceWireless.InvTracker( - dual, - dual.getPatterns(), - dual.getTermName(), - i * 9, - 9)); + for (var clz : InterfaceTerminalSupportedClassProvider.getSupportedClasses()) { + for (final IGridNode gn : this.grid.getMachines(clz)) { + final IInterfaceTerminalSupport terminalSupport = (IInterfaceTerminalSupport) gn.getMachine(); + if (!gn.isActive() || !terminalSupport.shouldDisplay()) continue; + + final var configurations = terminalSupport.getPatternsConfigurations(); + + for (int i = 0; i < configurations.length; ++i) { + this.supportedInterfaces.put( + terminalSupport, + new ContainerInterfaceWireless.InvTracker(terminalSupport, configurations[i], i)); } } } @@ -271,7 +262,7 @@ public class ContainerInterfaceWireless extends FCBaseContainer { data.setBoolean("clear", true); - for (final ContainerInterfaceWireless.InvTracker inv : this.diList.values()) { + for (final ContainerInterfaceWireless.InvTracker inv : this.supportedInterfaces.values()) { this.byId.put(inv.which, inv); this.addItems(data, inv, 0, inv.client.getSizeInventory()); } @@ -307,6 +298,7 @@ public class ContainerInterfaceWireless extends FCBaseContainer { tag.setInteger("z", inv.Z); tag.setInteger("dim", inv.dim); tag.setInteger("side", inv.side.ordinal()); + tag.setInteger("size", inv.client.getSizeInventory()); } for (int x = 0; x < length; x++) { @@ -341,22 +333,46 @@ public class ContainerInterfaceWireless extends FCBaseContainer { private final int dim; private final ForgeDirection side; - public InvTracker(final DualityInterface dual, final IInventory patterns, final String unlocalizedName, - int offset, int size) { + public InvTracker(final DimensionalCoord coord, long sortValue, final IInventory patterns, + final String unlocalizedName, int offset, int size, ForgeDirection side) { + this( + coord.x, + coord.y, + coord.z, + coord.getDimension(), + sortValue, + patterns, + unlocalizedName, + offset, + size, + side); + } + + public InvTracker(int x, int y, int z, int dim, long sortValue, final IInventory patterns, + final String unlocalizedName, int offset, int size, ForgeDirection side) { this.server = patterns; this.client = new AppEngInternalInventory(null, size); this.unlocalizedName = unlocalizedName; - this.sortBy = dual.getSortValue() + offset << 16; + this.sortBy = sortValue + offset << 16; this.offset = offset; - X = dual.getLocation().x; - Y = dual.getLocation().y; - Z = dual.getLocation().z; - dim = dual.getLocation().getDimension(); - if (dual.getHost() instanceof AEBasePart) { - side = ((AEBasePart) dual.getHost()).getSide(); - } else { - side = ForgeDirection.UNKNOWN; - } + this.X = x; + this.Y = y; + this.Z = z; + this.dim = dim; + this.side = side; + } + + public InvTracker(IInterfaceTerminalSupport terminalSupport, + IInterfaceTerminalSupport.PatternsConfiguration configuration, int index) { + this( + terminalSupport.getLocation(), + terminalSupport.getSortValue(), + terminalSupport.getPatterns(index), + terminalSupport.getName(), + configuration.offset, + configuration.size, + terminalSupport instanceof AEBasePart ? ((AEBasePart) terminalSupport).getSide() + : ForgeDirection.UNKNOWN); } } @@ -371,47 +387,4 @@ public class ContainerInterfaceWireless extends FCBaseContainer { return itemstack != null && itemstack.getItem() instanceof ItemEncodedPattern; } } - - private class InterfaceCheck { - - int total = 0; - boolean missing = false; - - public InterfaceCheck() {} - - public int getTotal() { - return total; - } - - public boolean isMissing() { - return missing; - } - - public ContainerInterfaceWireless.InterfaceCheck invoke(IGridNode gn) { - if (gn.isActive()) { - final IInterfaceHost ih = (IInterfaceHost) gn.getMachine(); - if (ih.getInterfaceDuality().getConfigManager().getSetting(Settings.INTERFACE_TERMINAL) == YesNo.NO - || ih instanceof PartP2PInterface && ((PartP2PInterface) ih).isOutput()) { - return this; - } - - final Collection t = ContainerInterfaceWireless.this.diList - .get(ih); - - if (t.isEmpty()) { - missing = true; - } else { - final DualityInterface dual = ih.getInterfaceDuality(); - for (ContainerInterfaceWireless.InvTracker it : t) { - if (!it.unlocalizedName.equals(dual.getTermName())) { - missing = true; - } - } - } - - total += (ih.getInterfaceDuality().getInstalledUpgrades(Upgrades.PATTERN_CAPACITY) + 1); - } - return this; - } - } }