如果你是一名玩家,并想要让其他模组修复与更好的体验不兼容的问题,
你可以向其他模组作者提出请求,让他们阅读此文档并添加跨 Mod 支持。
除了以 GetXX 开头的,其他 Mod.Call 的返回值是一个 bool,指示这个操作是否成功执行。
获取指定物品的弹药链序列 建议将本模组源码的 AmmoChain.cs 和 ItemTypeData.cs 复制到你的模组源码中,以便操作弹药链
Item要获取弹药链序列的物品实例
TagCompound以TagCompound形式存储的弹药链数据,数据读取方式参考 AmmoChain.cs 和 ItemTypeData.cs。如果物品没有弹药链,返回null
获取“任意弹药”物品的ID,这是一个用于弹药链中,表示该位置弹药任意的物品,搭配弹药链使用
无
int“任意弹药”物品的ID
获取大背包中的物品
Player大背包所属玩家的实例
List<Item>大背包中共100格的物品的实例,包括空气
为某个/些指定的物品添加无尽增益忽略,以防止在拥有30个时无限提供增益
int/List<int>不提供无限增益的某个物品/一些物品的ID
为某个指定的物品添加无尽增益支持(药水类),对于没有设置Item.buffType或拥有多个增益的物品十分有用,药水类指需要达到30堆叠才能提供增益
int添加药水类无尽增益支持的物品的IDint/List<int>该物品提供的一个/一些增益的ID
让某个/些指定的物品在触发无尽增益的情况下也会被正常消耗
int/List<int>会被正常消耗的某个物品/一些物品的ID
设置当玩家拥有某个增益时,一个/些增益会被清除
int某个增益的IDint/List<int>会被清除的增益ID
为某个指定的物品添加无尽增益支持(放置站类),放置站类指有一个即可提供增益。放置站一般需要手动提供支持
int添加放置站类无尽增益支持的物品的IDint/List<int>该物品提供的一个/一些增益的ID
为某个指定的物品添加便携制作站支持,对于没有设置Item.createTile但是应该充当某种制作站的物品十分有用,你可以指定多个制作站。 如果你想要使其充当水源,应将“该物品充当的制作站的物块ID”(即第二个参数)设置为水槽 (TileID.Sink)
int添加便携制作站支持的物品的IDint/List<int>该物品可充当的一个/一些制作站的物块ID
为某个指定的物品添加自动钓鱼机的钓鱼饰品支持,可设置钓鱼速度加成、渔力加成、是否应被视为钓具箱和是否可在岩浆钓鱼。一般需要手动提供饰品支持
int添加自动钓鱼机的钓鱼饰品支持的物品的IDfloat该物品提供的钓鱼速度加成float该物品提供的渔力加成bool该物品是否应被视为钓具箱bool该物品是否给予在熔岩中钓鱼的能力
向属性面板添加一个属性类别,后续可以使用 AddStat 添加属性
string添加的属性类别的字符串标识符Texture2D指示属性类别的图标string该属性类别的名称的本地化键Texture2D指示该属性类别所属模组的图标,建议使用模组的icon_small贴图
向某个属性类别添加一个属性
string该属性要被添加到的属性类别的字符串标识符string该属性的名称的本地化键Func<string>该属性的值的获取函数
添加回家物品
int/List<int>你要添加的某个物品/一些物品的IDbool该物品是否应被视为药水,若为药水则需要堆叠超过无尽药水需求才能快捷使用bool该物品是否应被视为折返药水,在回程时会创造一个折返传送门
获取指定自动钓鱼机内的物品
Point16/TEAutoFisher钓鱼机坐标/实例,支持钓鱼机覆盖的任一图格坐标
int钓鱼机位置的横坐标,世界图格坐标int钓鱼机位置的纵坐标,世界图格坐标
Item[]长度为43的数组,包括空气,槽位说明:- 0-39: 渔获
- 40: 钓竿
- 41: 鱼饵
- 42: 钓鱼饰品
- 若钓鱼机获取失败返回空数组(
Array.Empty<Item>()而非null,可以通过数组长度判断)
- Note: 返回的数组为快照,玩家交互可能导致钓鱼机绑定物品实例改变,需要注意数据过期问题
同步指定自动钓鱼机内的物品,用于在单人模式请求钓鱼机UI刷新和多人模式服务器端物品同步
Point16/TEAutoFisher钓鱼机坐标/实例,支持钓鱼机覆盖的任一图格坐标int需要同步物品的栏位id,对应关系参考GetFisherItems返回值说明int物品数量的变化量
int钓鱼机位置的横坐标,世界图格坐标int钓鱼机位置的纵坐标,世界图格坐标int需要同步物品的栏位id,同前int物品数量的变化量
- 单人模式:
- 强制刷新钓鱼机UI,
栏位id需在0-42范围内,变化量参数值被忽略
- 强制刷新钓鱼机UI,
- 多人模式:
变化量为0时:同步指定槽位物品的完整状态(类型、数量、属性)变化量非0时:仅更新物品数量(支持增量修改)
- Note:多人模式中,客户端调用无效,会被拦截并直接返回false。
以下是一个为自己的放置站添加支持的例子
public override void PostSetupContent() {
if (ModLoader.TryGetMod("ImproveGame", out Mod improveGame)) {
improveGame.Call(
"AddStation",//加入你自己的增益站1
ModContent.ItemType<MyStation1>(), // 物品ID 1
ModContent.BuffType<MyStationBuff1>() // BuffID 1
);
improveGame.Call(
"AddStation",//加入你自己的增益站2
ModContent.ItemType<MyStation2>(), // 物品ID 2
ModContent.BuffType<MyStationBuff2>() // BuffID 2
);
}
}注册分类卡
Mod注册的分类卡所在的模组的实例List<KeyValuePair<string, ModConfig>>分类卡中的选项信息,键为字段/属性名,值为该模组设置的实例int分类卡的物品图标对应物品id,可选参数,默认值为0Func<Texture2D>获取分类卡图标的函数,会覆盖上面的物品图标id的效果,默认值为nullFunc<string>获取该分类卡的标签的函数,默认值为nullFunc<string>获取该分类卡的描述的函数,默认值为null
注册 “关于” 页面
Mod注册的 “关于” 页面所在的模组的实例Func<string>获取 “关于” 页面中所写的文本的函数int“关于” 页面的物品图标对应物品id,可选参数,默认值为0Func<Texture2D>获取 “关于” 页面图标的函数,会覆盖上面的物品图标id的效果,默认值为nullFunc<string>获取该 “关于” 页面的标签的函数,默认值为nullFunc<string>获取该 “关于” 页面的描述的函数,默认值为null
移除模组注册的所有分类卡
Mod目标模组的实例
移除模组注册的 “关于” 页面
Mod目标模组的实例
设置模组的配置中心在模组设置入口处的文本标题
Mod目标模组的实例LocalizedText标题的本地化文本实例
注册预览绘制
PropertyFieldWrapper注册的预览绘制对应的选项的字段/属性信息,注意需要直接属于某个Config才有效Action<UIElement, ModConfig, PropertyFieldWrapper, object, IList, int>注册的预览绘制内容
UIElement绘制框元素ModConfig预览绘制的选项对应的设置实例PropertyFieldWrapper对应的选项的字段/属性信息object直接隶属对象IList直接隶属列表int列表中的下标
添加全局预览绘制,与上一个唯一的区别是这个不针对任何一个特定选项,用来批量添加绘制
Action<UIElement, ModConfig, PropertyFieldWrapper, object, IList, int>参考上个条目的内容
// 此处示例使用了ImproveGame_ModernConfigCrossModHelper.cs文件的内容
// 这个是一个Mod类的Load函数
public override void Load()
{
if (Main.netMode == NetmodeID.Server ||
!ModLoader.TryGetMod("ImproveGame", out var qot)) return;
//添加标题
AddModernConfigTitle(qot, this,
Language.GetOrRegister("Mods.MyMod.MyModernConfigTitle"));
SetAboutPage(qot, this, () => "自己适配配置中心好累哦\n不如反射生成(逃",
(int)ItemID.IronShortsword, null, () => "关于示例", () => "请不要在意吐槽");
//上面三个文本自己写本地化获取文本吧(
//此处示例为给单个设置实例批量添加设置选项
//MyConfig.Instance为加载时获取的MyConfig实例
RegisterCategory(qot, this, MyConfig.Instance,
[
nameof(MyConfig.SomeField),
nameof(MyConfig.SomeProperty),
nameof(MyConfig.SomeArray),
nameof(MyConfig.SomeDefinition),
],
ItemID.Cog, null, () => "这是一些数据", () => "我顺带告诉你这个支持哪些东西了");
//上面两个文本自己写本地化获取文本吧(
//此处示例为给多个设置示例批量添加设置选项
//一个选项名一个设置实例那种太麻烦了我就不写示例了
RegisterCategory(qot, this,
[
(MyConfig.Instance, //上面水过的再水一遍(
[
nameof(MyConfig.SomeField),
nameof(MyConfig.SomeProperty),
nameof(MyConfig.SomeArray),
nameof(MyConfig.SomeDefinition),
]),
(SeverConfig.Instance,
[
nameof(MyConfig.SomeVector2),
nameof(MyConfig.SomeColor),
nameof(MyConfig.SomePoint),
nameof(MyConfig.SomeClass),
])
],
ItemID.WireKite, null, () => "两家的拼在一起!",
() => "也许有些内容同时需要客户端和服务端来管理,"
+ "这时这个就大抵能派上很大用场了,嗯。");
}添加新的建造魔杖建筑样式
Texture2D记录了建筑信息的数据图Texture2D该建筑的一张预览图
| 颜色 | Hex | 代表的对象 |
|---|---|---|
| 红色 | FF0000 | 实心块 |
| 黑色 | 000000 | 平台 |
| 白色 | FFFFFF | 火把 |
| 黄色 | FFFF00 | 椅子 |
| 粉色 | FF00FF | 桌子 |
| 蓝色 | 0000FF | 工作台 |
| 紫色 | 7F00FF | 床 |
| 青色 | 00FFFF | 禁止放置墙体 |
| 绿色 | 00FF00 | 门 |
| 透明 | 墙体 |
注册自动钓鱼机钓鱼事件,在钓鱼机钓起物品前触发,可修改钓鱼结果或取消钓鱼
委托实例,签名为 void Method(TileEntity fisher, FishingAttempt fishingAttempt, Player player, ref int itemType, ref int itemStack, ref bool cancel)
public class MyMod : Mod
{
public override void PostSetupContent()
{
if (!ModLoader.TryGetMod("ImproveGame", out Mod improveGame))
return;
// 定义委托签名并转换
improveGame.Call("RegisterFishingEvent", (Delegate)OnFishingCallback);
}
private void OnFishingCallback(TileEntity fisher, FishingAttempt fishingAttempt, Player player, ref int itemType, ref int itemStack, ref bool cancel)//注意这里的签名需要和委托定义一致
{
// 直接通过 ref 参数修改
itemType = ItemID.IronCrate;//全部变成铁匣子
}
//这里可以偷懒不卸载委托,因为模组在重新加载时本身会自动卸载清理所有的委托
}