Fixed #1235 - "Breaking cable with destructor crashes game"

This commit is contained in:
raoulvdberge
2017-05-24 21:00:42 +02:00
parent 4c92c87c7c
commit a62d2e257e
5 changed files with 9 additions and 18 deletions

View File

@@ -3,6 +3,7 @@
### 1.4.8 ### 1.4.8
- Fixed missing config categories in ingame config (raoulvdberge) - Fixed missing config categories in ingame config (raoulvdberge)
- Fixed Controller not working anymore after changing redstone setting (raoulvdberge) - Fixed Controller not working anymore after changing redstone setting (raoulvdberge)
- Fixed crash when placing or destroying network blocks (raoulvdberge)
### 1.4.7 ### 1.4.7
- Fixed bug where Portable Grid would dupe in inventory (raoulvdberge) - Fixed bug where Portable Grid would dupe in inventory (raoulvdberge)

View File

@@ -38,11 +38,6 @@ public interface INetworkNodeManager {
*/ */
Collection<INetworkNode> all(); Collection<INetworkNode> all();
/**
* Clears all the nodes.
*/
void clear();
/** /**
* Marks the network node manager for saving. * Marks the network node manager for saving.
*/ */

View File

@@ -20,7 +20,7 @@ public class NetworkNodeListener {
if (e.phase == TickEvent.Phase.END) { if (e.phase == TickEvent.Phase.END) {
for (INetworkNode node : API.instance().getNetworkNodeManager(e.world).all()) { for (INetworkNode node : API.instance().getNetworkNodeManager(e.world).all()) {
if (e.world.isBlockLoaded(node.getPos())) { if (node.getWorld() != null && e.world.isBlockLoaded(node.getPos())) {
node.update(); node.update();
} }
} }

View File

@@ -12,8 +12,8 @@ import net.minecraftforge.common.util.Constants;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function; import java.util.function.Function;
public class NetworkNodeManager extends WorldSavedData implements INetworkNodeManager { public class NetworkNodeManager extends WorldSavedData implements INetworkNodeManager {
@@ -24,7 +24,7 @@ public class NetworkNodeManager extends WorldSavedData implements INetworkNodeMa
private static final String NBT_NODE_DATA = "Data"; private static final String NBT_NODE_DATA = "Data";
private static final String NBT_NODE_POS = "Pos"; private static final String NBT_NODE_POS = "Pos";
private Map<BlockPos, INetworkNode> nodes = new HashMap<>(); private Map<BlockPos, INetworkNode> nodes = new ConcurrentHashMap<>();
public NetworkNodeManager(String s) { public NetworkNodeManager(String s) {
super(s); super(s);
@@ -32,7 +32,7 @@ public class NetworkNodeManager extends WorldSavedData implements INetworkNodeMa
@Override @Override
public void readFromNBT(NBTTagCompound tag) { public void readFromNBT(NBTTagCompound tag) {
clear(); Map<BlockPos, INetworkNode> newNodes = new ConcurrentHashMap<>();
if (tag.hasKey(NBT_NODES)) { if (tag.hasKey(NBT_NODES)) {
NBTTagList list = tag.getTagList(NBT_NODES, Constants.NBT.TAG_COMPOUND); NBTTagList list = tag.getTagList(NBT_NODES, Constants.NBT.TAG_COMPOUND);
@@ -53,7 +53,7 @@ public class NetworkNodeManager extends WorldSavedData implements INetworkNodeMa
Function<NBTTagCompound, INetworkNode> factory = API.instance().getNetworkNodeRegistry().get(id); Function<NBTTagCompound, INetworkNode> factory = API.instance().getNetworkNodeRegistry().get(id);
if (factory != null) { if (factory != null) {
setNode(pos, factory.apply(data)); newNodes.put(pos, factory.apply(data));
RSUtils.debugLog("Node at " + pos + " read... (" + (++read) + "/" + toRead + ")"); RSUtils.debugLog("Node at " + pos + " read... (" + (++read) + "/" + toRead + ")");
} else { } else {
@@ -65,6 +65,8 @@ public class NetworkNodeManager extends WorldSavedData implements INetworkNodeMa
} else { } else {
RSUtils.debugLog("Cannot read nodes, as there is no 'nodes' tag on this WorldSavedData"); RSUtils.debugLog("Cannot read nodes, as there is no 'nodes' tag on this WorldSavedData");
} }
this.nodes = newNodes;
} }
@Override @Override
@@ -117,13 +119,6 @@ public class NetworkNodeManager extends WorldSavedData implements INetworkNodeMa
return nodes.values(); return nodes.values();
} }
@Override
public void clear() {
RSUtils.debugLog("Clearing all nodes!");
nodes.clear();
}
@Override @Override
public void markForSaving() { public void markForSaving() {
markDirty(); markDirty();

View File

@@ -105,7 +105,7 @@ public abstract class TileNode<N extends NetworkNode> extends TileBase implement
NetworkNode node = (NetworkNode) API.instance().getNetworkNodeManager(getWorld()).getNode(pos); NetworkNode node = (NetworkNode) API.instance().getNetworkNodeManager(getWorld()).getNode(pos);
if (node == null) { if (node == null) {
throw new IllegalStateException("Node cannot be null!"); throw new IllegalStateException("Node cannot be null at " + pos + "!");
} }
if (node.getContainer().world() == null) { if (node.getContainer().world() == null) {