Karlatemp 4/19/2020, 5:47:29 AM
本帖最后由 Karlatemp 于 2020-5-2 17:44 编辑


怎样写出一个1.12.2 - 1.15.2 通用支持的插件

前言
如果你没有使用以下的任何内容,恭喜你,你的插件是1.12.2-1.15.2都能使用的
  • 使用了 Inventory#getTitle()String;
  • 使用了 Block#getType()Material;
  • 使用了 ItemStack#getType()Material;
  • 使用了 Material.**

在写支持的时候应该使用 Spigot1.12.2作为依赖核心, 而不是Spigot1.15.2, 并且不要标记 api-version

物品栏(Inventory的判断
你还在用 inv.getTitle().equals("§bMy inventory") 进行判断吗,噢,老兄,那可太不妙了,如果我是你的合作人,我一定会用我那油亮的皮鞋狠狠的踢你的屁股
而且Inventory#getTitle()String在高版本中已经删除了,你要是直接用的话准 java.lang.NoSuchMethodError

我们创建一个物品栏的时候都是使用 Server.createInventory(null, 9 * 3, "§bKarlatemp's public repo")
可你是否有想过最前面的null可以换什么东西呢, 这个地方就直接引用 [PCD]关于Inventory的判断与数据的传递了, 这边只给出示例代码
  1. class InvHolder implements InventoryHoder {
  2.     static InvHolder INSTANCE = new InvHolder();
  3.     // [implement code]
  4. }
  5. public static MyInv implements Listener {
  6.     public static final Inventory INVENTORY = Bukkit.createInventory(InvHolder.INSTANCE, 9 * 3, "§c");
  7.     @EventHandler(ignoreCancelled = true) void onPlayerClick(InventoryClickEvent event) {
  8.         if(event.getInventory().getHolder() instanceof InvHolder) event.setCancelled(true);
  9.     }
  10. }
复制代码


物品/方块材质判断
如果只是简单的判断这个方块是不是水, 火, 比如
  1. if(block.getType() == Material.FIRE)
复制代码

那就继续用,没必要对其做怎么,但是!如果这个材质是作为一个主键,加载配置的值的时候!就不应该直接getType了!
如果你直接getType(), 将会导致各种数据错误!
我推荐使用 ItemFactory.java, 这是我项目的对于这块数据的各种操作, 我想你会需要他。
下面是来着该项目的部分代码片段

  1.     public static void loadBlockTemperatures() {
  2.         for (String path : Temperature.yaml.getKeys(true)) {
  3.             if (path.startsWith("blockTemperature.")) {
  4.                 int tem = Temperature.yaml.getInt(path);
  5.                 path = path.replace("blockTemperature.", "");
  6.                 Material material = ItemFactory.valueOf(path);
  7.                 Logging.getLogger().info(UTEi18n.parse(
  8.                         "cap.tem.provider.block.tem.rule",
  9.                         ItemFactory.toString(material) + "(" + path + ")",
  10.                         String.valueOf(tem)
  11.                 ));
  12.                 blockTemperatures.put(material, tem);
  13.             }
  14.         }
  15.     }

  16.     public static double getBlockTemperature(Location loc) {
  17. // ............................
  18.                     Block b = l.getBlock();
  19.                     if (b == null) continue;
  20.                     Material mt = ItemFactory.getType(b);
  21.                     final Integer tmp = blockTemperatures.get(mt);
  22. // ............................
  23.     }

复制代码

可能有人会问: new ItemStack 不需要吗??????? 我在这里回答, 不需要, 因为 Bukkit 在处理这个的时候已经对其作出了兼容, 直接 new ItemStack 是ok的
然后判断两个物品是否一样请使用 ItemFactory.isSame 方法 =>


夏日冰熊 4/19/2020, 7:43:10 AM
本人已经多次试水,在此澄清:
用了Inventory.getTitle().equals("")的会被该人屑死(逃

支持教程
不如你做个前置算了(我爬了

150149 4/26/2020, 7:54:20 AM
老哥github链接炸了

夏日冰熊 5/1/2020, 1:26:49 PM
wnk 发表于 2020-4-26 15:54
老哥github链接炸了

用coding的:
https://untiltheend.coding.net/p ... al/ItemFactory.java

虎牙教授 5/2/2020, 9:39:39 AM

Inventory.getview()这个吧。。

Karlatemp 5/2/2020, 9:43:45 AM
虎牙教授 发表于 2020-5-2 17:39

Inventory.getview()这个吧。。

Spigot-1.12.2并没有Inv#getView()

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