这节里面我们研究下 ItemStack
。
通过使用 ItemStack
的 setAmount
方法可以设置物品的数量(超过堆叠上限时可能会出问题)。
ItemStack item = new ItemStack(Material.BARRIER);
item.setAmount(32); // 设置为 32 个
setAmount
有其对应的 getAmount
方法返回当前的数量。
ItemStack
的信息存储在一个对象中(废话),这个对象是一个 ItemMeta
类的实例。物品名称、物品描述等都由这个对象控制。
获取 ItemMeta
,只需要调用 getItemMeta
方法:
ItemMeta im = item.getItemMeta();
Bukkit 这里有个很缺德的地方。
!> 当心!
Bukkit 在获取 ItemMeta
时,返回的是一个副本,我们对它进行修改后,还需要使用 item.setItemMeta
返回给物品堆。这就像读写文件一样:内存中的内容如果不保存,就不会写入磁盘。
很快你就会发现,这种做法实在太不方便了,但我们也没办法,这是规定。
普通的物品信息由两部分组成:
- 物品名字
- 物品介绍
这两部分都是可以使用文字样式(ChatColor
)的,可以给文字染成不同的颜色。
实际上物品信息还包含 NBT 标签,但由于 NBT 是一个 NMS 功能(Minecraft 服务端的底层功能),要跨版本使用它需要更多的步骤(反射),我们会在更高级的部分见到它。
要设置物品的名字,可以使用 ItemMeta
类的 setDisplayName
方法:
im.setDisplayName("这个东西的名字");
这里可以使用 ChatColor.XXX
加在前面来设置颜色。
setDisplayName
有其对应的 getDisplayName
方法用于获得物品的显示名称。
啥是物品介绍捏?你应该看过苦力怕掉落的音乐唱片吧?
音乐唱片 ← 这是
DisplayName
显示名称C418 - Cat ← 这是
Lore
介绍
物品的介绍稍微有点复杂,它是一个 List<String>
类,使用 setLore
方法进行设置:
im.setLore(Arrays.asList("第一行", "第二行", "blahblah"));
Arrays.asList
是一个快速创建 List
的方法,它按顺序把几个参数「组装」成一个 List
。
物品介绍一般想写多长就可以多长,但把《哈姆雷特》读进来再 setLore
肯定会出问题。此外,就算 Minecraft 能够忍受,你的玩家很可能没法忍受!(记住,窗口的大小是有限的)
附魔并不是 Lore
的一部分,附魔保存在物品的 NBT 中。
同样,setLore
有其对应的 getLore
方法获得物品的介绍。
ItemMeta
只有这些信息,但 ItemMeta
的子类有很多其它的功能。
书本信息保存在 BookMeta
类中,它是 ItemMeta
的子类。书本能够进行设置书页等操作。
要获取 BookMeta
,需要进行强制类型转换,同时,创建 ItemStack
时的材质必须是成书(Material.WRITTEN_BOOK
)或者编写中的书(Material.WRITING_BOOK
)!
BookMeta bookMeta = (BookMeta) item.getItemMeta();
书本信息可以做很多的事情,设置书本内容是最常见的功能:
bookMeta.setTitle("咏 e");
bookMeta.setAuthor("咏士");
bookMeta.setPages("第一页放一些 e", "第二页中放更多的 e", "eee\neeeeeeeeeeeeeeeeeeeeeeeeeeee\neeeeeeee");
// 这三个方法都有对应的 getXXX 方法
// Title、Author 和 Pages 都要设置,否则 Minecraft 会认为无效
此外还可以通过 setGeneration
方法设置书的版本(「原版」、「副本」、「副本的副本」)。
返还时直接返还就好了:
item.setItemMeta(bookMeta);
这里我们只谈药水,不谈药水效果,那个东西我们到后面再说。
获取药水信息几乎和书本信息一样,只要你的 Material
是 POTION
、LINGERING_POTION
或 SPLASH_POTION
就行。
PotionMeta pm = (PotionMeta) item.getItemMeta();
药水同样可以设置一些药水独有的东西:
pm.setColor(new Color(223, 48, 127));
// RGB 颜色
pm.setBasePotionData(new PotionData(PotionType.WATER));
// 药水基础信息
pm.addCustomEffect(null);
// 添加药水效果——不要这样写!
addCustomEffect
那里不要像我一样写 null
!会出问题!
这不是全部,这只是一部分,查询 JavaDocs 可以得到更多信息,另外,如果你不想在浏览器和 IDEA 之间切换,可以使用反编译……
?> 查看源代码
在 IDEA 中,按着 Ctrl 并用左键单击类名(例如 ItemMeta
)就可以查看它的源代码,IDEA 会将该类反编译并向你展示。或者,你也可以通过按两下 Shift 进行全局搜索。
限于篇幅,我们无法介绍 ItemMeta
的全部子类(还有旗帜、装备、烟花等等等等),但不要着急。记得吗?我说过你在某个地方可以找到它们的用法,想不起来了?那我再说一遍:JavaDocs。
你可以在 ItemMeta
页面 的「All Known Subinterfaces」那里找到它的子接口,点击就可以查看相应的类。JavaDocs 可谓是插件开发最重要的资料之一,本教程无法教给你 Bukkit 的所有内容,但它的 JavaDocs 可以,一定要会用 JavaDocs!