三、容器
这一章节,我们讲讲怎么创建一个容器、往这个容器里加入一些东西和监听事件
编写教程
容器即Inventory,先创建一个对象
Inventory inv = Bukkit.createInventory(null,9,"");
其中9
是容器可容纳物品的数量,而最后的String是这个容器的名字
一个容器最多只能容纳54个物品,数字必须是9的倍数
现在一个容器创建好了,想让玩家打开这个容器。先创建一个Player对象,调用里面的openInventory
方法,里面的参数是填容器的名字
Player p;
p.openInventory(inv);
我们已经成功创建一个容器,那么怎么往这个容器里添加一些物品呢
ItemStack(物品堆)
ItemStack is = new ItemStack(Material.COMPASS);
COMPASS
是指南针,那么is就是个指南针。
我们也可以将这个物品更改名字和介绍
ItemMeta im = is.getItemMeta();
//更改物品名字
im.setDisplayName("点我传送");
//更改物品介绍
im.setLore(Arrays.asList("一个功能"));
这里感谢@MinecraftSTL指出错误,我们需要刷新一下物品
//更新原物品
is.setItemMeta(im)
现在将它放入容器中
inv.addItem(is);
现在我们的容器中就会有一个指南针了
当然你也可以调整它的位置
//将is调整至下标为9的地方
inv.setItem(9,is);
当然我们需要输入指令才能打开这个容器:
public boolean onCommand(CommandSender sender, Command cmd, String label, String args[]) {
if(label.equalsIgnoreCase("test")) {
Player p = (Player)sender;
if(!(p instanceof Player)) {
sender.sendMessage("只能在游戏中使用!");
return true;
}
Inventory inv = Bukkit.createInventory(null,54,"容器");
ItemStack is = new ItemStack(Material.COMPASS);
ItemMeta im = is.getItemMeta();
im.setDisplayName("点我传送");
im.setLore(Arrays.asList("一个功能"));
is.setItemMeta(im);
inv.addItem(is);
inv.setItem(9,is);
p.openInventory(inv);
return true;
}
return true;
}
输入指令test,你会发现有一个容器出现在你的面前,里面是指南针
监听事件
但是你会发现我们可以从这个容器里取出指南针,然后再次输入test继续从容器里刷指南针,该怎么办呢?
这个时候需要用到监听事件:Listener
public class InventoryClickListener implements Listener {
@EventHandler
public void onClick(InventoryClickEvent e) {
}
}
可以看到,这个类使用了Listener
接口,据 Bukkit 文档定义,它用于触发该类下所有的事件监听。
onClick
方法用于监听「玩家点击容器物品」事件,其中可以看到这个方法加上了注解,告诉 Bukkit 这个方法是用来监听的。
监听事件确实非常方便,它可以得到被点击的那个容器。
//获取被点击的那个容器
Inventory inv = e.getClickedInventory();
判断玩家点击了容器里的物品,只需判断下标:
//如果被点击的物品下标为9
if(e.getRawSlot()==9) {
...
}
那么这里我们的指南针下标是为9,如果玩家点击的物品下标为9,则执行里面的语句。
这里我们就假设玩家点击指南针后回到出生点
if(e.getRawSlot()==9) {
//获取点击物品的玩家
Player p = (Player)e.getWhoClicked();
//模拟玩家输入指令/spawn
p.chat("/spawn");
//关闭容器
p.closeInventory();
}
如果我们拒绝玩家从容器里拿东西就是:
//是否可以让玩家从容器里拿取物品
e.setCancelled(true);
打包一下,放到plugins文件夹中,再加载一下插件,回到游戏输入指令/test会发现一个容器,点击容器里的指南针就会回到出生点了。
@EventHandler
public void onClick(InventoryClickEvent e) {
Inventory inv = e.getClickedInventory();
if(e.getRawSlot()==9) {
Player p = (Player)e.getWhoClicked();
p.chat("/spawn");
p.closeInventory();
e.setCancelled(true);
}
}