邮件框架模组

邮件框架模组

游戏内邮箱使用框架。通过控制台命令调整邮件功能。代码与内容包接口支持。

模组工具

邮件框架模组

目标

简化向玩家发送邮件的过程,提供更多关于何时及接收内容的控制权。 同时,仅通过编辑数据文件无法提供更多选项,比如随意更改文本颜色和信件背景。

安装

安装最新版本的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 = 助手.翻译
    }
);

我的其他模组

  • 动物养殖模组
  • 保水田地模组
  • 自定义水晶复制机模组
  • 作物移植模组
  • 自定义酒桶模组
  • 自定义接吻模组
  • 无边框木地板模组
  • 自定义生产者模组
  • 邮件服务模组
  • 奥术工作台模组
  • 宝石灯柱模组
  • 高级酒桶模组