From b92152c593dceb7fecfbb77593d73effabe6a2b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sun, 13 Feb 2022 17:36:16 +0100 Subject: [PATCH] Fix devices in unloaded chunks not being removed from element device list. --- .../bus/AbstractGroupingDeviceBusElement.java | 5 +++-- .../bus/BlockDeviceBusControllerTests.java | 17 +++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/main/java/li/cil/oc2/common/bus/AbstractGroupingDeviceBusElement.java b/src/main/java/li/cil/oc2/common/bus/AbstractGroupingDeviceBusElement.java index f34194b8..86be7a21 100644 --- a/src/main/java/li/cil/oc2/common/bus/AbstractGroupingDeviceBusElement.java +++ b/src/main/java/li/cil/oc2/common/bus/AbstractGroupingDeviceBusElement.java @@ -124,12 +124,13 @@ public abstract class AbstractGroupingDeviceBusElement removedEntries = new HashSet<>(oldEntries); - for (final TEntry entry : removedEntries) { + for (final TEntry entry : oldEntries) { devices.removeInt(entry.getDevice()); onEntryRemoved(entry); } + oldEntries.clear(); + scanDevices(); } diff --git a/src/test/java/li/cil/oc2/common/bus/BlockDeviceBusControllerTests.java b/src/test/java/li/cil/oc2/common/bus/BlockDeviceBusControllerTests.java index a1f7e58b..0cb71d4d 100644 --- a/src/test/java/li/cil/oc2/common/bus/BlockDeviceBusControllerTests.java +++ b/src/test/java/li/cil/oc2/common/bus/BlockDeviceBusControllerTests.java @@ -218,6 +218,23 @@ public class BlockDeviceBusControllerTests { assertTrue(busController.getDevices().contains(deviceBlockEntity.getObjectDevice())); } + @Test + public void unloadedDeviceIsRemovedFromElement() { + final BlockPos elementPos = new BlockPos(0, 0, 8); + final TestBusElementBlockEntity busElementInfo = new TestBusElementBlockEntity(elementPos); + + final BlockPos devicePos = elementPos.west(); + final TestDeviceBlockEntity deviceBlockEntity = new TestDeviceBlockEntity(devicePos); + + busElementInfo.getBusElement().updateDevicesForNeighbor(Direction.WEST); + assertTrue(busElementInfo.getBusElement().getDevices().contains(deviceBlockEntity.getObjectDevice())); + + fakeLevel.setChunkLoaded(new ChunkPos(devicePos), false); + + busElementInfo.getBusElement().updateDevicesForNeighbor(Direction.WEST); + assertFalse(busElementInfo.getBusElement().getDevices().contains(deviceBlockEntity.getObjectDevice())); + } + @Test public void devicesGetSerializedWhenUnloadedAndDeserializedWhenLoaded() { final BlockPos controllerPos = new BlockPos(1, 0, 8);