SpigotMC双面更新后,如何在PlayerInteract事件中读取牌子文本?
解决新版Minecraft双面牌子文本读取问题
针对你遇到的PlayerInteractEvent无法直接获取SignSide的问题,可以通过牌子朝向(BlockFace) 和玩家点击的面(BlockFace) 来对应到SignSide,进而读取对应面的文本。以下是具体实现:
完整代码示例
@EventHandler(ignoreCancelled = true) void onPlayerInteract(PlayerInteractEvent event) { // 检查是否为右键点击方块 if (event.getAction() != Action.RIGHT_CLICK_BLOCK) { return; } Block block = event.getClickedBlock(); if (block == null) { return; } // 检查是否为新版Sign(1.20+) if (!(block.getState() instanceof Sign)) { return; } Sign sign = (Sign) block.getState(); BlockFace signFacing = sign.getFacing(); BlockFace clickedFace = event.getBlockFace(); // 判断点击的是牌子正面还是背面 SignSide targetSide; // 牌子的正面朝向是自身朝向的反方向(比如朝北的牌子,正面朝南) if (clickedFace.equals(signFacing.getOppositeFace())) { targetSide = SignSide.FRONT; } else { targetSide = SignSide.BACK; } // 读取对应面的文本(示例:读取第1行,行号范围0-3) String targetLine = sign.getSide(targetSide).getLine(0); // 后续可以对文本进行处理,比如发送给玩家 event.getPlayer().sendMessage("你点击的牌子文本:" + targetLine); }
关键逻辑说明
- 类型转换:将BlockState强转为新版
Sign接口(替代旧版SignState) - 朝向判断:
- 新版牌子的
getFacing()返回它附着/朝向的方向(比如挂在北墙的牌子,facing为NORTH) - 牌子的正面朝向是自身facing的反方向,当玩家点击这个反方向的面时,就是点击了正面
- 新版牌子的
- 文本读取:通过
sign.getSide(targetSide)获取对应面的SignSide实例,再用getLine(int)读取指定行文本
注意事项
- 该代码基于**Spigot/Bukkit 1.20+**版本,确保你的开发环境依赖对应版本的API
- 对站立式牌子(非墙挂),该逻辑同样适用,因为站立牌子的正面朝向就是自身facing的反方向
内容的提问来源于stack exchange,提问作者DNAmaster10
相关产品推荐
相关产品推荐

