我的世界Bukkit服务器插件开发教程(三)容器和物品堆

三、容器

这一章节,我们讲讲怎么创建一个容器、往这个容器里加入一些东西和监听事件

编写教程

容器即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);
    }
}

源代码


上一篇:我的世界Bukkit服务器插件开发教程(二)命令
下一篇:我的世界Bukkit服务器插件开发教程(四)配置文件

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值