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;
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<AssemblerCluster, Object> 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) {}

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) {
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;
}

View File

@ -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;
}