Minecraft(我的世界)中文论坛

 找回密码
 注册(register)
查看: 1518|回复: 5

[插件开发教程] [翻译][UD]自定义交互式书本

[复制链接]
耗子 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
10120
钻石
性别
保密
注册时间
2012-2-18
查看详细资料
发表于 2017-6-12 18:07:18 | 显示全部楼层 |阅读模式

您尚未登录,立即登录享受更好的浏览体验!

您需要 登录 才可以下载或查看,没有帐号?注册(register)

x
本帖最后由 耗子 于 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/

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

来自群组: Unknown Domain

评分

参与人数 4人气 +8 收起 理由
拉普达 + 2 MCBBS有你更精彩~
1582952890 + 2 还有这种操作?
602723113 + 2 MCBBS有你更精彩~
SmallFatCYW + 2 希望能有更多这方面的教程~

查看全部评分

拉普达 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
3321
钻石
性别
保密
注册时间
2014-9-2
查看详细资料
发表于 2018-4-13 23:45:26 | 显示全部楼层
楼主有没有直接给玩家打开书的方法?
回复

使用道具 举报

耗子 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
10120
钻石
性别
保密
注册时间
2012-2-18
查看详细资料
 楼主| 发表于 2018-4-14 00:17:26 | 显示全部楼层
拉普达 发表于 2018-4-13 23:45
楼主有没有直接给玩家打开书的方法?

欢迎使用UDPL:http://www.mcbbs.net/thread-734427-1-1.html

评分

参与人数 1人气 +2 收起 理由
拉普达 + 2 MCBBS有你更精彩~

查看全部评分

回复

使用道具 举报

拉普达 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
3321
钻石
性别
保密
注册时间
2014-9-2
查看详细资料
发表于 2018-4-14 13:38:52 | 显示全部楼层
耗子 发表于 2018-4-14 00:17
欢迎使用UDPL:http://www.mcbbs.net/thread-734427-1-1.html

不过使用你的这个库,打开书的一瞬间又关闭了。
回复

使用道具 举报

拉普达 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
3321
钻石
性别
保密
注册时间
2014-9-2
查看详细资料
发表于 2018-4-14 13:39:51 | 显示全部楼层
耗子 发表于 2018-4-14 00:17
欢迎使用UDPL:http://www.mcbbs.net/thread-734427-1-1.html

版本是1.12
回复

使用道具 举报

拉普达 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
3321
钻石
性别
保密
注册时间
2014-9-2
查看详细资料
发表于 2018-4-14 13:50:33 | 显示全部楼层
耗子 发表于 2018-4-14 00:17
欢迎使用UDPL:http://www.mcbbs.net/thread-734427-1-1.html

不好意思 - 解决了
原因是我判断玩家加入 ess好像会关掉它
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册(register)

本版积分规则

Archiver|小黑屋|Mcbbs.net ( 京ICP备15023768号-1 ) | 京公网安备 11010502037624号 | 手机版

GMT+8, 2019-8-21 09:24 , Processed in 0.037458 second(s), Total 14, Slave 13 queries , Gzip On, MemCached On.

"Minecraft"以及"我的世界"为Mojang Synergies AB的商标 本站与Mojang以及微软公司没有从属关系

© 2010-2019 我的世界中文论坛 版权所有 本站原创图文内容版权属于原创作者,未经许可不得转载

快速回复 返回顶部 返回列表