玩家在看终末之诗时究竟在哪里?UP主实验后惊了!

从代码层面解释其实也不难……
这里以 Java 版 1.19.3 为例,根据 Minecraft Wiki,“玩家进入返回传送门后终末之诗是否显示,取决于玩家的实体数据 seenCredits[仅JE]或 hasSeenCredits[仅BE]。初始状态下为 false,此时诗会显示;玩家看过或跳过之后,数据变为 true,则不再会显示”。
因此,只需要通过混淆映射表搜索 seenCredits,即可找到代码中对应的完整路径:net.minecraft.server.level.ServerPlayer.seenCredits,混淆后是 ahn.cI(注意是大写 i 而不是小写 L)。
打开源代码文件 ahn.java,可以找到 cI 数据值的声明:
/* 179 */ private boolean cI;
那么通过全局搜索,一路顺藤摸瓜,可以在同一个文件中找到函数 net.minecraft.world.entity.Entity changeDimension(net.minecraft.server.level.ServerLevel),混淆后是 bdr b(ahm $$0)。Change dimension 的中文意思是“改变维度”,而这恰巧就是我们要找的代码。
重点关注含有终末之诗相关内容的代码,即 763 - 775 行。这段代码的逻辑如下:
- 将当前玩家状态标记为“正在改变维度”(net.minecraft.server.level.ServerPlayer.isChangingDimension,ahn.cH);
- 后面两行看不懂,但是大概意思是,获取到当前维度,保存至 $$2;
- 如果当前维度是 g(END,末地),欲切换的维度是 e(OVERWORLD,主世界),那么执行以下操作:
- 把欲传送的实体从载具上面……弄下来?
- 判断玩家在主世界的出生点是否可以交互;
- 如果玩家没有在这个存档中通关过,将玩家标记为 wonGame(f);向服务器发送数据包,表明玩家已经通关;将玩家阅读过终末之诗标记为 true;
- 返回当前的玩家实例。
额,所以……终末之诗的内容在哪里啊喂!
算了,之后再研究吧,这个就当是给大家一个思路了……