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:
parent
ee0fe3d283
commit
4a72ceb724
|
@ -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) {}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue