Skip to content

Latest commit

 

History

History
138 lines (85 loc) · 5.45 KB

3-2.md

File metadata and controls

138 lines (85 loc) · 5.45 KB

3-2 奇怪的物品

这节里面我们研究下 ItemStack

物品数量

通过使用 ItemStacksetAmount 方法可以设置物品的数量(超过堆叠上限时可能会出问题)。

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);

药水信息

这里我们只谈药水,不谈药水效果,那个东西我们到后面再说。

获取药水信息几乎和书本信息一样,只要你的 MaterialPOTIONLINGERING_POTIONSPLASH_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