月半情残 发表于 2023-6-19 18:46

使用dnSpy简单自制缺氧Mod教程

本帖最后由 月半情残 于 2023-6-19 18:46 编辑

前言:
本教程仅适用于有一定编程基础、了解如何修改Assembly-CSharp.dll文件的人员学习,本人语言组织能力不强,看不懂可留言交流;
本人非大神,仅是一名对编程感兴趣的普通玩家,路过大神还望勿喷,本帖仅为本人一点经验分享,仅供参考,如有不妥请指出让我改正,谢谢大家!

static/image/hrline/4.gif


一、前期准备
    1、安装dnSpy
      1、首先你要知道dnSpy是干什么用的,如果你不清楚,不建议往下学习,该软件在github上开源,项目链接https://github.com/dnSpy/dnSpy/releases/tag/v6.1.8,可自行前往下载;我以前帖子里分享链接里有这款工具,也到这里下载;
      2、解压安装(不在多说)
static/image/hrline/1.gif
    2、创建文件
      1、首先新建一个文件夹,用于存放Mod文件,存放位置随意,只需在测试时复制到C:\Users\用户名\Documents\Klei\OxygenNotIncluded\mods\local\文件夹中就行了
      2、Mod运行需要最少三个文件:DLL文件,mod.yaml,mod_info.yaml
            
      DLL文件使用dnSpy创建,方法见后文文件,名称可自定义;mod.yaml、mod_info.yaml文件可以直接使用记事本创建(注意修改扩展名)
      3、mod.yaml文件内容(staticID:ModID、title:Mod名称,可用汉字)
staticID: MyMod
title: 自制Mod      4、mod_info.yaml文件内容
supportedContent: ALL
minimumSupportedBuild: 546664
version: 1.0.0.0
APIVersion: 2static/image/hrline/1.gif
    3、引用文件
      1、自制Mod要引用官方API,(将引用文件复制到mod文件内会更方便)
      2、右键Steam游戏图标选择 管理--浏览本地文件即可找到缺氧游戏文件
            
      3、需要引用的文件就在\OxygenNotIncluded_Data\Managed文件夹内
                     4、主要引用文件:0Harmony.dll、Assembly-CSharp.dll、Assembly-CSharp-firstpass.dll、FMODUnity.dll、mscorlib.dll、System.Core.dll、UnityEngine.CoreModule.dll
      

static/image/hrline/4.gif


二、创建mod
    1、创建mod      打开dnSpy,选择编辑-创建程序集在名称位置输入ModID 其他默认,点击确定
      
            2、保存
      选择文件--保存模块或直接点击保存所有图标
      


      
      点击文件名右侧...按钮选择前面创建的mod文件夹并输入DLL文件名称,点击保存返回后点击确定即可保存
      
static/image/hrline/4.gif

三、自制Mod
    1、创建命名空间、类
      展开刚创建的DLL程序集,会看到自动生成名为“-”的命名空间,后续mod代码就写在这里面,当然,也可以直接按DEL键删除
      右键选择创建类型输入命名空间、名称(可以使用汉字)
      
      
    2、开始编写Mod代码
      右键创建的类,选择 编辑类
      
    3、添加引用文件
      在编写代码前需对引用文件进行声明,否则dnSpy不知道引用的内容在哪会报错
      点击左下角添加程序集引用即可选择选择引用文件进行声明
      
      依次将前文提到的7个文件添加引用即可开始编写代码(这一步程序不会有提示,自行添加完成即可)
    4、引用游戏类
      此时默认添加代码如下
using System;

namespace 建筑修改
{
      // Token: 0x02000002 RID: 2
    public class 基地类
    {
    }
}
      我们需要在开头添加引用游戏DLL文件的哪一部分,这需要我们了解通过修改Assembly-CSharp.dll文件来修改游戏的基础知识,例如修改人力发电机的发电功率,我们需要在Assembly-CSharp.dll文件找到ManualGeneratorConfig部分,找到该部分就能看到改部分引用了那些游戏类
      
      直接复制到我们自制Mod部分即可,如下代码
using System;
using HarmonyLib;
using UnityEngine;

namespace 建筑修改
{
      // Token: 0x02000002 RID: 2
    public class 基地类
    {
    }
}
   5、编写代码
      按上述示例,后续内容需要写在基地类大括号内,
