邮件框架模块

创作者: Digus
已更新:2025-03-28 14:16:59
49KB

前置 MOD

使用 邮件框架模块 时将自动安装

关于此 MOD

使用游戏内邮箱的框架。调整邮件的控制台命令。代码和内容包接口。
客观的:
简化向玩家发送邮件的过程,让玩家能够更好地控制何时接收邮件以及接收哪些邮件。
还提供更多仅编辑数据文件无法实现的选项,例如随意更改文本颜色和字母背景。

安装:

更新日志:

1.20.0
  • 为游戏添加了新的自定义资源 (DIGUS.MailFrameworkMod/MailData)。这意味着 MFM 信件现在可以使用 Content Patcher 加载,并使用其所有功能(例如令牌)。它支持相同的属性。
  • 内容包字母也被加载到新的自定义资产中,因此可以使用内容修补程序进行编辑。
  • 内容包现在会在游戏开始时加载到缓存中,而不是每次加载存档时都重新加载。您可以使用控制台命令强制重新加载内容包。
  • 文本和标题属性现在支持可标记字符串。
  • 纹理资产现在可以是游戏资产,而不仅仅是 mod 文件夹中的资产。
  • 新的 GameStateQuery 属性作为传递信件的条件。
1.19.0
  • 新的属性是,当一天的所有条件都满足但当天未阅读邮件时,邮件将保持有效。
  • 处理随机选择附件的新功能
  • 新属性用于设置应从附件列表中选择多少个项目进行交付。
  • 为附件设置“RandomGroup”的新属性,以便从该组而不是整个列表中进行选择。
  • 当随机选择时,为给定附件设置“权重”的新属性。
  • 新属性用于设置从给定组中应选择多少个项目,而不是使用默认值。
  • 新属性表示是否可以多次选择给定组中的某个项目。
  • 一组新的属性,用于设置附件和回复的 MailReceived 要求
  • 新的属性用于设置在阅读信件或选择回复选项时删除的 MailReceived。
  • 新属性用于设置给定回复选项的成本。
  • 新增 ItemType“None”。它主要用于当您想要随机不投递物品时,不触发日志中的错误/警告。
1.18.0
  • 新的 Ids 属性用于替换 CollectionConditions 中的 Index 和 Name。它可以聚合多个项目的数量,并将它们的值相加,以便与金额进行比较。
  • 新增 ReplyConfig 属性,用于添加回复行为。您可以在阅读邮件后向玩家显示某些选项,系统会根据所选选项添加一个或多个 MailReceived 文本。您可以根据所选选项实现其他模组逻辑。
  • 修复配方中的字母不支持 CustomTextColorName 属性的问题。
  • 修复游戏中加载名称为空的物品时出现的空引用异常。
1.17.1
  • 如果未学习配方,则具有配方属性的内容包邮件无需带有附件即可重新发送。(如果有附件,则忽略配方属性)
  • 使用与之前制作食谱相同的逻辑来修复烹饪食谱。
1.17.0
  • 设置附件质量的新属性
  • 如果未学会配方,则应重新发送带有配方的内容包邮件。
  • 如果使用合格的项目 ID,则修复有关 Slingshot 的警告。
  • 修复即使已经学会了配方,仍会交付可制作物品的配方的问题。
  • 由于遗留原因,如果在学习过的配方中找不到配方 ID,它将寻找一个创建具有配方 ID 名称的物品的配方。
1.16.1
  • 修复食谱翻译名称。
1.16.0
  • 更新 mod 以兼容 Stardew Valley 1.6
  • 重新加载内容包的新命令
  • 将 MailDao 名称更改为 MailRepository。(仅影响使用它的 SMAPI 模块)
  • 附件的新物品类型“QualifiedItemId”如果使用适当的资格,应该适用于游戏中的每种物品类型。
  • 特殊日期条件的新房产。(婚礼和生育)
  • CustomTextColor 的新属性,旧属性已弃用。
  • 新的 HasMods 属性
  • 新的 RequireAllMods 属性
  • 事件 ID 现在是字符串。(数字应该仍然有效)
  • 从 MFM 中删除了过时的逻辑 SV 1.6。
  • 修复了 alpha 版本中信件无法在邮件收集页面打开的问题。
剧透:
展示
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
  • 使 mod 与 1.5.5 兼容,而无需强制 SMAPI 进行转换。
  • 应该修复一些附件在 Unix OS 上不起作用的问题。
  • 房屋升级级别的新房产。
