From 0da6f684555fa6fb81765c105a0bbee831ed0dae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sat, 1 Jan 2022 07:57:02 +0100 Subject: [PATCH] Store cable linking in player instead of in static list. --- .../cil/oc2/common/item/NetworkCableItem.java | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/main/java/li/cil/oc2/common/item/NetworkCableItem.java b/src/main/java/li/cil/oc2/common/item/NetworkCableItem.java index fb0d3d28..e2d34c7d 100644 --- a/src/main/java/li/cil/oc2/common/item/NetworkCableItem.java +++ b/src/main/java/li/cil/oc2/common/item/NetworkCableItem.java @@ -1,9 +1,12 @@ package li.cil.oc2.common.item; +import li.cil.oc2.api.API; import li.cil.oc2.common.Constants; import li.cil.oc2.common.blockentity.NetworkConnectorBlockEntity; import li.cil.oc2.common.blockentity.NetworkConnectorBlockEntity.ConnectionResult; import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; @@ -16,18 +19,18 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import java.util.Objects; -import java.util.WeakHashMap; public final class NetworkCableItem extends ModItem { - private static final WeakHashMap LINK_STARTS = new WeakHashMap<>(); + private static final String LINK_START_TAG_NAME = API.MOD_ID + ":" + "network_cable_link_start"; /////////////////////////////////////////////////////////////////// @Override public InteractionResultHolder use(final Level level, final Player player, final InteractionHand hand) { if (player.isShiftKeyDown()) { - if (player instanceof ServerPlayer) { - LINK_STARTS.remove(player); + if (player instanceof final ServerPlayer serverPlayer) { + final CompoundTag persistentData = serverPlayer.getPersistentData(); + persistentData.remove(LINK_START_TAG_NAME); } return InteractionResultHolder.success(player.getItemInHand(hand)); @@ -57,10 +60,13 @@ public final class NetworkCableItem extends ModItem { } if (!level.isClientSide() && player instanceof final ServerPlayer serverPlayer) { - final BlockPos startPos = LINK_STARTS.remove(player); - if (startPos == null || Objects.equals(startPos, currentPos)) { + final CompoundTag persistentData = serverPlayer.getPersistentData(); + final CompoundTag startPosTag = persistentData.getCompound(LINK_START_TAG_NAME); + final BlockPos startPos = NbtUtils.readBlockPos(startPosTag); + persistentData.remove(LINK_START_TAG_NAME); + if (startPosTag.isEmpty() || Objects.equals(startPos, currentPos)) { if (currentConnector.canConnectMore()) { - LINK_STARTS.put(serverPlayer, currentPos); + persistentData.put(LINK_START_TAG_NAME, NbtUtils.writeBlockPos(currentPos)); } else { player.displayClientMessage(new TranslatableComponent(Constants.CONNECTOR_ERROR_FULL), true); } @@ -80,18 +86,18 @@ public final class NetworkCableItem extends ModItem { break; case FAILURE: - LINK_STARTS.put((ServerPlayer) player, startPos); + persistentData.put(LINK_START_TAG_NAME, NbtUtils.writeBlockPos(startPos)); break; case FAILURE_FULL: - LINK_STARTS.put((ServerPlayer) player, startPos); + persistentData.put(LINK_START_TAG_NAME, NbtUtils.writeBlockPos(startPos)); player.displayClientMessage(new TranslatableComponent(Constants.CONNECTOR_ERROR_FULL), true); break; case FAILURE_TOO_FAR: - LINK_STARTS.put((ServerPlayer) player, startPos); + persistentData.put(LINK_START_TAG_NAME, NbtUtils.writeBlockPos(startPos)); player.displayClientMessage(new TranslatableComponent(Constants.CONNECTOR_ERROR_TOO_FAR), true); break; case FAILURE_OBSTRUCTED: - LINK_STARTS.put((ServerPlayer) player, startPos); + persistentData.put(LINK_START_TAG_NAME, NbtUtils.writeBlockPos(startPos)); player.displayClientMessage(new TranslatableComponent(Constants.CONNECTOR_ERROR_OBSTRUCTED), true); break; }