From 4a72ceb724390c490393637919d7110140f9cf5e Mon Sep 17 00:00:00 2001 From: LordMZTE Date: Tue, 3 Jan 2023 20:41:16 +0100 Subject: [PATCH] fix: fixed assembler grid cache - assemblers are now properly tracked across network splits and joins - forming a multiblock will no longer create multiple clusters closes #1 --- .../appeng/me/cache/AssemblerGridCache.java | 36 ++++++++++++++----- .../appeng/tile/legacy/TileAssembler.java | 2 ++ .../appeng/tile/legacy/TileAssemblerMB.java | 1 - 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/src/main/java/appeng/me/cache/AssemblerGridCache.java b/src/main/java/appeng/me/cache/AssemblerGridCache.java index 91fa888b..e56a0ad2 100644 --- a/src/main/java/appeng/me/cache/AssemblerGridCache.java +++ b/src/main/java/appeng/me/cache/AssemblerGridCache.java @@ -1,9 +1,6 @@ package appeng.me.cache; -import java.util.HashSet; -import java.util.Iterator; import java.util.Map; -import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import appeng.api.networking.IAssemblerCache; @@ -11,16 +8,17 @@ import appeng.api.networking.IGrid; import appeng.api.networking.IGridHost; import appeng.api.networking.IGridNode; import appeng.api.networking.IGridStorage; +import appeng.me.cluster.IAssemblerMB; import appeng.me.cluster.implementations.AssemblerCluster; public class AssemblerGridCache implements IAssemblerCache { - // This needs to be a ConcurrentHashMap to prevent errors when a cluster is invalidated - // while another is added. + // This needs to be a ConcurrentHashMap to prevent errors when a cluster is + // invalidated while another is added. // // Java has no ConcurrentHashSet Map assemblers = new ConcurrentHashMap<>(); static Object PRESENT = new Object(); - + int cooldown = 0; public AssemblerGridCache(IGrid grid) {} @@ -41,10 +39,32 @@ public class AssemblerGridCache implements IAssemblerCache { } @Override - public void removeNode(IGridNode gridNode, IGridHost machine) {} + public void removeNode(IGridNode gridNode, IGridHost machine) { + if (machine instanceof IAssemblerMB) { + AssemblerCluster cluster + = (AssemblerCluster) ((IAssemblerMB) machine).getCluster(); + + if (cluster != null) { + // We remove the cluster of the machine here, because we need to remove + // old clusters on network split. + this.assemblers.remove(cluster); + } + } + } @Override - public void addNode(IGridNode gridNode, IGridHost machine) {} + public void addNode(IGridNode gridNode, IGridHost machine) { + if (machine instanceof IAssemblerMB) { + AssemblerCluster cluster + = (AssemblerCluster) ((IAssemblerMB) machine).getCluster(); + + if (cluster != null) { + // Although a forming assembler multiblock will add its own cluster + // itself, we still need to do it here too for network joins. + this.addCluster(cluster); + } + } + } @Override public void onSplit(IGridStorage destinationStorage) {} diff --git a/src/main/java/appeng/tile/legacy/TileAssembler.java b/src/main/java/appeng/tile/legacy/TileAssembler.java index cf9b0aaf..a199212a 100644 --- a/src/main/java/appeng/tile/legacy/TileAssembler.java +++ b/src/main/java/appeng/tile/legacy/TileAssembler.java @@ -317,6 +317,8 @@ public class TileAssembler extends AENetworkTile if (max.x - min.x >= 2 && max.y - min.y >= 2 && max.z - min.z >= 2) { AssemblerCluster ac = verifyOwnedRegion(w, min, max); if (ac != null && verifyUnownedRegion(w, min, max)) { + if (start.getCluster() != null) + ac = (AssemblerCluster) start.getCluster(); completeRegion(w, min, max, ac); return; } diff --git a/src/main/java/appeng/tile/legacy/TileAssemblerMB.java b/src/main/java/appeng/tile/legacy/TileAssemblerMB.java index 43428beb..3d47cb9a 100644 --- a/src/main/java/appeng/tile/legacy/TileAssemblerMB.java +++ b/src/main/java/appeng/tile/legacy/TileAssemblerMB.java @@ -397,7 +397,6 @@ public class TileAssemblerMB extends AENetworkTile implements IAssemblerMB, IInv this.worldObj.markBlockRangeForRenderUpdate( this.xCoord, this.yCoord, this.zCoord, this.xCoord, this.yCoord, this.zCoord ); - System.out.println("ALEC: " + this.complete); return true; }