解决方案

namespace Triton.Game.Mapping
{
// Token: 0x020004A4 RID: 1188
[Attribute38("Entity")]
public class Entity : EntityBase

// Triton.Game.Mapping.Entity
// Token: 0x06003007 RID: 12295 RVA: 0x00026F09 File Offset: 0x00025109
public TAG_RACE GetRace()
{
return base.method_11<TAG_RACE>("GetRace", Array.Empty<object>());
}

modify as following

// Triton.Game.Mapping.Entity
// Token: 0x06003007 RID: 12295
public TAG_RACE GetRace()
{
return this.GetEntityDef().GetRace();
}

分析

很早就修复了,但是前任吧主在7月就把我永久封禁了。所以一直没办法发教程

========

在分析出错的原因之前,先分析一下兄弟的工作原理。
这是我之前在调试CollectionDeckBoxVisual.IsValid的这个错误的时候发现的。

兄弟是通过greymagic来获取游戏的客户端进程里面的api的,拿到api之后,调用api来玩游戏。
而游戏的api逻辑是在一个叫做Assembly-CSharp的文件中,可以用软件everything来搜索。

一般来讲,如果提示方法或者属性找不到了,都是因为Assembly-CSharp这个文件更新导致的。

================

为了能够找出api调用不成功的原因,大家可以手动备份这个叫做Assembly-CSharp的文件。
最好是能够备份统计目录下的所有文件,这样等到新版本更新,还可以去查看旧版本的Assembly-CSharp文件。

我目前只备份了Assembly-CSharp文件,并且给文件名加上了sha256的唯一识别码,以及日期。
8月2日之前的版本,我备份的文件是SHA-256: 0061e3e6959babde52f2 很长的一串数字,大概取前6位就足够了。
这里涉及到另外一个软件hashcheck,用来查看文件hash的

================

根据错误的堆栈信息,我们可以找到出错的方法

Exception was thrown by coroutine ---> System.MissingMethodException: 未找到方法“Entity.GetRace”。
在 Triton.Game.Mono.MonoClass.3b(String string_4, Enum20[] enum20_0, Object[] object_0)
在 Triton.Game.Mono.MonoClass.3e[T](String string_4, Enum20[] enum20_0, Object[] object_0)
在 Triton.Game.Mono.MonoClass.3f[T](String string_4, Object[] object_0)
在 Triton.Game.Mapping.Entity.GetRace()

==================

首先我们去8月2日之前的Assembly-CSharp看看这个Entity.GetRace方法。
Entity.GetRace方法内部首先调用另外一个方法,GetEntityDef。
GetEntityDef方法返回了EntityDef类型的结果,然后再调用这个结果的GetRace方法。
这一块的调用C sharp里面的基础知识,有兴趣的可以了解一下。

===============

然后我们看一下新版的Assembly-CSharp被改成什么样子了:

之前旧版本中getrace的下一个方法是hasrace,所以我们直接找到hasrace,看看附近是否还有getrace这个方法。

当然也可以直接整个类中搜索方法名,你会发现之前存在的方法被删除了。

===========

方法已经被删除,那就意味着之前的mehod_11方法,没办法再通过greymagic去内存中拿到对应的方法了。

所以,我们需要回到旧版本中,研究一下之前的方法getrace在做什么?

前面已经提到,之前的getrace做了两件事情:

1.通过GetEntityDef拿到一个类型EntityDef的结果

2.调用EntityDef的getRace方法。

我们尝试在Assembly-CSharp中搜索EntityDef.getrace,你会发现这个方法还是在的。所以我们可以考虑调用这个类的方法。

======

仔细分析之前Assembly-CSharp的getrace方法内容,调用的语法是this.GetEntityDef().GetRace。

这意味着Entity本身还有一个方法,方法名字是GetEntityDef。

因为兄弟是和Assembly做了一对一的映射关系的,所以兄弟里面应该也会有这么一个方法的。

搜索mapping.entity.getentitydef,果然找到了方法。并且这个方法的返回值就是EntityDef类型的。

======

能拿到EntityDef,事情就变得简单了,只要做如下调整就可以了

最新文章

  1. html5 canvas常用api总结(三)--图像变换API
  2. knockoutJS学习笔记01:从拼接字符串到编写模板引擎
  3. Android 笔记 day2 拨号器
  4. windows 系统时钟
  5. Table排序
  6. (六)观察者模式详解(包含观察者模式JDK的漏洞以及事件驱动模型)
  7. Android快速开发系列 10个常用工具类
  8. 构建基于WinRT的WP8.1 App 01:页面导航及页面缓存模式
  9. WPF 窗体拖转时不触发MouseLeftButtonUpEvent
  10. 使用STL库sort函数对vector进行排序
  11. kafka彻底删除topic
  12. js---DOM元素节点
  13. ctags使用说明详解
  14. tmux鼠标配置出现错误unknown option: mode-mouse
  15. 「NOI2013」小 Q 的修炼 解题报告
  16. Flask 系列之 SQLAlchemy
  17. sqlserver 隔离级别 - 转
  18. 一款Redis客户端,可以作为Redis Desktop manager的有效补充或替代
  19. Problem A 还会用继承吗?
  20. 峰Redis学习(8)Redis 持久化AOF方式

热门文章

  1. List &#183; leetcode-24. 交换相邻节点
  2. 前端(HTML)+后端(Django)+数据库(MySQL):用户注册及登录演示
  3. Python使用selenium模拟点击,进入下一页(三)
  4. Ubuntu系统---安NVIDIA 驱动后 CUDA+cuDNN 安装
  5. Java 基础 - Set接口 及其实现类HashSet/LinkedHashSet/TreeSet
  6. slice(), splice(),split(),indexOf(),join(),replace()
  7. tp5.1下redis配置和使用
  8. IntelliJ IDEA必装插件以及SpringBoot使用小技巧合集
  9. P4053 [JSOI2007]建筑抢修 堆贪心
  10. 020_统计 13:30 到 14:30 所有访问 apache 服务器的请求有多少个