BWIKI 全站将于 9 月 3 日(全天)进行维护,期间无法编辑任何页面或发布新的评论。
模组:效果
← 目录
此页面记录了自定义增益效果。
数据格式
您可以通过编辑 Data/Buffs 素材来自定义增益效果,然后可以在其他未知使用此效果,例如 Data/Object 中的 Buff 字段或 C# 的 Buff 构造函数。
此文件内含一个“字符串 → 数据模型”查询,其中
- 键为此增益效果的唯一字符串ID。
- 值为包含如下字段的数据模型。
字段 | 含义 | ||||||
---|---|---|---|---|---|---|---|
DisplayName | 一个模板字符串,用于显示增益效果名称。 | ||||||
Description | (可选)一个模板字符串,用于显示增益效果描述。默认为空。 | ||||||
IsDebuff | (可选)此效果是否为减损效果,后者的持续时长会在结实戒指时减半。默认为 false。 | ||||||
GlowColor | (可选)玩家的发光颜色。参见模组:公共数据字段#颜色。默认为空。 | ||||||
Duration | 此效果持续时长(毫秒)。可以设为 -2 代表持续到当天结束。 | ||||||
MaxDuration | (可选)效果最大持续时长(毫秒)。若此字段非空且大于 Duration,则会选取介于 Duration 和 MaxDuration 之间的随机值。默认为空。 | ||||||
IconTexture | 包含此效果贴图的贴图集素材名称。 | ||||||
IconSpriteIndex | (可选)IconTexture 中此效果贴图的索引。默认为 0。 | ||||||
Effects | (可选)欲应用的效果属性。默认为空。
此字段为包含如下字段的数据模型所组成的列表:
| ||||||
ActionsOnApply | (可选)当此效果应用于当前玩家时,运行指定数量的触发动作字符串。例如,下面的代码增加玩家的统计数据:
"ActionsOnApply": [
"IncrementStat {{ModId}}_NumberEaten 1"
]
| ||||||
CustomFields | (可选)此列表项的自定义字段。 |
对于C#模组作者
1.6 重写了增益效果逻辑,以使其更自洽、更可扩展:
- 效果逻辑统一为 Game1.player.buffs,其为效果数据的唯一来源。它替换了 player.added* 和 player.appliedBuffs 字段、BuffsDisplay 逻辑、附魔状态加成、穿戴靴子/戒指加成。
- 这也取消了效果类型(例如,效果可以加成武器,武器也可以加成效果)和装备(工具也可以有效果)的限制。
- 现在效果发生更改时,会被完全重新计算,这修复了一系列长期存在的漏洞,例如加成偏移和双重负面效果。就像先前那样,效果本身是局域的;仅有效果ID和总加成效果会被同步。
对于 C# 模组:
- 现在每个效果都有一个唯一字符串ID。您可以指定一个同名的新效果来替换旧效果(这意味您无需手动查找和移除此效果先前的实例)。
- 效果持续时间可以设为 Buff.ENDLESS 代表效果一直持续到当天玩家入睡。
- 您可以通过重写 Item.AddEquipmentEffects 来向任何设备添加标准加成效果,也可以通过重载 Item.onEquip 和 Item.onUnequip 来添加自定义行为/效果。
- 您可以通过重写 Item.GetFoodOrDrinkBuffs() 来添加自定义食物或饮料效果。
- 现在 Buff 构造函数支持自定义图标贴图集、贴图索引、显示名称、描述和持续时长,以全面支持自定义效果。
- 您现在可以通过扩展 BuffsDisplay.displayAttributes 来更改效果加成的显示方式(或添加新的加成)。
- 您现在可以通过设置 buff.visible = false 来使效果不可见,
下面代码用于定义一个 +3 速度的增益:
Buff buff = new Buff(
id: "Example.ModId_ZoomZoom",
displayName: "Zoom Zoom", // can optionally specify description text too
iconTexture: this.Helper.ModContent.Load<Texture2D>("assets/zoom.png"),
iconSheetIndex: 0,
duration: 30_000, // 30 seconds
effects: new BuffEffects()
{
Speed = { 10 } // shortcut for buff.Speed.Value = 10
}
);
Game1.player.applyBuff(buff);
您可以检查效果是否已被激活(例如 Game1.player.hasBuff("Example.ModId_ZoomZoom")
),并在代码中应用相应自定义效果。