交互式书本
本篇教程是关于如何创建一个有点击事件和悬浮事件的书
目录
- 创建书本
- 获取页面
- 创建一个有点击/悬浮事件的页面
- 完成创建ItemStack
- 一份实例代码
创建书本
首先,我们需要从ItemStack获取一个BookMeta。只有ItemStack是 Material.BOOK_AND_QUILL 或 Material.WRITTEN_BOOK 才有BookMeta。
- ItemStack book = new ItemStack(Material.WRITTEN_BOOK);
- BookMeta bookMeta = (BookMeta) book.getItemMeta();
获取页面
Bukkit的BookMeta是CraftBukkit的CraftMetaBook的接口。在教程编写的时候,BookMeta接口还没有方法获取页面,一个IChatBaseComponent对象的列表 (它储存在CraftMetaBook)。这意味着我们必须使用反射来获取页面。这是一个例子:
- List<IChatBaseComponent> pages = (List<IChatBaseComponent>) CraftMetaBook.class.getDeclaredField("pages").get(bookMeta);
我们对这个列表做出的任何修改都会更新到这本书,所以当我们完成操作时,我们不需要重新设置这个字段。
创建一个有点击/悬浮事件的页面
使用 BungeeCord 聊天组件 API(它已经包含在Spigot服务器jar中)你可以创建一个有点击和悬浮事件的 IChatBaseComponent。
或者你可以生成你自己的json字符串使你使用的书本具有特殊事件。
- BaseComponent text; //这是我们将要转换为页面的 BaseComponent
- //将BaseComponent转换为Json字符串
- String pageJson = ComponentSerializer.toString(text);
- //从Json字符串获取一个IChatBaseComponent对象
- IChatBaseComponent page = IChatBaseComponent.ChatSerializer.a(pageJson);
- //添加这个页面到页面列表
- pages.add(page);
完成创建ItemStack
一旦你完成了添加页面,不要忘记设置这个新的BookMeta到原ItemStack!你也可以为这本书设置标题和作者。
- bookMeta.setTitle("Interactive Book");
- bookMeta.setAuthor("gigosaurus");
- book.setItemMeta(bookMeta);
一份示例代码
- //创建书本
- ItemStack book = new ItemStack(Material.WRITTEN_BOOK);
- BookMeta bookMeta = (BookMeta) book.getItemMeta();
- List<IChatBaseComponent> pages;
- //获取页面
- try {
- pages = (List<IChatBaseComponent>) CraftMetaBook.class.getDeclaredField("pages").get(bookMeta);
- } catch (ReflectiveOperationException ex) {
- ex.printStackTrace();
- return;
- }
- //创建页面
- TextComponent text = new TextComponent("Click me");
- text.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, "http://spigotmc.org"));
- text.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("Goto the spigot website!").create()));
- //添加页面到页面列表中
- IChatBaseComponent page = ChatSerializer.a(ComponentSerializer.toString(text));
- pages.add(page);
- //设置书的标题和作者
- bookMeta.setTitle("Interactive Book");
- bookMeta.setAuthor("gigosaurus");
- //更新ItemStack的ItemMeta
- book.setItemMeta(bookMeta);
原文地址:https://www.spigotmc.org/wiki/interactive-books/
[groupid=1181]Unknown Domain[/groupid]
