本帖最后由 耗子 于 2018-8-3 11:21 编辑

交互式书本
本篇教程是关于如何创建一个有点击事件和悬浮事件的书

目录
- 创建书本
- 获取页面
- 创建一个有点击/悬浮事件的页面
- 完成创建ItemStack
- 一份实例代码

创建书本
首先,我们需要从ItemStack获取一个BookMeta。只有ItemStack是 Material.BOOK_AND_QUILLMaterial.WRITTEN_BOOK 才有BookMeta。

  1. ItemStack book = new ItemStack(Material.WRITTEN_BOOK);
  2. BookMeta bookMeta = (BookMeta) book.getItemMeta();
复制代码


获取页面
Bukkit的BookMeta是CraftBukkit的CraftMetaBook的接口。在教程编写的时候,BookMeta接口还没有方法获取页面,一个IChatBaseComponent对象的列表 (它储存在CraftMetaBook)。这意味着我们必须使用反射来获取页面。这是一个例子:

  1. List<IChatBaseComponent> pages = (List<IChatBaseComponent>) CraftMetaBook.class.getDeclaredField("pages").get(bookMeta);
复制代码

我们对这个列表做出的任何修改都会更新到这本书,所以当我们完成操作时,我们不需要重新设置这个字段。

创建一个有点击/悬浮事件的页面
使用 BungeeCord 聊天组件 API(它已经包含在Spigot服务器jar中)你可以创建一个有点击和悬浮事件的 IChatBaseComponent。
或者你可以生成你自己的json字符串使你使用的书本具有特殊事件。

  1. BaseComponent text; //这是我们将要转换为页面的 BaseComponent

  2. //将BaseComponent转换为Json字符串
  3. String pageJson = ComponentSerializer.toString(text);

  4. //从Json字符串获取一个IChatBaseComponent对象
  5. IChatBaseComponent page = IChatBaseComponent.ChatSerializer.a(pageJson);

  6. //添加这个页面到页面列表
  7. pages.add(page);
复制代码


完成创建ItemStack
一旦你完成了添加页面,不要忘记设置这个新的BookMeta到原ItemStack!你也可以为这本书设置标题和作者。

  1. bookMeta.setTitle("Interactive Book");
  2. bookMeta.setAuthor("gigosaurus");

  3. book.setItemMeta(bookMeta);
复制代码


一份示例代码

  1. //创建书本
  2. ItemStack book = new ItemStack(Material.WRITTEN_BOOK);
  3. BookMeta bookMeta = (BookMeta) book.getItemMeta();
  4. List<IChatBaseComponent> pages;

  5. //获取页面
  6. try {
  7.     pages = (List<IChatBaseComponent>) CraftMetaBook.class.getDeclaredField("pages").get(bookMeta);
  8. } catch (ReflectiveOperationException ex) {
  9.     ex.printStackTrace();
  10.     return;
  11. }

  12. //创建页面
  13. TextComponent text = new TextComponent("Click me");
  14. text.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, "http://spigotmc.org"));
  15. text.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("Goto the spigot website!").create()));

  16. //添加页面到页面列表中
  17. IChatBaseComponent page = ChatSerializer.a(ComponentSerializer.toString(text));
  18. pages.add(page);

  19. //设置书的标题和作者
  20. bookMeta.setTitle("Interactive Book");
  21. bookMeta.setAuthor("gigosaurus");

  22. //更新ItemStack的ItemMeta
  23. book.setItemMeta(bookMeta);
复制代码


原文地址:https://www.spigotmc.org/wiki/interactive-books/

欢迎各位支持作者,以编写和翻译更多优秀教程。
[afd]mouse[/afd]

[groupid=1181]Unknown Domain[/groupid]