如何在Spigot 1.19.3中旋转Minecraft告示牌?
解决Spigot 1.19.3中按玩家视角设置告示牌方向的问题
核心问题说明
1.19.3版本中Minecraft告示牌分两类,方向控制逻辑完全不同:
- 站立告示牌(
Material.OAK_SIGN):用rotation属性控制朝向,取值范围0-15对应不同角度 - 墙上告示牌(
Material.OAK_WALL_SIGN):用facing属性控制朝向,对应BlockFace的北、南、东、西四个主方向
你之前的代码未处理方向属性,且可能混淆了两类告示牌的设置逻辑,导致效果不符合预期。
解决方案代码
1. 创建墙上告示牌并匹配玩家朝向
墙上告示牌可直接绑定玩家的BlockFace朝向,代码示例:
// 获取玩家当前朝向 BlockFace playerFacing = player.getFacing(); // 生成带方向属性的墙上告示牌BlockData BlockData wallSignData = Bukkit.createBlockData(Material.OAK_WALL_SIGN, data -> { data.set("facing", playerFacing); }); block.setBlockData(wallSignData); // 设置告示牌文字 if (block.getState() instanceof Sign sign) { sign.setLine(0, "面向玩家朝向"); sign.setLine(1, playerFacing.name()); sign.update(); }
2. 创建站立告示牌并匹配玩家朝向
站立告示牌的rotation需要将玩家BlockFace转换为对应数值,常用映射关系:
- 北→0、东→2、南→4、西→6
转换后设置代码:
BlockFace playerFacing = player.getFacing(); // 玩家朝向转站立告示牌rotation值 int rotation = switch (playerFacing) { case EAST -> 2; case SOUTH -> 4; case WEST -> 6; default -> 0; // 默认朝北 }; // 生成带旋转属性的站立告示牌BlockData BlockData standingSignData = Bukkit.createBlockData(Material.OAK_SIGN, data -> { data.set("rotation", rotation); }); block.setBlockData(standingSignData); // 设置告示牌文字 if (block.getState() instanceof Sign sign) { sign.setLine(0, "站立告示牌"); sign.setLine(1, "朝向" + playerFacing.name()); sign.update(); }
关键注意事项
- 告示牌行索引从0开始,你原代码中
setLine(1, ...)是设置第二行,第一行会为空。 - 必须先设置包含方向/旋转的
BlockData,再获取Sign状态,否则方向设置会被覆盖。 - 若需要告示牌正对着玩家(即玩家看告示牌时文字朝向自己),可将
playerFacing替换为playerFacing.getOppositeFace(),适用于墙上告示牌的facing属性。
内容的提问来源于stack exchange,提问作者Lorenzo
相关产品推荐
相关产品推荐

