-
Notifications
You must be signed in to change notification settings - Fork 5
App Reader
整合包里的教程书全在这儿:书架、书城、搜索、三种书源。
整合包里的教程书通常有几十本,每一本都是一个物品——想查点什么就得先在仓库里翻出那本书,翻完还得放回去;出门在外想起要看,书多半不在身上。
这个 App 把它们全列在一页里:一行是书名,第二行是它出自哪个模组(玩家找书的思路几乎总是「某某模组那本书」,而不是书名)。行首那张小图就是那本书自己的样子。
底部两个页签:
- 书城是整合包里有的全部书,几十本
- 书架是你自己收下的那几本
常翻的书通常不超过五六本,书架就是把它们从几十本里摘出来——点开「阅读」默认就停在书架上。
收藏靠每行右端那颗 ☆:点一下进书架,再点一下拿出来。
不长按也不另开菜单——长按在这种小屏上没有任何提示,等于把功能藏起来。
收藏记在 config/mcphone/reader/shelf.json,全局一份,不分存档。
书来自你客户端装的模组,同一个整合包连到哪个服务器都是那几本;按存档分的结果是"同一个包、换个服务器书架就空了"。
换了整合包则当前认不出的书自动不显示,但不会从文件里删掉——回到原来那个包,它们还在架上。
停在哪一页是一局之内记着的:从书城点开一本书、看完回来还在书城,不用每次重点一次。
两页顶上那条都是搜索框,进这一页它已经拿着焦点了,想找哪本直接打字,不用先点一下。
书名、模组名、模组 id 三样都能搜。
中文客户端里一本书的名字是中文、出处是英文很常见,只搜一个字段就会「我明明记得这个模组叫什么,却搜不到它的书」。
多个词用空格分开是「与」的关系,各自可以命中不同字段(ars 笔记)。
结果按分数排:书名命中排在模组名命中前面,前缀命中排在中间命中前面——打「新生」的人要的是那本书,不是「出自某个名字里带新生的模组」的一堆书。右上角的数字在搜的时候变成「命中/总数」。
这一页会吃掉所有按键(包括背包键),和记事本、改设备名那几页一样:打拼音必然按到 e,不吃掉就成了开背包。ESC 照旧是直接关机。
眼下没做拼音搜索(xsmy → 新生魔艺),那要一张拼音表。
点开一本书,接管屏幕的是它自己的界面,进度、已读标记、条目锁定全都对得上,和你在背包里右键那本书一模一样。
我们只提供目录:它的书界面是 272×180,手机屏幕只有 120×200,放不下;而自己重画就要把它几十种页面类型重新实现一遍,它一改版就断。
合上书之后按 ESC 回到游戏(ESC 本来就该干这个),下次开机手机会直接停在书架上,不用再从主屏点一遍。
书城里的书从三条路收上来:
| 来路 | 怎么收 | 例子 |
|---|---|---|
| Patchouli | 扫描 | 绝大多数教程书 |
| GuideME | 自动发现 | AE2、现代化工艺 |
| 白名单 | 写死一份名单 | 沉浸工程《工程师手册》 |
同一套手册系统的,一次全收。 AE2 的作者把自家那套手册系统单独拆成了模组 GuideME,AE2 与现代化工艺都硬依赖它。GuideME 自己就有"列出全部手册"的能力,所以这一支是自动发现——不写死任何一本书的 id,将来第三第四个模组接上它,书城里自动就有。点开走的是它手册物品右键那条路,所以在手机里点开与在背包里右键,进的是同一个界面、同一段历史。图标是它给每本手册造的那个物品,AE2 的和现代化工艺的各不相同。
不是 Patchouli 做的手册,靠白名单收。 有的模组自己写了一整套手册系统,与 Patchouli 毫无关系,扫描扫不出来——沉浸工程的《工程师手册》就是第一个。这类书走一份写死的白名单:每条记着它出自哪个模组、拿哪个物品当图标和书名、以及怎么打开它。点开走的是它自己物品右键那条路(ManualHelper.getManual().getGui()),所以和你在背包里右键那本手册完全一样,连"停在上次看的那一页"都一致。书名取的是那个物品的名字,它自带中文,与你在背包里、JEI 里看到的是同一行字。
要再加一个模组,就写一个 ExternalBook 实现,往 ExternalBookSource 的白名单里加一行——对方没装时自动跳过。
没有物品的书也在。 有些模组的书是 no_book 的,游戏里根本没有对应物品,只能用命令打开——它们在这里一样列着,点了就能看。这类书没有图标,画的是自带的那本书。
有些模组把自己的手册整个换掉了,Patchouli 里只剩一本没人维护的旧书。这类靠一层「书籍特例」处理,它能做三件事:把某本书从架子上拿掉、改写它的显示、接管「点开之后打开什么」。
目前只有一条——新生魔艺(Ars Nouveau):它 5.x 起换成了自研的文档系统,右键笔记本打开的是那个界面,但 jar 里仍留着一本 Patchouli 书(条目只有英文,内容停在换系统那天)。所以在手机里点它的笔记本,打开的是它自己的文档界面,和你在背包里右键完全一样。
要再加一条,就写一个 BookQuirk 实现,加进 BookQuirks 的名单——对方没装时自动跳过。
和白名单的分别:特例管的是"这本书扫出来了,但要特殊对待"(新生魔艺那种),白名单管的是"这本书根本扫不出来,得我们报上去"(沉浸工程那种)。特例那一层刻意没有"凭空多出一本书"的能力,就是为了把这两件事分开。
这类代码一律走反射、不加编译依赖:为一个方法搭进去几十 MB 的前置不值,而且断了要能退回默认行为(打开那本遗留的 Patchouli 书),不能变成一个点了没反应的死按钮。