LING_Y_
如题,
写插件时发现只兼容一个版本会不会不够适用
查了相关的帖子,但还是不太清楚是个什么原理,是怎么来的
(有是有教程,但大部分都是干讲原理,能给些实例就好)

穆色
导入对应版本的bukkit/spigot/paper的api进行开发,通过getversion好像,获得服务器版本对一些版本有差异的代码分别编写。应该

凌语丶
这个插件可能可以作为一个例子
它在没有引入任何外部Json库的情况下实现了Json解析
相关代码
  1. if (Bukkit.getBukkitVersion().compareTo("1.14") >= 0) {
  2.             gson = true;
  3.         }
复制代码



RiceTofu123
Bukkit的个版本API都具有一定的相似性,就比如我最近在开发的一个小插件,使用的1.12.2的api进行开发,而1.13,1.14,1.15的API也涵盖了我开发插件中使用到的api,所以也可以在那些服务端上完美运行。我的一个跨版本兼容解决方案就是在编写完一段功能代码后,替换(降级或升级)当前API版本,看代码能否正常打包,相应的API是否兼容存在,不存在可以通过判断Bukkit当前版本书些不同版本的解决代码。我也是刚开始做开发的,可能说的不太到位。

BlessAzek
本帖最后由 BlessAzek 于 2023-1-27 20:11 编辑

嗯。。。一般来说只要使用通用的接口(指在任何版本下都存在的接口)
就没什么大问题

当然也有特例
就拿 1.16+ 版本中的 RGB 颜色举个例子吧
在 1.16+ 版本的 Spigot 服务器核心中,ChatColor(位于 net.md_5.api.chat 包中的类)类里面有一个 of(Color) 方法,
在低于 1.16 版本的服务器核心中是没有这个方法的  

因此在调用这个方法之前应该首先去判断一下服务器版本是否在 1.16 以上,
然后去调用这个方法

例子:
  1. String str = "";
  2. // true 代表服务器版本在 1.16+
  3. if (true) {
  4.   str += ChatColor.of(new Color(0xFF00FF)) + "RGB 颜色";
  5. } else {
  6.   str += ChatColor.BLACK + "版本低于了 1.16"
  7. }
复制代码


对于1.16及以下的版本,如果使用了 rgb 颜色,或许你需要将其转换成与原版最接近的颜色。
(相关例子可以见我的这个插件开源地址)


对于各个版本中不存在的类(指 1.12 中有这个类,但是更新的版本或者更老的版本中没有了)
应当将其封装成一个 class 以防止报 ClassNotFoundException

例子:
  1. // 示例用 class
  2. public class TestClass {
  3.       public static void test() {
  4.            // 假设我们服务器版本在 1.12 及以上才有了 Player 类
  5.            // 注意是假设(不要刚((
  6.            Player p = Bukkit.getPlayer();
  7.            // do something...
  8.      }
  9. }
复制代码

这样我们就把 新(老) 版本中的才有的 Class 给封装到了一个类中。
调用例子:
  1. //...
  2. // true 代表服务器版本在 1.12+
  3. if (true) {
  4.     TestClass.test();
  5. } else {
  6.   // do something
  7. }
复制代码


烂柯人beta
本帖最后由 烂柯人beta 于 2023-1-27 21:44 编辑

可以参考下这个

https://www.mcbbs.net/forum.php?mod=viewthread&tid=1414777&page=1#pid27848926

第一页 上一页 下一页 最后一页