模组:物品查询

来自Stardew Valley Wiki
跳到导航 跳到搜索

目录

此文档主要关于物品查询,其为动态创建一个或多个物品的内建方式,而非指定单个物品ID。

概览

可用字段

下述字段可用于诸如机器数据商店数据的多个位置。只有在明确表明允许使用物品查询的位置,才能使用这些字段。

查询格式

物品查询是一个由查询名称及0个及以上参数组成的字符串。参见下述查询列表

物品查询是部分大小写敏感的。尽管某些值对大小写不敏感,但并非总是如此。推荐使用精确的大小写以规避问题。

参数格式

物品查询的参数以空格分隔。例如,RANDOM_ITEMS (F) 1376 1390有3个参数:(F)1376 和 code>1390。

若某参数需要包含空格,则可用双引号引用之以表明这是一整个参数。例如LOST_BOOK_OR_ITEM "RANDOM_ITEMS (O)"RANDOM_ITEMS (O) 视作一个参数。如需嵌套双引号,可以将内层双引号加上反斜杠以转义。

注意JSON字符串内部的双引号和反斜杠也需要转义。例如,"ItemId": "LOST_BOOK_OR_ITEM \"RANDOM_ITEMS (O)\""会向游戏代码传入LOST_BOOK_OR_ITEM "RANDOM_ITEMS (O)"。另一种方法是在JSON字符串使用单引号,例如"ItemId": 'LOST_BOOK_OR_ITEM "RANDOM_ITEMS (O)"'

可用查询

一般用途

查询 效果
ALL_ITEMS [type ID] [flags] 返回物品数据提供的所有物品。若设置物品类型标识符[type ID],例如(O)代表物体,则仅返回对应类别的全部物品。

[flags]参数指定了待应用的选项。若指定,则必须在参数列表末尾(无论是否指定了[type ID])。[flags]可以为下列标识的任意组合:

标识 效果
@isRandomSale 不返回Data/FurnitureData/Objects不出现在商店随机存货中的物品。
@requirePrice 不返回购入价格低于data-sort-value="1">Gold.png1金的物品。

例如:

  • ALL_ITEMS返回游戏中所有物品。
  • ALL_ITEMS @isRandomSale返回不出现在随机存货中的所有物品。
  • ALL_ITEMS (F) @isRandomSale返回所有不出现在随机存货中的家具物品。
FLAVORED_ITEM <type> <ingredient ID> [ingredient flavor ID] 带有特定风味的物品,例如苹果果酒。其中<type>WineJellyPickleJuiceRoeAgedRoe, HoneyBaitDriedFruitDriedMushroomSmokedFish。 其中<ingredient ID>为原料的限定性或非限定性物品ID(例如苹果果酒此参数为Apple)。对于Honey,可以将<flavor ID>设为-1以获得野蜂蜜

对于腌鱼籽,其原料ID <ingredient ID> 应当为 (O)812,即鱼籽;欲指定其风味,需为[ingredient flavor ID]参数指定鱼类名称,例如河豚的非限定ID为128,因此腌河豚鱼籽对应的物品查询为FLAVORED_ITEM AgedRoe (O)812 128

RANDOM_ITEMS <type definition ID> [min ID] [max ID] [flags] 返回具有指定类型的物品,其次序随机。可以指定[min ID][max ID]以获取一定区间内的数字物品ID(包含端点值)。

[flags]参数指定所需的选项。若指定此参数,则必须位于参数列表末尾(无论是否给定[min ID]和/或[max ID]参数)。[flags]参数可以为下列取值的任意组合:

标识 效果
@isRandomSale 不返回Data/FurnitureData/Objects不出现在商店随机存货中的物品。
@requirePrice 不返回购入价格低于data-sort-value="1">Gold.png1金的物品。

例如,您可以在Data/Shops中设置售卖价格为data-sort-value="200">Gold.png200金的随机墙纸

{
    "ItemId": "RANDOM_ITEMS (WP)",
    "MaxItems": 1,
    "Price": 200
}

也可以售卖随机的家居植物

{
    "ItemId": "RANDOM_ITEMS (F) 1376 1390",
    "MaxItems": 1
}

还可以售卖模组定义的自定义物品,只需使用物品ID前缀:

{
    "ItemId": "RANDOM_ITEMS (O)",
    "MaxItems": 1,
    "PerItemCondition": "ITEM_ID_PREFIX Target AuthorName_ModName_"
}

还可以售卖10个类别不是-13-14的随机物品:

{
    "ItemId": "RANDOM_ITEMS (O)",
    "MaxItems": 10,
    "PerItemCondition": "ITEM_CATEGORY, !ITEM_CATEGORY Target -13 -14"
}

