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