Minecraft(我的世界)中文论坛

 找回密码
 注册(register)
查看: 1219|回复: 1

[插件开发教程] [翻译][UD]在使用NMS的同时支持多个版本

[复制链接]
byxiaobai 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
1789
钻石
性别
保密
注册时间
2014-7-1
查看详细资料
发表于 2017-5-26 23:08:55 | 显示全部楼层 |阅读模式

您尚未登录,立即登录享受更好的浏览体验!

您需要 登录 才可以下载或查看,没有帐号?注册(register)

x
之前我发现,很多人制作插件时需要使用一些当前版本的特性,比如发送一个title或一个ActionBar信息。很多人认为想实现这些功能就只能使用NMS(net.minecraft.server)。但由于每个版本的NMS都会有一些改动,所以有些插件的版本兼容性比较差。当版本更新时,它们往往会无法继续正常使用

一段时间后,我发现的最好方式是使用反射兼容我需要兼容的所有版本。
虽然我认为这是一件好事(因为我的插件现在能够向后兼容),但DarkSeraphim告诉我,在一个插件中如果使用了反射,那么应该写一个接口,并在兼容不同版本的功能类中分别实现不同的代码。
如果使用接口的话,我可以将NMS代码放到一个单独的类中,并只加载和使用特定版本的NMS类。这就避免了使用反射!
因为这个教程不可能让你避免有时候使用反射的需要,你可能会遇到类似于发送Title或使用ActionBar这样的需求
在这个示例插件中我们会在玩家进入服务器时发送一个ActionBar信息。同时,这个插件也会支持1.8的所有子版本。
那么让我们开始吧:
首先,我们需要创建一个包来放置接口和NMS类。

                               
登录/注册后可看大图



首先,让我们创建一个叫做Actionbar的接口类。
这个接口类有一个抽象方法,我们的NMS类可以实现这个方法并通过这个方法发送actionbar信息。
任何一个实现了我们的Actionbar接口的类都必须实现这个抽象类。

那么让我们创建我们的抽象类吧。
代码:
这个类里面只有一行代码。很简单,对吧?
接下来,实现这个接口的类将会以自己的"版本特性"来实现这个抽象方法。
如果你使用这个教程中介绍的方法(也就是创建一个接口类,然后分开实现这个接口)来实现一些功能的话,请务必记住,你需要在每个NMS类中实现这个抽象类中的所有方法。
现在我们拥有我们自己的接口了,让我们创建实现它的类,并用NMS向玩家发送actionbar信息吧!

下面是用来支持1.8.1版本的类的代码,这个类实现了我们的Actionbar接口。


下面是用来支持1.8.3版本的类的代码:

现在,我们拥有分别用不同版本发送ActionBar信息的代码了!

接下来,我们需要做的就只剩下创建我们的主类,然后在插件加载时检测版本并调用合适的方法了。
主类代码:

在这个教程中的示例中,我们在主类中就完成了所有操作。
但是,如果你要制作一个大型插件的话,可能会有很多类(比如你的监听器类等)。
这时候,你需要在你的主类中创建一个用来获取Actionbar的方法,并让你的其他类可以使用它。
这个方法是很简单的,如果你一直在认真看这个教程的话,想必就已经知道如何做了。
代码:

现在,你的所有类都能用这个方法发送actionbar信息了!
你可以选择很多支持多版本的方法,在这里我使用的方法是得到Bukkit的Server类,然后获取它的包名。
当然,你也可以用Bukkit.getBukkitVersion()方法来查看你的NMS类需要支持的版本。

看到这里,你应该明白了一件事:这个让NMS代码向后兼容的方法是非常简单的。
另外,注意:如果你要实例化你的一个NMS类时,没有支持合适版本的类的话,你的插件将会抛出一个 ClassNotFoundException 异常。因此,建议先确定好服务器版本再去实例化NMS类。
在此此后,当spigot更新了一个新的NMS包名时,我们只需要创建一个新的NMS类并让它实现Actionbar接口,最后在插件加载时检测就可以了!

                               
登录/注册后可看大图



作者最后的话:
我自己的一些废话:

来自群组: Unknown Domain

评分

参与人数 6人气 +11 金粒 +15 收起 理由
a103060 + 2 MCBBS有你更精彩~
耗子 + 2 MCBBS有你更精彩~
602723113 + 2 MCBBS有你更精彩~
1421312987 + 2 MCBBS有你更精彩~
Eldon + 1 + 15 辛苦了
810587921 + 2 翻译辛苦←_←这么久了还没人加分.

查看全部评分

jebme 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
2433
钻石
性别
保密
注册时间
2015-3-22
查看详细资料
发表于 2017-6-17 19:25:55 | 显示全部楼层
很不错,支持一个
但是反射毕竟有他的好处
如果NMS没有改动协议,那么我不需要去更新代码,我觉得应该是反射与接口实现类并用,当服务端NMS版本不在已经实现类之中,再尝试使用反射。
xD

评分

参与人数 1人气 +1 金粒 +5 收起 理由
byxiaobai + 1 + 5 谢谢!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册(register)

本版积分规则

Archiver|小黑屋|Mcbbs.net ( 京ICP备15023768号-1 ) | 京公网安备 11010502037624号 | 手机版

GMT+8, 2019-8-21 08:19 , Processed in 0.034322 second(s), Total 9, Slave 8 queries , Gzip On, MemCached On.

"Minecraft"以及"我的世界"为Mojang Synergies AB的商标 本站与Mojang以及微软公司没有从属关系

© 2010-2019 我的世界中文论坛 版权所有 本站原创图文内容版权属于原创作者,未经许可不得转载

快速回复 返回顶部 返回列表