特定物品

查询 效果
DISH_OF_THE_DAY 餐吧当日限定菜品
LOST_BOOK_OR_ITEM [alternate query] 若玩家尚未集齐遗失之书,则返回一本遗失之书。否则,若指定了 [alternate query]参数,则返回此参数的物品;若未指定,不返回任何物品。

例如LOST_BOOK_OR_ITEM (O)770在玩家集齐遗失之书的情况下会返回混合种子

RANDOM_BASE_SEASON_ITEM 返回随机的应季物品,这些物品通常可以在垃圾桶、矿井宝箱之类的地方找到。
SECRET_NOTE_OR_ITEM [alternate query] 若玩家尚未集齐秘密纸条(在姜岛则为日记残页),则返回一件相应物品。否则,若指定了[alternate query]则返回此参数的物品;若未指定,不返回任何物品。

例如SECRET_NOTE_OR_ITEM (O)390在集齐所有秘密纸条的情况下返回粘土

SHOP_TOWN_KEY 返回小镇钥匙。仅对商店有效。

特殊

查询 效果
ITEMS_SOLD_BY_PLAYER <shop location> 玩家最近卖给<shop location>的随机物品,此参数可以为 SeedShop杂货店)或 FishShop鱼店)。
LOCATION_FISH <location> <bobber tile> <depth> 可以在给定地点钓到的随机物品。其中<location>应当为地点的内部名称;<bobber tile>为浮标所在水体的位置,形如<x> <y><depth>为浮标距岸边的距离,单位为地块(其中0代表紧邻岸边)。

注意: 因为目标地点可能在其列表中使用LOCATION_FISH查询,因此容易造成错误的循环引用(例如地点A从地点B获取鱼,而地点B又从地点A获取鱼)。若这种情况发生,则游戏记录此错误并不返回物品。

MONSTER_SLAYER_REWARDS 返回所有已解锁的杀怪目标奖励。所有玩家从吉尔处收集的奖品都将计入在内。返回的物品列表按照MonsterSlayerQuests.xnb中的顺序排序,例如史莱姆克星戒指、野蛮人戒指、吸血戒指,以此类推。
MOVIE_CONCESSIONS_FOR_GUEST [NPC name] 返回为指定村民[NPC name]生成的电影零食列表。若缺省,则默认为当前受邀看电影的村民(若无人受邀,默认为阿比盖尔)。
RANDOM_ARTIFACT_FOR_DIG_SPOT 返回在Data/Objects中类型为Arch(古物)的随机物品,其满足如下要求:其Miscellaneous字段的生成规则符合当前地点,且其通过随机概率检查。此查询主要用于远古斑点
TOOL_UPGRADES [tool ID] 返回Data/Shops所列出的、玩家背包中有相应升级材料的工具升级(即,类似于克林特的工具升级)。若指定了[tool ID],则仅返回对应工具的升级。

物品生成字段

物品生成字段是一系列公共字段,用于在诸如机器商店的数据素材中使用物品查询。仅适用于明确声明允许使用物品查询的数据素材。

字段 效果
ID 当前列表中此条目的唯一字符串ID(而不是物品自己的ID)。

这是半可选的,即,若缺省则从 ItemIdRandomItemIdIsRecipe 字段中自动生成。然而,若不同项目具有相同ID,则可能导致意外行为(例如,商店物品ID冲突会导致买一件商品却消耗所有冲突物品的库存),因此推荐使用全局唯一的ID。

ItemId 下列值之一
RandomItemId (可选) 一个物品ID列表,将从中随机选择一项物品。该列表格式与ItemId相同(适用物品查询)。若设置此参数,则ItemId为可选参数且被忽略。该列表中每个条目都有等概率被选中。例如:
// wood, stone, or pizza
"RandomItemId": [ "(O)388", "(O)390", "(O)206" ]
条件 (可选) 指示是否应当应用此条目的游戏状态查询。默认为true。

注意: 不适用于武器抛射物。

PerItemCondition (可选) 用于筛选其他字段返回物品的游戏状态查询。默认为true。

例如,此字段可用于筛选RANDOM_ITEMS等查询返回的物品:

// random mineral
"ItemId": "RANDOM_ITEMS (O)",
"PerItemCondition": "ITEM_CATEGORY Target -12"
MaxItems (可选) 若此条目返回多组不同的物品,则此字段规定了返回的最大组数(但不会影响每组物品的堆叠数量;欲配置堆叠数量,参见MinStackMaxStack字段)。默认为无穷。
IsRecipe (可选) 是否获取此物品对应的打造/烹饪配方,而非物品本身。默认为false。

