第一步
錯誤提示
System.ArgumentException: Requested value 'PLAY_CASUAL_STANDARD' was not found.
由於我選擇的模式是標准休閑,所以他報錯未找到 PLAY_CASUAL_STANDARD
。
分析&思路
PLAY_CASUAL_STANDARD
在兄弟里和原來的Managed中是搜索不到的,這里就不貼圖了。說明這是個新東西。
借個賬號更新爐石后,用 dnspy 打開 Hearthstone\Hearthstone_Data\Managed\Assembly-CSharp.dll
后搜索程序集(快捷鍵 Ctrl+K
),搜索 PLAY_CASUAL_STANDARD
。
搜索結果:
位於一個叫做 PresenceStatus
的枚舉下面。
熟悉的可以知道 PresenceStatus
是兄弟里面一個與場景有關的類,不熟悉也可以通過搜索一下其他枚舉值定位到兄弟中的對應位置。
所以首先需要更新一下這個枚舉。
具體修復
復制反編譯爐石文件中的 PresenceStatus
枚舉后,定位到兄弟的 PresenceStatus
,右鍵編輯類,復制進去,編譯一下即可。
修復結果
不再報長篇大錯,只有一條
[GameplayScene] Unhandled presence status detected: PLAY_CASUAL_STANDARD. Please restart your client and try again. If the error is still not fixed, please report this message.
進入下一步。
第二步
錯誤提示
[GameplayScene] Unhandled presence status detected: PLAY_CASUAL_STANDARD. Please restart your client and try again. If the error is still not fixed, please report this message.
分析&思路
注意關鍵部分[GameplayScene] Unhandled presence status detected:
,所以可以搜索一下這個字符串定位一下位置。接下來教大家用 dnspy 來搜索字符串。
題外話:有的時候前面 [GameplayScene]
這部分中間的關鍵詞是字符串格式化輸出的,如
所以如果一整個前面搜索不到的話,可以嘗試去除一下關鍵詞,比如只搜索 Unhandled presence status detected:
。
搜索程序集(快捷鍵 Ctrl+K
),調出后設置為搜索數字、字符串,並設置范圍為所選文件以縮小范圍。
可以看到成功定位到問題所在位置。
瀏覽了一下整個方法,感慨一句dnspy反編譯真不彳亍。
異步亂亂的不說,switch
語句還轉化成 if
語句。
所以這里推薦一下 ilspy 來反編譯看一下代碼。
(ilspy 只能反編譯,沒法修改代碼、編譯,但是它的反編譯能力比 dnspy 要強很多,大家可以根據這個反編譯出來的代碼進行修改,來替換進dnspy。)
這是 ilspy 反編譯出來的代碼
其中着重需要關注的是我所標識的兩行,這個是之前游戲進行時候會走的分支(不信的話就點開其他的 case 來讀一下代碼)。但是現在不叫作 PresenceStatus.PLAY_GAME
了,而是分為第一步中添加的那 6 個枚舉了。所以我們只要讓上面添加的那 6 個枚舉都走這個 case 就可以了。
具體修復
先復制出來 ilspy 中反編譯出來的比 dnspy 好多了的代碼。
在原來的 case PresenceStatus.PLAY_GAME:
后面添加上其他的 6 個 case 讓他們都走 method_39
。
case PresenceStatus.PLAY_GAME:
case PresenceStatus.PLAY_RANKED_STANDARD:
case PresenceStatus.PLAY_RANKED_WILD:
case PresenceStatus.PLAY_RANKED_CLASSIC:
case PresenceStatus.PLAY_CASUAL_STANDARD:
case PresenceStatus.PLAY_CASUAL_WILD:
case PresenceStatus.PLAY_CASUAL_CLASSIC:
await method_39(gameplay_0);
然后在 dnspy 中編輯方法,復制進去就可以了。
修復結果
一切正常。