lowieliang 发表于 2021-11-1 18:23

放大招了,范围接种疫苗,凋萎顿关卡克星

本帖最后由 lowieliang 于 2021-11-1 18:23 编辑

    根据论坛的疫苗改法,不管是修改初始疫苗数量还是疫苗不减反增都很有作用。
    但是,想过没有,医院大了病人多了,一个一个点过去,手酸不?
    这就来了,直接上修改方法
   
    有朋友提醒我得从根子上教,好吧,先上个关于 dnSpy 的传送门 https://bbs.3dmgame.com/thread-5782890-1-1.html

    打开 dnSpy 我们要修改的是 安装目录\TPH_Data\Managed\Assembly-CSharp.dll 这个文件
    修改的是 TH20.ChallengeEpidemic 这个类
    先在 VaccinateCharacter 这个函数附近添加如下私有函数
    private bool vaccinateSingleCharacter(Character character)
    {
      if (ChallengeEpidemic.CharacterCantBeVaccinated(character))
      {
            return false;
      }
      if (this.IsVaccinated(character))
      {
            return false;
      }
      this._vaccinated.Add(character);
      bool flag = this.IsInfected(character);
      if (flag)
      {
            this._numberCured++;
            if (character.ModifiersComponent != null)
            {
                character.ModifiersComponent.RemoveStatusEffect(this._config.InfectionStatusEffect.Instance);
            }
            base.Level.CharacterEvents.OnCharacterVaccinated.InvokeSafe();
      }
      ChallengeEpidemic.PlayCuredEffect(character, flag);
      if (this._subGoal != null)
      {
            this._subGoal.UpdateProgress();
      }
      base.Level.StatusIconManager.ShowStatusIcon(character, StatusIcon.Type.Vaccinated);


      return flag;
    }


    然后修改原来的 VaccinateCharacter 函数如下
    public void VaccinateCharacter(Character character)
    {
      if (ChallengeEpidemic.CharacterCantBeVaccinated(character))
      {
            return;
      }
      if (this.IsVaccinated(character))
      {
            return;
      }
      List<Character> list = new List<Character>();
      float radius = 4f;    // 4×4 范围喷洒疫苗,请根据自己的喜好修改,不建议改的太大,影响游戏体验
      base.Level.CharacterManager.GetCharactersWithinDistance(character.Position, radius, null, list);
      bool cured = false;
      foreach (Character target in list)
      {
            if (this.vaccinateSingleCharacter(target))
            {
                cured = true;
            }
      }
      if (cured)
      {
            this._numberOfVaccines--;
            if (this._subGoal != null)
            {
                this._subGoal.UpdateProgress();
            }
      }
    }


    修改后的效果,随便找个没接种过疫苗的病人(员工也可以),点击给他接种,一定范围内的人都会接种疫苗。而且只有治愈了感染的人,疫苗数量才会减 1(注意,不是治愈几人减几剂疫苗,而是点击一次只要有治愈的才减 1)

david4801 发表于 2021-11-2 12:32

本帖最后由 david4801 于 2021-11-2 12:48 编辑


这个challenge里面没有看到List<Character> list = new List<Character>();      float radius = 4f是我开错位置了么?

lowieliang 发表于 2021-11-2 13:18

david4801 发表于 2021-11-2 12:32
这个challenge里面没有看到List list = new List();      float radius = 4f是我开错位置了么?

...

    你没看错,原来是没有,这些都是我写的,请把整个函数的内容替换成我写的代码:)。红字注释的那行是方便调参数的,不是只改这行。
    前面那个私有函数 private bool vaccinateSingleCharacter(Character character) 是新添加的哦,别忘了加上。


    祝你玩的开心。

david4801 发表于 2021-11-2 13:21

lowieliang 发表于 2021-11-2 13:18
你没看错,原来是没有,这些都是我写的,请把整个函数的内容替换成我写的代码。红字注释的那行是方 ...

请问大佬,我应该怎么替换原本的代码?右键原本的代码选编辑类?萌新不大懂

lowieliang 发表于 2021-11-2 13:34

