高级玩家

- 贡献度
- 27
- 金元
- 2106
- 积分
- 319
- 精华
- 0
- 注册时间
- 2017-8-6

|
本帖最后由 月半情残 于 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
查看全部评分
-
|