BWIKI 全站将于 9 月 3 日(全天)进行维护,期间无法编辑任何页面或发布新的评论。
模组:物品数据
← 目录
本页面解释游戏如何存储和解析物品数据。这是一个面向模组开发者的高级指南。
特别注意: 此页面严格区分术语物品(item)和物体(object)。参见模组:物体。
综述
物品ID
在游戏数据中,我们通过物品ID表示物品。物品ID具有如下两种形式:
- 非限定性物品ID(unqualified item ID,对应于
item.ItemId
)是某个物品的唯一字符串ID,例如123(原版物品)或Example.ModId_Watermelon(自定义物品)。由于历史遗留因素,原版物品的非限定性物品ID可能有重复;例如,河豚(物体 128)和蘑菇箱(大型打造品 128)的非限定性物品ID都是128。 - 限定性物品ID(qualified item ID,对应于
item.QualifiedItemId
)则不会有重复,它是物品的类型ID和非限定性ID的组合,例如(O)128代表ID为128的物体。
在安装了 SMAPI 后,您可以使用运行 list_items 控制台命令以搜索物品ID。
注意: 早于星露谷 1.6 版本的模组可能会使用 item.ParentSheetIndex 字段来识别物品。这并不是一种有效的方法,因为即使是同一类型的物品也可能位于不同的贴图集中,因而可能拥有相同的贴图索引。
物品类型
物品是通过相应的 DataDefinition类而被定义的。每种 DataDefinition 类会处理对应类型的物品。例如,游戏的 ObjectDataDefinition 类负责解析 Data/Objects 数据素材并创建“物体”类型的物品。
每种物品类型都有唯一的ID,例如 (O)
,它们用于构建全局唯一的限定性物品ID。在 C# 代码中,类型ID记录在 item.TypeDefinitionId
字段。对于原版物品类型,其值与 ItemRegistry.type_*
常量一致。
如下列出了自定义物品可以添加/编辑的物品类型:
物品类型 | 类型标识符 | 数据素材 | 概述 |
---|---|---|---|
物体 | (O) | Data/Objects | 最常见的物品类型。根据具体数据,它们能够被放在地上、捡起、食用、售出等。 |
大型打造品 | (BC) | Data/BigCraftables | 能被放在地上、两地块高的物品(而不是像物体那样一个地块高)。 |
靴子 | (B) | Data/Boots | 能够被放进靴子栏的物品。靴子能改变玩家贴图,并且可能提供加成。 |
家具 | (F) | Data/Furniture | 可以被放下的装饰性物品。某些情况下玩家可以坐在其上,或在其上放置物品。 |
帽子 | (H) | Data/Hats | 能够被放进玩家的帽子栏的物品。可以改变玩家贴图。 |
假人模特 | (M) | Data/Mannequins | 可以被放在地上的装饰性物品,用于存放和展示衣物。 |
裤子 | (P) | Data/Pants | 可以被放进玩家的裤子栏的物品。可以改变玩家贴图。 |
上衣 | (S) | Data/Shirts | 可以被放进玩家的上衣栏的物品。可以改变玩家贴图。 |
工具 | (T) | Data/Tools | 可以被玩家挥舞或使用、发挥特定功效(挖土、砍树、挤奶、剪毛等)的物品。 |
饰品 | (TR) | Data/Trinkets | 能够被放进玩家的饰品栏以提供特定效果的物品。 |
墙纸和地板 | (WP) and (FL) | Data/AdditionalWallpaperFlooring | 可以被应用于可装饰地点(例如农舍或畜棚)、改变地板或墙壁样式的物品。(区别于红砖地板等可放置物品。) |
武器 | (W) | Data/Weapons | 能够被玩家挥舞或使用以杀伤怪物的物品。 |
当游戏尝试解析非限定性物品ID(例如 128)时,游戏会按如下顺序检索物品类型,并返回第一个可用的类型对应的物品:物体、大型打造品、家具、武器、靴子、帽子、假人模特、裤子、上衣、工具、饰品、墙纸和地板。
物品贴图
对于每个物品类型,游戏都在 Content 目录下有对应的两个文件(可以解包以编辑):
- 数据素材用于存储此类型的物品的文本数据(包括名称、描述、价格等);
- 贴图集用于存储物品在游戏内的图标。
每个物品都有一个 ParentSheetIndex 字段用于指示其在相应贴图集中的位置,左上角的索引为 0 ,然后按左到右、从上到下的顺序依次加一。例如,帽子 #0 指代 Characters/Farmer/hats 贴图集中的第一个贴图。
定义自定义物品
对于大多数原版物品类型,您可以仅利用 Contenet Patcher 或 SMAPI 的 Content 接口。
例如,下面给出的内容包添加了一个自定义的河豚鸡(Pufferchick)物品,包括自定义图像、自定义礼物喜好、产出它的自定义作物。注意在其他数据素材中(例如Data/Crops或Data/NPCGiftTastes),物品引用须使用物品ID。
{
"Format": "2.7.0",
"Changes": [
// add item
{
"Action": "EditData",
"Target": "Data/Objects",
"Entries": {
"{{ModId}}_Pufferchick": {
"Name": "{{ModId}}_Pufferchick", // best practice to match the ID, since it's sometimes used as an alternate ID (e.g. in Data/CraftingRecipes)
"Displayname": "Pufferchick",
"Description": "An example object.",
"Type": "Seeds",
"Category": -74,
"Price": 1200,
"Texture": "Mods/{{ModId}}/Objects",
"SpriteIndex": 0
}
}
},
// add gift tastes
{
"Action": "EditData",
"Target": "Data/NPCGiftTastes",
"TextOperations": [
{
"Operation": "Append",
"Target": ["Entries", "Universal_Love"],
"Value": "{{ModId}}_Pufferchick",
"Delimiter": " " // if there are already values, add a space between them and the new one
}
]
},
// add crop (Pufferchick is both seed and produce, like coffee beans)
{
"Action": "EditData",
"Target": "Data/Crops",
"Entries": {
"{{ModId}}_Pufferchick": {
"Seasons": [ "spring", "summer", "fall" ],
"DaysInPhase": [ 1, 1, 1, 1, 1 ],
"HarvestItemId": "{{ModId}}_Pufferchick",
"Texture": "Mods/{{ModId}}/Crops",
"SpriteIndex": 0
}
}
},
// add item + crop images
{
"Action": "Load",
"Target": "Mods/{{ModId}}/Crops, Mods/{{ModId}}/Objects",
"FromFile": "assets/{{TargetWithoutPath}}.png" // assets/Crops.png, assets/Objects.png
}
]
}
大多数物品数据素材的工作方式就像Data/Objects。另请参阅关于自定义果树、自定义工具和近战武器的详细信息。
错误物品
当由于某个物品(因为删除所在模组等原因)损坏时,它在游戏中就会变为默认的错误物品,并显示 🛇 贴图。错误物品会保留先前的物品数据,以备后期重新补回物品数据。
公共数据
品质
每个物品都有一个品质等级,该等级(依赖于物品类型)可能影响物品的售价、生命值回复等。可用的品质如下:
品质 | 数值 | 常量 |
---|---|---|
普通 | 0 | Object.lowQuality |
银星 | 1 | Object.medQuality |
金星 | 2 | Object.highQuality |
铱星 | 4 | Object.bestQuality |
类别
每个物品都有一个类别(使用负整数表示)。在代码中,可以通过item.Category获取物品类别,以及可以通过item.getCategoryName()获取其翻译后的名称。可用的类别如下:
数值 | 常量 | 上下文标签 | 中文翻译 | 性质 |
---|---|---|---|---|
-2 | Object.GemCategory | category_gem | 矿物 | 受宝石专家职业影响。 |
-4 | Object.FishCategory | category_fish | 鱼 | 受渔夫和垂钓者职业影响。 |
-5 | Object.EggCategory | category_egg | 动物制品 | 受畜牧人职业影响。可用于弹弓。 |
-6 | Object.MilkCategory | category_milk | 动物制品 | 受畜牧人职业影响。 |
-7 | Object.CookingCategory | category_cooking | 菜品 | |
-8 | Object.CraftingCategory | category_crafting | 制造品 | 可放置 |
-9 | Object.BigCraftableCategory | category_big_craftable | 可放置 | |
-12 | Object.mineralsCategory | category_minerals | 矿物 | 受宝石专家职业影响。 |
-14 | Object.meatCategory | category_meat | 动物制品 | |
-15 | Object.metalResources | category_metal_resources | 资源 | |
-16 | Object.buildingResources | category_building_resources | 资源 | |
-17 | Object.sellAtPierres | category_sell_at_pierres | ||
-18 | Object.sellAtPierresAndMarnies | category_sell_at_pierres_and_marnies | 动物制品 | 受畜牧人职业影响。 |
-19 | Object.fertilizerCategory | category_fertilizer | 肥料 | 可放置、可穿行 |
-20 | Object.junkCategory | category_junk | 垃圾 | |
-21 | Object.baitCategory | category_bait | 鱼饵 | 可以用于钓竿。 |
-22 | Object.tackleCategory | category_tackle | 鱼钩 | 可以用于钓竿。不可堆叠。 |
-23 | sellAtFishShopCategory | category_sell_at_fish_shop | ||
-24 | Object.furnitureCategory | category_furniture | 装饰 | |
-25 | Object.ingredientsCategory | category_ingredients | 菜品 | |
-26 | Object.artisanGoodsCategory | category_artisan_goods | 工匠物品 | 受工匠职业影响。 |
-27 | Object.syrupCategory | category_syrup | 工匠物品 | 受萃取者职业影响。 |
-28 | Object.monsterLootCategory | category_monster_loot | 怪物战利品 | |
-29 | Object.equipmentCategory | category_equipment | ||
-74 | Object.SeedsCategory | category_seeds | 种子 | 可放置。可穿行。 |
-75 | Object.VegetableCategory | category_vegetable | 蔬菜 | 受农耕人职业影响。可用于弹弓。 |
-79 | Object.FruitsCategory | category_fruits | 水果 | 受农耕人职业影响(若非采集水果)。可用于弹弓。 |
-80 | Object.flowersCategory | category_flowers | 花 | 受农耕人职业影响。 |
-81 | Object.GreensCategory | category_greens | 采集品 | |
-95 | Object.hatCategory | category_hat | ||
-96 | Object.ringCategory | category_ring | ||
-97 | Object.bootsCategory | category_boots | ||
-98 | Object.weaponCategory | category_weapon | ||
-99 | Object.toolCategory | category_tool | ||
-100 | Object.clothingCategory | category_clothing | ||
-101 | Object.trinketCategory | category_trinket | ||
-102 | Object.booksCategory | |||
-103 | Object.skillBooksCategory | |||
-999 | Object.litterCategory | category_litter |
Console commands
cs return string.Join(`\n`, Game1.objectData.Keys.Select(key => new StardewValley.Object(key, 1)).GroupBy(item => item.Category, item => item.Name).OrderByDescending(p => p.Key).Select(p => ← [[模组:目录|目录]] 本页面解释游戏如何存储和解析物品数据。这是一个面向模组开发者的高级指南。 '''特别注意: 此页面严格区分术语物品(item)和物体(object)。参见[[模组:物体]]'''。 ==综述== ===物品ID=== 在游戏数据中,我们通过物品ID表示物品。物品ID具有如下两种形式: * '''非限定性物品ID'''(unqualified item ID,对应于<code>item.ItemId</code>)是某个物品的[[#唯一字符串ID|唯一字符串ID]],例如<samp>123</samp>(原版物品)或<samp>Example.ModId_Watermelon</samp>(自定义物品)。由于历史遗留因素,原版物品的非限定性物品ID可能有重复;例如,河豚(物体 128)和蘑菇箱(大型打造品 128)的非限定性物品ID都是<samp>128</samp>。 * '''限定性物品ID'''(qualified item ID,对应于<code>item.QualifiedItemId</code>)则不会有重复,它是物品的[[#物品类型|类型ID]]和非限定性ID的组合,例如<samp>(O)128</samp>代表ID为128的[[模组:物体|物体]]。 在[[模组:使用指南/入门|安装了 SMAPI ]]后,您可以使用[[模组:控制台命令#控制台命令|运行 <samp>list_items</samp> 控制台命令]]以搜索物品ID。 '''注意:''' 早于星露谷 1.6 版本的模组可能会使用 <samp>item.ParentSheetIndex</samp> 字段来识别物品。这'''并不是'''一种有效的方法,因为即使是同一类型的物品也可能位于不同的贴图集中,因而可能拥有相同的贴图索引。 ===物品类型=== 物品是通过相应的 '''DataDefinition'''类而被定义的。每种 DataDefinition 类会处理对应类型的物品。例如,游戏的 <samp>ObjectDataDefinition</samp> 类负责解析 <samp>Data/Objects</samp> 数据素材并创建[[模组:物体|“物体”类型的物品]]。 每种物品类型都有唯一的ID,例如 <code>(O)</code>,它们用于构建全局唯一的[[#物品ID|限定性物品ID]]。在 C# 代码中,类型ID记录在 <code>item.TypeDefinitionId</code> 字段。对于原版物品类型,其值与 <code>ItemRegistry.type_*</code> 常量一致。 如下列出了自定义物品可以添加/编辑的物品类型: {| class="wikitable" |- ! 物品类型 ! 类型标识符 ! 数据素材 ! 概述 |- | [[模组:物体|物体]] | <samp>(O)</samp> | <samp>Data/Objects</samp> | 最常见的物品类型。根据具体数据,它们能够被放在地上、捡起、食用、售出等。 |- | [[模组:大型打造品|大型打造品]] | <samp>(BC)</samp> | <samp>Data/BigCraftables</samp> | 能被放在地上、两地块高的物品(而不是像物体那样一个地块高)。 |- | [[模组:靴子|靴子]] | <samp>(B)</samp> | <samp>Data/Boots</samp> | 能够被放进[[鞋类|靴子]]栏的物品。靴子能改变玩家贴图,并且可能提供加成。 |- | [[模组:家具|家具]] | <samp>(F)</samp> | <samp>Data/Furniture</samp> | 可以被放下的装饰性物品。某些情况下玩家可以坐在其上,或在其上放置物品。 |- | [[模组:帽子|帽子]] | <samp>(H)</samp> | <samp>Data/Hats</samp> | 能够被放进玩家的[[帽子]]栏的物品。可以改变玩家贴图。 |- | [[模组:假人模特|假人模特]] | <samp>(M)</samp> | <samp>Data/Mannequins</samp> | 可以被放在地上的装饰性物品,用于存放和展示衣物。 |- | [[模组:裤子|裤子]] | <samp>(P)</samp> | <samp>Data/Pants</samp> | 可以被放进玩家的[[裁缝#裤子|裤子]]栏的物品。可以改变玩家贴图。 |- | [[模组:上衣|上衣]] | <samp>(S)</samp> | <samp>Data/Shirts</samp> | 可以被放进玩家的[[裁缝#上衣|上衣]]栏的物品。可以改变玩家贴图。 |- | [[模组:工具|工具]] | <samp>(T)</samp> | <samp>Data/Tools</samp> | 可以被玩家挥舞或使用、发挥特定功效(挖土、砍树、挤奶、剪毛等)的物品。 |- | [[模组:饰品|饰品]] | <samp>(TR)</samp> | <samp>Data/Trinkets</samp> | 能够被放进玩家的[[饰品]]栏以提供特定效果的物品。 |- | [[模组:墙纸和地板|墙纸和地板]] | <samp>(WP)</samp> and <samp>(FL)</samp> | <samp>Data/AdditionalWallpaperFlooring</samp> | 可以被应用于可装饰地点(例如[[农舍]]或[[畜棚]])、改变地板或墙壁样式的物品。(区别于[[红砖地板]]等可放置物品。) |- | [[模组:武器|武器]] | <samp>(W)</samp> | <samp>Data/Weapons</samp> | 能够被玩家挥舞或使用以杀伤怪物的物品。 |} 当游戏尝试解析非限定性物品ID(例如 <samp>128</samp>)时,游戏会按如下顺序检索物品类型,并返回第一个可用的类型对应的物品:物体、大型打造品、家具、武器、靴子、帽子、假人模特、裤子、上衣、工具、饰品、墙纸和地板。 ===物品贴图=== 对于每个物品类型,游戏都在 <samp>Content</samp> 目录下有对应的两个文件(可以[[模组:编辑 XNB 文件|解包以编辑]]): * '''数据素材'''用于存储此类型的物品的文本数据(包括名称、描述、价格等); * '''贴图集'''用于存储物品在游戏内的图标。 每个物品都有一个 <samp>ParentSheetIndex</samp> 字段用于指示其在相应贴图集中的位置,左上角的索引为 0 ,然后按左到右、从上到下的顺序依次加一。例如,帽子 #0 指代 <samp>Characters/Farmer/hats</samp> 贴图集中的第一个贴图。 ===定义自定义物品=== 对于大多数原版物品类型,您可以仅利用 [[模组:Content Patcher|Contenet Patcher]] 或 [[模组:制作指南/APIs/Content|SMAPI 的 Content 接口]]。 例如,下面给出的内容包添加了一个自定义的河豚鸡(Pufferchick)物品,包括自定义图像、自定义礼物喜好、产出它的自定义作物。注意在其他数据素材中(例如<samp>Data/Crops</samp>或<samp>Data/NPCGiftTastes</samp>),物品引用须使用物品ID。 {{#tag:syntaxhighlight| { "Format": "{{Content Patcher version}}", "Changes": [ // add item { "Action": "EditData", "Target": "Data/Objects", "Entries": { "{{ModId}}_Pufferchick": { "Name": "{{ModId}}_Pufferchick", // best practice to match the ID, since it's sometimes used as an alternate ID (e.g. in Data/CraftingRecipes) "Displayname": "Pufferchick", "Description": "An example object.", "Type": "Seeds", "Category": -74, "Price": 1200, "Texture": "Mods/{{ModId}}/Objects", "SpriteIndex": 0 } } }, // add gift tastes { "Action": "EditData", "Target": "Data/NPCGiftTastes", "TextOperations": [ { "Operation": "Append", "Target": ["Entries", "Universal_Love"], "Value": "{{ModId}}_Pufferchick", "Delimiter": " " // if there are already values, add a space between them and the new one } ] }, // add crop (Pufferchick is both seed and produce, like coffee beans) { "Action": "EditData", "Target": "Data/Crops", "Entries": { "{{ModId}}_Pufferchick": { "Seasons": [ "spring", "summer", "fall" ], "DaysInPhase": [ 1, 1, 1, 1, 1 ], "HarvestItemId": "{{ModId}}_Pufferchick", "Texture": "Mods/{{ModId}}/Crops", "SpriteIndex": 0 } } }, // add item + crop images { "Action": "Load", "Target": "Mods/{{ModId}}/Crops, Mods/{{ModId}}/Objects", "FromFile": "assets/{{TargetWithoutPath}}.png" // assets/Crops.png, assets/Objects.png } ] }|lang=javascript}} 大多数物品数据素材的工作方式就像<samp>Data/Objects</samp>。另请参阅关于[[模组:果树数据|自定义果树]]、[[模组:物品数据#工具|自定义工具]]和[[模组:物品数据#武器|近战武器]]的详细信息。 ===错误物品=== 当由于某个物品(因为删除所在模组等原因)损坏时,它在游戏中就会变为默认的[[错误物品]],并显示 <samp>🛇</samp> 贴图。错误物品会保留先前的物品数据,以备后期重新补回物品数据。 ==公共数据== ===品质=== 每个物品都有一个品质等级,该等级(依赖于物品类型)可能影响物品的售价、生命值回复等。可用的品质如下: {| class="wikitable" |- ! 品质 ! 数值 ! 常量 |- | 普通 | <samp>0</samp> | <samp>Object.lowQuality</samp> |- | 银星 | <samp>1</samp> | <samp>Object.medQuality</samp> |- | 金星 | <samp>2</samp> | <samp>Object.highQuality</samp> |- | 铱星 | <samp>4</samp> | <samp>Object.bestQuality</samp> |} ===类别=== 每个物品都有一个类别(使用负整数表示)。在代码中,可以通过<samp>item.Category</samp>获取物品类别,以及可以通过<samp>item.getCategoryName()</samp>获取其翻译后的名称。可用的类别如下: {| class="wikitable sortable" |- ! 数值 ! 常量 ! [[模组:上下文标签|上下文标签]] ! 中文翻译 ! 性质 |- | -2 | <samp>Object.GemCategory</samp> | <samp>category_gem</samp> | 矿物 | 受[[技能#采矿|宝石专家]]职业影响。 |- | -4 | <samp>Object.FishCategory</samp> | <samp>category_fish</samp> | 鱼 | 受[[技能#钓鱼|渔夫]]和[[技能#钓鱼|垂钓者]]职业影响。 |- | -5 | <samp>Object.EggCategory</samp> | <samp>category_egg</samp> | 动物制品 | 受[[技能#耕种|畜牧人]]职业影响。可用于弹弓。 |- | -6 | <samp>Object.MilkCategory</samp> | <samp>category_milk</samp> | 动物制品 | 受[[技能#耕种|畜牧人]]职业影响。 |- | -7 | <samp>Object.CookingCategory</samp> | <samp>category_cooking</samp> | 菜品 | |- | -8 | <samp>Object.CraftingCategory</samp> | <samp>category_crafting</samp> | 制造品 | 可放置 |- | -9 | <samp>Object.BigCraftableCategory</samp> | <samp>category_big_craftable</samp> | | 可放置 |- | -12 | <samp>Object.mineralsCategory</samp> | <samp>category_minerals</samp> | 矿物 | 受[[技能#采矿|宝石专家]]职业影响。 |- | -14 | <samp>Object.meatCategory</samp> | <samp>category_meat</samp> | 动物制品 | |- | -15 | <samp>Object.metalResources</samp> | <samp>category_metal_resources</samp> | 资源 | |- | -16 | <samp>Object.buildingResources</samp> | <samp>category_building_resources</samp> | 资源 | |- | -17 | <samp>Object.sellAtPierres</samp> | <samp>category_sell_at_pierres</samp> | | |- | -18 | <samp>Object.sellAtPierresAndMarnies</samp> | <samp>category_sell_at_pierres_and_marnies</samp> | 动物制品 | 受[[技能#耕种|畜牧人]]职业影响。 |- | -19 | <samp>Object.fertilizerCategory</samp> | <samp>category_fertilizer</samp> | 肥料 | 可放置、可穿行 |- | -20 | <samp>Object.junkCategory</samp> | <samp>category_junk</samp> | 垃圾 | |- | -21 | <samp>Object.baitCategory</samp> | <samp>category_bait</samp> | 鱼饵 | 可以用于钓竿。 |- | -22 | <samp>Object.tackleCategory</samp> | <samp>category_tackle</samp> | 鱼钩 | 可以用于钓竿。不可堆叠。 |- | -23 | <samp>sellAtFishShopCategory</samp> | <samp>category_sell_at_fish_shop</samp> | | |- | -24 | <samp>Object.furnitureCategory</samp> | <samp>category_furniture</samp> | 装饰 | |- | -25 | <samp>Object.ingredientsCategory</samp> | <samp>category_ingredients</samp> | 菜品 | |- | -26 | <samp>Object.artisanGoodsCategory</samp> | <samp>category_artisan_goods</samp> | 工匠物品 | 受[[技能#耕种|工匠]]职业影响。 |- | -27 | <samp>Object.syrupCategory</samp> | <samp>category_syrup</samp> | 工匠物品 | 受[[技能#采集|萃取者]]职业影响。 |- | -28 | <samp>Object.monsterLootCategory</samp> | <samp>category_monster_loot</samp> | 怪物战利品 | |- | -29 | <samp>Object.equipmentCategory</samp> | <samp>category_equipment</samp> | | |- | -74 | <samp>Object.SeedsCategory</samp> | <samp>category_seeds</samp> | 种子 | 可放置。可穿行。 |- | -75 | <samp>Object.VegetableCategory</samp> | <samp>category_vegetable</samp> | 蔬菜 | 受[[技能#耕种|农耕人]]职业影响。可用于弹弓。 |- | -79 | <samp>Object.FruitsCategory</samp> | <samp>category_fruits</samp> | 水果 | 受[[技能#耕种|农耕人]]职业影响(若非采集水果)。可用于弹弓。 |- | -80 | <samp>Object.flowersCategory</samp> | <samp>category_flowers</samp> | 花 | 受[[技能#耕种|农耕人]]职业影响。 |- | -81 | <samp>Object.GreensCategory</samp> | <samp>category_greens</samp> | 采集品 | |- | -95 | <samp>Object.hatCategory</samp> | <samp>category_hat</samp> | | |- | -96 | <samp>Object.ringCategory</samp> | <samp>category_ring</samp> | | |- | -97 | <samp>Object.bootsCategory</samp> | <samp>category_boots</samp> | | |- | -98 | <samp>Object.weaponCategory</samp> | <samp>category_weapon</samp> | | |- | -99 | <samp>Object.toolCategory</samp> | <samp>category_tool</samp> | | |- | -100 | <samp>Object.clothingCategory</samp> | <samp>category_clothing</samp> | | |- | -101 | <samp>Object.trinketCategory</samp> | <samp>category_trinket</samp> | | |- | -102 | <samp>Object.booksCategory</samp> | | | |- | -103 | <samp>Object.skillBooksCategory</samp> | | | |- | -999 | <samp>Object.litterCategory</samp> | <samp>category_litter</samp> | | |} {{collapse|Console commands|content= 如果您安装了{{nexus mod|3101|Console Code}}模组,您可以在 SMAPI 控制台中运行如下命令,以获取按类别分类的物品列表: <pre>{p.Key}: {string.Join(`, `, p.OrderBy(name => name))}`));
上下文标签
上下文标签是附加在物品上的任意数据标签,例如 category_gem
或 item_apple
。它们提供了物品的元数据(例如颜色、品质、类别、大体上的分类比如酒或鱼 等),且可能影响游戏逻辑(例如,机器处理)。
参见模组:上下文标签以获取更多信息。
特定物品类型
如需了解某个具体数据类型(如物体或武器),请参阅上述物品类型表格。
关于C#模组
识别物品
您可以检查物品ID字段以识别物品。例如:
bool isPufferfish = item.QualifiedItemId == "(O)128";
ItemRegistry 类也提供了处理物品的方法,例如:
// 检查物品是否匹配限定性或非限定性物品ID
bool isPufferfish = ItemRegistry.HasItemId(item, "128");
// 如有需要,将非限定性ID转为限定性
string pufferfishQualifiedId = ItemRegistry.QualifyItemId("128"); // returns "(O)128"
注意,风味物品(例如果酱和果酒)没有单独的ID。例如,“蓝莓果酒”和“果酒”的ID都是(O)348。您可以通过 preservedParentSheetIndex 字段获取其原材料ID;例如,蓝莓果酒的原材料ID为蓝莓的ID(虽然此字段名为“贴图集索引”,但实际上包含的是原材料的物品ID)。
创建物品实例
ItemRegistry.Create 方法是创建物品的主要途径。例如:
Item pufferfish = ItemRegistry.Create("(O)128"); // can optionally specify count and quality
若ID不能匹配任何真实存在的物品,则 ItemRegistry 默认返回一个错误物品。此逻辑可以被重写,具体来说是在调用方法时传入 allowNull: true。
如有需要,您也可以使该方法返回特定类型的对象,而不是默认返回 Item 对象。如果物品类型不兼容(例如把家具转换为靴子),则会抛出一则描述性的异常。
Boots boots = ItemRegistry.Create<Boots>("(B)505"); // Rubber Boots
如果需要手动创建物品,请确保向构造函数传入的是ItemId(而不是 QualifiedItemId)。例如:
Item pufferfish = new Object("128", 1);
处理物品元数据
ItemRegistry 类提供了几种方法用于处理物品元数据。下面列出了一些实用的方法:
方法 | 效果 |
---|---|
ItemRegistry.Create | 创建一个物品实例。 |
ItemRegistry.Exists | 获知某个限定性或非限定性物品ID是否可以匹配真实存在的物品。例如:
bool pufferfishExists = ItemRegistry.Exists("(O)128");
|
ItemRegistry.IsQualifiedId | 获知给定的物品ID是否添加了限定性前缀(例如(O)128和128)。 |
ItemRegistry.QualifyItemId | 根据输入的限定性或非限定性物品ID,返回对应的限定性物品ID。例如:
string qualifiedId = ItemRegistry.QualifyItemId("128"); // returns (O)128
|
ItemRegistry.GetMetadata | 获取物品的高级信息:
// 获取橡胶靴的信息
ItemMetadata metadata = ItemRegistry.GetMetadata("(B)505");
// 获取物品ID信息
$"The item has unqualified ID {metadata.LocalId}, qualified ID {metadata.QualifiedId}, and is defined by the {metadata.TypeIdentifier} item data definition.";
// 物品是否存在于数据文件中?
bool exists = metadata.Exists();
获取物品通用的、解析后的数据: // 获取解析后的信息
ParsedItemData data = info.GetParsedData();
$"The internal name is {data.InternalName}, translated name {data.DisplayName}, description {data.Description}, etc.";
// 绘制物品贴图
Texture2D texture = data.GetTexture();
Rectangle sourceRect = data.GetSourceRect();
spriteBatch.Draw(texture, Vector2.Zero, sourceRect, Color.White);
创建物品: Item item = metadata.CreateItem();
获取类型定义(注意,此操作高度专业化。通常情况下您应当转而使用ItemRegistry,以获取缓存和优化上的好处): IItemDataDefinition typeDefinition = info.GetTypeDefinition();
|
ItemRegistry.ResolveMetadata | 相当于ItemRegistry.GetMetadata,除了物品不存在时会返回空值。 |
ItemRegistry.GetData | 获取某个物品解析后的数据,若不存在则返回null。这是ItemRegistry.ResolveMetadata(id)?.GetParsedData() 的简写;参见前一方法以获得关于解析后的数据的信息。
|
ItemRegistry.GetDataOrErrorItem | 相当于ItemRegistry.GetData,除了物品不存在时会返回错误物品的信息(例如,在物品栏中绘制)。 |
ItemRegistry.GetErrorItemName | 获取翻译后的错误物品标签。 |
定义自定义物品类型
您可以实现IItemDataDefinition以自定义物品类型,并调用ItemRegistry.AddTypeDefinition以注册之。这提供了游戏所需的处理物品类型的一切逻辑:何处获取物品数据、如何绘制物品等等。
自定义物品类型是极其专业化的,且对于多人游戏的兼容性未知。大部分模组应当添加属于已有类型的物品,而非新建类型。