
邮件框架模组
游戏内邮箱使用框架。通过控制台命令调整邮件功能。代码与内容包接口支持。
查看大图邮件框架模组
目标
简化向玩家发送邮件的过程,提供更多关于何时及接收内容的控制权。 同时,仅通过编辑数据文件无法提供更多选项,比如随意更改文本颜色和信件背景。
安装
安装最新版本的SMAPI。 将MailFrameworkMod解压到/Stardew Valley/Mods目录中。
更新日志
1.20.0
- 向游戏中添加了一个新的自定义资产。(DIGUS.MailFrameworkMod/MailData) 这意味着MFM信件现在可以通过Content Patcher加载,并利用其所有功能,如令牌。它支持相同的属性。内容包信件也被加载到新的自定义资产中,因此可以通过Content Patcher进行编辑。内容包现在在游戏启动时被加载到缓存中,而不是每次加载存档时重新加载。您可以使用控制台命令强制重新加载内容包。文本和标题属性现在支持可令牌化的字符串。纹理资产现在可以是游戏资产,而不仅仅是模组文件夹中的资产。新增GameStateQuery属性作为投递信件的条件。
1.19.0
- 新增属性,用于在邮件满足所有条件但当天未被阅读时保持邮件有效。
- 新增功能,用于处理随机选择的附件。
- 新增属性,用于设置应从附件列表中选择多少项进行投递。
- 新增属性,用于为附件设置"随机组",以便从该组而非整个列表中进行选择。
- 新增属性,用于为随机选择的附件设置"权重"。
- 新增属性,用于设置应从给定组中选择多少项,而非使用默认值。
- 新增属性,用于设置给定组中的项目是否可被多次选择。
- 新增一组属性,用于设置附件和回复的"邮件接收"要求。
- 新增属性,用于设置在阅读信件或点击回复选项时移除"邮件接收"状态。
- 新增属性,用于为特定回复选项设置成本。
- 新增物品类型"无"。主要用于当您希望有随机不投递物品的几率,同时不触发日志中的错误/警告时使用。
1.18.0
- 新增Ids属性,用于替代CollectionConditions中的Index和Name。它可以聚合多个物品数量,将其值相加后与目标数值进行比较。
- 新增ReplyConfig属性,用于添加回复行为。玩家阅读邮件后可以显示一些选项,根据所选选项将添加一条或多条MailReceived文本。可以基于该选择实现额外的模组逻辑。
- 修复了带有配方的信件不支持CustomTextColorName属性的问题。
- 修复了加载游戏中名称为null的物品时引发的空引用异常问题。
1.17.1
- 内容包邮件若带有配方属性且无附件,在配方未被学习时可重新投递。(若存在附件,配方属性将被忽略)
- 修复烹饪配方,应用此前处理制作配方时相同的逻辑。
1.17.0
- 新增设置附件质量的属性
- 若配方未学习,应重新投递包含配方的内容包邮件。
- 修复使用限定物品ID时关于弹弓的警告。
- 修复即使配方已学习仍会投递可制作物品配方的问题。
- 出于历史兼容性考虑,若在学习配方中未找到配方ID,系统将查找能创建以该配方ID命名的物品的配方。
1.16.1
- 修复配方翻译名称。
1.16.0
- 将模组更新至与《星露谷物语》1.6版本兼容
- 新增重新加载内容包的命令
- 将MailDao更名为MailRepository(仅影响使用该功能的SMAPI模组)
- 为附件新增'QualifiedItemId'物品类型,若使用正确的限定条件可适用于游戏内所有物品类型
- 为特殊日期条件(婚礼和生子)新增属性
- 新增CustomTextColor属性,旧属性已弃用
- 新增HasMods属性
- 新增RequireAllMods属性
- 事件ID现为字符串类型(数字仍可兼容使用)
- 移除了已被《星露谷物语》1.6整合的MFM过时代码
- 修复了测试版中邮件收藏页面无法打开信件的问题
剧透:显示1.15.0
1.15.0
- 为SMAPI模组提供的新API接口。
- API方法,用于从您的SMAPI模组内部加载内容包文件夹。
- API方法,用于加载信件。
- API方法,用于获取信件数据。
- API方法,用于获取信件的邮件数据字符串。
- 修复了在关闭信件时发生错误导致邮箱无法正常工作的问题。
- 优化了这些错误的日志记录。
1.14.0
- 为兼容SMAPI 4做出的更多更改
- 在信件类中新增了设置ITranslationHelper的属性。内容包无需进行任何更改,但这一改动可以避免一些罕见的i18n问题。
- 通过代码使用MFM的模组可以更新它们的实现。
1.13.0
- 使模组兼容SMAPI 4。
- 新增最深矿井层数属性。
- 新增当前金钱属性。
- 新增累计获得金钱属性。
- 新增强制更新邮箱的控制台命令以帮助模组开发者调试。
- 信件收集菜单现在也显示自定义关闭按钮。
1.12.2
- 使模组兼容1.5.5版本,无需强制SMAPI进行转换。
- 应修复附件在Unix操作系统上无法使用的问题。
- 新增房屋升级等级属性。
1.12.1
- 修复了当 Expanded Preconditions Utility 未加载时的错误。
1.12.0
- 新增属性以支持扩展前提条件的使用
- 新增属性使玩家邮件接收列表中的字母ID旁可添加额外文本。
1.11.0
- 支持将DGA(动态游戏资产)作为附件。
1.10.2
- 修复了由 Json Assets 添加的烹饪食谱名称在英文中显示为 null 的问题。
1.10.1
- 修复了当存在i18n文件时,自动打开无文本信件导致模组崩溃的问题。
- 修复了内容包信件在出现收集条件警告后无法加载的问题。
- 为合成配方新增了收集需求类型。
1.10.0
- 所有原版工具现在都支持。
- 支持将原版弹弓作为武器使用。如果使用弹弓的索引或名称,将会正确创建为弹弓。
- 新增"自动打开"属性,用于当你想要使用MFM条件来将信件ID标记为已读而不实际书写信件时。
1.9.2
- 优化从内容包加载资源的性能。
- 修复当打开菜单向物品栏添加物品时,信件回调未被触发的问题。
1.9.1
- 修复了一个错误:当玩家手持物品点击邮箱时,当天的小马友谊魔法信件不会被打开并从信箱中移除。
1.9.0
- 通过SMAPI创建的信件新增属性,用于动态添加物品到信件中。
- 新增方法用于从邮箱中移除信件。
1.8.1
- 修复了本地合作模式中避免邮件冲突的问题。
- 修复了在极少数情况下,如果游戏未正确关闭信件菜单,模组会停止工作的错误。
1.8.0
- 支持将家具、武器和靴子作为附件。
- 新增属性用于设置附加工具的升级等级。
1.7.0
- 支持将戒指作为附件。
- 为配方添加新的条件。
- 为背景自定义添加新属性,支持内容包。
- 支持通过内容包和代码自定义关闭按钮。
1.6.0
- 支持内容包中的国际化(i18n)。
- 为农场建筑新增条件属性。
- 为接收邮件新增条件属性。(用于任务标记)
- 为事件新增条件属性。
- 为收藏菜单项新增条件列表。
- 为游戏统计新增条件列表。
- 为NPC好感度条件列表新增好感度状态属性。
- 新增群组ID冲突时的随机处理功能。
1.5.1
- 修复了没有组ID的字母被错误分组的问题。
1.5.0
- 如果定义了标题,信件现在会在收藏菜单中显示。自定义纹理和颜色也会在收藏菜单中显示。
- 信件现在可以拥有组ID。具有相同组ID的信件不会在同一天投递。
- 内容包新增条件:"随机概率"。
- BigObject 现在改名为 BigCraftable,与游戏代码保持一致。
- 修复了模板中的拼写错误。
1.4.1
- 为《星露谷物语》1.4.0版本添加支持
- 为信件添加可在收集菜单中显示的标题属性。目前尚未完全实现,但模组制作者可以开始设置该属性。
1.4.0
- 为模组制作者添加内容包支持,可自定义信件,并配置该框架提供的所有功能,以及最常用的投递条件。
- 修复控制器无法获取附加物品的问题。
- 修复当邮件附加多个物品时正确显示附件的问题。
- 修复当背包已满且打开管理菜单时不关闭信件的问题。
- 修复即使配置允许也不将物品堆叠添加到邮件中的问题。
- 添加对 SMAPI 3 的支持
1.3.4
- 为《星露谷物语》1.3.36版本添加支持
1.3.3
- 为SMAPI 3添加支持
1.3.2
- 为《星露谷物语》1.3.32版本添加支持
1.3.1
- 添加命令以移除和添加到玩家已接收邮件列表。
1.3.0-beta.6
- 新增对合成配方的支持
- 新增对自定义背景的支持
- 新增对自定义文本颜色的支持
- 新增打开自定义信件的方式,现使用harmonyConfig文件来启用旧版打开自定义信件的方法。
1.2.0
- 支持国际化食谱的翻译。
- 修复返回标题菜单后模组无法正常工作的问题。
- 修复因信件条件抛出异常导致邮件无法送达的问题。
1.1.0
- 修复了在睡觉和退出游戏时未阅读自定义邮件却收到"税款已通过"邮件的问题。
- 自定义邮件可能包含配方。
- 此版本与旧版本不兼容。
- 需要更新模组以使用此版本。
1.0.0
- 添加自定义邮件
- 自定义邮件可以包含物品。
供模组制作者使用的内容包
模组文件夹内有一个模板,附带注释说明每个属性的作用。 除条件和回调外,所有信件功能与框架编码方式相同。 条件仅限于已实现的功能,回调始终将信件ID设为接收值。如需高级条件,仍需自行编码。 若条件合理,您也可礼貌建议我将其添加到内容包中,我可能会考虑添加。
以下是模组文件中添加的模板:
剧透:显示模板
[
{
"Id": "MyMod.MyMailId", // 信件ID。必须确保是唯一字符串以避免冲突,且不应包含空格字符。
"GroupId": "MyMod.MyGroupId", // 信件组ID。相同组ID的信件永远不会在同一天送达。先注册的信件优先处理,除非组ID以".Random"结尾,这种情况下会随机选择一封信件。默认为null。
"Title": "我的信件标题", // 信件标题。将在收藏菜单中显示。若不想让信件出现在收藏中,请设为null或删除该行。如果提供了翻译文件,此处应放置翻译键,但仍可保留null表示无标题。
"Text": "亲爱的@^这是我的自定义邮件。", // 信件内容。可使用@代表玩家名称,^表示换行。也可使用基础游戏指令添加金钱、物品等内容。若提供翻译文件,此处应填写翻译键。
"RandomlyChooseAttachment": 2, // 若设置数值,将从每组附件列表中随机选取对应数量的物品。默认为空值。
"RandomlyChooseEachGroup": { "洞穴物品": 3 }, // 如果在此设置了组别和数量,将使用该数量来挑选物品,而非RandomlyChooseAttachment中设置的数量。默认为空。
"RandomGroupWithReplacement": [ "洞穴物品" ], // 默认情况下附件是从列表中随机选取且不重复的,若希望选取时替换原有附件,请将该分组加入列表。如未添加分组,请使用空字符串。默认值为空列表。
"Attachments": [ // 附件列表。删除该属性可不将物品附加至邮件。
{
"Type": "Object", // [Object|BigCraftable|Tool|Ring|Furniture|Weapon|Boots|DGA|QualifiedItemId|None] 必填。指定将附加的物品类型。若未提供,该物品将被忽略。选择'None'时日志不会报错且始终被忽略,适用于需要设置不添加附件的概率时使用。
"Name": "洞穴胡萝卜", // 用于查找物品索引。如果使用如Json Assets等自定义对象时必需。若使用DGA则应填写完整DGA ID。若未提供,则将使用索引值。默认为null。
"Index": "(0)78", // 物品的索引。应为字符串形式的合格物品ID,但为了向后兼容,也可以作为整数使用。如果未提供名称或未找到对应名称的物品,则使用索引。否则,附件将被忽略。若类型为DGA则忽略此项。
"Stack": 1, // 待交付物品的堆叠数量。仅适用于物品和大型可制作物品。默认值为1。
"Quality": 2, // 交付物品的品质值。仅适用于物品对象。0 = 无品质,1 = 银星,2 = 金星,4 = 铱星。默认为0;
"RequireMailReceived": [ "jojaVault", "ccVault" ], // 需要已收到其中一封邮件。游戏列表中还包含其他非邮件内容,如社区中心标志。默认为null表示不需要收到邮件。
"RequireAllMailReceived": false, // 若为true,则要求"RequireMailReceived"列表中的所有邮件都必须已接收。默认为false。
"ProbabilityWeight": 1, // 该配件在被选择交付时的权重值。模组会汇总指定组内所有权重值,并通过将此权重除以总权重来计算概率。默认值为1。
"RandomGroup": "洞穴物品" // 当随机选择物品时,按找到的组别对列表进行分组,并从每组中选取设定的数量。默认值为空字符串,作为默认组别使用。
},
{
"Type": "Tool", // 使用工具时,仅支持可附加的类型。
"Name": "斧头", // [Axe|Hoe|WateringCan|Pickaxe|Scythe|GoldenScythe|MilkPail|Shears|FishingRod|Pan|ReturnScepter] 工具必备项。支持的工具名称。否则附件将被忽略。
"UpgradeLevel": 1 // 工具的升级等级。普通工具:0 = 石头,1 = 铜,2 = 钢,3 = 金,4 = 铱。钓竿:0 = 竹竿,1 = 训练竿,2 = 玻璃纤维竿,3 = 铱竿。其他类型忽略此参数。默认值为0。
},
{
"Type": "DGA", //DGA物品
"Name": "spacechase0.DynamicGameAssets.示例/我的自定义物品", // 使用完整的DGA ID。必需。
"Stack": 10, // 待交付物品的堆叠数量。仅适用于Objects和BigCraftable类型。默认值为1。
"Quality": 2 // 待交付物品的品质值。仅适用于物品对象。0 = 无品质,1 = 银星,2 = 金星,4 = 铱星。默认为0;
},
{
"Type": "QualifiedItemId", //任何支持的物品
"Index": "(0)78", // 物品的合格物品ID。
"Stack": 10, // 待交付物品的堆叠数量。仅适用于物品和大型可制作物品。默认值为1;
"Quality": 2 // 待交付物品的品质值。仅适用于物品对象。0 = 无品质,1 = 银星,2 = 金星,4 = 铱星。默认为0;
}
],
"Recipe": "配方名称", // 如果不想在邮件中附加配方,请删除此行。仅当邮件没有其他附件时才有效。对于DGA配方,仅使用ID部分(去掉ModID)
"AdditionalMailReceived": ["MyMod.AnotherMailId", "VANILLA_FLAG"], // 用于向MailReceived列表添加额外文本。可用于添加原版标志或其他MFM信件ID。
"MailReceivedToRemove": ["MyMod.AnotherMailThatNeedToBeResent","MyMod.SomeFlagThatWasLockingSomeFeature"], //要从MailReceived列表中移除的文本。可用于触发新邮件、事件、原版标记、阻止其他MFM邮件发送...
"LetterBG": "CustomLetterBG.png", // 内容包中用于自定义信件背景的文件名。该文件结构应与游戏原版LetterBG文件保持一致。本信件的WhichBG设置将相对于此文件路径。若值为null或删除此项,模组将使用游戏默认的LetterBG文件。
"WhichBG": 0, //信件背景的ID。0 = 经典,1 = 记事本,2 = 金字塔
"TextColor": -1, //删除此行以使用默认颜色。若设置了CustomTextColor则此设置将被忽略。-1 = 深红, 0 = 黑, 1 = 天蓝, 2 = 红, 3 = 蓝紫, 4 = 白, 5 = 橙红, 6 = 柠檬绿, 7 = 青, 8 = 深灰
"CustomTextColorName": "白色", //文本颜色。[http://www.foszor.com/blog/xna-color-chart/] 默认将使用TextColor属性。
"UpperRightCloseButton": "CustomCloseButton.png", // 内容包中用作自定义关闭按钮的文件名。尺寸应为12x12像素。若为空或删除则使用默认按钮。
"ReplyConfig": { // 若希望玩家在阅读信件后发送回复。将显示回复选项,根据玩家选择添加一个或多个"已收邮件"。所有与回复相关的额外逻辑都需要基于添加的"已收邮件"来实现。
"QuestionKey": "MyMod.MyMailId.Question", //用于识别问题的键值。仅限内部使用,但在内容包中应保持唯一以避免回复冲突。
"QuestionDialog": "发送回复选择你的奖励:", //显示在回复选项上方的问题或文本。如果提供了翻译文件,此处应填写翻译键。
"Replies": [
{
"ReplyKey": "MyMod.MyMailId.Reply1", //必须在问题回复之间保持唯一。
"ReplyOptionDialog": "我想要种子。", //将显示在回复列表中的选项文本。如果提供了翻译文件,应在此处放置翻译键。
"RequireMailReceived": [ "jojaVault", "ccVault" ], // 需要已收到其中一封邮件。游戏列表中还包含其他非邮件内容,如社区中心标志。默认为null表示不要求收到邮件。
"RequireAllMailReceived": false, // 若为true,则要求"RequireMailReceived"列表中的所有邮件都必须已接收。默认为false。
"MailReceivedToAdd": [ "MyMod.MyMailId.PlayerSeedOption" ], // 要添加到MailReceived列表的文本。可用于触发新邮件、事件、原版标志、阻止其他MFM邮件发送...
"MailReceivedToRemove": [ "MyMod.MyMailId.PlayerSapplingOption" ], //要从MailReceived列表中移除的文本。可用于触发新邮件、事件、原版标志、阻止其他MFM邮件发送...
"ReplyResponseDialog": "您请求种子的信件已寄出。", //选择此回复选项后显示的文本。如果提供了翻译文件,应在此处填写翻译键。
"Cost": 50 //玩家选择该选项需要拥有的金额。如果选择,该金额会立即从玩家的资金中扣除。务必提供一个无需花费的选项,否则可能导致玩家陷入无法继续游戏的困境。
}
]
},
"Repeatable": false, // 若为true,模组将不会检查该信件ID是否已被送达。默认为false。
"AutoOpen": false, // 若为true,满足条件后信件将在新一天开始时自动打开。信件ID将被标记为已读,若设置了配方则会自动学习。由于信件不会显示,标题、正文、背景等视觉属性及附件都将不会被使用。
// 交付条件
//以下是交付条件。如果不想检查某项条件,请删除对应行。
"Date": "第一年春10日", // 必须为该日期或之后。格式为"[1-28] [春|夏|秋|冬] Y[1-999]"。
"Days": [7,14,21,28], // 必须是列表中的天数之一。
"Seasons": ["秋季"], // 必须选择列表中的季节之一。[春季|夏季|秋季|冬季]
"Weather": "晴朗", // 必须是游戏内天气。格式为"[晴朗|雨天]"。
"HouseUpgradeLevel": 2, // 房屋升级等级必须等于或高于定义值。0 - 初始房屋(无理由使用此项,直接删除该行),1 - 厨房,2 - 二楼,3 - 地下室。
"DeepestMineLevel": 80, // 最深矿井层数必须等于或高于设定值。120是矿井最后一层,121是骷髅洞穴的第一层。
"CurrentMoney": 10000, // 当前金钱必须等于或高于定义值
"TotalMoneyEarned": 500000, // 总收益必须达到或超过设定值。
"FriendshipConditions": // 列表中每个NPC都必须满足所有条件。
[
{
"NpcName": "刘易斯", //NPC名称。可使用自定义NPC。
"FriendshipLevel": 8, // NPC必须达到或高于此处定义的友谊心等级。默认为0。
"FriendshipStatus": ["恋爱中","已订婚","已婚"] // [友好|恋爱中|已订婚|已婚|离婚] 要求NPC的友谊状态必须符合列表中某一项。删除此项则不要求特定状态。
}
],
"SkillConditions": // 列表中每个技能必须达到或超过定义等级。可使用原版游戏中所有编码技能,包括幸运。不可使用自定义技能。
[
{ "SkillName": "农耕", "SkillLevel": 1 }
],
"StatsConditions": // 列表中每项状态值必须达到或超过定义值。选择状态名称或状态标签
[
{
"StatsName": "CheeseMade", //[播种种子|运送物品|烹饪物品|制作物品|鸡下蛋|鸭下蛋|奶牛产奶|山羊产奶|兔子产毛|绵羊产毛|制作奶酪|制作山羊奶酪|发现松露|收集石头|粉碎岩石|锄地|赠送礼物|昏迷次数|平均就寝时间|钓鱼次数|捕获鱼类|击碎巨石|砍伐树桩|行走步数|击杀怪物|发现钻石|发现五彩碎片|发现其他珍贵宝石|发现洞穴胡萝卜|发现铜矿|发现铁矿|发现煤矿|发现硬币|发现金矿|发现铱矿|熔炼金属锭|制作饮料|制作腌制品|回收垃圾数量|粉碎神秘石|游玩天数|清除杂草|砍伐树枝|发现笔记|完成任务|运送星级作物|运送作物|采集物品|击杀史莱姆|开启晶洞|好友数量|个人收入] 默认为空。
"StatsLabel": "名称", // [exMemoriesWiped|childrenTurnedToDoves|trashCansChecked|boatRidesToIsland|beachFarmSpawns|hardModeMonstersKilled|timesEnchanted] 这些是通过标签识别的当前游戏统计数据,如果添加更多,也应支持。它还将识别其他模组添加的自定义统计标签。默认为null。
"Amount": 1 // 状态值需等于或大于该数值条件才成立。
}
],
"CollectionConditions": // 列表中的每个收集条件必须达到或超过定义的数量。
[
{
"Collection": "已送达", //[已送达|鱼类|文物|矿物|烹饪|制作] 必填项。
"Name": "石油", //已弃用,改用ID。对象名称或'制作'配方的名称。若非制作配方集合,将在对象列表中查找该名称以获取索引。若未找到名称,则忽略该字母。将与其他属性结合使用。默认为null。
"Index": 211, //已弃用,改用Ids。对象的索引。将与其他属性结合使用。默认为null。
"Ids": [ "282", "苔藓汤" ], //物品ID或合成配方名称。将与其他属性结合使用。数量会被累加以与Amount属性进行比较。
"Amount": 10 // 集合中对象的总数必须等于或大于该数值才能使条件成立。
}
],
"SpecialDateCondition": // 必须是该日期或之后。
{
"SpecialDate": "孩子出生", //[婚礼|孩子出生] 必填
"YearsSince": 1, //距离事件发生的年数。0表示匹配实际日期,1表示次年。默认为0。
"WhichChild": 1 //如果SpecialDate属性为ChildBirth,将引用哪个孩子。默认为1;
},
"ExpandedPreconditionsUtility": "d 周一 周五/拥有物品 粉色蛋糕/未完成乔家超市/非雨天", //需要安装扩展前置条件工具模组。请参阅该模组文档了解具体运作方式。若未加载该模组,信件将不会被送达。
"ExpandedPrecondition": [ "!z 春季/t 600 1000", "f 莱纳斯 1000/w 雨天/z 春季", "f 莱纳斯 2500" ], //需要安装扩展前置条件功能模组。请参阅该模组文档了解其运作方式。如果未加载该模组,信件将无法送达。
"RandomChance": 0.25, // 模组会检查0到1之间的随机数是否低于给定数值。同一存档、同一天、同一封信件将始终获得相同结果以防止作弊。
"Buildings": ["鸡舍","大鸡舍","豪华鸡舍"], // 需要农场中当前已建造其中一种建筑。
"RequireAllBuildings": false, // 若为true,则要求农场当前必须已建造"Buildings"列表中所有建筑。默认为false。
"MailReceived": ["jojaVault","ccVault"], // 要求已收到其中一封邮件。游戏列表中还包含其他非邮件内容,比如社区中心标志。
"RequireAllMailReceived": false, // 若为true,则要求必须收到"MailReceived"列表中的所有邮件。默认为false。
"MailNotReceived": ["jojaVault","ccVault"], // 要求邮件未被接收。游戏列表中还包含其他非邮件内容,比如社区中心标志。
"EventsSeen": [ "4", "32423" ], // 要求玩家已触发其中至少一个事件。应为字符串格式,但为保持向后兼容性也支持整数形式。
"RequireAllEventsSeen": false, // 若为true,则要求玩家必须已看过"EventsSeen"列表中的所有事件。默认为false。
"HasMods": [ "SMAPI.ConsoleCommands", "SMAPI.SaveBackup" ], // 需要加载其中一个模组。应为模组的UniqueID。
"RequireAllMods": false, // 如果为true,则要求"HasMods"列表中的所有模组都已加载。默认为false。
"EventsNotSeen": [ "4", "32423" ], // 要求玩家未触发过这些事件。应为字符串格式,但为保持向后兼容性也支持整数形式。
"RecipeKnown": ["披萨","求生汉堡"], // 要求玩家已学会其中一种配方
"RequireAllRecipeKnown": false, // 若为true,则要求玩家必须学会"RecipeKnown"列表中的所有配方。默认为false。
"RecipeNotKnown": ["野生鱼饵"], // 要求玩家尚未学会该配方。
"KeepValid": false // 若为true,满足条件后邮件将保持有效状态直至被阅读。默认为false。
}
]
供模组制作者使用的API
复制 IMailFrameworkModApi 接口,其中包含你想从 MFM 接口使用的方法。
复制 ILetter 接口,如果其中某个方法需要它。
方法:
- RegisterContentPack - 使用
Helper.ContentPacks.CreateTemporary从您的模组中加载包含 mail.json 和可能用于翻译的 i18n 文件夹的目录。由于可以使用该方法参数,因此不需要清单文件。 - RegisterLetter - 用您需要的属性填充
ILetter。注册信件还需要一个条件。建议使用回调函数,至少添加收到的信件 ID。请参阅下方"供模组开发者使用 MFM 依赖项编码"部分的示例。 - GetLetter - 您将获取该信件 ID 对应的
ILetter对象。 - GetMailDataString - 您将获取该信件 ID 对应的邮件数据字符串。邮件数据字符串基本上是翻译后的文本加上以
[#]分隔符连接的翻译后标题。
供模组开发者使用MFM依赖进行编码
在你的SMAPI项目中引用MailFrameworkMod.dll。
您通过 MailRepository.SaveLetter(Letter) 注册信件
每天开始时,模组会检查已达到投递条件的信件,并将其添加到邮箱中。 当玩家查看邮箱时,这些信件会优先被打开。 信件被打开后,会从邮箱中移除。 随后会调用该信件的回调条件。 在一天结束时,仍留在邮箱中的信件将被移除,因此它们不会被游戏保存。
你可以把这个模组想象成一个存放你信件的仓库。 如果能在游戏加载时载入所有信件,效果会最好。
剧透:显示示例
加载一封简单的信件,若玩家之前未阅读过则会显示,一旦被玩家打开后将不再重复投递:
MailRepository.SaveLetter(
new Letter(
"信件唯一标识"
"自定义信件文本。"
(l) => !Game1.player.mailReceived.Contains(l.Id)
,(l)=>Game1.player.mailReceived.Add(l.Id)
)
);
像之前一样加载一封简单的信件,但附带了5颗绿宝石:
MailRepository.SaveLetter(
new Letter(
"信件唯一标识符"
,"自定义信件文本。"
,new List<Item> { new StardewValley.Object(60,5) }
,(l)=>!Game1.player.mailReceived.Contains(l.Id)
,(l)=>Game1.player.mailReceived.Add(l.Id)
)
);
玩家不会收到相同的物品,而是获得由getOne()方法返回的一个副本。
加载一封简单的信件,其中包含一个烹饪食谱的教学内容,如果玩家尚未掌握该食谱,信件将会送达。模组会在玩家加载时自动教授食谱,此处无需回调:
MailRepository.SaveLetter(
new Letter(
"信件唯一标识"
, "自定义信件文本。"
, "配方唯一名称"
, (l) => !Game1.player.cookingRecipes.ContainsKey(l.Recipe)
)
);
"RecipeUniqueName" 必须与存储在 "Data//CookingRecipes" 或 "Data//CraftingRecipes" 中的名称相同。
加载一个带有不同文本和背景的简单信件:
MailRepository.SaveLetter(
new Letter(
"信件唯一标识符"
,"自定义字母文本。"
,(l)=>!Game1.player.mailReceived.Contains(l.Id)
,(l)=>Game1.player.mailReceived.Add(l.Id)
1
){文字颜色=8}
);
加载带有自定义背景的简单信件:
MailRepository.SaveLetter(
new Letter(
"信件唯一标识"
,"自定义字母文本。"
,(l)=>!Game1.player.mailReceived.Contains(l.Id)
,Game1.player.mailReceived.Add(l.Id)
1
){
LetterTexture=helper.Content.Load<Texture2D>("CustomLetterBG.png")
,文本颜色=4
}
);
其中CustomLetterBG.png是一个图像文件,其结构与"LooseSprites//letterBG"相同
加载一个简单的信件,包含文本和标题的翻译。
MailRepository.SaveLetter(
new Letter(
"信件唯一标识符"
"我的信件翻译关键文本"
(l) => !Game1.player.mailReceived.Contains(l.Id)
,(l)=>Game1.player.mailReceived.Add(l.Id)
){
Title = "我的信件翻译键标题",
I18N = 助手.翻译
}
);
我的其他模组
- 动物养殖模组
- 保水田地模组
- 自定义水晶复制机模组
- 作物移植模组
- 自定义酒桶模组
- 自定义接吻模组
- 无边框木地板模组
- 自定义生产者模组
- 邮件服务模组
- 奥术工作台模组
- 宝石灯柱模组
- 高级酒桶模组
正在加载版本记录…


正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。