鬼畜畜
1.14后,不能再使用org.spigotmc.material.Sign和org.spigotmc.material.data了(反正这个Dev是这样)


和MD_5一通交流,应使用BlockData API,翻了一圈SpigotMC毛线都没找到


经过3个小时的折腾,我整理了一套教程,虽然代码特别菜,但希望能帮到你


org.bukkit.material.Sign 不能在 1.14 上正常工作了,所以我们要换掉这个


获取Sign示例,可以用来设置牌子文字:


代码:

  1. Block b = <在这里获取你的牌子方块>;
  2. org.bukkit.block.Sign sign = (org.bukkit.block.Sign) b.getState();
  3. sign.setText(....);
  4. sign.update(..);

如果你需要操作 Facing 那么就要用BlockData Type了:


BlockDataAPI区分SIGNPOST(插地上的)和WALLSIGN(贴墙上的),所以代码不同:


代码:

  1. bs=<在这里获取你的贴墙上的牌子方块>.getState();
  2. org.bukkit.block.data.type.WallSign signBlockDataType = (org.bukkit.block.data.type.WallSign) bs.getBlockData();

代码:

  1. bs=<在这里获取你的插地上的牌子方块>.getState();
  2. org.bukkit.block.data.type.Sign signBlockDataType = (org.bukkit.block.data.type.Sign) bs.getBlockData();



获取到牌子的BlockDataType后,你可以用这个来操作 Facing


代码:

  1. signBlockDataType.setFacing(<需要设置为的BlockFace>);
  2. bs.setBlockData(signBlockDataType);



附上一个QSRR正在用的检测牌子是否贴在某个方块上的方法


@param Block b - 需要检测的方块


@Return Block - 被检测方块依附的方块,没有返回null


代码:

  1. public static Block getAttached(Block b) {
  2.   try {
  3.    if(b.getBlockData() instanceof Directional) {
  4.     Directional directional = (Directional) b.getBlockData();
  5.     return b.getRelative(directional.getFacing().getOppositeFace());
  6.    }else {
  7.     //No Directionalable
  8.     return null;
  9.    }
  10.   } catch (NullPointerException|ClassCastException e) {
  11.    debugLog("What's this?");
  12.    debugLog(e.getMessage());
  13.    return null;
  14.   }
  15.     }



经测试可在1.13与1.14使用