使用nms之前,我们先了解一下什么是nms,一句话,nms就是Bukkit核心jar里面的包net.minecraft.server.vXXX 就拿我的 spigot-1.9.4 使用 jd-gui 进行反编译,呈现在我们眼前的是这个: 可以看到,不同bukkit版本,包名都不同,比如1.8就是v1_8_R1,1.8.3就是v1_8_R2,而现在看到的这个1.9.4,就是1_9_R2 因此,如果你使用了nms,就会有着严格的版本限制,多版本兼容后面讲到。
现在来说我们为什么要使用这个包里面的东西,就拿Title来说,1.8是没有为我们提供任何发送Title消息的方法的,那其他插件是怎么做到的呢?原因很简单,因为在Bukkit核心jar里面,就藏着我们想要的东西。
1.6版本之后,Bukkit的通信机制大改,许多的东西都是通过给玩家发送数据包的方式做到的。而我们想要的Title,也是这样,你可以找到PacketPlayOutTitle这个类,里面藏着的,正是Title的构造方法。当你完成了一个Title的构造然后发送给玩家时,玩家的客户端就会对你发送的数据包进行解读,最终呈现的,就是Title消息了。
而我们要达到的目的,就是像上面一样给玩家发送这样一个数据包。 下面是详细操作步骤: 展开这个类,查看所有的构造方法。 从上面的消息中我们得到了这个类的4个构造方法 - PacketPlayOutTitle() - 无参
- PacketPlayOutTitle(EnumTitleAction, IChatBaseComponent) - 类型枚举、基础交流类?(随便起个名字好了)
- PacketPlayOutTitle(EnumTitleAction, IChatBaseComponent,int,int,int) - 类型枚举、基础类、淡入时间、停留时间、淡出时间
- PacketPlayOutTitle(int,int,int) - 淡入时间、停留时间、淡出时间
而我们最需要的,就是能够传入参数最多的那个构造方法。 现在,我们来看看如何构造:
 在这里要注意一下 EnumTitleAction 是一个内部枚举类,在Bukkit1.8.3之前被拿到外面成为单独的一个枚举类。 EnumTitleAction类提供的枚举用于区分Title的类型: 两个我们要一般用到的: - TITLE - 主Title内容(第一行)
- SUBTITLE - 副Title内容(第二行)
像上面这样,我们就已经构造出一个PacketPlayOutTitle对象了,接下来要做的,就是将它发送给玩家。
步骤如下: 
这样,我们就完成了Title的发送。 你可以将其包装成为自己的方法,以便随时调用。 |