若尚未获得相应配方,则自动解锁具有如下ID的配方:其ID等于该物品查询的ObjectInternalName字段,或等于目标物品的内部Name字段(默认为物品ID)。

Quality (可选) 待查找物品的品质。为 0(普通)、1(银星)、2(金星)、4(铱星)。无效数值会舍入到最近的有效数值(例如7舍入到4)。默认为-1,代表保持物品查询的值不变(通常为0)。
MinStack (可选) 物品的最小和默认堆叠数量。默认为-1,代表保持物品查询的值不变(通常为1)。
MaxStack (可选) 若设为大于MinStack的值,则堆叠数值取最小值和最大值之间的随机值(包含端点值)。默认为-1。
ObjectInternalName (可选) 仅用于物体。待使用的内部名称。默认为此物品在Data/Objects的名称。
ObjectDisplayName (可选) 仅用于物体。用于显示该物品名称的模板字符串。默认为此物品在Data/Objects的显示名称。可以包括 %DISPLAY_NAME(物品的默认显示名称)和 %PRESERVED_DISPLAY_NAME(若通过诸如机器数据中的PreserveId等方式设置了风味物品名称,则显示风味物品的名称)。

注意: 此字段中的文本会被永久存储至物品的信息,即使玩家更改语言或更换内容包也不会改变。这包括会保存当前语言的翻译文本的Content Patcher翻译(例如%DISPLAY_NAME {{i18n: wine}})。为避免此问题,可以将显示名称添加到诸如Strings/Objects的字符串素材,然后使用[LocalizedText]标记

以下示例展示如何使用Content Patcher创建风味油 
  1. 将显示名称添加到您的i18n/default.json文件(其中 {0} 代表风味名称):
    {
        "flavored-oil": "{0} Oil"
    }
    
  2. 将文本添加到游戏可见的字符串素材中:
    {
        "Format": "2.3.0",
        "Changes": [
            {
                "Action": "EditData",
                "Target": "Strings/Objects",
                "Entries": {
                    "Example.ModId_Oil": "{{i18n: flavored-oil}}"
                }
            }
    }
    
  3. 使用[LocalizedText]标记以获得翻译后的文本,并将风味作为参数传入:
    "ObjectDisplayName": "[LocalizedText Strings/Objects:Example.ModId_Oil %PRESERVED_DISPLAY_NAME]",
    

现在,只要玩家改变语言,物体会自动从对应的Strings/Object文件中获取新翻译。

ToolUpgradeLevel (可选) 仅用于工具。创建工具时的初始等级(例如铜/金斧头,或训练用鱼竿/铱金鱼竿)。默认为-1,即保持物品查询的值不变(通常为0)。
QualityModifiers
StackModifiers
(可选) 应用在QualityStack数值上的数量修饰器。默认为none。

数量修饰器会更改品质数据(即,0 = 普通,1 = 银星,2 = 金星,4 = 铱星)。例如,银星 × 2 = 金星。

QualityModifierMode
StackModifierMode
(可选) 指示QualityModifiersStackModifiers字段中如果出现多个数量修饰器,这些修饰器相互作用的方式。
ModData (可选) 添加到待创建物品中的模组数据。默认为none。

例如:

"ModData": {
    "Example.ModId_FieldName": "some custom data"
}

关于C#模组作者

在自定义数据素材中使用物品查询

可使用ItemQueryResolver类以解析物品查询。

例如,考虑一个使用了物品生成字段的自定义数据模型,此模型用于决定添加到一开始的礼盒中的礼物:

public class InitialGiftsModel
{
    public List<GenericSpawnItemData> Items = new();
}

可以使用如下方式为其生成物品:

ItemQueryContext itemQueryContext = new();
foreach (GenericSpawnItemData entry in model.Items)
{
    Item item = ItemQueryResolver.TryResolveRandomItem(entry, itemQueryContext, logError: (query, message) => this.Monitor.Log($"Failed parsing item query '{query}': {message}", LogLevel.Warn));
    // or TryResolve to get all items
}

亦可使用GenericSpawnItemDataWithCondition以与游戏状态查询相配合:

ItemQueryContext itemQueryContext = new();
foreach (GenericSpawnItemDataWithCondition entry in model.Items)
{
    if (!GameStateQuery.CheckConditions(entry.Condition))
        continue;

    Item item = ItemQueryResolver.TryResolveRandomItem(entry, itemQueryContext, logError: (query, message) => this.Monitor.Log($"Failed parsing item query '{query}': {message}", LogLevel.Warn));
}

添加自定义物品查询

可以使用ItemQueryResolver.Register("Example.ModId_QueryName", handleQueryMethod)定义新的物品查询。为避免冲突,自定义查询名称应当遵从唯一字符串ID惯例。