1.12.1
  • 修复了未加载扩展先决条件实用程序时的错误。
1.12.0
  • 支持使用的新属性扩展的先决条件
  • 新的属性使得除了字母 ID 之外还可以将文本添加到玩家的 MailReceived 列表中。
1.11.0
  • 支持DGA(动态游戏资产)作为附件。
1.10.2
  • 修复了通过 Json Assets 添加时英文烹饪食谱名称显示为空的问题。
1.10.1
  • 修复当存在 i18n 文件时自动打开没有文本的字母破坏模块的问题。
  • 修复一次收集条件警告后内容包中的信件无法加载的问题。
  • 为制作配方添加了新的收集要求类型。
1.10.0
  • 现在支持所有原始工具。
  • 支持原版弹弓作为武器。如果您使用弹弓的索引或名称,它将被正确创建。
  • 新的“自动打开”属性,用于当您想要使用 MFM 条件将字母 ID 保存为已读而无需写实际字母时。
1.9.2
  • 优化从内容包加载资产。
  • 修复打开菜单将物品添加到库存时不调用字母回调的问题。
1.9.1
  • 修复一个错误:如果您在单击邮箱时手持某个物体,则 MFM 信件不会被打开并从当天的邮箱中移除。
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 的信件绝不会在同一天投递。
  • 内容包的新条件:“RandomChance”。
  • BigObject 现在被称为 BigCraftable,就像在游戏代码中一样。
  • 修复模板中的拼写错误。
1.4.1
  • 添加对 Stardew Valley 1.4.0 的支持
  • 为“字母”添加“标题”属性,使其显示在收藏菜单中。尚未完全实现,但模组制作者可以开始设置。
1.4.0
  • 为模组制作者添加内容包支持以添加自定义字母,并配置该框架提供的所有功能,以及最常用的交付条件。
  • 修复控制器无法获取附加物品的问题。
  • 如果邮件中附加了多个项目,则修复该问题以正确显示附件。
  • 修复了如果您的库存已满并且打开菜单进行管理时不让信件关闭的问题。
  • 修复即使配置了也不会将一堆项目添加到邮件中的问题。
  • 添加对 SMAPI 3 的支持
1.3.4
  • 添加对 Stardew Valley 1.3.36 的支持
1.3.3
  • 添加对 SMAPI 3 的支持
1.3.2
  • 添加对 Stardew Valley 1.3.32 的支持
1.3.1
  • 添加删除和添加到玩家收到的邮件列表的命令。
1.3.0-beta.6
  • 增加了对制作配方的支持
  • 添加对自定义背景的支持
  • 添加对自定义文本颜色的支持
  • 打开自定义信件的新方法,现在使用和谐
  • 配置文件以启用打开自定义字母的旧方法。
1.2.0
  • 支持 i18n 食谱。
  • 修复返回标题菜单后模块无法正常工作的问题。
  • 修复如果信件情况发生异常则无法投递邮件的问题。
1.1.0
  • 修复睡觉时收到“税收已通过”邮件并在未阅读自定义邮件的情况下退出游戏的问题。
  • 自定义邮件可以包含食谱。
  • 此版本与旧版本不兼容。需要更新模组才能使用此版本。
1.0.0
  • 添加自定义邮件
  • 自定义邮件可以包含项目。

对于使用内容包的模组制作者:
  • mod 文件夹内有一个模板,其中有关于每个属性功能的注释说明。
  • 除条件和回调外,所有字母功能都与使用框架编码相同。
  • 条件仅限于已实现的条件,回调始终将信件 ID 设置为已收到。如果您需要高级条件,仍然需要编写代码。或者您可以礼貌地建议我在内容包中添加一个条件,如果可行的话,我可能会添加。
  • 这是 mod 文件中添加的模板:
