2021.06.04 更新带来的对局内报错问题
第一步
错误提示
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 中编辑方法,复制进去就可以了。
修复结果
一切正常。