玩家在看終末之詩時(shí)究竟在哪里?UP主實(shí)驗(yàn)后驚了!

從代碼層面解釋其實(shí)也不難……
這里以 Java 版 1.19.3 為例,根據(jù) Minecraft Wiki,“玩家進(jìn)入返回傳送門后終末之詩是否顯示,取決于玩家的實(shí)體數(shù)據(jù)?seenCredits[僅JE]或?hasSeenCredits[僅BE]。初始狀態(tài)下為 false,此時(shí)詩會(huì)顯示;玩家看過或跳過之后,數(shù)據(jù)變?yōu)?true,則不再會(huì)顯示”。
因此,只需要通過混淆映射表搜索 seenCredits,即可找到代碼中對(duì)應(yīng)的完整路徑:net.minecraft.server.level.ServerPlayer.seenCredits,混淆后是 ahn.cI(注意是大寫 i 而不是小寫 L)。
打開源代碼文件 ahn.java,可以找到 cI 數(shù)據(jù)值的聲明:
/* ?179 */ ? private boolean cI;
那么通過全局搜索,一路順藤摸瓜,可以在同一個(gè)文件中找到函數(shù) net.minecraft.world.entity.Entity changeDimension(net.minecraft.server.level.ServerLevel),混淆后是 bdr b(ahm $$0)。Change dimension 的中文意思是“改變維度”,而這恰巧就是我們要找的代碼。
重點(diǎn)關(guān)注含有終末之詩相關(guān)內(nèi)容的代碼,即 763 - 775 行。這段代碼的邏輯如下:
- 將當(dāng)前玩家狀態(tài)標(biāo)記為“正在改變維度”(net.minecraft.server.level.ServerPlayer.isChangingDimension,ahn.cH);
- 后面兩行看不懂,但是大概意思是,獲取到當(dāng)前維度,保存至 $$2;
- 如果當(dāng)前維度是 g(END,末地),欲切換的維度是 e(OVERWORLD,主世界),那么執(zhí)行以下操作:
- 把欲傳送的實(shí)體從載具上面……弄下來?
- 判斷玩家在主世界的出生點(diǎn)是否可以交互;
- 如果玩家沒有在這個(gè)存檔中通關(guān)過,將玩家標(biāo)記為 wonGame(f);向服務(wù)器發(fā)送數(shù)據(jù)包,表明玩家已經(jīng)通關(guān);將玩家閱讀過終末之詩標(biāo)記為 true;
- 返回當(dāng)前的玩家實(shí)例。
額,所以……終末之詩的內(nèi)容在哪里啊喂!
算了,之后再研究吧,這個(gè)就當(dāng)是給大家一個(gè)思路了……