本帖最后由 byxiaobai 于 2017-6-10 19:38 编辑
这是一个教插件初学者如何编辑,获取和使用木牌的一个教程。

木牌改变事件(SignChangeEvent):
当一个木牌发生改变时,这个事件就会被调用。关于这个事件的详细信息可以自行查阅相关资料。
接下来,让我们开始制作一个简单的木牌颜色插件吧。

首先,让我们从一个事件监听器开始。
  1. @EventHandler
复制代码
上面这段代码实现了一个简单的权限检查功能。
我们都知道,一个木牌中只有四行空间存放字符串。
所以,我们可以增加几行代码。
这里之所以循环四次,是因为一个木牌只有四行字符串。
  1. for (int i = 0; i < 4; i++) {
复制代码
接下来,我们的代码会读取这一行的字符,并确定这些字符不是空的。
  1. String line = e.getLine(i);
  2. if (line != null && !line.equals("")) {
复制代码
检查完毕之后,我们就可以从事件里改变这个牌子上的字符串了。(在这个示例中,我们需要把"&"字符替换成正确的颜色字符)
  1. e.setLine(i, ChatColor.translateAlternateColorCodes('&', line));
复制代码


如何得到一个牌子方块的实例
首先,用下面的代码可以得到一个方块的对象。
  1. Block b = p.getLocation().getBlock();
复制代码
因为这个方块有可能并不是牌子,所以我们需要先进行一个判断:
  1. if (b.getType() == Material.WALL_SIGN || b.getType() == Material.SIGN_POST)
复制代码
之所以是双重判断,是因为在墙上的牌子有两种material类型。
接下来,我们需要对这个方块进行一个类型转换:
一个警告:
现在我们拥有牌子方块的对象了,那么接下来我们就可以做很多事,比如:
  1. sign.getLine(int line); // 从牌子中的任意一行(范围是1到3)读取字符串
  2. sign.setLine(int line, String text); // 在牌子中的任意一行设置字符串
  3. sign.getLines(); // 得到每一行的字符串(返回一个String的数组)
复制代码

那么,接下来我们要实现一个右键有指定内容的牌子传送的功能。(就是牌子上第一行[WARP],第二行warp的地点。然后右键可以传送到那个地点)
  1. if (ChatColor.stripColor(sign.getLine(0)).equalsIgnoreCase("[WARP]")) {

  2.     String warp = sign.getLine(2);
  3.     Bukkit.dispatchCommand(p, "warp " + warp);

  4. }
复制代码
判断条件中的ChatColor.stripColor是用来去掉字符串中的颜色字符的。
去掉颜色字符后,我们确认了一下第一行里的内容是不是[WARP]。如果是的话,就从牌子的第三行获取要传送的地址,然后让玩家使用这个指令(如/warp shop)。
当然,如果你想的话,也可以自己在玩家没有权限时发送一个提示。
作者的一些话:

[groupid=1181]Unknown Domain[/groupid]