public class 基地类
{
}       例如,这里修改储气罐,可以在大括号内添加如下代码(代码无需进行缩进修改,dnSpy会自动识别)public class 储气罐
{
   
    public class 容量
    {
      public static void Postfix(GameObject go)
      {
            BuildingTemplates.CreateDefaultStorage(go, false).capacityKg = 150000f;
            EntityTemplateExtensions.AddOrGet<ConduitConsumer>(go).capacityKG = 150000f;
      }
    }
}      public class 储气罐用于创建一个子类,以和其他建筑修改内容区分;
      用于声明引用了哪一部分内容;
      public class 容量用于创建一个子子类,以和改建筑其他修改内容区分;
      public static void Postfix(GameObject go)用于声明修改哪些变量,
      BuildingTemplates.CreateDefaultStorage(go, false).capacityKg = 150000f;修改储气罐最大容量为150000KG;
      EntityTemplateExtensions.AddOrGet<ConduitConsumer>(go).capacityKG = 150000f;修改可用导管输入最大容量为150000KG
      此时若代码无误即可点击保存,保存后效果如下图
      
      6、保存、测试
         这时候就可以保存代码,打开游戏加载mod测试是否生效了

static/image/hrline/4.gif

四、常用修改代码(相关内容见https://bbs.3dmgame.com/thread-6408943-1-1.html)
    1、建筑类
      1、基地
            1、储气罐[HarmonyPatch(typeof(GasReservoirConfig), "ConfigureBuildingTemplate"
               容量
      public static void Postfix(GameObject go)
      {
            BuildingTemplates.CreateDefaultStorage(go, false).capacityKg = 150000f;
            EntityTemplateExtensions.AddOrGet<ConduitConsumer>(go).capacityKG = 150000f;
      }
            2、储液库[HarmonyPatch(typeof(LiquidReservoirConfig), "ConfigureBuildingTemplate"
               容量
      public static void Postfix(GameObject go)
      {
            BuildingTemplates.CreateDefaultStorage(go, false).capacityKg = 100000f;
            go.AddOrGet<ConduitConsumer>().capacityKG = 100000f;
      }
            3、储物箱[HarmonyPatch(typeof(Storage), MethodType.Constructor
               容量
      public static void Postfix(ref float ___capacityKg)
      {
            ___capacityKg = 250000f;
      }
            4、地毯砖[HarmonyPatch(typeof(CarpetTileConfig), "ConfigureBuildingTemplate"
                移动速度加成
      public static void Postfix(GameObject go, Tag prefab_tag)
      {
            go.AddOrGet<SimCellOccupier>().movementSpeedMultiplier = 3f;
      }
            5、塑料梯子[HarmonyPatch(typeof(LadderFastConfig), "ConfigureBuildingTemplate"
               爬行速度加成
      public static void Postfix(GameObject go)
      {
            Ladder ladder = go.AddOrGet<Ladder>();
            ladder.upwardsMovementSpeedMultiplier = 4.6f;
            ladder.downwardsMovementSpeedMultiplier = 4.6f;
            go.AddOrGet<AnimTileable>();
      }
            6、梯子[HarmonyPatch(typeof(LadderConfig), "ConfigureBuildingTemplate"
               爬行速度加成
      public static void Postfix(GameObject go)
      {
            Ladder ladder = go.AddOrGet<Ladder>();
            ladder.upwardsMovementSpeedMultiplier = 2.6f;
            ladder.downwardsMovementSpeedMultiplier = 2.6f;
            go.AddOrGet<AnimTileable>();
      }
            7、运输管道入口[HarmonyPatch(typeof(TravelTubeEntranceConfig), "ConfigureBuildingTemplate"
               传输次数(及修改单次起跳耗能与电容量)
      public static void Postfix(GameObject go, Tag prefab_tag)
      {
            TravelTubeEntrance travelTubeEntrance = go.AddOrGet<TravelTubeEntrance>();
            travelTubeEntrance.joulesPerLaunch = 100f;
            travelTubeEntrance.jouleCapacity = 40000f;
      }
            8、隔热砖[HarmonyPatch(typeof(InsulationTileConfig), "CreateBuildingDef"
               隔热效果
      public static void Postfix(ref BuildingDef __result)
      {
            __result.ThermalConductivity = 0f;
      }

static/image/hrline/1.gif

      2、氧气
            1、氧气扩散器[HarmonyPatch(typeof(MineralDeoxidizerConfig), "ConfigureBuildingTemplate"
               元素转换(氧气产出增加)
      public static void Postfix(GameObject go, Tag prefab_tag)
      {
            CellOffset cellOffset = new CellOffset(0, 1);
            ElementConverter elementConverter = go.AddOrGet<ElementConverter>();
            elementConverter.consumedElements = new ElementConverter.ConsumedElement[]
            {
                new ElementConverter.ConsumedElement(new Tag("Algae"), 0.55f, true)
            };
            elementConverter.outputElements = new ElementConverter.OutputElement[]
            {
                new ElementConverter.OutputElement(5f, SimHashes.Oxygen, 283.15f, false, false, (float)cellOffset.x, (float)cellOffset.y, 1f, byte.MaxValue, 0, true)
            };
      }
            2、碳素脱离器
               能耗降低及不产热[HarmonyPatch(typeof(CO2ScrubberConfig), "CreateBuildingDef"
      public static void Postfix(ref BuildingDef __result)
      {
            __result.EnergyConsumptionWhenActive = 80f;
            __result.SelfHeatKilowattsWhenActive = 0f;
      }
               吸收半径、吸收速率、元素转换(净水、二氧化碳消耗量、污水产出量)、转换速率、内部容量[HarmonyPatch(typeof(CO2ScrubberConfig), "ConfigureBuildingTemplate"
      public static void Postfix(GameObject go, Tag prefab_tag)
      {
            PassiveElementConsumer passiveElementConsumer = go.AddOrGet<PassiveElementConsumer>();
            passiveElementConsumer.elementToConsume = SimHashes.CarbonDioxide;
            passiveElementConsumer.consumptionRate = 0.6f;
            passiveElementConsumer.capacityKG = 1f;
            passiveElementConsumer.consumptionRadius = 30;
            ElementConverter elementConverter = go.AddOrGet<ElementConverter>();
            elementConverter.consumedElements = new ElementConverter.ConsumedElement[]
            {
                new ElementConverter.ConsumedElement(GameTagExtensions.Create(SimHashes.Water), 6f, true),
                new ElementConverter.ConsumedElement(GameTagExtensions.Create(SimHashes.CarbonDioxide), 0.2f, true)
            };
            elementConverter.outputElements = new ElementConverter.OutputElement[]
            {
                new ElementConverter.OutputElement(6f, SimHashes.DirtyWater, 0f, false, true, 0f, 0.5f, 1f, byte.MaxValue, 0, true)
            };
            go.AddOrGet<ConduitConsumer>().consumptionRate = 6f;
            go.AddOrGet<ConduitConsumer>().capacityKG = 12f;
      }
            3、空气净化器
               耗能及发热[HarmonyPatch(typeof(AirFilterConfig), "CreateBuildingDef"
      public static void Postfix(ref BuildingDef __result)
      {
            __result.ExhaustKilowattsWhenActive = 0f;
            __result.SelfHeatKilowattsWhenActive = 0f;
      }
               吸收速率、半径[HarmonyPatch(typeof(AirFilterConfig), "ConfigureBuildingTemplate"
      public static void Postfix(GameObject go, Tag prefab_tag)
      {
            ElementConsumer elementConsumer = go.AddOrGet<ElementConsumer>();
            elementConsumer.consumptionRate = 0.8f;
            elementConsumer.capacityKG = 0.8f;
            elementConsumer.consumptionRadius = 9;
      }

https://bbs.3dmgame.com/static/image/hrline/1.gif




内容过多,请等后续更新

月半情残 发表于 2023-6-19 19:08

      3、食物
            1、冰箱
               功耗、发热[HarmonyPatch(typeof(RefrigeratorConfig), "CreateBuildingDef"
      public static void Postfix(ref BuildingDef __result)
      {
            __result.EnergyConsumptionWhenActive = 10f;
            __result.ExhaustKilowattsWhenActive = 0f;
            __result.SelfHeatKilowattsWhenActive = 0f;
      }
               制冷功率[HarmonyPatch(typeof(RefrigeratorConfig), "DoPostConfigureComplete"
      public static void Postfix(GameObject go)
      {
            go.AddOrGet<Storage>().capacityKg = 2000f;
            RefrigeratorController.Def def = go.AddOrGetDef<RefrigeratorController.Def>();
            def.powerSaverEnergyUsage = 0f;
            def.coolingHeatKW = 0f;
      }
               制冷温度[HarmonyPatch(typeof(RefrigeratorController.Def), MethodType.Constructor
      public static void Postfix(ref float ___simulatedInternalTemperature)
      {
            ___simulatedInternalTemperature = 233.15f;
      }
            2、燃气炉
               功率、发热[HarmonyPatch(typeof(GourmetCookingStationConfig), "CreateBuildingDef"
      public static void Postfix(ref BuildingDef __result)
      {
            __result.EnergyConsumptionWhenActive = 20f;
            __result.ExhaustKilowattsWhenActive = 0f;
            __result.SelfHeatKilowattsWhenActive = 0f;
      }
               燃料需求及废气(燃料改为氧气、废气改为氧气)[HarmonyPatch(typeof(GourmetCookingStationConfig), "ConfigureBuildingTemplate"      public static void Postfix(GameObject go)
      {
            ElementConverter elementConverter = go.AddOrGet<ElementConverter>();
            elementConverter.consumedElements = new ElementConverter.ConsumedElement[]
            {
                new ElementConverter.ConsumedElement("Oxygen", 0.1f, true)
            };
            elementConverter.outputElements = new ElementConverter.OutputElement[]
            {
                new ElementConverter.OutputElement(0.025f, SimHashes.Oxygen, 300.15f, false, false, 0f, 2f, 1f, byte.MaxValue, 0, true)
            };
      }
               烹饪配方修改(配方需求量、需求烹饪台、添加配方)[HarmonyPatch(typeof(GourmetCookingStationConfig), "ConfigureRecipes"
内容过多,写不下,自行下载https://bbs.3dmgame.com/thread-6408943-1-1.html这个mod,自己反编译看吧


            3、电动烤炉
               功率、发热[HarmonyPatch(typeof(CookingStationConfig), "CreateBuildingDef"
      public static void Postfix(ref BuildingDef __result)
      {
            __result.EnergyConsumptionWhenActive = 10f;
            __result.ExhaustKilowattsWhenActive = 0f;
            __result.SelfHeatKilowattsWhenActive = 0f;
      }
               烹饪配方修改(配方需求量、需求烹饪台、添加配方)[HarmonyPatch(typeof(CookingStationConfig), "ConfigureRecipes"
内容过多,写不下,自行下载https://bbs.3dmgame.com/thread-6408943-1-1.html这个mod,自己反编译看吧
            4、食物压制机
               功耗、发热[HarmonyPatch(typeof(MicrobeMusherConfig), "CreateBuildingDef"


      public static void Postfix(ref BuildingDef __result)
      {
            __result.EnergyConsumptionWhenActive = 20f;
            __result.ExhaustKilowattsWhenActive = 0f;
            __result.SelfHeatKilowattsWhenActive = 0f;
      }

static/image/hrline/1.gif


      4、电力
            1、发电量、发热量(代码都是一样的自行补充)
               人力发电机[HarmonyPatch(typeof(ManualGeneratorConfig), "CreateBuildingDef"
               天然气发电机[HarmonyPatch(typeof(MethaneGeneratorConfig), "CreateBuildingDef"
               氢气发电机[HarmonyPatch(typeof(HydrogenGeneratorConfig), "CreateBuildingDef"               煤炭发电机[HarmonyPatch(typeof(GeneratorConfig), "CreateBuildingDef"
               石油发电机[HarmonyPatch(typeof(PetroleumGeneratorConfig), "CreateBuildingDef"


      public static void Postfix(ref BuildingDef __result)
      {
            __result.GeneratorWattageRating = 40000f;
            __result.ExhaustKilowattsWhenActive = 0f;
            __result.SelfHeatKilowattsWhenActive = 0f;
      }
            2、变压器变电功率、发热量(代码都是一样的自行补充)
               变压器[HarmonyPatch(typeof(PowerTransformerSmallConfig), "CreateBuildingDef"               大型变压器[HarmonyPatch(typeof(PowerTransformerConfig), "CreateBuildingDef"


      public static void Postfix(ref BuildingDef __result)
      {
            __result.ExhaustKilowattsWhenActive = 0f;
            __result.SelfHeatKilowattsWhenActive = 0f;
            __result.GeneratorWattageRating = 10000f;
            __result.GeneratorBaseCapacity = 10000f;
      }
            3、电池容量(代码都是一样的自行补充)
               电池[HarmonyPatch(typeof(BatteryConfig), "DoPostConfigureComplete"
               巨型电池[HarmonyPatch(typeof(BatteryMediumConfig), "DoPostConfigureComplete"
               智能电池[HarmonyPatch(typeof(BatterySmartConfig), "DoPostConfigureComplete"

      public static void Postfix(GameObject go)
      {
            Battery battery = go.AddOrGet<Battery>();
            battery.capacity = 1000000f;
            battery.joulesLostPerSecond = 0f;
      }
            4、电池发热(代码都是一样的自行补充)               电池[HarmonyPatch(typeof(BatteryConfig), "CreateBuildingDef"
               巨型电池[HarmonyPatch(typeof(BatteryMediumConfig), "CreateBuildingDef"
               智能电池[HarmonyPatch(typeof(BatterySmartConfig), "CreateBuildingDef"


      public static void Postfix(ref BuildingDef __result)
      {
            __result.ExhaustKilowattsWhenActive = 0f;
            __result.SelfHeatKilowattsWhenActive = 0f;
      }






太多了,不想写了,谁有啥问题直接问吧,或者下载我之前的mod直接反编译

1364320666 发表于 2023-6-19 19:54

太复杂了...不会!不学!不练!大佬能发一个561558版本小人无负面特性和打印机能刷新的Mod吗,我一改那个文件就报错...{:3_92:}

月半情残 发表于 2023-6-20 11:04

本帖最后由 月半情残 于 2023-6-20 11:07 编辑

1364320666 发表于 2023-6-19 19:54
太复杂了...不会!不学!不练!大佬能发一个561558版本小人无负面特性和打印机能刷新的Mod吗,我一改那个文 ...


你直接用https://steamworkshopdownloader.io/下载这两个mod就行
DGSM   https://steamcommunity.com/sharedfiles/filedetails/?id=1838445101技能自定义   https://steamcommunity.com/sharedfiles/filedetails/?id=2851636970

1364320666 发表于 2023-6-20 14:31

月半情残 发表于 2023-6-20 11:04
你直接用https://steamworkshopdownloader.io/下载这两个mod就行
DGSM   https://steamcommunity.com/sh ...

居然还有这种网站,有一种第一次知道P站图片搜索网站时的喜悦....感谢大佬已经用上了{:3_149:}

3dm_19530492 发表于 2023-6-20 23:31

6了早就想学了可是有一些比较复杂的不知道怎么引用。

月半情残 发表于 2023-6-21 16:14

3dm_19530492 发表于 2023-6-20 23:31
6了早就想学了可是有一些比较复杂的不知道怎么引用。

确实,只要知道怎么引用,就简单很多了,我都是上steam工坊下载mod反编译看是怎么引用

3dm_19530492 发表于 2023-6-23 10:44

其实想找类似的也不懂怎么引用比如衣服类型。如果按照用编一改的话,到时候会直接添加因为编译会直接在里面编译吧这种我也不知道但是如果你改为想保存出来作为模组使用不行的。因为保存里面没有向往变异里面引用的那些,而且有的没用的也用了。

3dm_19530492 发表于 2023-6-23 10:45

@月半情残所以在网上找了衣服类型同样的添加属性的基本都没看到有有了但是没看到谁都有手的里面就有超级气压服的可是那种都不会看引用的他都不知道引用到哪里了。我原本是想比如企业服添加某一些属性,体力,耐力,运动力量。

3dm_19530492 发表于 2023-6-23 10:46

@3dm_19530492或因为气压符固定的也就那几个而且还有减速度所以不懂引用了或者添加

d9527t 发表于 2023-6-28 19:38

大神分析的那个无比复杂啊,有没有最新版本的现成的MOD,跪求!改个小人属性之类,最基础功能就行。

3dm_19017134 发表于 2024-1-25 19:57

大大我其实就是想改一下无限刷小人,因为是学习版,他们发的供方我从来没接触过,求教

zr19941003 发表于 2024-3-20 15:49

我就想问一下关于油井获取当前压力值的代码,还有写完后怎么上传创意工坊

czar1980 发表于 2024-3-20 19:40

大佬,改的过多之后,能保存,但是游戏界面飘红,加载不上,怎么处理
页: [1]
查看完整版本: 使用dnSpy简单自制缺氧Mod教程