diff --git a/src/main/java/li/cil/oc2/common/block/entity/ComputerTileEntity.java b/src/main/java/li/cil/oc2/common/block/entity/ComputerTileEntity.java index 2954a5b0..bb924506 100644 --- a/src/main/java/li/cil/oc2/common/block/entity/ComputerTileEntity.java +++ b/src/main/java/li/cil/oc2/common/block/entity/ComputerTileEntity.java @@ -271,6 +271,15 @@ public final class ComputerTileEntity extends AbstractTileEntity implements ITic } } + @Override + public void remove() { + super.remove(); + + // Regular dispose only suspends, but we want to do a full unload when we get + // destroyed, so stuff inside us can delete out-of-nbt persisted data. + virtualMachine.vmAdapter.unload(); + } + @Override public CompoundNBT getUpdateTag() { final CompoundNBT result = super.getUpdateTag(); @@ -381,7 +390,9 @@ public final class ComputerTileEntity extends AbstractTileEntity implements ITic ServerScheduler.removeOnUnload(getWorld(), onWorldUnloaded); - stopRunnerAndResetVM(); + joinVirtualMachine(); + virtualMachine.vmAdapter.suspend(); + busController.dispose(); busElement.dispose(); } diff --git a/src/main/java/li/cil/oc2/common/vm/VirtualMachineDeviceBusAdapter.java b/src/main/java/li/cil/oc2/common/vm/VirtualMachineDeviceBusAdapter.java index 107ac587..2588fbf2 100644 --- a/src/main/java/li/cil/oc2/common/vm/VirtualMachineDeviceBusAdapter.java +++ b/src/main/java/li/cil/oc2/common/vm/VirtualMachineDeviceBusAdapter.java @@ -69,6 +69,10 @@ public final class VirtualMachineDeviceBusAdapter { public void unload() { fireLifecycleEvent(VMDeviceLifecycleEventType.UNLOAD); + suspend(); + } + + public void suspend() { deviceContexts.forEach((device, context) -> { if (context != null) { context.invalidate();