Bukkit插件开发教程 - Inventory(容器)

容器 - Inventory

学习目标

  • 了解Inventory的创建
  • 了解Inventory的监听操作

了解Inventory的创建

在Bukkit中Inventory我们称之为容器,也有人说是Gui,那么我们来看看什么是Gui,其实我们的箱子,大箱子,熔炉 这样的界面,就是容器,那么我们想要做一个虚拟的Inventory的话要怎么做呢?我们看下面的一段代码

Bukkit.createInventory(InventoryHolder owner, int size);
Bukkit.createInventory(InventoryHolder owner, int size, String title);
Bukkit.createInventory(InventoryHolder owner, InventoryType type);
Bukkit.createInventory(InventoryHolder owner, InventoryType type, String title);

// 这四个方法都可以返回一个Inventory对象,Inventory不能通过 new 出来,因为它是一个接口,具体实现呢这里就不告诉大家了,大家可以自行去反编译
Inventory inv = Bukkit.createInventory(null, 54, "233");
player.openInventory(inv);

之后我们在游戏内就可以看到以下的效果

Bukkit插件开发教程 - Inventory(容器)_第1张图片
inventory.png

根据上图我们可以了解出 Bukkit.createInventory(InventoryHolder owner, int size, String title) 后两个参数的含义

  • size 容器的大小(必须是一个9的倍数)
  • title 容器的标题

那么第一个参数是什么意思呢?箱子的所有人,我们一般填入null即可,
那么还有一些别的容器,比如熔炉,炼药台这样的容器就不给大家介绍了,大家可以使用含有参数 InventoryType type 的方法进行调用即可.
那么我们有了容器就可以往里面放入物品了吧。(以下代码将会在下一章详细讲解,这里只做了解即可)

Inventory inv = Bukkit.createInventory(null, 54, "233");
// 实例化物品对象
ItemStack itemStack = new ItemStack(Material.APPLE);
// 往其添加物品, 如果想指定添加的格子可以使用方法
// setItem(int index, ItemStack item)
inv.addItem(itemStack);
player.openInventory(inv);

当你发现你在往一个玩家背包添加物品时,而物品并没有出现,也许这时候你需要player.updateInventory()方法来对其进行更新
那么我们就成功了往这个容器里面放入了一个物品.

了解Inventory的监听操作

在实际业务当中,基本上没有不需要监听的容器(除非是那种垃圾桶插件),那么这一小节我们就来谈谈关于容器的监听

那么首先呢我们找到 org.bukkit.event.inventory 这个包,在里面我们找到 InventoryClickEvent 这个监听器,然后我们对它进行注册

@EventHandler
public void onClick(InventoryClickEvent event) {
    
}

那么通过上方的代码我们就可以监听服务器内所有关于容器点击的事件.
假设我们现在有个业务需求,玩家点击一个物品,然后对其进行传送的操作,我们来看一段代码

@EventHandler
public void onClick(InventoryClickEvent event) {
    // 获取被点击的容器的对象
    Inventory inv = event.getInventory();
    // 获取被点击的格子是否是0,
    // 因为Inventory底层的实现是由一个数组来进行管理的, 所以我们的首项就是0
    if (event.getRawSlot() == 0) { 
        // 获取点击容器的玩家的对象
        Player player = (Player) event.getWhoClicked();
        // 对该玩家进行传送的操作
        player.teleport(player.getLocation().add(1D, 1D, 1D));
        // 因为我们不想让玩家拿走该物品所以我们使用
        // event.setCancelled() 方法来取消该事件的执行
        event.setCancelled(true);
        // 让玩家关闭当前的容器界面
        player.closeInventory();
    }   
}

有了上面的例子我相信你对容器这一概念有了一个初步的认识,详细内容可以自行查阅Doc,或者反编译核心进行推导

补充

如果你想在事件里判断是否是玩家的背包,那么可以使用

event.getInventory().getType().equals(InventoryType.PLAYER)

你可能感兴趣的:(Bukkit插件开发教程 - Inventory(容器))