剧透:
展示
[
    {
"Id": "MyMod.MyMailId", // 信件 ID。为了避免冲突,该 ID 必须是唯一的字符串。此外,它不应包含空格。
"GroupId": "MyMod.MyGroupId", // 信件组 ID。具有相同组 ID 的信件绝不会在同一天投递。先注册的信件具有优先权,除非组 ID 以“.Random”结尾,在这种情况下,将随机选择一封信件。默认值为 null。
"Title": "我的信件标题", // 信件标题。将显示在收藏菜单中。如果您不想让该信件出现在收藏中,请将其设置为 null 或删除此行。如果提供了翻译文件,您应该在此处输入翻译关键字,但如果没有标题,您仍然可以将其保留为 null。
“Text”:“亲爱的@^这是我的自定义邮件。” // 信件正文。您可以使用@输入玩家姓名,使用^输入换行符。您还可以使用基础游戏命令添加金钱、物品和其他物品。如果提供了翻译文件,您应该在此处输入翻译代码。
"RandomlyChooseAttachment": 2, // 如果设置了数字,则将从附件列表中按组随机选择指定数量的项目。默认值为 null。
"RandomlyChooseAttachmentPerGroup": { "CaveItems": 3 }, // 如果此处设置了组别和数量,系统将使用该数量来拾取物品,而不是 RandomlyChooseAttachment 中设置的数量。默认为空。
"AttachmentGroupWithReplacement": [ "CaveItems" ], // 默认情况下,附件会从列表中随机选择,无需替换。如果您希望选择替换附件,请将组添加到列表中。如果您未添加组,请使用空字符串。默认值为空列表。
"Attachments": [ // 附件列表。删除该属性则不将项目附加到邮件。
            {
"Type": "Object", // [Object|BigCraftable|Tool|Ring|Furniture|Weapon|Boots|DGA|QualifiedItemId|None] 必填。待添加物品的类型。若未提供,则该物品将被忽略。“None”在日志中始终会被忽略且不会出现错误,因此当您希望计算不添加附件的概率时,应使用此参数。
"Name": "Cave Carrot", // 用于查找项目索引。如果使用自定义对象(例如 Json Assets 对象),则需要提供此项。使用 DGA 时,应提供完整的 DGA ID。如果未提供,则将使用索引。默认值为 null。
"Index": "(0)78", // 项目的索引。应为符合条件的项目 ID(字符串形式),但为了兼容后续操作,也可使用整数形式。如果未提供名称或未找到与名称对应的项目,则使用索引。否则,将忽略该附件。如果类型为 DGA,则忽略该附件。
"Stack": 1, // 待投递物品的堆叠值。仅用于 Objects 和 BigCraftable。默认值为 1。
"Quality": 2, // 待交付物品的品质值。仅适用于对象。0 = 无,1 = 银,2 = 金,4 = 铱。默认值为 0;
"RequireMailReceived": [ "jojaVault", "ccVault" ], // 要求收到一封邮件。游戏列表中还包含其他非邮件内容,例如社区中心旗帜。默认为 null,表示不要求收到邮件。
"RequireAllMailReceived": false, // 如果为 true,则要求“RequireMailReceived”列表中的所有邮件都已接收。默认为 false。
"ProbabilityWeight": 1, // 此附件在选择投递哪个附件时的权重。该参数会将给定组中所有附件的权重相加,并计算出一个概率,将该权重除以总权重。默认值为 1。
"RandomGroup": "CaveItems" // 随机选择物品时,根据找到的组对列表进行分组,并从每个组中选取设定的数量。默认值为空字符串,用作默认组。
},
            {
"Type": "Tool", // 使用工具时,只能附加受支持的工具。
"Name": "Axe", // [斧头|锄头|喷壶|镐|镰刀|金镰刀|牛奶桶|剪刀|鱼竿|平底锅|回礼杖] 工具必需。支持的工具名称。否则,附件将被忽略。
"UpgradeLevel": 1 // 工具的升级等级。常规工具:0 = 石质,1 = 铜质,2 = 钢质,3 = 金质,4 = 铱质。钓鱼竿:0 = 竹竿,1 = 训练竿,2 = 玻璃纤维竿,3 = 铱质竿。其他类型忽略。默认值为 0。
},
            {
"Type": "DGA", //DGA项目
"Name": "spacechase0.DynamicGameAssets.Example/My Custom Item", // 使用完整的 DGA ID。必填。
"Stack": 10, // 待投递物品的堆叠值。仅用于 Objects 和 BigCraftable。默认值为 1。
"Quality": 2 // 待交付物品的品质值。仅适用于对象。0 = 无,1 = 银,2 = 金,4 = 铱。默认值为 0;
},
            {
"Type": "QualifiedItemId", //任何支持的物品
"Index": "(0)78", // 某个商品的合格商品 ID。
"Stack": 10, // 待投递物品的堆叠值。仅用于 Objects 和 BigCraftable。默认值为 1;
"Quality": 2 // 待交付物品的品质值。仅适用于对象。0 = 无,1 = 银,2 = 金,4 = 铱。默认值为 0;
            }
],
"Recipe": "Recipe Name", // 如果您不想在邮件中附加配方,请删除此行。此操作仅在邮件中没有其他附件时有效。对于 DGA 配方,仅使用 ID 部分(省略 ModID)
"AdditionalMailReceived": ["MyMod.AnotherMailId", "VANILLA_FLAG"], // 使用此项向 MailReceived 列表添加附加文本。可用于添加原版标志或其他 MFM 字母 ID。
"MailReceivedToRemove": ["MyMod.AnotherMailThatNeedToBeResent","MyMod.SomeFlagThatWasLockingSomeFeature"], //要从 MailReceived 列表中移除的文本。这可用于触发新邮件、事件、原始标志,以及阻止其他 MFM 邮件的发送……
"LetterBG": "CustomLetterBG.png", // 内容包中包含要使用的自定义字母背景的文件的名称。它应遵循与游戏 LetterBG 文件相同的结构。WhichBG 将与此字母的此文件相关联。如果为空或已移除,模组将使用游戏 LetterBG。
"WhichBG": 0, //字母背景的 id。0 = 经典,1 = 记事本,2 = 金字塔
"TextColor": -1, //删除此行即可使用默认颜色。如果设置了 CustomTextColor,则会被忽略。-1 = 深红色,0 = 黑色,1 = 天蓝色,2 = 红色,3 = 蓝紫色,4 = 白色,5 = 橙红色,6 = 柠檬绿,7 = 青色,8 = 深灰色
"CustomTextColorName": "White", //文本的颜色。[http://www.foszor.com/blog/xna-color-chart/] 默认将使用 TextColor 属性。
"UpperRightCloseButton": "CustomCloseButton.png", // 内容包中包含要使用的自定义关闭按钮的文件的名称。其尺寸应为 12 x 12。如果为空或已移除,则将使用默认按钮。
"ReplyConfig": { // 如果您希望玩家在阅读信件后发送回复,则会显示回复选项,并根据玩家的回复添加一个或多个“ReceivedMail”。任何与回复相关的附加逻辑都需要基于添加的 ReceivedMail 来实现。
"QuestionKey": "MyMod.MyMailId.Question", //用于标识您的问题的键。它仅供内部使用,但在您的内容包中应保持唯一,以避免回复之间发生冲突。
"QuestionDialog": "发送回复,选择您的奖励:", //您的问题或文本将显示在回复选项中。如果提供了翻译文件,您应该在此处输入翻译关键字。
"回复": [
                {
"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 spring Y1", // 必须是该日期或之后的日期。格式为“[1-28] [spring|summer|fall|winter] Y[1-999]”。
"Days": [7,14,21,28], // 必须是列表中的某一天。
"Seasons": ["fall"], // 必须是列表中的季节之一。[spring|summer|fall|winter]
"Weather": "sunny", // 必须是游戏天气。格式为“[sunny|rainy]”。
“HouseUpgradeLevel”:2,//房屋升级等级必须等于或高于定义的等级。0 - 初始房屋(没有理由使用它,只需删除该行),1 - 厨房,2 - 二楼,3 - 地窖。
"DeepestMineLevel": 80, // 最深矿井等级必须等于或高于定义值。120 是矿井的最后一层,121 是骷髅洞穴的第一层。
“CurrentMoney”:10000,//当前金额必须等于或高于定义金额。
“TotalMoneyEarned”:500000,//总收入必须等于或高于定义值。
"FriendshipConditions": // 列表中的每个 NPC 都必须检查所有条件。
        [
            {
"NpcName": "Lewis", //NPC 的名称。可以使用自定义 NPC。
"FriendshipLevel": 8, // NPC 的友谊等级必须等于或高于定义的值。默认值为 0。
"FriendshipStatus": ["Dating","Engaged","Married"] // [Friendly|Dating|Engaged|Married|Divorced] 要求 NPC 的友谊状态必须为列表中的一项。删除则不要求提供状态。
            }
],
"SkillConditions": // 列表中每项技能的等级必须等于或高于定义等级。可以使用原版游戏中所有已编码的技能,包括运气技能。无法使用自定义技能。
        [
{ "SkillName": "农业", "SkillLevel": 1 }
],
"StatsConditions": // 列表中每个统计数据的值必须等于或高于定义值。请选择 StatsName 或 StatsLabel
        [
            {
"StatsName": "CheeseMade", //[种子播种|物品运送|物品烹饪|物品制作|鸡蛋产出|鸭蛋产出|牛奶产出|羊奶产出|兔毛产出|羊毛产出|CheeseMade|山羊奶酪产出|松露发现|石头收集|岩石压碎|泥土锄头|礼物赠送|昏迷次数|平均就寝时间|钓鱼次数|鱼获量|破碎巨石|砍树桩|步数采集|怪物击杀|钻石发现|棱柱形ardsFound|OtherPreciousGemsFound|CaveCarrotsFound|CopperFound|IronFound|CoalFound|CoinsFound|GoldFound|IridiumFound|BarsSmelted|BeveragesMade|PreservesMade|PiecesOfTrashRecycled|MysticStonesCrushed|DaysPlayed|WeedsEliminated|SticksChopped|NotesFound|QuestsCompleted|StarLevelCropsShipped|CropsShipped|ItemsForaged|SlimesKilled|GeodesCracked|GoodFriends|IndividualMoneyEarned] 默认值为空。
"StatsLabel": "Name", // [exMemoriesWiped|childrenTurnedToDoves|trashCansChecked|boatRidesToIsland|beachFarmSpawns|hardModeMonstersKilled|timesEnchanted] 这是当前通过标签标识的游戏统计数据,如果添加更多标签,则应支持。它还可以标识其他模组添加的自定义统计数据标签。默认值为 null。
“金额”:1 // 状态金额应等于或大于条件有效。
            }
],
"CollectionConditions": // 列表的每个收集条件必须具有等于或高于定义数量的值。
        [
            {
"Collection": "已发货", //[已发货|鱼|文物|矿物|烹饪|制作] 必填。
"Name": "Oil", //已弃用,改用 ID。“Crafting”系列物品或配方的名称。如果不是制作系列,则会在物品列表中查找该名称以查找索引。如果未找到该名称,则忽略该字母。将与其他属性合并。默认值为 null。
"Index": 211, //已弃用,使用 ID 代替。对象的索引。将与其他属性合并。默认值为 null。
"Ids": [ "282", "MossSoup" ], //物品 ID 或合成配方名称。将与其他属性合并。金额将被相加,以便与 Amount 属性进行比较。
"Amount": 10 // 集合中对象的总数量应等于或大于该条件才有效。
            }
],
"SpecialDateCondition": // 必须是该日期或该日期之后。
        {
"SpecialDate": "ChildBirth", //[婚礼|ChildBirth] 必填
"YearsSince": 1, //自日期发生以来的年数。0 表示与实际日期匹配,1 表示与后续年份匹配。默认值为 0。
"WhichChild": 1 //如果 SpecialDate 属性为 ChildBirth,则表示是哪个孩子。默认为 1;
},
"ExpandedPrecondition": "d Mon Fri/HasItem Pink Cake/!JojaMartComplete/!w rainy", //需要扩展前提条件实用程序模块。请参阅该模块的文档以了解其工作原理。如果未加载该模块,信件将无法投递。
"ExpandedPreconditions": [ "!z spring/t 600 1000", "f Linus 1000/w rainy/z spring", "f Linus 2500" ], //需要扩展前提条件实用程序模块。请参阅该模块的文档以了解其工作原理。如果未加载该模块,信件将无法投递。
"RandomChance": 0.25, // 模块会检查 0 到 1 之间的随机数是否低于给定值。同一天、同一封信的同一次存档将始终获得相同的结果,以避免作弊。
"Buildings": ["Coop","Big Coop","Deluxe Coop"], // 要求农场中当前正在建造其中一栋建筑物。
"RequireAllBuildings": false, // 如果为 true,则要求“建筑物”列表中的所有建筑物当前均已在农场中建造。默认值为 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": ["Pizza","Survival Burger"], // 要求玩家已经学会其中一种食谱。
"RequireAllRecipeKnown": false, // 如果为 true,则要求玩家必须已学会“RecipeKnown”列表中的所有配方。默认值为 false。
"RecipeNotKnown": ["Wild Bait"], // 要求配方尚未被玩家学过。
"KeepValid": false // 如果为真,则在满足条件后,保持邮件有效直至被阅读。默认为 false。
    }
]


对于 Modder 使用 API:
  • 复制IMailFrameworkModApi与您想要从 MFM 接口使用的方法进行接口。
  • 复制字母如果其中一种方法需要它。
  • 方法:
    • 注册内容包- 使用帮助器.内容包.创建临时从你的 mod 中加载一个包含 mail.json 和可能的 i18n 文件夹用于翻译的文件夹。Manifest 文件不需要,因为你可以使用该方法的参数。
    • 注册信件- 使用您需要的属性填充 ILetter。注册信件还需要一个条件。建议使用回调,至少在收到信件时添加信件 ID。请参阅下面的示例,网址为“让 Modder 使用 MFM 依赖性进行编码“ 会议。
    • 获取信件- 您将获得字母 ID 的 ILetter 对象。
    • 获取邮件数据字符串- 您将获得与信件 ID 对应的邮件数据字符串。邮件数据字符串基本上是翻译后的文本加上翻译后的标题,并以 [#] 分隔。

对于使用 MFM 依赖性进行编码的 Modder:
  • 在您的 SMAPI 项目上引用 MailFrameworkMod.dll。
    • 您使用 MailRepository.SaveLetter(Letter) 注册您的信件
    • 每天开始时,模块都会检查已达到投递条件的信件并将其添加到邮箱中。
    • 当玩家检查邮箱时,这封信件将首先被打开。
    • 当信件被打开时,它会被从邮箱中取出。
    • 信件的回调条件就是他们所调用的。
    • 一天结束时,仍在邮箱上的信件将被删除,因此它们不会被游戏保存。
  • 你可以把这个模组看作是你的字母库。最好在游戏加载时加载所有字母。


例子:

剧透:
展示

加载一封简单的信件,如果之前没有读过,就会显示给玩家,并且在玩家打开后不会再次投递:
MailRepository.保存信件(
新信件(
“LetterUniqueId”
,“字母自定义文本。”
,(l)=>!Game1.player.mailReceived.Contains(l.Id)
,(l)=>Game1.player.mailReceived.Add(l.Id)
)
(此处似有缺失,请提供更正后的文本)。


像以前一样加载一封简单的信件,但附加了 5 颗绿宝石:
MailRepository.保存信件(
新信件(
“LetterUniqueId”
,“字母自定义文本。”
,new List<Item> { new StardewValley.Object(60,5) }
,(l)=>!Game1.player.mailReceived.Contains(l.Id)
,(l)=>Game1.player.mailReceived.Add(l.Id)
  )
(此处似有缺失,请提供更正后的文本)。

玩家将不会收到相同的物品,而是从 getOne() 方法返回的副本。

加载一封简单的信件,用于教授烹饪食谱。如果玩家不知道食谱,信件就会被寄送。模组会在玩家加载时自动教授食谱,无需回调:
MailRepository.保存信件(
新信件(
“LetterUniqueId”
, "字母自定义文本。"
,“食谱唯一名称”
, (l) => !Game1.player.cookingRecipes.ContainsKey(l.Recipe)
  )
(此处似有缺失,请提供更正后的文本)。

“RecipeUniqueName”必须与“Data//CookingRecipes”或“Data//CraftingRecipes”中存储的相同。

加载具有不同文本和背景的简单信件:
MailRepository.保存信件(
新信件(
“LetterUniqueId”
,“字母自定义文本。”
,(l)=>!Game1.player.mailReceived.Contains(l.Id)
,(l)=>Game1.player.mailReceived.Add(l.Id)
1
){文本颜色=8}
(此处似有缺失,请提供更正后的文本)。


加载具有自定义背景的简单信件:
MailRepository.保存信件(
新信件(
“LetterUniqueId”
,“字母自定义文本。”
,(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.保存信件(
新信件(
“LetterUniqueId”
,"我的信件翻译关键文本"
,(l)=>!Game1.player.mailReceived.Contains(l.Id)
,(l)=>Game1.player.mailReceived.Add(l.Id)
){
标题 = “myletter.translation.key.title”,
I18N = helper.Translation
    }
(此处似有缺失,请提供更正后的文本)。



我的其他模组:

使用 Xmod 解锁 星露谷物语 的全部潜力 — 今天就探索这些顶级 MOD!