3DMGAME 3DM首页 新闻中心 前瞻 | 评测 游戏库 热门 | 最新 攻略中心 攻略 | 秘籍 下载中心 游戏 | 汉化 购买正版 论坛

注册 登录

QQ登录

只需一步,快速开始

查看: 22036|回复: 386
打印 上一主题 下一主题

[原创] 医院员工XP修改

  [复制链接]

63

主题

975

帖子

3333

积分

游戏达人

Rank: 7Rank: 7Rank: 7

贡献度
420
金元
16225
积分
3333
精华
3
注册时间
2014-11-13

3DM MOD站(黄金)

跳转到指定楼层
主题
发表于 2018-9-6 18:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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);
之后……终于不用为了升个级等一个小时了



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

3

查看全部评分

回复

使用道具 举报

2

主题

102

帖子

222

积分

中级玩家

Rank: 3Rank: 3

贡献度
12
金元
1739
积分
222
精华
0
注册时间
2021-6-7
舒服的沙发
发表于 2025-2-19 00:29 | 只看该作者
wjxdjj 发表于 2018-10-19 21:05
改IL没有数字选择,
改类的时候未更改就编译不了。求方法啊~~~~

我也遇到同样的错误,无法选择数字1 如果用ldloc.1 就会乱码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|3DMGAME ( 京ICP备14006952号-1  沪公网安备 31011202006753号

GMT+8, 2025-4-18 15:15 , Processed in 0.139082 second(s), 18 queries , Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表