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
This commit is contained in:
LordMZTE 2023-01-03 20:41:16 +01:00
parent ee0fe3d283
commit 4a72ceb724
Signed by: LordMZTE
GPG Key ID: B64802DC33A64FF6
3 changed files with 30 additions and 9 deletions

View File

@ -1,9 +1,6 @@
package appeng.me.cache; package appeng.me.cache;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import appeng.api.networking.IAssemblerCache; import appeng.api.networking.IAssemblerCache;
@ -11,16 +8,17 @@ import appeng.api.networking.IGrid;
import appeng.api.networking.IGridHost; import appeng.api.networking.IGridHost;
import appeng.api.networking.IGridNode; import appeng.api.networking.IGridNode;
import appeng.api.networking.IGridStorage; import appeng.api.networking.IGridStorage;
import appeng.me.cluster.IAssemblerMB;
import appeng.me.cluster.implementations.AssemblerCluster; import appeng.me.cluster.implementations.AssemblerCluster;
public class AssemblerGridCache implements IAssemblerCache { public class AssemblerGridCache implements IAssemblerCache {
// This needs to be a ConcurrentHashMap to prevent errors when a cluster is invalidated // This needs to be a ConcurrentHashMap to prevent errors when a cluster is
// while another is added. // invalidated while another is added.
// //
// Java has no ConcurrentHashSet // Java has no ConcurrentHashSet
Map<AssemblerCluster, Object> assemblers = new ConcurrentHashMap<>(); Map<AssemblerCluster, Object> assemblers = new ConcurrentHashMap<>();
static Object PRESENT = new Object(); static Object PRESENT = new Object();
int cooldown = 0; int cooldown = 0;
public AssemblerGridCache(IGrid grid) {} public AssemblerGridCache(IGrid grid) {}
@ -41,10 +39,32 @@ public class AssemblerGridCache implements IAssemblerCache {
} }
@Override @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 @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 @Override
public void onSplit(IGridStorage destinationStorage) {} public void onSplit(IGridStorage destinationStorage) {}

View File

@ -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) { if (max.x - min.x >= 2 && max.y - min.y >= 2 && max.z - min.z >= 2) {
AssemblerCluster ac = verifyOwnedRegion(w, min, max); AssemblerCluster ac = verifyOwnedRegion(w, min, max);
if (ac != null && verifyUnownedRegion(w, min, max)) { if (ac != null && verifyUnownedRegion(w, min, max)) {
if (start.getCluster() != null)
ac = (AssemblerCluster) start.getCluster();
completeRegion(w, min, max, ac); completeRegion(w, min, max, ac);
return; return;
} }

View File

@ -397,7 +397,6 @@ public class TileAssemblerMB extends AENetworkTile implements IAssemblerMB, IInv
this.worldObj.markBlockRangeForRenderUpdate( this.worldObj.markBlockRangeForRenderUpdate(
this.xCoord, this.yCoord, this.zCoord, this.xCoord, this.yCoord, this.zCoord this.xCoord, this.yCoord, this.zCoord, this.xCoord, this.yCoord, this.zCoord
); );
System.out.println("ALEC: " + this.complete);
return true; return true;
} }