|
| |
众所周知,现在各大服务端核心(spigot, craftbukkit, cauldron)都是基于Mojang官方开发的服务器内核(sponge除外)搭建的。 虽然这些服务端核心给我们提供了很多便利的API,但在这之中难免会有一些功能没有完全地被api继承,所以有时候开发者们会需要通过直接调用Mojang的代码才能达到某些特殊效果(比如向玩家发送特定数据包)。 而这些Mojang代码大部分都属于net.minecraft.server包,便有了NMS简称。 しかし(但是) Mojang的代码不光混淆过,还有一个很烦人的尿性:每个mc版本的包名都不一样 比如1.7.10的包名就是net.minecraft.server.v1_7_R4, 而1.14.4的包名就是net.minecraft.server.v1_14_R4 不过虽然里面的代码会根据版本改变,但很多时候要调用的方法都不会变 然鹅这时候如果你的包名不一样的话,JVM就懵逼了:就算这个类存在也有这个方法,JVM却找不到该版本对应的类,然后你的插件就不能跨版本了。 |
| |
面对这个棘手的问题,大家出了很多不同的解决办法: 办法1:反射 方法2:代理 方法3:Libs64 |
| |
Libs64使用了 而且使用方法又简单,只需在插件启动的时候(onEnable)里加入一行代码:
这里的插件就用你插件的实例,比如如果是在主类里调用这个方法的话就是this 类名就是需要打补丁的类,比如如果这个类是net.berry64.test.NMSClass那么这里就是"net.berry64.test.NMSClass" 切记这里不能用NMSClass.class.getName()! 因为这样的话JVM会加载你本身的类 而插件版本就是你开发时使用的API版本,比如你用的是1.7.10的话那么你的版本就是v1_7_R4,那么你这里就可以写new ServerVersion(1,7,4) |
| |
现在我们可以跨版本调用NMS了,那我们就可以愉快的使用NMS带来的便利了: NMS最常用的用法是用来向玩家发包,这里我直接放上代码:
主类:
|
| |
不要急不要急,人人都有份 现在下载Libs64 -> 这里 读到这里你可能发现了,嘿嘿,这是不是像个广告 |