byxiaobai
本帖最后由 byxiaobai 于 2021-7-29 16:55 编辑
前言
本教程致力于解决1.13更新删除Inventory.getTitle()导致的一堆问题,
并同时帮助大家更容易制作好用的GUI,而不是被各种特性烦到死
本教程代码取自PlotHotel[1.15-1.16],使用MIT协议(就是可以随便抄袭)
如果你的版本在1.12及以下,请使用这一份代码中的gui部分(com.toolapi.api.gui),工具包(toolapi.utils)
ToolAPI-master.zip (388.83 KB, 下载次数: 38) 1.12及以下的源码取自ToolAPI

使用方法
首先,下载附件,里面有用到的源代码
sources.zip (9.77 KB, 下载次数: 16, 售价: 5 粒金粒)


API架构
GuiManager:在这里注册你的gui
Gui:一个gui的抽象类
GuiHandler:用来注册gui中的按钮

GuiSlot:用于代表gui中的一个位置
GuiListener:用来监听gui相关事件,并通知注册的gui进行处理

使用示例
这里以上面的GUI为例,介绍制作这个GUI的过程

在所有工作开始之前,使用键盘上的Ctrl+C键和Ctrl+V键将api代码导入到自己的项目中,并修改包名和import语句
在自己插件的onEnable()方法中调用GuiManager.INSTANCE.registerGuiManager(this);
  1. @Override
  2.     public void onEnable() {
  3.         plugin = this;
  4.         GuiManager.INSTANCE.registerGuiManager(this);
  5.         SellerGuiManager.INSTANCE.init();
  6.         Bukkit.getLogger().info("[Seller] 插件加载完毕");
  7.     }
复制代码
首先,创建一个自己的GUI管理器(SellerGuiManager)
其中canPutSlots是能够放物品的格子,SellGui是我们自定义的GUI
SellHandler为玩家点击"点击出售"按钮是插件进行的处理
SellSlot为更新用Slot,如果你的物品可能需要在某些时候自动更新,就需要实现这个类
  1. public class SellerGuiManager {
  2.     public static final SellerGuiManager INSTANCE=new SellerGuiManager();
  3.     private SellGui sellGui;
  4.     private int[] canPutSlots=new int[]{9,10,11,12,13,14,15,
  5.                                         19,20,21,22,23,24,25,
  6.                                         29,30,31,32,33,34,35,
  7.                                         39,40,41,42,43,44,45};

  8.     public void init(){
  9.         sellGui=new SellGui("§a出售菜单",canPutSlots);

  10.         //点击出售
  11.         ItemStack sellItem=ItemUtil.createItem(Material.ACACIA_LOG,"点击出售","QAQ");
  12.         SellSlot sellSlot=new SellSlot(53);
  13.         sellSlot.setSlotItem(sellItem);
  14.         InventoryUtil.setInventoryItem(sellGui.getInventory(),sellItem,53);

  15.         //玻璃板
  16.         ItemStack glassPane=ItemUtil.createItem(Material.GLASS_PANE," ","");
  17.         InventoryUtil.setInventoryItem(sellGui.getInventory(),glassPane,MathUtil.getNumberToNumber(0,8));
  18.         InventoryUtil.setInventoryItem(sellGui.getInventory(),glassPane,9,18,27,36,45,
  19.                                                                                 17,26,35,44);
  20.         InventoryUtil.setInventoryItem(sellGui.getInventory(),glassPane,MathUtil.getNumberToNumber(46,52));

  21.         sellGui.addGuiSlot(sellSlot);
  22.         SellHandler sellHandler=new SellHandler(sellGui, GuiHandler.GuiHandlerType.SINGLE_CLICK,53);
  23.         sellGui.addGuiHandlers(sellHandler);
  24.     }

  25.     public SellGui getSellGui() {
  26.         return sellGui;
  27.     }
  28.     public void setSellGui(SellGui sellGui) {
  29.         this.sellGui = sellGui;
  30.     }
  31. }
复制代码
SellGui
继承即可
  1. public class SellGui extends Gui {
  2.     public SellGui(String title, int[] canPutSlots) {
  3.         super(title,canPutSlots);
  4.     }
  5. }
复制代码
SellHandler
  1. public class SellHandler extends GuiHandler {
  2.     /**
  3.      * 实例化
  4.      *
  5.      * @param gui
  6.      * @param type        处理器类型
  7.      * @param handleSlots 需要处理的GUI slot
  8.      */
  9.     public SellHandler(Gui gui, GuiHandlerType type, int... handleSlots) {
  10.         super(gui, type, handleSlots);
  11.     }

  12.     @Override
  13.     public void handle(InventoryClickEvent evt) throws Exception {
  14.         System.out.println("handle");
  15.     }
  16. }
复制代码
SellSlot
  1. /**
  2. * 出售物品Slot
  3. */
  4. public class SellSlot extends GuiSlot {
  5.     public SellSlot(int inventorySlot) {
  6.         super(inventorySlot);
  7.     }

  8.     @Override
  9.     public void updateItem() {
  10.         //System.out.println("updateItem");
  11.         return;
  12.     }
  13. }
复制代码

为什么要使用这个API?
为了不在一个破Gui上消耗一大堆垃圾时间

来自群组: Unknown Domain

white_fele
我只是来混帖子的,别管我

byxiaobai
white_fele 发表于 2021-7-17 16:05
我只是来混帖子的,别管我

不能不管

byxiaobai
有什么建议可以在帖子下回复

疯狂方块学园
感谢楼主的解说和解释

Luo_you
看不懂很难受

_諵城`Tr)L
那1.12以上呢

一代浪人
111111111111111

e_mirai
安全性怎么样,不会被刷物品吧

小罗过的开心
6666666666666

夏日冰熊
对于新人蛮不错的
不过我还是喜欢在holder里自己捣鼓

Yanyan_kagou
谢谢楼主分享、教程

Yanyan_kagou
其实做Gui理解了就很简单了,照着源文件的顺序和结构就行了

7410036987
看不懂啊怎么办

小罗过的开心
真的很有用!!!

莫尼白的黑
脑子会了,手不会

laojian123e
真的好用,感谢教程贴作者!

jjwjj
一楼加一!!!!!!!!!

可可的验证
Java是世界上最好的编程语言

limengzestudio
不错 学废了

阀门及规划
请问有没有铁砧的相关api

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