You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 05:27:21