From 72a4e61de2e29a3df0bba75b6eca659a4f3a777c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Tue, 3 Aug 2021 02:56:08 +0200 Subject: [PATCH] Fix computer not adding own devices without attached cable/interface. --- .../common/tileentity/ComputerTileEntity.java | 54 ++++++++++++++----- 1 file changed, 42 insertions(+), 12 deletions(-) diff --git a/src/main/java/li/cil/oc2/common/tileentity/ComputerTileEntity.java b/src/main/java/li/cil/oc2/common/tileentity/ComputerTileEntity.java index 80c4b14d..46c82916 100644 --- a/src/main/java/li/cil/oc2/common/tileentity/ComputerTileEntity.java +++ b/src/main/java/li/cil/oc2/common/tileentity/ComputerTileEntity.java @@ -3,7 +3,6 @@ package li.cil.oc2.common.tileentity; import li.cil.oc2.api.bus.DeviceBusElement; import li.cil.oc2.api.bus.device.Device; import li.cil.oc2.api.bus.device.DeviceTypes; -import li.cil.oc2.api.bus.device.provider.BlockDeviceQuery; import li.cil.oc2.api.bus.device.provider.ItemDeviceQuery; import li.cil.oc2.api.capabilities.TerminalUserProvider; import li.cil.oc2.client.audio.LoopingSoundManager; @@ -25,7 +24,10 @@ import li.cil.oc2.common.network.message.ComputerBusStateMessage; import li.cil.oc2.common.network.message.ComputerRunStateMessage; import li.cil.oc2.common.network.message.ComputerTerminalOutputMessage; import li.cil.oc2.common.serialization.NBTSerialization; -import li.cil.oc2.common.util.*; +import li.cil.oc2.common.util.HorizontalBlockUtils; +import li.cil.oc2.common.util.NBTUtils; +import li.cil.oc2.common.util.SoundEvents; +import li.cil.oc2.common.util.TerminalUtils; import li.cil.oc2.common.vm.*; import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; @@ -69,7 +71,7 @@ public final class ComputerTileEntity extends AbstractTileEntity implements ITic /////////////////////////////////////////////////////////////////// private final Terminal terminal = new Terminal(); - private final TileEntityDeviceBusElement busElement = new ComputerBusElement(); + private final ComputerBusElement busElement = new ComputerBusElement(); private final ComputerItemStackHandlers deviceItems = new ComputerItemStackHandlers(); private final FixedEnergyStorage energy = new FixedEnergyStorage(Config.computerEnergyStorage); private final ComputerVirtualMachine virtualMachine = new ComputerVirtualMachine(new TileEntityDeviceBusController(busElement, Config.computerEnergyPerTick, this), deviceItems::getDeviceAddressBase); @@ -172,10 +174,7 @@ public final class ComputerTileEntity extends AbstractTileEntity implements ITic // adjacent cable. Because that would just be weird. if (!hasAddedOwnDevices) { hasAddedOwnDevices = true; - final BlockDeviceQuery query = Devices.makeQuery(this, (Direction) null); - for (final LazyOptional optional : Devices.getDevices(query)) { - optional.ifPresent(info -> busElement.addDevice(info.device)); - } + busElement.addOwnDevices(); } if (isNeighborUpdateScheduled) { @@ -225,7 +224,7 @@ public final class ComputerTileEntity extends AbstractTileEntity implements ITic tag.put(ENERGY_TAG_NAME, energy.serializeNBT()); tag.put(STATE_TAG_NAME, virtualMachine.serialize()); tag.put(TERMINAL_TAG_NAME, NBTSerialization.serialize(terminal)); - tag.put(BUS_ELEMENT_TAG_NAME, NBTSerialization.serialize(busElement)); + tag.put(BUS_ELEMENT_TAG_NAME, busElement.save()); tag.put(ITEMS_TAG_NAME, deviceItems.saveItems()); tag.put(DEVICES_TAG_NAME, deviceItems.saveDevices()); @@ -239,10 +238,7 @@ public final class ComputerTileEntity extends AbstractTileEntity implements ITic energy.deserializeNBT(tag.getCompound(ENERGY_TAG_NAME)); virtualMachine.deserialize(tag.getCompound(STATE_TAG_NAME)); NBTSerialization.deserialize(tag.getCompound(TERMINAL_TAG_NAME), terminal); - - if (tag.contains(BUS_ELEMENT_TAG_NAME, NBTTagIds.TAG_COMPOUND)) { - NBTSerialization.deserialize(tag.getCompound(BUS_ELEMENT_TAG_NAME), busElement); - } + busElement.load(tag.getCompound(BUS_ELEMENT_TAG_NAME)); deviceItems.loadItems(tag.getCompound(ITEMS_TAG_NAME)); deviceItems.loadDevices(tag.getCompound(DEVICES_TAG_NAME)); @@ -320,10 +316,22 @@ public final class ComputerTileEntity extends AbstractTileEntity implements ITic } private final class ComputerBusElement extends TileEntityDeviceBusElement { + private static final String DEVICE_ID_TAG_NAME = "device_id"; + + private final HashSet devices = new HashSet<>(); + private UUID deviceId = UUID.randomUUID(); + public ComputerBusElement() { super(ComputerTileEntity.this); } + public void addOwnDevices() { + for (final BlockDeviceInfo info : collectDevices(level, getPosition(), null)) { + devices.add(info.device); + super.addDevice(info.device); + } + } + @Override public Optional>> getNeighbors() { return super.getNeighbors().map(neighbors -> { @@ -339,6 +347,28 @@ public final class ComputerTileEntity extends AbstractTileEntity implements ITic public boolean canScanContinueTowards(@Nullable final Direction direction) { return getBlockState().getValue(ComputerBlock.FACING) != direction; } + + @Override + public Optional getDeviceIdentifier(final Device device) { + if (devices.contains(device)) { + return Optional.of(deviceId); + } + return super.getDeviceIdentifier(device); + } + + @Override + public CompoundNBT save() { + final CompoundNBT tag = super.save(); + tag.putUUID(DEVICE_ID_TAG_NAME, deviceId); + return tag; + } + + public void load(final CompoundNBT tag) { + super.load(tag); + if (tag.hasUUID(DEVICE_ID_TAG_NAME)) { + deviceId = tag.getUUID(DEVICE_ID_TAG_NAME); + } + } } private final class ComputerVMRunner extends AbstractTerminalVMRunner {