promotional bannermobile promotional banner

MCphone

A working smartphone in Minecraft — photos, music, chat, and apps other mods can add.
Back to Files

MCphone Forge 1.20.1 v0.12.0-beta.1

File namemcphone-0.12.0-beta.1.jar
Uploader
November_PigNovember_Pig
Uploaded
Sep 7, 2026
Downloads
127
Size
817.7 KB
Mod Loaders
Forge
File ID
8831290
Type
B
Beta
Supported game versions
  • 1.20.1

Curse Maven Snippet

Forge

implementation fg.deobf("curse.maven:mcphone-1681807:8831290")

Learn more about Curse Maven

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