qweytr_1 发表于 2018-9-6 18:14

医院员工XP修改

本帖最后由 qweytr_1 于 2018-9-16 17:12 编辑

……第一次见到这么见鬼的数据结构,学到了不少活久见的知识——题记首先,打开dnSpy(https://github.com/0xd4d/dnSpy/releases),选中dnSpy左边窗口的全部文件按下Del键(这只会关闭文件而非删除,这样做可以防止一些诡异的编译失败的问题……特别是在你希望修改不止一个游戏的时候)
之后用dnSpy打开游戏目录\TPH_Data\Managed\Assembly-CSharp.dll
下面,开始正文

最开始,让我们介绍一种常规(但不适合修改员工XP)的修改方法

首先根据英语,员工是staff,经验是experience,多半会简写成xp,exp之类的东西
依此搜索,搜索可能是改游戏时候最耗时的一步,毕竟知道从哪里下手之后,做什么都会很方便。
当我们输入exp staff的时候,我们看到

请注意我是故意用exp的,因为游戏里面用的名称是XP,我们本应搜不到任何有用的信息
然而谁让Initialise这个可以被理解成“初始化”的单词以e结尾呢:)
点开InitialiseXP

这里我们看到,这个函数主要操纵了变量this.XP,这说明this.XP就是我们要修改的目标(或者,查文件的开头可以看到,这里的this指的应该是staff,也就是说我们的目标是staff里面一个叫做XP的变量)

看到this.XP之后,我们其实就找到了我们要修改的目标,理论上我们就可以不要客气了,右键怼它:)

我们得到了有个菜单,里面有一个“分析”,这是dnSpy里面最好用的一个功能
我们看到了两个下拉菜单,一个叫get,一个叫set,字面意义上,set是“设置”,是赋值的意思,而get是获取,是读的意思,也就是,如果我们要改这个数据,我们应该找set,看看到底是哪个函数set了它……
然而我们想多了

只有一个函数使用了set,而这个函数正是我们打开的这个初始化的函数
会有程序用初始化这种方法对变量进行更新吗?
或者说,会有人用格式化这种方法往硬盘里面存数据吗?
显然不对……
然鹅,对一般数据……或者说我从Reus一路改过来改了那么多游戏……从未见过哪个函数不是直接用set进行赋值的,也就是说,一般情况下,只要找到set顺蔓摸瓜就可以了。
下面介绍错误原因……
原因很简单,因为这个作死的程序是用get进行赋值,甚至越过了get使用了他们自己定义的AttributeFloat进行赋值的。
先说get
这个时候,在常规方法失效的时候,其实就是大家发挥自己想象力的时候了。
点开get,如果有足够耐心,可以一个个看下去,然鹅大家都没有耐心……于是,一个好方法是通过名字以及对游戏的了解进行修改
首先,游戏里面只有医生看病人的时候才会进行经验上的修改,所以我们要看update,而非其他的东西
在get方法里面带update的只有两个,都是带patient的,把这两个都改掉,我们会发现……助理的等级哗哗哗往上涨拦都拦不住
然而大夫还是一脸萌萌哒……
这时候,我们不得不去仔细检查那个modify到底是怎么完成的……
搜索相关代码(右键怼modify选择分析,强行阅读相关代码),在AttributeFloat attribute = attributes.GetAttribute(enumValue);一句里面,出现了一个可以绕过this.XP来强行读取并修改XP的
这句话最终在attribute.Modify(this._amount, attributesInterface.GetAttributeMultiplier(enumValue));一句完成了修改
既然知道了这一点,我们只需要修改相关代码拦截住这一段内容,就可以让员工XP(或许要除去那群可怜的助理)蹭蹭蹭网上涨了
这里选择修改更为保险的GetAttributeMultiplier
反正我们可以查到XP的enumValue是9(善用鼠标左键双击以及右键硬怼即可)
最后找到public float GetAttributeMultiplier(CharacterAttributes.Type type)
在这里进行修改,反正只要随手一改就好,我改了return:return Mathf.Max(this._getAttributeMultiplierParam.Multiplier, type == CharacterAttributes.Type.XP ? 100f:1f);
之后……终于不用为了升个级等一个小时了



nudest 发表于 2025-2-19 00:29

wjxdjj 发表于 2018-10-19 21:05
改IL没有数字选择,
改类的时候未更改就编译不了。求方法啊~~~~

我也遇到同样的错误,无法选择数字1 如果用ldloc.1 就会乱码
页: [1]
查看完整版本: 医院员工XP修改