Fixed OC nodes disconnection on chunk loading
This commit is contained in:
parent
cc1b537d46
commit
2d7a04c491
1 changed files with 42 additions and 25 deletions
|
@ -12,6 +12,7 @@ import li.cil.oc.api.Network;
|
||||||
import li.cil.oc.api.machine.Arguments;
|
import li.cil.oc.api.machine.Arguments;
|
||||||
import li.cil.oc.api.machine.Callback;
|
import li.cil.oc.api.machine.Callback;
|
||||||
import li.cil.oc.api.machine.Context;
|
import li.cil.oc.api.machine.Context;
|
||||||
|
import li.cil.oc.api.network.Component;
|
||||||
import li.cil.oc.api.network.Environment;
|
import li.cil.oc.api.network.Environment;
|
||||||
import li.cil.oc.api.network.ManagedEnvironment;
|
import li.cil.oc.api.network.ManagedEnvironment;
|
||||||
import li.cil.oc.api.network.Message;
|
import li.cil.oc.api.network.Message;
|
||||||
|
@ -34,7 +35,6 @@ import dan200.computercraft.api.peripheral.IPeripheral;
|
||||||
})
|
})
|
||||||
public abstract class TileEntityAbstractInterfaced extends TileEntityAbstractBase implements IPeripheral, Environment {
|
public abstract class TileEntityAbstractInterfaced extends TileEntityAbstractBase implements IPeripheral, Environment {
|
||||||
// Common computer properties
|
// Common computer properties
|
||||||
private boolean interfacedFirstTick = true;
|
|
||||||
protected String peripheralName = null;
|
protected String peripheralName = null;
|
||||||
private String[] methodsArray = {};
|
private String[] methodsArray = {};
|
||||||
|
|
||||||
|
@ -55,6 +55,7 @@ public abstract class TileEntityAbstractInterfaced extends TileEntityAbstractBas
|
||||||
protected HashMap<Integer, IComputerAccess> connectedComputers = new HashMap<Integer, IComputerAccess>();
|
protected HashMap<Integer, IComputerAccess> connectedComputers = new HashMap<Integer, IComputerAccess>();
|
||||||
|
|
||||||
public TileEntityAbstractInterfaced() {
|
public TileEntityAbstractInterfaced() {
|
||||||
|
super();
|
||||||
addMethods(new String[] {
|
addMethods(new String[] {
|
||||||
"interfaced",
|
"interfaced",
|
||||||
"position",
|
"position",
|
||||||
|
@ -90,24 +91,6 @@ public abstract class TileEntityAbstractInterfaced extends TileEntityAbstractBas
|
||||||
public void updateEntity() {
|
public void updateEntity() {
|
||||||
super.updateEntity();
|
super.updateEntity();
|
||||||
|
|
||||||
if (interfacedFirstTick) {
|
|
||||||
if (WarpDriveConfig.isComputerCraftLoaded) {
|
|
||||||
String CC_path = "/assets/" + WarpDrive.MODID.toLowerCase() + "/lua.ComputerCraft/" + peripheralName;
|
|
||||||
CC_hasResource = assetExist(CC_path);
|
|
||||||
}
|
|
||||||
if (WarpDriveConfig.isOpenComputersLoaded) {
|
|
||||||
String OC_path = "/assets/" + WarpDrive.MODID.toLowerCase() + "/lua.OpenComputers/" + peripheralName;
|
|
||||||
OC_hasResource = assetExist(OC_path);
|
|
||||||
}
|
|
||||||
|
|
||||||
// deferred constructor so the derived class can finish it's initialization first
|
|
||||||
if (WarpDriveConfig.isOpenComputersLoaded) {
|
|
||||||
OC_constructor();
|
|
||||||
}
|
|
||||||
interfacedFirstTick = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (WarpDriveConfig.isOpenComputersLoaded) {
|
if (WarpDriveConfig.isOpenComputersLoaded) {
|
||||||
if (!OC_addedToNetwork) {
|
if (!OC_addedToNetwork) {
|
||||||
OC_addedToNetwork = true;
|
OC_addedToNetwork = true;
|
||||||
|
@ -115,6 +98,19 @@ public abstract class TileEntityAbstractInterfaced extends TileEntityAbstractBas
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@Override
|
||||||
|
public void validate() {
|
||||||
|
if (WarpDriveConfig.isComputerCraftLoaded) {
|
||||||
|
String CC_path = "/assets/" + WarpDrive.MODID.toLowerCase() + "/lua.ComputerCraft/" + peripheralName;
|
||||||
|
CC_hasResource = assetExist(CC_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
// deferred constructor so the derived class can finish it's initialization first
|
||||||
|
if (WarpDriveConfig.isOpenComputersLoaded && OC_node == null) {
|
||||||
|
OC_constructor();
|
||||||
|
}
|
||||||
|
super.validate();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void invalidate() {
|
public void invalidate() {
|
||||||
|
@ -142,8 +138,18 @@ public abstract class TileEntityAbstractInterfaced extends TileEntityAbstractBas
|
||||||
public void readFromNBT(NBTTagCompound tag) {
|
public void readFromNBT(NBTTagCompound tag) {
|
||||||
super.readFromNBT(tag);
|
super.readFromNBT(tag);
|
||||||
if (WarpDriveConfig.isOpenComputersLoaded) {
|
if (WarpDriveConfig.isOpenComputersLoaded) {
|
||||||
|
if (OC_node == null) {
|
||||||
|
OC_constructor();
|
||||||
|
}
|
||||||
if (OC_node != null && OC_node.host() == this) {
|
if (OC_node != null && OC_node.host() == this) {
|
||||||
OC_node.load(tag.getCompoundTag("oc:node"));
|
OC_node.load(tag.getCompoundTag("oc:node"));
|
||||||
|
} else {
|
||||||
|
WarpDrive.logger.error("OC node failed to construct or wrong host, ignoring NBT node data read...");
|
||||||
|
}
|
||||||
|
if (OC_fileSystem != null && OC_fileSystem.node() != null) {
|
||||||
|
OC_fileSystem.node().load(tag.getCompoundTag("oc:fs"));
|
||||||
|
} else {
|
||||||
|
WarpDrive.logger.error("OC filesystem failed to construct or wrong node, ignoring NBT filesystem data read...");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -153,16 +159,21 @@ public abstract class TileEntityAbstractInterfaced extends TileEntityAbstractBas
|
||||||
super.writeToNBT(tag);
|
super.writeToNBT(tag);
|
||||||
if (WarpDriveConfig.isOpenComputersLoaded) {
|
if (WarpDriveConfig.isOpenComputersLoaded) {
|
||||||
if (OC_node != null && OC_node.host() == this) {
|
if (OC_node != null && OC_node.host() == this) {
|
||||||
final NBTTagCompound nodeNbt = new NBTTagCompound();
|
final NBTTagCompound nbtNode = new NBTTagCompound();
|
||||||
OC_node.save(nodeNbt);
|
OC_node.save(nbtNode);
|
||||||
tag.setTag("oc:node", nodeNbt);
|
tag.setTag("oc:node", nbtNode);
|
||||||
|
}
|
||||||
|
if (OC_fileSystem != null && OC_fileSystem.node() != null) {
|
||||||
|
final NBTTagCompound nbtFileSystem = new NBTTagCompound();
|
||||||
|
OC_fileSystem.node().save(nbtFileSystem);
|
||||||
|
tag.setTag("oc:fs", nbtFileSystem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return (((((super.hashCode() + worldObj.provider.dimensionId << 4) + xCoord) << 4) + yCoord) << 4) + zCoord;
|
return (((((super.hashCode() + (worldObj == null ? 0 : worldObj.provider.dimensionId) << 4) + xCoord) << 4) + yCoord) << 4) + zCoord;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dirty cheap conversion methods
|
// Dirty cheap conversion methods
|
||||||
|
@ -299,9 +310,15 @@ public abstract class TileEntityAbstractInterfaced extends TileEntityAbstractBas
|
||||||
|
|
||||||
@Optional.Method(modid = "OpenComputers")
|
@Optional.Method(modid = "OpenComputers")
|
||||||
private void OC_constructor() {
|
private void OC_constructor() {
|
||||||
|
assert(OC_node == null);
|
||||||
|
if (WarpDriveConfig.isOpenComputersLoaded) {
|
||||||
|
String OC_path = "/assets/" + WarpDrive.MODID.toLowerCase() + "/lua.OpenComputers/" + peripheralName;
|
||||||
|
OC_hasResource = assetExist(OC_path);
|
||||||
|
}
|
||||||
OC_node = Network.newNode(this, Visibility.Network).withComponent(peripheralName).create();
|
OC_node = Network.newNode(this, Visibility.Network).withComponent(peripheralName).create();
|
||||||
if (OC_hasResource && WarpDriveConfig.G_LUA_SCRIPTS != WarpDriveConfig.LUA_SCRIPTS_NONE) {
|
if (OC_node != null && OC_hasResource && WarpDriveConfig.G_LUA_SCRIPTS != WarpDriveConfig.LUA_SCRIPTS_NONE) {
|
||||||
OC_fileSystem = FileSystem.asManagedEnvironment(FileSystem.fromClass(getClass(), WarpDrive.MODID.toLowerCase(), "lua.OpenComputers/" + peripheralName), peripheralName);
|
OC_fileSystem = FileSystem.asManagedEnvironment(FileSystem.fromClass(getClass(), WarpDrive.MODID.toLowerCase(), "lua.OpenComputers/" + peripheralName), peripheralName);
|
||||||
|
((Component) OC_fileSystem.node()).setVisibility(Visibility.Network);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue