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

注册 登录

QQ登录

只需一步,快速开始

查看: 7993|回复: 13
打印 上一主题 下一主题

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

[复制链接]

6

主题

83

帖子

319

积分

高级玩家

Rank: 4

贡献度
27
金元
2106
积分
319
精华
0
注册时间
2017-8-6
QQ
跳转到指定楼层
主题
发表于 2023-6-19 18:46 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 月半情残 于 2023-6-19 18:46 编辑

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




一、前期准备
    1、安装dnSpy
        1、首先你要知道dnSpy是干什么用的,如果你不清楚,不建议往下学习,该软件在github上开源,项目链接https://github.com/dnSpy/dnSpy/releases/tag/v6.1.8,可自行前往下载;我以前帖子里分享链接里有这款工具,也到这里下载;
        2、解压安装(不在多说)

    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名称,可用汉字
<       4、mod_info.yaml文件内容
<
    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
        




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


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


三、自制Mod
    1、创建命名空间、类
        展开刚创建的DLL程序集,会看到自动生成名为“-”的命名空间,后续mod代码就写在这里面,当然,也可以直接按DEL键删除
        右键选择  创建类型  输入  命名空间、名称  (可以使用汉字)
        
        
    2、开始编写Mod代码
        右键创建的类,选择 编辑类
        
    3、添加引用文件
        在编写代码前需对引用文件进行声明,否则dnSpy不知道引用的内容在哪会报错
        点击左下角  添加程序集引用  即可选择选择引用文件进行声明
        
        依次将前文提到的7个文件添加引用即可开始编写代码(这一步程序不会有提示,自行添加完成即可)
    4、引用游戏类
        此时默认添加代码如下
<       我们需要在开头添加引用游戏DLL文件的哪一部分,这需要我们了解通过修改Assembly-CSharp.dll文件来修改游戏的基础知识,例如修改  人力发电机  的发电功率,我们需要在Assembly-CSharp.dll文件找到ManualGeneratorConfig部分,找到该部分就能看到改部分引用了那些游戏类
        
        直接复制到我们自制Mod部分即可,如下代码
<    5、编写代码
        按上述示例,后续内容需要写在基地类大括号内,
<      例如,这里修改储气罐,可以在大括号内添加如下代码(代码无需进行缩进修改,dnSpy会自动识别)<       public class 储气罐用于创建一个子类,以和其他建筑修改内容区分;
        [HarmonyPatch(typeof(GasReservoirConfig), "ConfigureBuildingTemplate")]用于声明引用了哪一部分内容;
        public class 容量用于创建一个子子类,以和改建筑其他修改内容区分;
        public static void Postfix(GameObject go)用于声明修改哪些变量,
        BuildingTemplates.CreateDefaultStorage(go, false).capacityKg = 150000f;修改储气罐最大容量为150000KG;
        EntityTemplateExtensions.AddOrGet<ConduitConsumer>(go).capacityKG = 150000f;修改可用导管输入最大容量为150000KG
        此时若代码无误即可点击保存,保存后效果如下图
        
      6、保存、测试
         这时候就可以保存代码,打开游戏加载mod测试是否生效了



四、常用修改代码(相关内容见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;
        
}



        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;
        
}






内容过多,请等后续更新

评分

1

查看全部评分

回复

使用道具 举报

6

主题

83

帖子

319

积分

高级玩家

Rank: 4

贡献度
27
金元
2106
积分
319
精华
0
注册时间
2017-8-6
QQ
舒服的沙发
 楼主| 发表于 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;
        
}




        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直接反编译
回复 支持 反对

使用道具 举报

2

主题

275

帖子

320

积分

高级玩家

Rank: 4

贡献度
0
金元
3197
积分
320
精华
0
注册时间
2016-7-11
硬硬的板凳
发表于 2023-6-19 19:54 | 只看该作者
太复杂了...不会!不学!不练!大佬能发一个561558版本小人无负面特性和打印机能刷新的Mod吗,我一改那个文件就报错...
回复 支持 反对

使用道具 举报

6

主题

83

帖子

319

积分

高级玩家

Rank: 4

贡献度
27
金元
2106
积分
319
精华
0
注册时间
2017-8-6
QQ
冰凉的地板
 楼主| 发表于 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
回复 支持 反对

使用道具 举报

2

主题

275

帖子

320

积分

高级玩家

Rank: 4

