【技術(shù)向】Minecraft1.16.5離線 多人游戲已禁用Bug 修復(fù)與分析
首先劇透一下,這個(gè)Bug的本質(zhì)是,游戲不小心把離線用戶當(dāng)作了正版用戶……

似乎從6月8日開始,許多離線模式玩家在游玩1.16.5時(shí)都遇到了圖上這一Bug,無(wú)法進(jìn)入多人游戲。也有很多人提出了解決辦法,比如打開游戲時(shí)先斷網(wǎng),或者加裝繞過(guò)限制的Mod。這里咱在深入分析問(wèn)題原因確認(rèn)這是一個(gè)Bug后,向大家提供一個(gè)從根源上解決這一Bug的方法。
那就是買個(gè)正版!
開個(gè)玩笑,我相信大家都是愿意支持正版的,只是暫時(shí)沒(méi)有條件所以才玩的離線模式,那么廢話不多說(shuō),開始介紹修復(fù)Bug的方法吧。

首先,打開.minecraft/versions/你的游戲版本/目錄下的json文件,有些人可能玩的是整合包所以目錄名并不是1.16.5,總之進(jìn)去用你喜歡的文本編輯器打開那個(gè)json文件就行了。
打開文件后,搜索authlib,刪除大括號(hào)里的size和sha1兩行

注意,如果刪完這兩行后大括號(hào)內(nèi)最后一個(gè)字符是逗號(hào),那么也要把那個(gè)逗號(hào)刪除,否則啟動(dòng)器會(huì)無(wú)法識(shí)別。

繼續(xù)搜索,如果還有別的authlib包含了size和sha1,也要?jiǎng)h掉,不然無(wú)法生效。(我這邊PCL的只有一個(gè)需要?jiǎng)h,而HMCL有兩個(gè))
然后,將所有的2.1.28替換為2.3.31

保存文件,重新打開啟動(dòng)器,開始游戲,即可發(fā)現(xiàn)已經(jīng)可以正常進(jìn)入多人游戲了。

這一方法應(yīng)該對(duì)任何啟動(dòng)器都有效,無(wú)需斷網(wǎng),適配原版和任何Mod端,雖然改東西不太方便吧……適合喜歡折騰的人。

下面是關(guān)于這一Bug的分析。
在1.16.5版本所使用的認(rèn)證組件Authlib 2.1.28中,認(rèn)證是使用網(wǎng)頁(yè)接口返回的error字段來(lái)判斷是否認(rèn)證失敗,并且會(huì)無(wú)視網(wǎng)頁(yè)接口的HTTP 401狀態(tài)碼



但是,現(xiàn)在的Mojang認(rèn)證接口就算認(rèn)證失敗也不會(huì)設(shè)置error字段,只會(huì)返回HTTP 401

這就導(dǎo)致認(rèn)證組件因?yàn)闆](méi)有發(fā)現(xiàn)錯(cuò)誤,所以將離線玩家也視為正版用戶,正常返回了解析出的社交配置;又因?yàn)榻涌趯?shí)際上并沒(méi)有返回相關(guān)配置,所以多人游戲、realms、聯(lián)機(jī)交流功能的啟用權(quán)限全被Gson解析成false了。

在1.17版所使用的認(rèn)證組件Authlib 2.3.31中,認(rèn)證組件會(huì)在獲取到HTTP 401狀態(tài)碼后直接拋出異常,游戲返回離線配置,所以不會(huì)有這個(gè)問(wèn)題。

1.16.5和1.17的Authlib 2.+使用的是同樣的認(rèn)證接口,只是部分代碼邏輯不同,可以直接通用,1.18之后版本使用的是Authlib 3.+,接口和代碼都有很大改動(dòng),所以不能在1.16.5上使用。
所以這就只是一個(gè)因?yàn)楣俜胶笈_(tái)更新導(dǎo)致的Bug而已,別再說(shuō)什么官方要封離線啦!

我的方法原理上很簡(jiǎn)單,讓啟動(dòng)器加載1.17使用的authlib 2.3.31來(lái)代替1.16.5的有bug的authlib 2.1.28,這個(gè)方法在代碼層面完全可行,并且我自己成功很多次了。
我不知道為什么會(huì)有人用我的方法失敗,我只能建議你們找別的辦法,B站上至少能找到三個(gè)解決方法的,用不著在我這里死磕。
如果想質(zhì)疑我的方法的可行度的話,你們需要證明你們的游戲確實(shí)是在離線模式下加載了SHA1為bbd00ca33b052f73a6312254780fc580d2da3535的authlib-2.3.31.jar,并且依然會(huì)有文中提到的多人模式禁用問(wèn)題,否則,請(qǐng)從自己身上找原因。