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都能使用的
在写支持的时候应该使用 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的判断与数据的传递了, 这边只给出示例代码
复制代码
物品/方块材质判断
如果只是简单的判断这个方块是不是水, 火, 比如
复制代码
那就继续用,没必要对其做怎么,但是!如果这个材质是作为一个主键,加载配置的值的时候!就不应该直接getType了!
如果你直接getType(), 将会导致各种数据错误!
我推荐使用 ItemFactory.java, 这是我项目的对于这块数据的各种操作, 我想你会需要他。
下面是来着该项目的部分代码片段
复制代码
可能有人会问: new ItemStack 不需要吗??????? 我在这里回答, 不需要, 因为 Bukkit 在处理这个的时候已经对其作出了兼容, 直接 new ItemStack 是ok的
然后判断两个物品是否一样请使用 ItemFactory.isSame 方法 =>
怎样写出一个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的判断与数据的传递了, 这边只给出示例代码
- class InvHolder implements InventoryHoder {
- static InvHolder INSTANCE = new InvHolder();
- // [implement code]
- }
- public static MyInv implements Listener {
- public static final Inventory INVENTORY = Bukkit.createInventory(InvHolder.INSTANCE, 9 * 3, "§c");
- @EventHandler(ignoreCancelled = true) void onPlayerClick(InventoryClickEvent event) {
- if(event.getInventory().getHolder() instanceof InvHolder) event.setCancelled(true);
- }
- }
物品/方块材质判断
如果只是简单的判断这个方块是不是水, 火, 比如
- if(block.getType() == Material.FIRE)
那就继续用,没必要对其做怎么,但是!如果这个材质是作为一个主键,加载配置的值的时候!就不应该直接getType了!
如果你直接getType(), 将会导致各种数据错误!
我推荐使用 ItemFactory.java, 这是我项目的对于这块数据的各种操作, 我想你会需要他。
下面是来着该项目的部分代码片段
- public static void loadBlockTemperatures() {
- for (String path : Temperature.yaml.getKeys(true)) {
- if (path.startsWith("blockTemperature.")) {
- int tem = Temperature.yaml.getInt(path);
- path = path.replace("blockTemperature.", "");
- Material material = ItemFactory.valueOf(path);
- Logging.getLogger().info(UTEi18n.parse(
- "cap.tem.provider.block.tem.rule",
- ItemFactory.toString(material) + "(" + path + ")",
- String.valueOf(tem)
- ));
- blockTemperatures.put(material, tem);
- }
- }
- }
- public static double getBlockTemperature(Location loc) {
- // ............................
- Block b = l.getBlock();
- if (b == null) continue;
- Material mt = ItemFactory.getType(b);
- final Integer tmp = blockTemperatures.get(mt);
- // ............................
- }
可能有人会问: new ItemStack 不需要吗??????? 我在这里回答, 不需要, 因为 Bukkit 在处理这个的时候已经对其作出了兼容, 直接 new ItemStack 是ok的
然后判断两个物品是否一样请使用 ItemFactory.isSame 方法 =>
夏日冰熊
4/19/2020, 7:43:10 AM
本人已经多次试水,在此澄清:
用了Inventory.getTitle().equals("")的会被该人屑死(逃
支持教程
不如你做个前置算了(我爬了
用了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()这个吧。。
Inventory.getview()这个吧。。
Karlatemp
5/2/2020, 9:43:45 AM
虎牙教授 发表于 2020-5-2 17:39
用
Inventory.getview()这个吧。。
Spigot-1.12.2并没有Inv#getView()