贡献度
0
金元
3197
积分
320
精华
0
注册时间
2016-7-11
5#
发表于 2023-6-20 14:31 | 只看该作者
月半情残 发表于 2023-6-20 11:04
你直接用https://steamworkshopdownloader.io/下载这两个mod就行
DGSM   https://steamcommunity.com/sh ...

居然还有这种网站,有一种第一次知道P站图片搜索网站时的喜悦....感谢大佬已经用上了
回复 支持 反对

使用道具 举报

8

主题

90

帖子

101

积分

中级玩家

Rank: 3Rank: 3

贡献度
0
金元
1014
积分
101
精华
0
注册时间
2021-10-31
6#
发表于 2023-6-20 23:31 来自手机 | 只看该作者
6了早就想学了可是有一些比较复杂的不知道怎么引用。
回复 支持 反对

使用道具 举报

6

主题

83

帖子

319

积分

高级玩家

Rank: 4

贡献度
27
金元
2106
积分
319
精华
0
注册时间
2017-8-6
QQ
7#
 楼主| 发表于 2023-6-21 16:14 | 只看该作者
3dm_19530492 发表于 2023-6-20 23:31
6了早就想学了可是有一些比较复杂的不知道怎么引用。

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

使用道具 举报

8

主题

90

帖子

101

积分

中级玩家

Rank: 3Rank: 3

贡献度
0
金元
1014
积分
101
精华
0
注册时间
2021-10-31
8#
发表于 2023-6-23 10:44 来自手机 | 只看该作者
其实想找类似的也不懂怎么引用比如衣服类型。如果按照用编一改的话,到时候会直接添加因为编译会直接在里面编译吧这种我也不知道但是如果你改为想保存出来作为模组使用不行的。因为保存里面没有向往变异里面引用的那些,而且有的没用的也用了。
回复 支持 反对

使用道具 举报

8

主题

90

帖子

101

积分

中级玩家

Rank: 3Rank: 3

贡献度
0
金元
1014
积分
101
精华
0
注册时间
2021-10-31
9#
发表于 2023-6-23 10:45 来自手机 | 只看该作者
所以在网上找了衣服类型同样的添加属性的基本都没看到有有了但是没看到谁都有手的里面就有超级气压服的可是那种都不会看引用的他都不知道引用到哪里了。我原本是想比如企业服添加某一些属性,体力,耐力,运动力量。
回复 支持 反对

使用道具 举报

8

主题

90

帖子

101

积分

中级玩家

Rank: 3Rank: 3

贡献度
0
金元
1014
积分
101
精华
0
注册时间
2021-10-31
10#
发表于 2023-6-23 10:46 来自手机 | 只看该作者
或因为气压符固定的也就那几个而且还有减速度所以不懂引用了或者添加
回复 支持 反对

使用道具 举报

0

主题

4

帖子

4

积分

新手玩家

Rank: 1

贡献度
0
金元
40
积分
4
精华
0
注册时间
2023-6-28
11#
发表于 2023-6-28 19:38 | 只看该作者
大神分析的那个无比复杂啊,有没有最新版本的现成的MOD,跪求!  改个小人属性之类,最基础功能就行。
回复 支持 反对

使用道具 举报

0

主题

15

帖子

17

积分

新手玩家

Rank: 1

贡献度
0
金元
170
积分
17
精华
0
注册时间
2023-11-12
12#
发表于 2024-1-25 19:57 | 只看该作者
大大我其实就是想改一下无限刷小人,因为是学习版,他们发的供方我从来没接触过,求教
回复 支持 反对

使用道具 举报

0

主题

21

帖子

92

积分

初级玩家

Rank: 2

贡献度
0
金元
923
积分
92
精华
0
注册时间
2016-4-24
13#
发表于 2024-3-20 15:49 | 只看该作者
我就想问一下关于油井获取当前压力值的代码,还有写完后怎么上传创意工坊
回复 支持 反对

使用道具 举报

0

主题

35

帖子

112

积分

中级玩家

Rank: 3Rank: 3

贡献度
0
金元
1122
积分
112
精华
0
注册时间
2017-10-12
14#
发表于 2024-3-20 19:40 | 只看该作者
大佬,改的过多之后,能保存,但是游戏界面飘红,加载不上,怎么处理
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-26 00:54 , Processed in 0.039216 second(s), 19 queries , Memcached On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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