david4801 发表于 2021-11-2 13:21
请问大佬,我应该怎么替换原本的代码?右键原本的代码选编辑类?萌新不大懂 ...

    在左边那栏里右键点击 ChallengeEpidemic 类,会弹出一个菜单

    左键点击 "C# 编辑类(C#)(C)..."这个菜单项


    会弹出一个新的窗体,这里面的代码就可以编辑了


    编辑完之后,点击下面的“编译”按钮,没报错的话,编译成功窗体关闭。


    最后,顶上的菜单里点击 “文件”-“保存模块”,然后确定就可以退出去进游戏试试了。

lowieliang 发表于 2021-11-2 13:37

    帖子里那个传送门,你也可以参考着看看

david4801 发表于 2021-11-2 23:38

lowieliang 发表于 2021-11-2 13:34
在左边那栏里右键点击 ChallengeEpidemic 类,会弹出一个菜单

    左键点击 "C# 编辑类(C#)(C)..."...

操我作之后出现错误,完全无法编译。哪怕是我什么都不改,直接点编译,也出现下面图里的错误


lowieliang 发表于 2021-11-3 17:42

david4801 发表于 2021-11-2 23:38
操我作之后出现错误,完全无法编译。哪怕是我什么都不改,直接点编译,也出现下面图里的错误




    从你报错的情况来看,是相关的类库没有引用进来。

    你试下这么操作:


    “文件”-“打开”, 然后选择 安装目录\TPH_Data\Managed 目录下所有 dll 文件,打开。


    然后再按照前面说的操作下看看

david4801 发表于 2021-11-4 02:18

lowieliang 发表于 2021-11-3 17:42
从你报错的情况来看,是相关的类库没有引用进来。

    你试下这么操作:


多谢大佬,已经可以了, 看来是因为我打开的是备份的dll,所以位置不在游戏目录里。可能这样就读取不到别的dll了

cyz2000 发表于 2021-12-31 20:04

有点懵~lz能上传修改过的截图吗?

13607914476 发表于 2022-7-27 16:45

咋回事

请输入姓名ˇ 发表于 2022-8-25 01:25

怎么添加私有函数

半月蝶莲 发表于 2022-9-15 01:30

david4801 发表于 2021-11-2 12:32
这个challenge里面没有看到List list = new List();      float radius = 4f是我开错位置了么?

...

请问下你是怎么改的 添加私有函数是什么...

半月蝶莲 发表于 2022-9-17 01:46

cyz2000 发表于 2021-12-31 20:04
有点懵~lz能上传修改过的截图吗?

完整代码 试过能用 直接把原代码全部覆盖就行
using System;
using System.Collections.Generic;

namespace TH20
{
    // Token: 0x02000348 RID: 840
    public partial class ChallengeEpidemic : Challenge
    {
      // Token: 0x06000FD2 RID: 4050 RVA: 0x0007AA1C File Offset: 0x00078C1C
      public void VaccinateCharacter(Character character)
      {
            if (ChallengeEpidemic.CharacterCantBeVaccinated(character))
            {
                return;
            }
            if (this.IsVaccinated(character))
            {
                return;
            }
            List<Character> list = new List<Character>();
            float radius = 4f;
            base.Level.CharacterManager.GetCharactersWithinDistance(character.Position, radius, null, list);
            bool flag = false;
            foreach (Character character2 in list)
            {
                if (this.vaccinateSingleCharacter(character2))
                {
                  flag = true;
                }
            }
            if (flag)
            {
                this._numberOfVaccines--;
                if (this._subGoal != null)
                {
                  this._subGoal.UpdateProgress();
                }
            }
      }
    }
}


半月蝶莲 发表于 2022-9-17 01:47

13607914476 发表于 2022-7-27 16:45
咋回事

看下面

半月蝶莲 发表于 2022-9-17 01:47

请输入姓名ˇ 发表于 2022-8-25 01:25
怎么添加私有函数

看下面

半月蝶莲 发表于 2022-9-17 01:48

cyz2000 发表于 2021-12-31 20:04
有点懵~lz能上传修改过的截图吗?

看下面

loudio 发表于 2024-6-4 11:13

看下面????
页: [1]
查看完整版本: 放大招了,范围接种疫苗,凋萎顿关卡克星