diff --git a/src/main/java/com/extendedae_plus/hooks/WrenchHook.java b/src/main/java/com/extendedae_plus/hooks/WrenchHook.java index 5890cb1..1976a88 100644 --- a/src/main/java/com/extendedae_plus/hooks/WrenchHook.java +++ b/src/main/java/com/extendedae_plus/hooks/WrenchHook.java @@ -90,15 +90,15 @@ public final class WrenchHook { } } } else if (!InteractionUtil.isInAlternateUseMode(player) && InteractionUtil.canWrenchRotate(stack)) { - // 未潜行 + 扳手:打开频率输入界面 + // 未潜行 + 扳手:切换锁定状态 BlockEntity be = level.getBlockEntity(hit.getBlockPos()); if (be instanceof WirelessTransceiverBlockEntity te) { - if (level.isClientSide) { - // 客户端打开GUI - openFrequencyInputScreen(hit.getBlockPos(), te.getFrequency()); - } + boolean newLocked = !te.isLocked(); + te.setLocked(newLocked); + // 提示玩家 + player.displayClientMessage(Component.literal(newLocked ? "已锁定收发器" : "已解锁收发器"), true); // 轻微反馈音效 - level.playSound(player, hit.getBlockPos(), SoundEvents.UI_BUTTON_CLICK.get(), SoundSource.BLOCKS, 0.5F, 1.0F); + level.playSound(player, hit.getBlockPos(), SoundEvents.LEVER_CLICK, SoundSource.BLOCKS, 0.5F, newLocked ? 0.6F : 0.9F); event.setCanceled(true); event.setCancellationResult(InteractionResult.sidedSuccess(level.isClientSide)); @@ -106,6 +106,34 @@ public final class WrenchHook { } } + @SubscribeEvent + public static void onPlayerLeftClickBlock(PlayerInteractEvent.LeftClickBlock event) { + var player = event.getEntity(); + var level = event.getLevel(); + var pos = event.getPos(); + + // 非旁观者 + if (player.isSpectator()) { + return; + } + + ItemStack stack = player.getMainHandItem(); + // 潜行 + 扳手 + 无线收发器:打开频率输入界面 + if (InteractionUtil.isInAlternateUseMode(player) && InteractionUtil.canWrenchRotate(stack)) { + BlockEntity be = level.getBlockEntity(pos); + if (be instanceof WirelessTransceiverBlockEntity te) { + if (level.isClientSide) { + // 客户端打开GUI + openFrequencyInputScreen(pos, te.getFrequency()); + } + // 轻微反馈音效 + level.playSound(player, pos, SoundEvents.UI_BUTTON_CLICK.get(), SoundSource.BLOCKS, 0.5F, 1.0F); + + event.setCanceled(true); + } + } + } + @OnlyIn(Dist.CLIENT) private static void openFrequencyInputScreen(net.minecraft.core.BlockPos pos, long currentFrequency) { Minecraft.getInstance().setScreen(new FrequencyInputScreen(pos, currentFrequency)); diff --git a/src/main/java/com/extendedae_plus/network/SetWirelessFrequencyC2SPacket.java b/src/main/java/com/extendedae_plus/network/SetWirelessFrequencyC2SPacket.java index f3d398f..31413a5 100644 --- a/src/main/java/com/extendedae_plus/network/SetWirelessFrequencyC2SPacket.java +++ b/src/main/java/com/extendedae_plus/network/SetWirelessFrequencyC2SPacket.java @@ -52,13 +52,13 @@ public class SetWirelessFrequencyC2SPacket { return; } - // 检查是否锁定 - if (te.isLocked()) { - player.displayClientMessage( - Component.literal("收发器已锁定,无法修改频道"), - true - ); - return; + // 通过GUI设置频率时,忽略锁定状态 + // 临时保存锁定状态 + boolean wasLocked = te.isLocked(); + + // 临时解锁以允许设置 + if (wasLocked) { + te.setLocked(false); } // 设置频率 @@ -68,6 +68,11 @@ public class SetWirelessFrequencyC2SPacket { } te.setFrequency(newFreq); + // 恢复锁定状态 + if (wasLocked) { + te.setLocked(true); + } + // 发送反馈消息 player.displayClientMessage( Component.literal("频道已设置为:" + te.getFrequency()),