[Reframework教程]找不到想要的?试试TypeDefine~
Pre

老规矩,还是先放一下索引贴的反向链接Ref索引

你是不是在看完Singletons后感觉你又行啦~然后兴冲冲的想去找你想要的对象,然后发现~

淦!为什么找不到!

然后你可能又会去找别的大佬写的脚本,结果发现他们根本不用Singletons方法,这时你又会发现,他们在使用一个叫sdk.find_type_definition(xxx)方法~不禁再次发问~

淦!这特么又是什么?!

那么这一章,我们就来认识下,非单例模式RETypeDefinition~

非单例模式是什么?

非单例模式,也就是在全局中不唯一的对象,通常这类对象会随着生命周期创建或销毁,或者该对象会被频繁复用,导致没有办法确保仅存在全局唯一对象。

举个例子,cHunterWp00Handling是大剑的控制类,会由它控制武器动作执行、状态记录等功能。那么假设现在任务中共有4个大剑侠,那至少就会有4个不同地址的cHunterWp00Handling实例,以实现对每个大剑侠角色的控制。Reframework无法替你去判断究竟哪一个对象你所控制的大剑侠的,这就是非单例模式。

[其实在真实的软件中单例才是少见的~,高复用和高性能存储管理才是大多数软件人的喜好,为了好理解,我们就也把它视为一个与单例模式同样重要的内容来看待]

如果不好理解,你可以去PlayerManager中看一下PlayerList对象,它是一个101个空间的地址表,里面包含你所在的服务器中每一个玩家的对象,每个玩家都会有一个Controller。

该怎么找到非单例对象

那么在确定非单例对象后,该怎么去捕捉它呢?万幸,Reframework给你提供了一个非常便捷的方法,

sdk.find_type_definition(name)

返回接收一个对象名称作为输入,返回一个RETypeDefinition*。

[注: RETypeDefinition类似于C#中的Type类,提供对类型元数据的访问功能,看不到就请忽略这一条]

OK,现在请先忘掉这个函数,RETypeDefinition和sdk.hook将在下一章中详细讲解。现在我们来看看该怎么去确定你想要的触发函数或者对象究竟在哪里~

我建议新手先去看下别人的sdk.hook,这是最快的办法,如果你不想这么做的话~~有个比较笨的办法~

首先,你需要你个MHWS-Editor ,也就是本地文件修改器,以及一个已经解包的文件[去别人改好的文件里面下就行,自己解包也简单,有工具和教程]。我这里以太刀为例吧:

natives\STM\GameDesign\Player\ActionData\Wp03\GlobalParam\Wp03GlobalActionParam.user.3,打开后我们来看下刃气槽的持续时间定义:

ok,这东西有什么用呢?很简答,记住~越是大佬越懒~不可能自己去帮你把这么多定义表手动补全的,那么这个东西一定是来自于解包数据! 巧了,Reframework的定义也是来自于类定义数据~,那么你就一定可以找到对应的东西,无非就是麻烦一点。

那么第二步,还记得上次在调试工具中没讲,但是说很重要的搜索框么?

AuraTime的对象类型,必定是一个Field [实际上能看到的都是Field,本地存function没有意义]~,那么我们就粘贴到Field栏里面看看都有什么~

ok,结果出来了,有两个对象包含这个Field,如果你懂点编程,你基本已经猜到要改哪里了,不过鉴于是基础教程,所以~机翻一下!

好吧,Wp03操控,Wp03对应的是太刀文件,因为MHWS-Editor的解包文件路径也是Wp03,我觉得这个弱智问题就不解释了吧。

那就先看看app.cHunterWp03Handing里面都有啥

那么也就知道了,_AuraTime这个对象就是我们想改的,但是点开一看,估计又傻了~

空指针?! 纳尼?!

那么现在估计你可能就放弃了,但别忘了,这是个非单例对象,没有地址很正常,毕竟Reframework也不知道该给你哪个嘛~,这时候我们就有两种方法~:

  1. 通过sdk.hook获取对象实例后修改,不过我们这章不讨论这个方法,这是下一章的内容
  2. 递归寻找

递归是什么?不用知道,就是别人递给你一只大乌龟~那么我们想要找到这个实例,我们只知道它归属于app.cHunterWp03Handling这个对象,那我们就把它作为函数返回值或Arg对象进行搜索:

完全没找到有帮助的?! 惊不惊喜,意不意外~

那么我们再找找看有没有包含这个类型的Field:

还是没有!!,那这时候我们就要考虑一个问题了,是不是他们为了使返回值合法,又不想定义一大堆返回值,所以用它的父类作为返回对象了呢?那就看看这个类的定义吧(也就是在TypeName,第一栏搜索)~

OK,结合上节课所说的,它果然是继承自一个基类(废话,不派生要累死这帮人),复制基类名称,再搜一次~

熟悉么? HunterCharacter在上一章中,我们通过单例知道了怎么找到你的角色的Character,那是不是只要你在切换武器时,或者定周期去通过get_WeaponHandling(),就可以找到你控制的角色的操作类实例了呢~

OK,以上就是本章的全部内容了~,以上只是提供一个递归寻找的思路,比起sdk.find_type_define+sdk.hook的方法更慢,但能够让你快速了解游戏的组织机制~各有利弊~

多尝试多反馈~ 下一章来讲一下正统的对象获取方法~

by Tweister 发布于 2025-04-23
若有附件,打赏后可直接下载 赠人玫瑰 手留余香
默认
最新


1