Jump to content

Modding:Objects: Difference between revisions

From Stardew Valley Wiki
imported>Pathoschild
merge Modding:Hat data into page as-is (initial content by Margotbean, ignoreHairStyleOffset info by MonaisReal, data updates by MouseyPounds + Pathoschild + Spaceeinstein + Treyh0)
imported>Zeltron0012
m removed a duplicate mention of CombatLevel in custom attributes
 
(178 intermediate revisions by 23 users not shown)
Line 1: Line 1:
← [[Modding:Index|Index]]
← [[Modding:Items|Items]]


This page explains how the game stores and parses item data. This is an advanced guide for mod developers.
This page explains how the game stores and parses object-type item data. For items in general, see [[Modding:Items]].


==Introduction==
==Overview==
===Overview===
Objects are the default type for items in inventories or in the world. Depending on their data, they can be placed, picked up, eaten, sold to shops, etc.
Items are divided into several types:


They have [[Modding:Items#Item types|item type]] <code>(O)</code> (or <code>ItemRegistry.type_object</code> in C# code), their data in <samp>Data/Objects</samp>, their icon sprites in <samp>Maps/springobjects</samp> or <samp>TileSheets/Objects_2</samp> by default, and their code in <samp>StardewValley.Object</samp>. See [[/Object sprites|a table of sprites and their corresponding indexes]].
==Data format==
The object data in <samp>Data/Objects</samp> consists of a string → model lookup, where...
* The key is the unqualified [[Modding:Common data field types#Item ID|item ID]].
* The value is a model with the fields listed below.
===Basic info===
{| class="wikitable"
{| class="wikitable"
|-
|-
! item type
! field
! data asset
! purpose
! texture name
! summary
|-
|-
| <samp>Object</samp>
| <samp>Name</samp>
| <samp>Data/ObjectInformation</samp>
| The internal item name.
| <samp>Maps/springobjects</samp>
| The default type for items in inventories or placed in the world.
|-
|-
| <samp>Object</samp> (big craftable)
| <samp>DisplayName</samp><br /><samp>Description</samp>
| <samp>Data/BigCraftablesInformation</samp>
| A [[Modding:Tokenizable strings|tokenizable string]] for the item's in-game display name and description.
| <samp>TileSheets/Craftables</samp>
| Craftable items which can be placed in the world and are two tiles tall (instead of one like objects).
|-
|-
| <Samp>Boots</samp>
| <samp>Type</samp>
| <samp>Data/Boots</samp>
| The item's general type, like Arch (artifact) or Minerals. The vanilla types are: <samp>Basic</samp>, <samp>Arch</samp> (artifact), <samp>Litter</samp> (e.g. debris), <samp>Minerals</samp>, <samp>Quest</samp>, <samp>Crafting</samp>, <samp>Fish</samp>, <samp>Cooking</samp>, <samp>Seeds</samp>, <samp>Ring</samp>, <samp>interactive</samp>, and some placeholder values like <samp>asdf</samp>.
| item sprite: <samp>Maps/springobjects</samp><br />shoe color: <samp>Characters/Farmer/shoeColors</samp>
 
| Equippable boots.
'''Caution:''' adding custom items with the <samp>Arch</samp> type is inadvisable as it often leads to [[Artifact Spot|artifact spot]]s becoming broken and not giving any items.
 
'''Note:''' The "Type" affects whether an item shows up in the collections menu. For example, items with <samp>Type: Cooking</samp> will show up as silhouettes in the cooked items collection menu, items with <samp>Type: Minerals</samp> will show up as silhouettes in the mineral collection menu, etc. However, the [[Modding:Items#Categories|Category]] of the item must also be the correct number or the item will not count toward Perfection/Achievements. For example, if an item has Type: Cooking, it must also be "Category": -7 in order to count toward the "Gourmet Chef" achievement and Perfection.  
|-
|-
| <samp>Clothing</samp>
| <samp>Category</samp>
| <samp>Data/ClothingInformation</samp>
| The [[Modding:Items#Categories|item category]].
| <samp>Characters/Farmer/pants</samp><br /><samp>Characters/Farmer/shirts</samp>
| Equippable pants and shirts.
|-
|-
| <samp>Furniture</samp>
| <samp>Price</samp>
| <samp>Data/Furniture</samp>
| ''(Optional)'' The price when sold by the player. This is not the price when bought from a shop. Default 0.
| <samp>TileSheets/furniture</samp>
| Decorative furniture items, including chairs which the player can sit on.
|-
| <samp>Hat</samp>
| <samp>Data/Hats</samp>
| <samp>Characters/Farmer/hats</samp>
| Equippable hat items.
|-
| <samp>Tool</samp>
| &mdash;
| <samp>TileSheets/Tools</samp>
| Tools that can be used by the player.
|-
| <samp>MeleeWeapon</samp>
| <samp>Data/Weapons</samp>
| <samp>TileSheets/weapons</samp>
| Weapons that can be used by the player to damage monsters.
|}
|}


The game has two files in its <samp>Content</samp> folder (which can be [[Modding:Editing XNB files#unpacking|unpacked for editing]]) for each item type:
===Appearance===
* a ''data asset'' for the text data for its items (names, descriptions, prices, etc);
{| class="wikitable"
* and a ''spritesheet'' for the in-game item icons.
 
Each item has a <samp>ParentSheetIndex</samp> field which is its position in the item type's spritesheet, starting at 0 in the top-left and incrementing by one as you move across and then down. For example, hat #0 is the first sprite in <samp>Characters/Farmer/hats</samp>. The <samp>ParentSheetIndex</samp> is also used to identify the item itself; since spritesheet indexes aren't unique (''e.g.'' there's both a hat #10 and object #10), code needs to check the type too like <code>item is Weapon weapon && weapon.ParentSheetIndex == 4</code>.
 
See the sections below for details on each item type.
 
===Categories===
Each item also has a category (represented by a negative integer). In code, you can get an item's category value from <samp>item.Category</samp>, and its translated name from <samp>item.getCategoryName()</samp>. Here are the valid categories:
 
{| class="wikitable sortable"
|-
|-
! value
! field
! internal constant
! purpose
! English translation
|-
|-
| -2
| <samp>Texture</samp>
| <samp>Object.GemCategory</samp>
| The asset name for the texture containing the item's sprite. Defaults to <samp>Maps/springobjects</samp>.
| Mineral
|-
|-
| -4
| <samp>SpriteIndex</samp>
| <samp>Object.FishCategory</samp>
| The sprite's index within the <samp>Texture</samp>, where 0 is the top-left sprite.
| Fish
|-
|-
| -5
| <samp>ColorOverlayFromNextIndex</samp>
| <samp>Object.EggCategory</samp>
| ''(Optional)'' When drawn as a colored object, whether to apply the color to the next sprite in the spritesheet and draw that over the main sprite. If false, the color is applied to the main sprite instead. Default false.
| Animal Product
|}
 
===Edibility===
{| class="wikitable"
|-
|-
| -6
! field
| <samp>Object.MilkCategory</samp>
! purpose
| Animal Product
|-
|-
| -7
| <samp>Edibility</samp>
| <samp>Object.CookingCategory</samp>
| ''(Optional)'' A numeric value that determines how much energy (edibility × 2.5) and health (edibility × 1.125) is restored when this item is eaten. An item with an edibility of -300 can't be eaten, values from -299 to -1 reduce health and energy, and zero can be eaten but doesn't change health/energy. Default -300.
| Cooking
|-
|-
| -8
| <samp>IsDrink</samp>
| <samp>Object.CraftingCategory</samp>
| ''(Optional)'' Whether to drink the item instead of eating it. Default false.
| Crafting
|-
|-
| -9
| <samp>Buffs</samp>
| <samp>Object.BigCraftableCategory</samp>
| ''(Optional)'' The buffs to apply to the player when this item is eaten, if any. Default none.
|  
 
This consists of a list of models with these fields:
{| class="wikitable"
|-
|-
| -12
! field
| <samp>Object.mineralsCategory</samp>
! purpose
| Mineral
|-
|-
| -14
| <samp>Id</samp>
| <samp>Object.meatCategory</samp>
| The [[Modding:Common data field types#Unique string ID|unique string ID]] for this entry within the list.
| Animal Product
|-
|-
| -15
| <samp>Duration</samp>
| <samp>Object.metalResources</samp>
| ''(Optional if <samp>BuffId</samp> is set)'' The buff duration measured in in-game minutes. This can be set to <samp>-2</samp> for a buff that should last for the rest of the day.
| Resource
|-
|-
| -16
| <samp>BuffId</samp>
| <samp>Object.buildingResources</samp>
| ''(Optional)'' The unique ID of a buff from <samp>Data/Buffs</samp> to apply, or <samp>null</samp> to ignore <samp>Data/Buffs</samp> and set the ID to <samp>food</samp> or <samp>drink</samp> depending on the item's <samp>IsDrink</samp> field.
| Resource
 
If a buff from <samp>Data/Buffs</samp> is applied and you also specify other fields, here's how the buff data is combined:
{| class="wikitable"
|-
|-
| -17
! field
| <samp>Object.sellAtPierres</samp>
! result
|
|-
|-
| -18
| <samp>Duration</samp><br /><samp>IconTexture</samp><br /><samp>IconSpriteIndex</samp><br /><samp>GlowColor</samp>
| <samp>Object.sellAtPierresAndMarnies</samp>
| If specified, the value in <samp>Data/Objects</samp> is used instead of the one in <samp>Data/Buffs</samp>. If omitted, defaults to the value from <samp>Data/Buffs</samp>.
| Animal Product
|-
|-
| -19
| <samp>CustomAttributes</samp>
| <samp>Object.fertilizerCategory</samp>
| The values from both entries are combined (e.g. +1 speed in <samp>Data/Objects</samp> and +1 speed in <samp>Data/Buffs</samp> results in +2 speed).
| Fertilizer
|-
|-
| -20
| <samp>IsDebuff</samp>
| <samp>Object.junkCategory</samp>
| The value in <samp>Data/Objects</samp> is used.
| Trash
|}
|-
|-
| -21
| <samp>IsDebuff</samp>
| <samp>Object.baitCategory</samp>
| ''(Optional)'' Whether this buff counts as a debuff, so its duration should be halved when wearing a Sturdy Ring. Default false.
| Bait
|-
|-
| -22
| <samp>IconTexture</samp>
| <samp>Object.tackleCategory</samp>
| ''(Optional)'' The asset name for the icon texture to load. This must contain one or more 16x16 icons in a grid of any size. If omitted, the game will draw a default icon based on the <samp>BuffId</samp> and <samp>CustomAttributes</samp> fields.
| Fishing Tackle
|-
|-
| -23
| <samp>IconSpriteIndex</samp>
| <samp>sellAtFishShopCategory</samp>
| ''(Optional)'' The buff's icon index within the <samp>IconTexture</samp>, where 0 is the top-left icon. Default 0.
|
|-
|-
| -24
| <samp>GlowColor</samp>
| <samp>Object.furnitureCategory</samp>
| ''(Optional)'' The glow color to apply to the player. See [[Modding:Common data field types#Color|color format]]. Default none.
| Decor
|-
|-
| -25
| <samp>CustomAttributes</samp>
| <samp>Object.ingredientsCategory</samp>
| The custom buff attributes to apply, if any.
| Cooking
 
This consists of a model with any combination of these fields:
{| class="wikitable"
|-
|-
| -26
! field
| <samp>Object.artisanGoodsCategory</samp>
! purpose
| Artisan Goods
|-
|-
| -27
| <samp>CombatLevel</samp><br /><samp>FarmingLevel</samp><br /><samp>FishingLevel</samp><br /><samp>ForagingLevel</samp><br /><samp>LuckLevel</samp><br /><samp>MiningLevel</samp>
| <samp>Object.syrupCategory</samp>
| ''(Optional)'' An amount applied to the matching [[Skills|skill level]] while the buff is active. This can be negative for a debuff. Default 0.
| Artisan Goods
|-
|-
| -28
| <samp>Attack</samp><br /><samp>AttackMultiplier</samp><br /><samp>CriticalChanceMultiplier</samp><br /><samp>CriticalPowerMultiplier</samp><br /><samp>Defense</samp><br /><samp>Immunity</samp><br /><samp>KnockbackMultiplier</samp><br /><samp>MagneticRadius</samp><br /><samp>MaxStamina</samp><br /><samp>Speed</samp><br /><samp>WeaponPrecisionMultiplier</samp><br /><samp>WeaponSpeedMultiplier</samp>
| <samp>Object.monsterLootCategory</samp>
| ''(Optional)'' An amount applied to the player's [[attack]], [[Crit. Chance|critical chance]] and  [[Crit. Power|critical power]], [[defense]], [[immunity]], knockback (i.e. [[weight]]), [[Magnetism|magnetic radius]], maximum [[Energy|stamina]], [[speed]], or weapon precision/[[speed|speed]] while the buff is active. This can be negative for a debuff. Default 0.
| Monster Loot
|}
|-
|-
| -29
| <samp>CustomFields</samp>
| <samp>Object.equipmentCategory</samp>
| ''(Optional)'' The [[Modding:Common data field types#Custom fields|custom fields]] for this entry.  
|
|}
|-
| -74
| <samp>Object.SeedsCategory</samp>
| Seed
|-
| -75
| <samp>Object.VegetableCategory</samp>
| Vegetable
|-
| -79
| <samp>Object.FruitsCategory</samp>
| Fruit
|-
| -80
| <samp>Object.flowersCategory</samp>
| Flower
|-
| -81
| <samp>Object.GreensCategory</samp>
| Forage
|-
| -95
| <samp>Object.hatCategory</samp>
|
|-
| -96
| <samp>Object.ringCategory</samp>
|
|-
| -98
| <samp>Object.weaponCategory</samp>
|
|-
| -99
| <samp>Object.toolCategory</samp>
|  
|}
|}


{{collapse|Console commands|content=
===Geodes & artifact spots===
With the {{nexus mod|3101|Console Code}} mod installed, you can run this command in the SMAPI console to see a list of objects by category:
 
<pre>cs return string.Join(`\n`, Game1.objectInformation.Keys.Select(key => new StardewValley.Object(key, 1)).GroupBy(item => item.Category, item => item.Name).OrderByDescending(p => p.Key).Select(p => $`{p.Key}: {string.Join(`, `, p.OrderBy(name => name))}`));</pre>
}}
 
===Get a list of items===
With [[Modding:Player Guide/Getting Started|SMAPI installed]], you can [[Modding:Console commands#Console commands|run the <samp>list_items</samp> console command]] in-game to view/search items and their IDs.
 
===Define a custom item===
Every item must be assigned a unique <samp>ParentSheetIndex</samp> within its type, and that index must fit within the item type's spritesheet.
 
Adding custom items to the data assets and spritesheets directly is '''not recommended''', since it's very easy to conflict with other mods or cause game errors. Instead you should create a content pack for {{nexus mod|1720|Json Assets}}, which coordinates dynamic item ID assignment so multiple custom item mods can work together.
 
==Objects==
Objects are the default type for items in inventories or placed in the world.
 
They have their data in <samp>Data/ObjectInformation</samp>, their icon sprites in <samp>Maps/springobjects</samp>, and their code in <samp>StardewValley.Object</samp>. See [[Modding:Items/Object sprites|a table of sprites and their corresponding indexes]].
 
===Data format===
The object data in <samp>Data/ObjectInformation</samp> consists of an integer→string dictionary with entries like this:
<syntaxhighlight lang="json">
  "18": "Daffodil/30/0/Basic -81/Daffodil/A traditional spring flower that makes a nice gift."
</syntaxhighlight>
 
For each entry in the data asset, the key is the item's <samp>ParentSheetIndex</samp> and the value is a slash-delimited string with the fields listed below. Fields 0–5 are used by rings and most other objects; fields 6–11 are only used for food buffs. The objects with keys 516–534 (<samp>Ring.ringLowerIndexRange</samp> through <samp>Ring.ringUpperIndexRange</samp>) and 801 (wedding ring) are hardcoded as rings.
 
{| class="wikitable"
{| class="wikitable"
|-
|-
! index
! field
! field
! effect
! purpose
|-
|-
!style="text-align: left;" colspan="3"| all objects
| <samp>GeodeDrops</samp><br /><samp><samp>GeodeDropsDefaultItems</samp>
| ''(Optional)'' The items that can be dropped when breaking open this item as a [[Minerals#Geodes|geode]]. Specifying either or both fields automatically enables geode behavior for this item.
 
You can specify one or both fields:
<ul>
<li><samp>GeodeDrops</samp> can be set to the specific items to drop. Default none. This consists of a list of models with these fields:
{| class="wikitable"
|-
|-
| 0
! field
| name
! purpose
| The internal item name (and display name in English).
|-
|-
| 1
| price
| The gold price of the item when sold by the player.
|-
|-
| 2
| ''common fields''
| edibility
| See [[Modding:Item queries#Item spawn fields|item spawn fields]] for the generic item fields supported by geode drops.
| A numeric value that determines how much health (edibility × 2.5) and energy (edibility × 1.125) is restored. An item with an edibility of -300 can't be eaten.


This is ignored for rings.
If set to an [[Modding:Item queries|item query]] which returns multiple items, one of them will be selected at random.
|-
| 3
| type and category
| &#32;
* For a ring: the value <samp>Ring</samp>. Rings have a hardcoded category of -96 (<samp>Object.ringCategory</samp>).
* For other objects: the item's type (string) and category (negative integer), separated by a space like <samp>Fish -4</samp>.
|-
| 4
| display name
| The translated item name.
|-
| 5
| description
| The translated item description.
|-
!style="text-align: left;" colspan="3"| food & drink only
|-
| 6
| miscellaneous
| &#32;
* For a food or drink item, set this to <samp>food</samp> or <samp>drink</samp> respectively. This enables the remaining fields, and changes which animation/sound is played when the player consumes the item. Any other value is ignored.
* For a geode item ([[Geode|535]], [[Frozen Geode|536]], [[Magma Geode|537]], or [[Omni Geode|749]]) is broken, a space-delimited list of object IDs. There's a roughly 50% chance that the geode item will drop one of these items (the other drops are hardcoded).
|-
| 7
| buffs
| The bonuses to apply to the player's attribute when the item is consumed. This consists of a space-delimited list of these numbers:
{|class="wikitable"
|-
! index
! buff
|-
| 0
| [[Skills#Farming|farming]]
|-
| 1
| [[Skills#Fishing|fishing]]
|-
| 2
| [[Skills#Mining|mining]]
|-
| 3
| ''unused''
|-
|-
| 4
| <samp>Chance</samp>
| [[Luck|luck]]
| ''(Optional)'' The probability that the item will be dropped if the other fields match, as a decimal value between 0 (never) and 1 (always). Default 1.
|-
|-
| 5
| <samp>SetFlagOnPickup</samp>
| [[Skills#Foraging|foraging]]
| ''(Optional)'' The mail flag to set for the current player when this drop is picked up.
|-
|-
| 6
| <samp>Precedence</samp>
| ''unused''
| ''(Optional)'' The order in which this entry should be checked, where lower values are checked first. This can be a negative value. Geode drops with the same precedence are checked in the order listed. Default 0.
|-
| 7
| max [[energy]]
|-
| 8
| [[magnetism]]
|-
| 9
| [[speed]]
|-
| 10
| [[defense]]
|-
| 11
| [[attack]]
|}
|-
| 8
| buff duration
| How long the buffs provided by the previous field last. This is converted into in-game minutes using the formula <samp>(''duration'' × 0.7) / 60</samp>. The buff duration number shown in-game will always be one second less than the calculated value.
|}


===Notes===
For consistency, vanilla drops mostly use these values:
* Items that have a number in the "Crafting" field show buggy information in-game (''e.g.,'' Bean Hotpot prior to version 1.4). Items that have a number in the "Attack" field display the Attack icon and a number, but no description. It's unclear how these buffs work (if at all).
* <samp>-1000</samp>: special overrides like the [[Golden Helmet|golden helmet]];
* Named [[buffs]] (like [[Oil of Garlic]], [[Life Elixir]], or [[Tipsy]]) are implemented in code and can't be set in the food buff fields.
* <samp>0</samp>: normal items.
* The spritesheet and data have items that can't normally be found in the player inventory (like twigs and lumber), and some sprites have no corresponding item data. There are also multiple entries for ''weeds'' and ''stone'' corresponding to different sprites, but the player can only normally obtain one ''stone'' item (index 390) and no ''weeds'' items.
|}</li>
<li><samp>GeodeDropsDefaultItems</samp> chooses a predefined list of possible geode drops like [[clay]], [[coal]], [[Copper Ore|copper]], [[Iridium Ore|iridium]], etc. Default false.</li>
</ul>


==Objects (big craftables)==
If both fields are specified, each geode will choose between them with an equal 50% chance. If <samp>GeodeDrops</samp> is specified but no entries match, the geode will use the <samp>GeodeDropsDefaultItems</samp> regardless of whether it's true.
Big craftables are objects which can be placed in the world and are two tiles tall (instead of one like objects).
|-
| <samp>ArtifactSpotChances</samp>
| ''(Optional)'' If this is an artifact (i.e. the <samp>Type</samp> field is <samp>Arch</samp>), the chance that it can be found by digging [[Artifact Spot|artifact spots]] in each location.


They have their data in <samp>Data/BigCraftableInformation</samp>, their in-game sprites in <samp>TileSheets/Craftables</samp>, and their code in <samp>StardewValley.Object</samp> (with the <code>bigCraftable.Value = true</code> flag).
This consists of a string → model lookup, where:
 
* the key is the internal location name;
===Data format===
* the value is the probability the item will spawn if checked, as a decimal value between 0 (never) and 1 (always).
The big craftables data in <samp>Data/BigCraftableInformation</samp> consists of an integer→string dictionary with entries like this:
|}
 
<syntaxhighlight lang="json">
  "19": "Oil Maker/50/-300/Crafting -9/Makes gourmet truffle oil./true/true/0/Oil Maker"
</syntaxhighlight>
 
For each entry in the data asset, the key is the item's <samp>ParentSheetIndex</samp> and the value is a slash-delimited string with these fields:


===Context tags & exclusions===
{| class="wikitable"
{| class="wikitable"
|-
|-
! index
! field
! field
! effect
! purpose
|-
|-
| 0
| <samp>ContextTags</samp>
| name
| ''(Optional)'' The custom [[Modding:Context tags|context tags]] to add for this item (in addition to the tags added automatically based on the other object data). This is formatted as a list; for example:
| The internal item name (and display name in English).
<syntaxhighlight lang="json">
"ContextTags": [ "color_yellow", "fish_ocean", "fish_upright", "season_summer" ]
</syntaxhighlight>
|-
|-
| 1
| <samp>CanBeGivenAsGift</samp>
| price
| ''(Optional)'' Whether this item can be gifted to NPCs. Default true.
| The gold price when sold by the player.
|-
|-
| 2
| <samp>CanBeTrashed</samp>
| edibility
| ''(Optional)'' Whether this item can be trashed from the player's inventory. Also affects whether the item can be shipped but not whether it can be sold to shops. Default true.
| See edibility for [[#Objects|object data]]. Always set to <samp>-300</samp> (inedible) for vanilla items.
|-
|-
| 3
| <samp>ExcludeFromRandomSale</samp>
| type and category
| ''(Optional)'' Whether to exclude this item from shops when selecting random items to sell. Default false.
| See type and category for [[#Objects|object data]]. Always set to <samp>Crafting -9</samp> for vanilla items.
|-
|-
| 4
| <samp>ExcludeFromFishingCollection</samp><br /><samp>ExcludeFromShippingCollection</samp>
| description
| ''(Optional)'' Whether to exclude this item from the fishing/shipping collection and their respective effect on the [[perfection|perfection score]]. Default false, in which case the normal requirements apply (e.g., artifacts are always excluded from the shipping collection).
| The translated item description shown in-game.
|}
|-
 
| 5
===Advanced===
| outdoors
| Whether the item can be placed outdoors (<samp>true</samp> or <samp>false</samp>).
|-
| 6
| indoors
| Whether the item can be placed indoors (<samp>true</samp> or <samp>false</samp>).
|-
| 7
| fragility
| How the item is removed by tools. Possible values:
{| class="wikitable"
{| class="wikitable"
|-
|-
! fragility
! field
! effect
! purpose
|-
| <samp>0</samp>
| Pick up with any tool.
|-
| <samp>1</samp>
| Destroyed if hit with an [[axe]], [[hoe]], or [[pickaxe]]. Any other tool will pick it up.
|-
| <samp>2</samp>
| Indestructible. The item can't be removed once placed.
|}
|-
| 8
| is lamp
| Whether the item is a lamp and produces light when it's dark. This can be <samp>true</samp> (mark as lamp) or any other value (ignored).
|-
|-
| 9
| <samp>CustomFields</samp>
| display name
| ''(Optional)'' The [[Modding:Common data field types#Custom fields|custom fields]] for this entry.  
| The translated display name (in non-English assets only).
|}
|}


===Notes===
==Unobtainable items==
* Many of the items in the data asset aren't implemented in-game. They may be completely absent from the game, or they may be unused as craftables and instead appear in [[#Objects|object data]] or [[#Furniture|furniture data]].
The spritesheet and data have items that can't normally be found in the player inventory (like twigs and lumber), and some sprites have no corresponding item data. There are also multiple entries for ''weeds'' and ''stone'' corresponding to different sprites, but the player can only normally obtain one ''stone'' item (index 390) and no ''weeds'' items.
 
==Furniture==
Furniture are decorative items which can be placed in the world, including chairs which the player can sit on.
 
They have their data in <samp>Data/Furniture</samp>, their in-game sprites in <samp>TileSheets/furniture</samp>, and their code in <samp>StardewValley.Objects.Furniture</samp>.


===Data format===
==For C# mods==
The furniture data in <samp>Data/Furniture</samp> consists of an integer→string dictionary with entries like this:
Object-type items are represented by the <samp>StardewValley.Object</samp> type.


<syntaxhighlight lang="json">
This provides many methods to simplify common logic. Some notable examples:
  "18": "Country Chair/chair/-1/-1/4/750"
</syntaxhighlight>
 
For each entry in the data asset, the key is the item's <samp>ParentSheetIndex</samp> and the value is a slash-delimited string with these fields:


{| class="wikitable"
{| class="wikitable"
|-
|-
! index
! method
! field
! effect
! effect
|-
|-
| 0
| <samp>Object.GetRadiusForScarecrow()</samp>
| name
| The tile radius that Object protects as a scarecrow. Default behavior: Checks for the value in the <samp>crow_scare_radius_{{t|radius}}</samp> [[Modding:Context tags|context tag]] if applicable, then defaults to 17 if the internal name contains "Deluxe" and 9 otherwise. Can be patched to support custom scarecrows.
| The internal item name (and display name in English).
|-
| 1
| type
| The furniture type. Possible values:
{| class="wikitable sortable"
|-
! type
! meaning
|-
| 0
| chair
|-
| 1
| bench
|-
| 2
| couch
|-
| 3
| armchair
|-
| 4
| dresser
|-
| 5
| long table
|-
| 6
| painting
|-
| 7
| lamp
|-
| 8
| decor
|-
| 9
| other
|-
| 10
| bookcase
|-
| 11
| table
|-
| 12
| rug
|-
| 13
| window
|-
| 14
| fireplace
|-
| 15
| bed
|-
| 16
| torch
|-
| 17
| sconce
|}
|-
|-
| 2
| <samp>Object.IsBar()</samp>
| tilesheet size
| Whether the item is a [[Copper Bar|copper bar]], [[Iron Bar|iron bar]], [[Gold Bar|gold bar]], [[Iridium Bar|iridium bar]], or [[Radioactive Bar|radioactive bar]].
| The furniture sprite size on the tilesheet, measured in tiles. This can be <samp>{{t|width}} {{t|height}}</samp> (e.g. <samp>1 2</samp>), or <samp>-1</samp> to use the default size for the type.
|-
|-
| 3
| <samp>Object.IsBreakableStone()</samp>
| bounding box size
| Whether the item is a stone debris item which can be broken by a pickaxe.
| The size of the hitbox when the furniture is placed in-game, measured in tiles. The bounding box will be anchored to the bottom-left corner and extend upwards and rightwards. This can be <samp>{{t|width}} {{t|height}}</samp> (e.g. <samp>1 2</samp>), or <samp>-1</samp> to use the default size for the type.
|-
|-
| 4
| <samp>Object.IsFence()</samp>
| rotations
| Whether the item is a [[Crafting#Fences|fence]].
| The number of rotations possible (1, 2, or 4).
|-
|-
| 5
| <samp>Object.IsFruitTreeSapling()</samp>
| price
| Whether the item is a [[Fruit Trees|fruit tree]] sapling. This checks the <samp>Data\fruitTrees</samp> keys, so it works with custom fruit trees too.
| The price when purchased from a shop.
|-
|-
| 6
| <samp>Object.IsHeldOverHead()</samp>
| display name
| Whether the player is shown holding up the item when it's selected in their toolbar. Default true (except for furniture).
| The translated furniture name (in non-English data assets only).
|}
 
=Hats=
This page explains how the game stores and parses hat data. This is an advanced guide for mod developers.
 
==Raw data==
Hat data is stored in <samp>Content\Data\hats.xnb</samp>, which can be [[Modding:Editing XNB files#unpacking|unpacked for editing]]. Here's the raw data as of {{version|1.5.1}} for reference:
 
{{collapse|Data|content=<syntaxhighlight lang="json">
{
  "0": "Cowboy Hat/The leather is old and cracked, but surprisingly supple. It smells musty./false/true",
  "1": "Bowler Hat/Made from smooth felt./false/true",
  "2": "Top Hat/A gentleman's classic./false/true",
  "3": "Sombrero/A festively decorated hat made from woven straw./false/true",
  "4": "Straw Hat/Light and cool, it's a farmer's delight./false/true",
  "5": "Official Cap/Looks like it belonged to a postman or policeman. Either way, it's still very soft and smells okay./false/true",
  "6": "Blue Bonnet/Harken back to simpler times with this prairie bonnet./false/true",
  "7": "Plum Chapeau/Looks alright./false/true",
  "8": "Skeleton Mask/The red eyes are glowing mysteriously./true/true",
  "9": "Goblin Mask/Freak out the neighborhood with this creepy mask. Rubber ear joints for effect./true/true",
  "10": "Chicken Mask/You'll be sure to get them grinning with this one./true/true",
  "11": "Earmuffs/Keep your ears toasty. Lined with artisanal velvet from Castle Village./true/false",
  "12": "Delicate Bow/Little pink jewels glisten as you examine it./true/false",
  "13": "Tropiclip/It's shaped like a little palm tree./true/false",
  "14": "Butterfly Bow/This one is very soft./true/false",
  "15": "Hunter's Cap/The wool lining should stay warm deep into the forest./false/true",
  "16": "Trucker Hat/Mesh in the back to keep your head cool./false/true",
  "17": "Sailor's Cap/It's fresh and starchy./false/true",
  "18": "Good Ol' Cap/A floppy old topper with a creased bill. Looks like it's been through a lot./false/true",
  "19": "Fedora/A city-slicker's standard./false/true",
  "20": "Cool Cap/It looks really faded, but it used to be a vibrant blue./false/true",
  "21": "Lucky Bow/The middle is made of solid gold./true/false",
  "22": "Polka Bow/This one's sure to be turn heads./true/false",
  "23": "Gnome's Cap/This gnome had a very large head./false/true",
  "24": "Eye Patch/You can't tell if it's real or just from a costume shop./true/true",
  "25": "Santa Hat/Celebrate the magical season./false/true",
  "26": "Tiara/This one has a big amethyst encircled by gold./true/true",
  "27": "Hard Hat/Keep your dome in one piece./false/true",
  "28": "Sou'wester/The shape helps to keep sailors dry during storms./false/true",
  "29": "Daisy/A fresh spring daisy to put in your hair./true/false",
  "30": "Watermelon Band/The color scheme was inspired by the beloved summer melon./true/false",
  "31": "Mouse Ears/Made from synthetic fibers./true/true",
  "32": "Cat Ears/Whiskers included./true/true",
  "33": "Cowgal Hat/The band is studded with fake diamonds./false/true",
  "34": "Cowpoke Hat/For dairy experts./false/true",
  "35": "Archer's Cap/Fashionable whether you're an archer or not./false/true",
  "36": "Panda Hat/A lovely panda hat./false/true",
  "37": "Blue Cowboy Hat/A denim cowboy hat in cool blue./false/true",
  "38": "Red Cowboy Hat/An eye-catching cowboy hat in red suede./false/true",
  "39": "Cone Hat/A curiosity from a distant land./false/true",
  "40": "Living Hat/It absorbs moisture from your scalp. No watering needed!/false/true",
  "41": "Emily's Magic Hat/Made with love by Emily. It's 100% organic!/false/true",
  "42": "Mushroom Cap/It smells earthy./false/true",
  "43": "Dinosaur Hat/A hat fashioned to look like a small dinosaur./false/true",
  "44": "Totem Mask/Don't worry, it won't warp your face.../true/true",
  "45": "Logo Cap/A red cap with a logo on the front./false/true",
  "46": "Wearable Dwarf Helm/A slightly larger, human sized version of the helmets worn by dwarves./hide/true",
  "47": "Fashion Hat/A fashionable hat with a feather in the brim./false/true",
  "48": "Pumpkin Mask/This must have been a pretty big pumpkin once.../hide/true",
  "49": "Hair Bone/A prehistoric version of the hair bow./true/false",
  "50": "Knight's Helmet/It looks just like the real thing!/hide/true",
  "51": "Squire's Helmet/The face is exposed to increase air flow./hide/true",
  "52": "Spotted Headscarf/A red polka-dot scarf tied around the head./hide/true",
  "53": "Beanie/A warm hat with a pretty tight fit./hide/true",
  "54": "Floppy Beanie/A warm hat with a looser fit./hide/true",
  "55": "Fishing Hat/The wide brim keeps you shaded when you're fishing on the riverbank./false/true",
  "56": "Blobfish Mask/Just as spongy as the real thing!/true/true",
  "57": "Party Hat/A goofy red hat that makes any celebration more fun./false/true",
  "58": "Party Hat/A goofy blue hat that makes any celebration more fun./false/true",
  "59": "Party Hat/A goofy green hat that makes any celebration more fun./false/true",
  "60": "Arcane Hat/The type of cowboy hat worn by a wizard./false/true",
  "61": "Chef Hat/The traditional hat worn by a head chef./hide/true",
  "62": "Pirate Hat/A captain's hat with a horrible skull on the front./false/true",
  "63": "Flat Topped Hat/An old style of hat once considered very fashionable./false/true",
  "64": "Elegant Turban/A fine black silk turban with gold trim./false/true",
  "65": "White Turban/A fine white silk turban with blue trim./false/true",
  "66": "Garbage Hat/It's a garbage can lid 'upcycled' into a hat.../false/true",
  "67": "Golden Mask/A faithful recreation of the Calico Desert relic!/true/true",
  "68": "Propeller Hat/A goofy hat with a propeller on top./false/true",
  "69": "Bridal Veil/The traditional headwear for a bride./false/true",
  "70": "Witch Hat/A pointy hat popular with witches./false/true",
  "71": "Copper Pan/You place the copper pan on your head.../false/true",
  "72": "Green Turban/A green silk turban with a gold ornament on the front./false/true",
  "73": "Magic Cowboy Hat/It's shimmering with prismatic energy/false/true/Prismatic",
  "74": "Magic Turban/It's shimmering with prismatic energy/false/true/Prismatic",
  "75": "Golden Helmet/It's half of a golden coconut./false/true",
  "76": "Deluxe Pirate Hat/Only the most infamous pirate could pull off this look./false/true",
  "77": "Pink Bow/This huge bow makes quite a statement!/true/false",
  "78": "Frog Hat/A slimy friend that lives on your dome./hide/true",
  "79": "Small Cap/It's a more aerodynamic style of cap./false/true",
  "80": "Bluebird Mask/Wear this to look just like your favorite island trader./hide/true",
  "81": "Deluxe Cowboy Hat/A cowboy hat with a more extreme shape./false/true",
  "82": "Mr. Qi's Hat/A replica of Mr. Qi's iconic hat./false/true",
  "83": "Dark Cowboy Hat/A cowboy hat in fashionable black./false/true",
  "84": "Radioactive Goggles/Doesn't actually provide any protection from radiation./true/true",
  "85": "Swashbuckler Hat/The classic swashbuckler look./false/true",
  "86": "Qi Mask/???/hide/true",
  "87": "Star Helmet/A red hat with stars on it./false/true",
  "88": "Sunglasses/These give you a relaxed look./true/true",
  "89": "Goggles/These will make you look very safe./true/true",
  "90": "Forager's Hat/It's a forager's delight./false/true",
  "91": "Tiger Hat/Makes you look like a beautiful tiger./hide/true",
  "92": "???/???/hide/true",
  "93": "Warrior Helmet/An Ostrich eggshell repurposed into a helmet./false/true"
}
</syntaxhighlight>}}
 
==Format==
 
Hats have a hard-coded category of -95 (<samp>Hats.cs::Load</samp>)
{| class="wikitable"
|-
|-
! Index
| <samp>Object.IsIncubator()</samp>
! Field
| Whether the item can incubate [[Animals|farm animal]] eggs when placed in a building.
! Example Value
|-
|-
| 0
| <samp>Object.IsScarecrow()</samp>
| Name
| Whether the item is a scarecrow. Default: <samp>true</samp> if the object has the <samp>crow_scare</samp> [[Modding:Context_tags|context tag]]. Otherwise, returns whether the object's internal name contains "arecrow". Can be patched to support custom scarecrows.
| ''Trucker Hat''
|-
|-
| 1
| <samp>Object.IsTapper()</samp>
| Description
| Whether the item is a [[Tapper|tapper]] or [[Heavy Tapper|heavy tapper]].
| ''Mesh in the back to keep your head cool.''
|-
|-
| 2
| <samp>Object.IsTeaSapling()</samp>
| skipHairDraw
| Whether the item is a [[Tea Sapling|tea sapling]].
| ''false''
|-
|-
| 3
| <samp>Object.IsTwig()</samp>
| ignoreHairstyleOffset
| Whether the item is a twig debris item.
| ''true''
|-
|-
| 4
| <samp>Object.IsWeeds()</samp>
| Name (for language files other than English)
| Whether the item is a weed debris item.
| ''Truckerhut''
|}
|}
If skipHairDraw is "true", then the game will not change the character's hairstyle when they put on the hat.  If set to "false", the player's hairstyle may change when they put on the hat.
If ignoreHairstyleOffset is set to "true", it means that the game will position the hat regardless of the hairstyle your character has. For instance, for a hat such as the Butterfly Bow, you will want to have it set to "false" so that the bow will adjust position to be attached to your character's chosen hairstyle. However, for something like the Eye Patch, that should be kept in the same position on your character's head no matter what hair you have chosen, so it should be set to "true".


==See also==
==See also==
* [[Modding:Index]] for related content like [[Modding:Crop data|crops]], [[Modding:Fish data|fish]], [[Modding:Gift taste data|gift tastes]], and [[Modding:Recipe data|recipes]]
* [[Modding:Items]] for item data in general


[[Category:Modding]]
[[Category:Modding]]


[[ru:Модификации:Объекты]]
[[ru:Модификации:Объекты]]
[[zh:模组:物体]]

Latest revision as of 10:59, 8 August 2026

← Items

This page explains how the game stores and parses object-type item data. For items in general, see Modding:Items.

Overview

Objects are the default type for items in inventories or in the world. Depending on their data, they can be placed, picked up, eaten, sold to shops, etc.

They have item type (O) (or ItemRegistry.type_object in C# code), their data in Data/Objects, their icon sprites in Maps/springobjects or TileSheets/Objects_2 by default, and their code in StardewValley.Object. See a table of sprites and their corresponding indexes.

Data format

The object data in Data/Objects consists of a string → model lookup, where...

  • The key is the unqualified item ID.
  • The value is a model with the fields listed below.

Basic info

field purpose
Name The internal item name.
DisplayName
Description
A tokenizable string for the item's in-game display name and description.
Type The item's general type, like Arch (artifact) or Minerals. The vanilla types are: Basic, Arch (artifact), Litter (e.g. debris), Minerals, Quest, Crafting, Fish, Cooking, Seeds, Ring, interactive, and some placeholder values like asdf.

Caution: adding custom items with the Arch type is inadvisable as it often leads to artifact spots becoming broken and not giving any items.

Note: The "Type" affects whether an item shows up in the collections menu. For example, items with Type: Cooking will show up as silhouettes in the cooked items collection menu, items with Type: Minerals will show up as silhouettes in the mineral collection menu, etc. However, the Category of the item must also be the correct number or the item will not count toward Perfection/Achievements. For example, if an item has Type: Cooking, it must also be "Category": -7 in order to count toward the "Gourmet Chef" achievement and Perfection.

Category The item category.
Price (Optional) The price when sold by the player. This is not the price when bought from a shop. Default 0.

Appearance

field purpose
Texture The asset name for the texture containing the item's sprite. Defaults to Maps/springobjects.
SpriteIndex The sprite's index within the Texture, where 0 is the top-left sprite.
ColorOverlayFromNextIndex (Optional) When drawn as a colored object, whether to apply the color to the next sprite in the spritesheet and draw that over the main sprite. If false, the color is applied to the main sprite instead. Default false.

Edibility

field purpose
Edibility (Optional) A numeric value that determines how much energy (edibility × 2.5) and health (edibility × 1.125) is restored when this item is eaten. An item with an edibility of -300 can't be eaten, values from -299 to -1 reduce health and energy, and zero can be eaten but doesn't change health/energy. Default -300.
IsDrink (Optional) Whether to drink the item instead of eating it. Default false.
Buffs (Optional) The buffs to apply to the player when this item is eaten, if any. Default none.

This consists of a list of models with these fields:

field purpose
Id The unique string ID for this entry within the list.
Duration (Optional if BuffId is set) The buff duration measured in in-game minutes. This can be set to -2 for a buff that should last for the rest of the day.
BuffId (Optional) The unique ID of a buff from Data/Buffs to apply, or null to ignore Data/Buffs and set the ID to food or drink depending on the item's IsDrink field.

If a buff from Data/Buffs is applied and you also specify other fields, here's how the buff data is combined:

field result
Duration
IconTexture
IconSpriteIndex
GlowColor
If specified, the value in Data/Objects is used instead of the one in Data/Buffs. If omitted, defaults to the value from Data/Buffs.
CustomAttributes The values from both entries are combined (e.g. +1 speed in Data/Objects and +1 speed in Data/Buffs results in +2 speed).
IsDebuff The value in Data/Objects is used.
IsDebuff (Optional) Whether this buff counts as a debuff, so its duration should be halved when wearing a Sturdy Ring. Default false.
IconTexture (Optional) The asset name for the icon texture to load. This must contain one or more 16x16 icons in a grid of any size. If omitted, the game will draw a default icon based on the BuffId and CustomAttributes fields.
IconSpriteIndex (Optional) The buff's icon index within the IconTexture, where 0 is the top-left icon. Default 0.
GlowColor (Optional) The glow color to apply to the player. See color format. Default none.
CustomAttributes The custom buff attributes to apply, if any.

This consists of a model with any combination of these fields:

field purpose
CombatLevel
FarmingLevel
FishingLevel
ForagingLevel
LuckLevel
MiningLevel
(Optional) An amount applied to the matching skill level while the buff is active. This can be negative for a debuff. Default 0.
Attack
AttackMultiplier
CriticalChanceMultiplier
CriticalPowerMultiplier
Defense
Immunity
KnockbackMultiplier
MagneticRadius
MaxStamina
Speed
WeaponPrecisionMultiplier
WeaponSpeedMultiplier
(Optional) An amount applied to the player's attack, critical chance and critical power, defense, immunity, knockback (i.e. weight), magnetic radius, maximum stamina, speed, or weapon precision/speed while the buff is active. This can be negative for a debuff. Default 0.
CustomFields (Optional) The custom fields for this entry.

Geodes & artifact spots

field purpose
GeodeDrops
GeodeDropsDefaultItems
(Optional) The items that can be dropped when breaking open this item as a geode. Specifying either or both fields automatically enables geode behavior for this item.

You can specify one or both fields:

  • GeodeDrops can be set to the specific items to drop. Default none. This consists of a list of models with these fields:
    field purpose
    common fields See item spawn fields for the generic item fields supported by geode drops.

    If set to an item query which returns multiple items, one of them will be selected at random.

    Chance (Optional) The probability that the item will be dropped if the other fields match, as a decimal value between 0 (never) and 1 (always). Default 1.
    SetFlagOnPickup (Optional) The mail flag to set for the current player when this drop is picked up.
    Precedence (Optional) The order in which this entry should be checked, where lower values are checked first. This can be a negative value. Geode drops with the same precedence are checked in the order listed. Default 0.

    For consistency, vanilla drops mostly use these values:

    • -1000: special overrides like the golden helmet;
    • 0: normal items.
  • GeodeDropsDefaultItems chooses a predefined list of possible geode drops like clay, coal, copper, iridium, etc. Default false.

If both fields are specified, each geode will choose between them with an equal 50% chance. If GeodeDrops is specified but no entries match, the geode will use the GeodeDropsDefaultItems regardless of whether it's true.

ArtifactSpotChances (Optional) If this is an artifact (i.e. the Type field is Arch), the chance that it can be found by digging artifact spots in each location.

This consists of a string → model lookup, where:

  • the key is the internal location name;
  • the value is the probability the item will spawn if checked, as a decimal value between 0 (never) and 1 (always).

Context tags & exclusions

field purpose
ContextTags (Optional) The custom context tags to add for this item (in addition to the tags added automatically based on the other object data). This is formatted as a list; for example:
"ContextTags": [ "color_yellow", "fish_ocean", "fish_upright", "season_summer" ]
CanBeGivenAsGift (Optional) Whether this item can be gifted to NPCs. Default true.
CanBeTrashed (Optional) Whether this item can be trashed from the player's inventory. Also affects whether the item can be shipped but not whether it can be sold to shops. Default true.
ExcludeFromRandomSale (Optional) Whether to exclude this item from shops when selecting random items to sell. Default false.
ExcludeFromFishingCollection
ExcludeFromShippingCollection
(Optional) Whether to exclude this item from the fishing/shipping collection and their respective effect on the perfection score. Default false, in which case the normal requirements apply (e.g., artifacts are always excluded from the shipping collection).

Advanced

field purpose
CustomFields (Optional) The custom fields for this entry.

Unobtainable items

The spritesheet and data have items that can't normally be found in the player inventory (like twigs and lumber), and some sprites have no corresponding item data. There are also multiple entries for weeds and stone corresponding to different sprites, but the player can only normally obtain one stone item (index 390) and no weeds items.

For C# mods

Object-type items are represented by the StardewValley.Object type.

This provides many methods to simplify common logic. Some notable examples:

method effect
Object.GetRadiusForScarecrow() The tile radius that Object protects as a scarecrow. Default behavior: Checks for the value in the crow_scare_radius_<radius> context tag if applicable, then defaults to 17 if the internal name contains "Deluxe" and 9 otherwise. Can be patched to support custom scarecrows.
Object.IsBar() Whether the item is a copper bar, iron bar, gold bar, iridium bar, or radioactive bar.
Object.IsBreakableStone() Whether the item is a stone debris item which can be broken by a pickaxe.
Object.IsFence() Whether the item is a fence.
Object.IsFruitTreeSapling() Whether the item is a fruit tree sapling. This checks the Data\fruitTrees keys, so it works with custom fruit trees too.
Object.IsHeldOverHead() Whether the player is shown holding up the item when it's selected in their toolbar. Default true (except for furniture).
Object.IsIncubator() Whether the item can incubate farm animal eggs when placed in a building.
Object.IsScarecrow() Whether the item is a scarecrow. Default: true if the object has the crow_scare context tag. Otherwise, returns whether the object's internal name contains "arecrow". Can be patched to support custom scarecrows.
Object.IsTapper() Whether the item is a tapper or heavy tapper.
Object.IsTeaSapling() Whether the item is a tea sapling.
Object.IsTwig() Whether the item is a twig debris item.
Object.IsWeeds() Whether the item is a weed debris item.

See also