From a5054736ace1bdddb6bb396f5d7129e7b7a70643 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sun, 20 Dec 2020 21:36:50 +0100 Subject: [PATCH] Make unload of computers only suspend devices, only unload in destroy. Avoids persisted data getting killed when it shouldn't. --- .../oc2/common/block/entity/ComputerTileEntity.java | 13 ++++++++++++- .../common/vm/VirtualMachineDeviceBusAdapter.java | 4 ++++ 2 files changed, 16 insertions(+), 1 deletion(-) 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();