MCphone Forge 1.20.1 v0.12.0-beta.1
Curse Maven Snippet
What's new
MCphone Forge 1.20.1 v0.12.0-beta.1
这一版把 1.21.1 那一支 1.10.0 与 1.10.1 搬了过来。 上一版(0.11.1)跟到的是那边的 1.9.3,此后那一支加了「终端」App、副手 HUD、快捷键直接开 App、手机的 3D 模型这几样, 现在两支又对齐了。
运行环境: Minecraft 1.20.1 · Forge 47.4.0 或更高 · 客户端与服务端都需安装
可选联动多了三家(都不装也能玩,装了才多出「终端」那一格): Applied Energistics 2、AE2 Wireless Terminals、Refined Storage、 Tom's Simple Storage。原有的 Curios、Waystones + Balm、MCEF、NetMusic、Patchouli、 GuideME、FTB Quests 一个没变。
⚠️ 先说清楚这一版验到哪儿
别把它当成熟版本用,这也是它带 -beta 的原因。
绿的是这些:
| 验了什么 | 怎么验的 |
|---|---|
| 全仓编译 | ./gradlew build,零 error |
| 断言测试 | 10 份全过(含这一支特有的两份手写编解码往返测试) |
| 服务端安全 | verifyDistIsolation:170 个非 client 类,无一引用客户端类型 |
| SPI 服务文件 | verifyServiceFiles:17 个类全部存在 |
| 声明的 Forge 下限仍编得过 | ./gradlew compileJava -Pforge_version=47.4.0 |
| AE2 那条绕法的两个前提 | 直接对 ae2-15.0.10 的字节码核过,不是照抄文档 |
这一版新加的东西,一个像素都没在真游戏里看过。 这台开发机没有显示环境,
runClient 跑不起来——而新加的全是要点着看的:三家存储模组的终端能不能开、卡槽收不收、
充电有没有真补上、副手 HUD 摆得对不对、快捷键会不会漏按、手机的 3D 模型与亮屏切换。
开个新存档试,别拿主力存档。 碰到问题请带上 logs/latest.log 开 issue。
多人游戏要两端都升。 这一版在通道里插了三个包(终端两个、屏幕亮不亮一个), 协议号从 2 跳到 4,0.11.1 的客户端连 0.12.0-beta.1 的服务端会被直接拒绝——这是刻意的, 让它连上去只会解错包。
📱 这一版多了什么
🖥 「终端」App —— 手机上直接打开存储终端
装了 AE2、Refined Storage、Tom's Simple Storage 任意一家,手机里就多一格「终端」。 点开它,打开的是那一家自己的终端界面——范围、维度、绑没绑网络、增幅卡加了多远,一条都不是 我们定的,仍旧是它们自己查、自己拒绝、自己给你发消息。
手机上多了一个终端卡槽。 把终端装进去,它就跟着手机走,不必占背包格子。卡槽只收 "装得进去而且点得开"的那一种,装不进去比装进去点不开好解释。
🔌 卡槽里的终端由手机供电
不然这个卡槽是负资产:世界里的充电器够不着卡槽,没电了只能取出来、充完再装回去, 而没电的终端连开都开不了。所以电这件事手机管了:
- 打开终端的那一刻补满——"没电打不开"根本不会发生;
- 之后只要还有容器界面开着就每秒补一次。界面全关着时不补,那时候电量本来就不会变。
只有电这一件事是我们管的,而且充进去的电取不回来(AE2 那份实现不允许外部抽电),
所以它不是一台无限发电机。服主不想要可以在
serverconfig/mcphone-server.toml 里把 terminalKeepPowered 关掉。
📲 副手 HUD:手机挂在画面上
手机放进副手就挂到画面上,还能就地摆放——按住 Alt 在原地放大操作,位置与大小在 「设置 → HUD」里调,也可以直接拖。
⌨️ 快捷键不再先弹一次手机
给 App 绑了快捷键之后,原来按下去是"先开机、再进那个 App"。界面根本不在手机里的那六个 ——终端、末影箱、传送石、任务书、浏览器、相机——玩家会先看见手机弹出来,然后才被真正的界面 顶掉。这一版这几个 App 按一下直接就是那个界面。
手机仍然要带在身上:手机是那台设备,锁在箱子里按一下键不该开出终端来。
附属 App 也能享受:覆盖一句 IPhoneApp.opensInsidePhone() 返回 false。不覆盖的话行为和
以前一模一样,默认是 true。
✨ 手机物品换成 3D 模型,开着的时候屏幕在所有人眼里都是亮的
手上那部手机开着界面时,屏幕是亮的——别人也看得见。这条链是本机把状态报给服务端、 服务端记在那件物品上、随手持物品同步给所有看得见这只手的人。地上掉的、箱子里的、 别人没开着的那部,一律黑屏。
🖥 服主须知
新配置项(serverconfig/mcphone-server.toml):
terminalKeepPowered = true # 手机替卡槽里的终端供电
关掉之后卡槽里的终端和拿在手上完全一样,该耗多少耗多少。改这一项只影响「电」, 范围与网络绑定仍然全由 AE2 自己说了算。
协议号 2 → 4,两端必须同版本,理由见上面。
🔧 与 1.21.1 那一支的差别
这一版有一处功能上的降级,不是等价替换,说清楚:
Refined Storage 的终端装不进手机卡槽
1.20.1 上的 RS 是 1.12.x,也就是 RS 1;那一支对的是 RS 2,两代之间这块 API 全换了。
RS 1.12 用一个叫 PlayerSlot 的具体类表达"东西在哪儿",它只认"背包第 n 格"与 Curios 的
槽位,没有留任何注册点——"在手机卡槽里"这种位置它表达不了。继承它绕过去是能编过的,
但过不了网:客户端收到之后造出来的是原版那个类,我们的覆盖不在了,接着会拿一个哨兵槽位号去
getItem(-1),玩家看到的是崩溃而不是"这一格不好使"。
背包里那台照常开得了——那正是 PlayerSlot 生来要表达的东西。所以玩家这边的差别只有
一条:RS 的终端得留在背包里。卡槽在放进去之前就会拒绝它,不会出现"装得进去却点不开"。
因此供电实际上只对 AE2 的终端生效。 Tom's 的终端本来就不用电(整个模组里连能量的影子 都没有),RS 的进不了卡槽。
其余三处内部差别
- 卡槽的同步得自己发包。 那边是 NeoForge 的
AttachmentType.sync(),加载器负责推给 客户端;Forge 1.20.1 的 capability 没有这回事,所以上线、重生、换维度以及内容变了的每一次 都自己发一个包。 - "屏幕亮着"那一位那边只同步不落盘,这边落盘。 1.20.1 的物品 NBT 同步与落盘是同一份, 做不到只同步不落盘。所以多了上线、下线两道补擦——不擦的话,开着手机崩一次,那部手机就 永远亮着。
- 裁剪的兜底改成直接问 GL。 1.20.1 没有
containsPointInScissor,改成问glIsEnabled(GL_SCISSOR_TEST),反而比那边"(0,0) 在不在框里"的推断更准。
🔨 内部
断言测试挂进了 check。 那 10 份带 main() 的测试原来只写在类注释里靠人手动跑,
也就是说没人跑的时候它们等于不存在。现在跟着每一次 ./gradlew build 跑,CI 自动带上。
哪几份要跑是读文件头现判的,不维护手写清单——加了测试却忘了往清单里补,症状是
"构建绿的,但那份根本没跑"。
🙏 第三方
AE2、AE2WTLib、Refined Storage、Tom's Simple Storage 四家都是编译期可选依赖,
它们的代码一个字节都没有被打进这个 jar。接触面各自关在
feature/terminal/integration/ 下的一个包里,装了哪家就用哪家。
This mod has no additional files

