• 2021.06.04 更新带来的对局内报错问题


    第一步

    错误提示

    System.ArgumentException: Requested value 'PLAY_CASUAL_STANDARD' was not found.
    

    由于我选择的模式是标准休闲,所以他报错未找到 PLAY_CASUAL_STANDARD

    分析&思路

    PLAY_CASUAL_STANDARD 在兄弟里和原来的Managed中是搜索不到的,这里就不贴图了。说明这是个新东西。

    借个账号更新炉石后,用 dnspy 打开 HearthstoneHearthstone_DataManagedAssembly-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 中编辑方法,复制进去就可以了。

    修复结果

    一切正常。

  • 相关阅读:
    关于ACID,BASE和CAP定理的探究
    2020年10月3日——武汉,成都,南京房价揭秘
    程序员如何选择自己的保险
    Yarn系列(一)——Yarn整体介绍
    利用媒体查询实现响应式布局
    移动端web布局:适配
    scss在编辑器中保存自动编译css插件及安装
    移动端web布局:像素与成像的基本原理
    微信小程序:路由
    自定义vue指令
  • 原文地址:https://www.cnblogs.com/varc/p/14851480.html
Copyright © 2020-2023  润新知