Jump to content

Modding:Migrate to Stardew Valley 1.6.16: Difference between revisions

From Stardew Valley Wiki
imported>Pathoschild
→Context tag changes: add behavior column; + edibility tags
imported>Spacechase0
→Game state query changes: Added `IS_GREEN_RAIN_DAY` GSQ change.
 
(107 intermediate revisions by 3 users not shown)
Line 40: Line 40:


==Data asset changes==
==Data asset changes==
===New <samp>Id</samp> fields===
Stardew Valley 1.6.16 adds <samp>Id</samp> fields for all data models which didn't have one, so content packs can easily edit them.
This affects...
{| class="wikitable"
|-
! asset
! added to fields
|-
| <samp>Data/Buildings</samp>
| <samp>AdditionalPlacementTiles</samp>.
|-
| <samp>Data/HomeRenovations</samp>
| <samp>RectGroups</samp>;<br /><samp>RectGroups</samp> → <samp>Rects</samp>;<br /><samp>RenovateActions</samp>;<br /><samp>Requirements</samp>.
|-
| <samp>Data/Machines</samp>
| <samp>AdditionalConsumedItems</samp>.
|-
| <samp>Data/MuseumRewards</samp>
| <samp>TargetContextTags</samp>.
|-
| <samp>Data/Pets</samp>
| <samp>Behaviors</samp>;<br /><samp>Behaviors</samp> → <samp>AnimationEndBehaviorChanges</samp>;<br /><samp>Behaviors</samp> → <samp>PlayerNearbyBehaviorChanges</samp>;<br /><samp>Behaviors</samp> → <samp>TimeoutBehaviorChanges</samp>.
|-
| <samp>Data/Shops</samp>
| <samp>VisualTheme</samp>.
|-
| <samp>Data/SpecialOrders</samp>
| <samp>Objectives</samp>;<br /><samp>RandomizedElements</samp>;<br /><samp>RandomizedElements</samp> → <samp>Values</samp>;<br /><samp>Rewards</samp>.
|-
| <samp>Data/Tools</samp>
| <samp>UpgradeFrom</samp>.
|-
| <samp>Data/WildTrees</samp>
| <samp>Textures</samp>.
|}
===[[Modding:Wallpaper and flooring|<samp>Data/AdditionalWallpaperFlooring</samp>]]===
* The <samp>Texture</samp> asset no longer needs to be exactly 256 pixels wide.
===[[Modding:Achievement data|<samp>Data/Achievements</samp>]]===
===[[Modding:Achievement data|<samp>Data/Achievements</samp>]]===
This has been overhauled into a data model asset, with...
This has been overhauled into a data model asset, with...
Line 91: Line 131:
| <samp>CustomFields</samp>
| <samp>CustomFields</samp>
| ''(Optional)'' The [[Modding:Common data field types#Custom fields|custom fields]] for this entry.
| ''(Optional)'' The [[Modding:Common data field types#Custom fields|custom fields]] for this entry.
|}
===[[Modding:Big craftables|<samp>Data/BigCraftables</samp>]]===
Added one new field:
{| class="wikitable"
|-
! field
! effect
|-
| <samp>CanFlipSpriteWhenPlaced</samp>
| ''(Optional)'' Whether the object has a 50% chance to horizontally flip its sprite when placed to improve visual diversity. Default false.
|}
|}


Line 108: Line 159:


This can be an [[Modding:Audio|audio cue ID]], an empty string (<code>""</code>) for no sound, or omitted for the default sound. If omitted, the NPC plays the default <samp>Cowboy_Footstep</samp> sound.
This can be an [[Modding:Audio|audio cue ID]], an empty string (<code>""</code>) for no sound, or omitted for the default sound. If omitted, the NPC plays the default <samp>Cowboy_Footstep</samp> sound.
|-
| <samp>ForceOneTileWide</samp>
| ''(Optional)'' Whether the character should be one tile wide for the purposes of collisions and positioning, regardless of their sprite size. Default false.
|-
|-
| <samp>KissSpriteIndexWhenFlipped</samp>
| <samp>KissSpriteIndexWhenFlipped</samp>
Line 113: Line 167:


This is assumed to be facing left, unless <samp>KissSpriteFacingRight</samp> is false.
This is assumed to be facing left, unless <samp>KissSpriteFacingRight</samp> is false.
|-
| <samp>SpawnAsEphemeral</samp>
| ''(Optional)'' Whether the [[#Ephemeral characters|character is ephemeral]] when spawned automatically (e.g. via the <samp>SpawnIfNeeded</samp> field), so they're removed automatically before save and before the day ends. This doesn't affect NPCs which are already spawned, or which are spawned directly in game or mod code. Default false.
|}
|}
</li>
</li>
<li>The <samp>LoveInterest</samp> field now affects [[Flower Dance]] dance partner selection.</li>
</ul>
</ul>


Line 152: Line 210:
* The <samp>MaxPopulation</samp> field is no longer limited to a maximum of 10.
* The <samp>MaxPopulation</samp> field is no longer limited to a maximum of 10.


===[[Modding:Lost items shop|<samp>Data/LostItemsShop</samp>]]===
===[[Modding:Giant crops|<samp>Data/GiantCrops</samp>]]===
Added one new field:
In the <samp>HarvestItems</samp> list, added one new field:
{| class="wikitable"
{| class="wikitable"
|-
|-
Line 159: Line 217:
! effect
! effect
|-
|-
| <samp>RequireCondition</samp>
| <samp>ActionsOnDrop</samp>
| ''(Optional)'' The [[Modding:Game state queries|game state queries]] which must match to add this item. The <samp>Target</samp> player is the one being checked.
| ''(Optional)'' The [[Modding:Trigger actions|actions]] to run when the item is dropped. The actions are run once per entry drop. Default none.
 
|}
This field should generally only be used with deterministic game state queries.
 
===[[Modding:Lost items shop|<samp>Data/LostItemsShop</samp>]]===
Added one new field:
{| class="wikitable"
|-
! field
! effect
|-
| <samp>RequireCondition</samp>
| ''(Optional)'' The [[Modding:Game state queries|game state queries]] which must match to add this item. The <samp>Target</samp> player is the one being checked.
 
This field should generally only be used with deterministic game state queries.
|}
|}


If you specify multiple criteria fields, only one is applied in this order: <samp>RequireMailReceived</samp>, then <samp>RequireEventSeen</samp>, then <samp>RequireCondition</samp>.
If you specify multiple criteria fields, only one is applied in this order: <samp>RequireMailReceived</samp>, then <samp>RequireEventSeen</samp>, then <samp>RequireCondition</samp>.
===[[Modding:Objects|<samp>Data/Objects</samp>]]===
Added one new field:
{| class="wikitable"
|-
! field
! effect
|-
| <samp>CanFlipSpriteWhenPlaced</samp>
| ''(Optional)'' Whether the object has a 50% chance to horizontally flip its sprite when placed to improve visual diversity. Default false.
|}


===[[Modding:Passive Festival data|<samp>Data/PassiveFestivals</samp>]]===
===[[Modding:Passive Festival data|<samp>Data/PassiveFestivals</samp>]]===
Line 180: Line 260:
===[[Modding:Special orders|<samp>Data/SpecialOrders</samp>]]===
===[[Modding:Special orders|<samp>Data/SpecialOrders</samp>]]===
<ul>
<ul>
<li>Added one new field:
<li>Added new fields:
{| class="wikitable"
{| class="wikitable"
|-
|-
Line 188: Line 268:
| <samp>CanBeCancelled</samp>
| <samp>CanBeCancelled</samp>
| ''(Optional)'' Whether the special order can be cancelled. In multiplayer, any player cancelling the special order will remove it for all players. Default false.
| ''(Optional)'' Whether the special order can be cancelled. In multiplayer, any player cancelling the special order will remove it for all players. Default false.
|-
| <samp>ActionsOnReward</samp>
| ''(Optional)'' A list of [[Modding:Trigger actions|trigger actions]] to run when the special order is completed. These are run locally for each player. This field accepts [[Modding:Special orders#Randomized Elements|special order tokens]].
For example:
<syntaxhighlight lang="js">
"ActionsOnReward": [
    "AddMail Current {{ModId}}_MailId Received",
    "MarkCookingRecipeKnown Current Hopper"
]
</syntaxhighlight>
You should usually prefer <samp>ActionsOnReward</samp> instead of <samp>Rewards</samp>, ''except'' that the <samp>Gems</samp> (Qi board only), <samp>Object</samp> (town board only), or <samp>Money</samp> reward types are drawn in the special order board UI.
|}
|}


Line 212: Line 305:
|}
|}


===[[Modding:Weapons|<samp>Data/Weapons</samp>]]===
===[[Modding:Trinkets|<samp>Data/Trinkets</samp>]]===
Added one field:
Added one field:
{| class="wikitable"
{| class="wikitable"
Line 223: Line 316:
|}
|}


==Changes for all mod authors==
===[[Modding:Weapons|<samp>Data/Weapons</samp>]]===
===Cache changes===
Added one field:
Stardew Valley 1.6.16 adds [[#TickCache|internal caching]] to improve performance.
 
That means there might be a small delay between editing certain data, and updating entities which ''already loaded the data''. (This has no effect on new entities, so there's no issue with things like editing NPC data right before the NPC is spawned.)
 
This affects:
{| class="wikitable"
{| class="wikitable"
|-
|-
! entity type
! field
! data cache time
! effect
|-
|-
| fence
| <samp>ContextTags</samp>
| 30 seconds
| ''(Optional)'' The custom [[Modding:Context tags|context tags]] to add for this item (in addition to the tags added automatically based on the other item data), specified as an array.
|}
 
==Changes for all mod authors==
===Cache changes===
Stardew Valley 1.6.16 adds [[#TickCache|internal]] [[#DataCache|caching]] to improve performance. Typically the relevant caches will be reset right away.
 
Some entities have been changed to take advantage of this, which may impact some mods.
 
{| class="wikitable"
|-
|-
| machine object
! entity type
| 1 second
! field
! effect
! technical notes
|-
|-
| NPC
| Items
| 1 second
| Sprite index
| If <samp>SpriteIndex</samp> in the data asset is changed, existing items will be updated to match (unless something else has overridden it for that existing item, such as certain big craftables changing appearance based on the season).
| Items in existing saves will be updated for this when loaded in 1.6.16, assuming their sprite index matches the data asset value.
 
The <samp>parentSheetIndex</samp> netfield will have a value of -1 when the data asset value should be used. The <samp>ParentSheetIndex</samp> property will have the "effective" <samp>parentSheetIndex</samp> (meaning that if the netfield has -1, it will return the data asset value).
 
The value from the data asset can easily retrieved from the <samp>DataParentSheetIndex</samp> propery.
|}
|}


Line 261: Line 366:
Note that the vanilla scythes are <samp>melee_weapon</samp>. See also the <samp>is_scythe</samp> context tag below.
Note that the vanilla scythes are <samp>melee_weapon</samp>. See also the <samp>is_scythe</samp> context tag below.
|-
|-
| <samp>is_edible</samp><br /><samp>is_edible_healing</samp><br /><samp>is_edible_poisonous</samp>
| <samp>is_edible</samp><br /><samp>is_edible_bad</samp><br /><samp>is_edible_good</samp>
| [[Modding:Objects|objects]]
| [[Modding:Objects|objects]]
| informational
| informational
| Indicates the item can be eaten/drunk.
| Indicates the item can be eaten/drunk.


This is set automatically based on the item's <samp>edibility</samp> value:
This is set automatically based on the item's [[Modding:Objects#Edibility|<samp>edibility</samp> value]]:
* -299 to -1: <code>is_edible is_edible_poisonous</code>;
* -299 to -1: <code>is_edible is_edible_bad</code>;
* 0: <code>is_edible</code>;
* 0: <code>is_edible</code>;
* 1+: <code>is_edible is_edible_healing</code>.
* 1+: <code>is_edible is_edible_good</code>.
|-
|-
| <samp>fish_skip_minigame</samp>
| <samp>fish_skip_minigame</samp>
Line 290: Line 395:
| functional
| functional
| Whether butterflies spawn around this furniture, similar to the [[Butterfly Hutch|butterfly hutch]].
| Whether butterflies spawn around this furniture, similar to the [[Butterfly Hutch|butterfly hutch]].
|-
| <samp>exclude_from_furniture_catalogue</samp>
| [[Modding:Furniture|furniture]]
| functional
| Prevents the furniture from showing up in the furniture catalogue
|-
|-
| <samp>trash_bear_ignore</samp>
| <samp>trash_bear_ignore</samp>
Line 309: Line 419:
! command
! command
! description
! description
|-
| <samp>giantCrop {{t|id}} {{o|x}} {{o|y}}</samp>
| Place the specified [[Modding:Giant crops|giant crop ID]] at the given tile position. The ID is case-insensitive, and will list fuzzy matches if an exact match isn't found. If the position isn't specified, it'll be placed just to the right of the farmer.
|-
|-
| <samp>heldItem</samp>
| <samp>heldItem</samp>
Line 326: Line 439:
| Places a warp at the player's position (adjusted by the amount of tiles indicated by {{o|positionOffsetX}} and {{o|positionOffsetY}}, if specified) leading to ({{t|targetTileX}}, {{t|targetTileY}}) in {{t|targetLocation}}. If the player is touching the resulting warp (such as if no offset was specified), they are immediately warped.
| Places a warp at the player's position (adjusted by the amount of tiles indicated by {{o|positionOffsetX}} and {{o|positionOffsetY}}, if specified) leading to ({{t|targetTileX}}, {{t|targetTileY}}) in {{t|targetLocation}}. If the player is touching the resulting warp (such as if no offset was specified), they are immediately warped.
This warp does not persist across saves, and may disappear at any time based on other game code.
This warp does not persist across saves, and may disappear at any time based on other game code.
|-
| <samp>currency {{t|currencyType}} {{t|amount}}</samp>
| Gives yourself {{t|amount}} of the specified currency type. Valid currency types are:
{| class="wikitable"
|-
! currency ID
! name
|-
| <samp>0</samp>
| {{Price|0}}
|-
| <samp>1</samp>
| {{Price|0|Token}}
|-
| <samp>2</samp>
| {{Price|0|Qi}}
|-
| <samp>4</samp>
| {{Price|0|Gem}}
|}
|-
| <samp>printEvent </samp>
| If there is an event currently running, prints the event ID and current event command.
|}</li>
|}</li>
<li>Improved existing commands:
<li>Improved existing commands:
Line 335: Line 471:
| <samp>achieve</samp><br /><samp>achievement</samp>
| <samp>achieve</samp><br /><samp>achievement</samp>
| Merged <code>achieve {{t|ID}}</code> (unlock platform achievement) and <code>achievement {{t|ID}}</code> (unlock in-game achievement) into one command that unlocks both automatically based on the [[#Data/Achievements|achievement data]]. The <samp>achieve</samp> command is now just an alias for <samp>achievement</samp>.
| Merged <code>achieve {{t|ID}}</code> (unlock platform achievement) and <code>achievement {{t|ID}}</code> (unlock in-game achievement) into one command that unlocks both automatically based on the [[#Data/Achievements|achievement data]]. The <samp>achieve</samp> command is now just an alias for <samp>achievement</samp>.
|-
| <samp>addAllCrafting</samp>
| No longer fails if the player already knows some of the crafting recipes.
|-
|-
| <samp>animalInfo</samp><br /><samp>characterInfo</samp><br /><samp>daysPlayed</samp><br /><samp>gamepad</samp>
| <samp>animalInfo</samp><br /><samp>characterInfo</samp><br /><samp>daysPlayed</samp><br /><samp>gamepad</samp>
| Now shows output in the console instead of showing a HUD notification.
| Now shows output in the console instead of showing a HUD notification.
|-
| <samp>cookingRecipe</samp><br /><samp>craftingRecipe</samp>
| No longer throws an exception if the player already knows the recipe.
|-
| <samp>dye</samp>
| Now accepts any [[Modding:Common data field types#Color|standard color value]].
|-
| <samp>experience</samp>
| Fixed validation errors for the 'skill' argument never logged correctly.
|-
| <samp>fuzzyItemNamed</samp>
| Now drops multiple items if the requested count exceeds the item's max stack size.
|-
| <samp>gameQuery</samp>
| Can now be used with queries which check an item; the <samp>Input</samp> and <samp>Target</samp> item are now the item selected on the player's toolbar.
|-
|-
| <samp>jump</samp>
| <samp>jump</samp>
Line 344: Line 498:
| <samp>perfection</samp>
| <samp>perfection</samp>
| Fixed error when run on a save which already has some requirements partly met.
| Fixed error when run on a save which already has some requirements partly met.
|-
| <samp>setupBigFarm</samp>
| &#32;
* No longer fails if some of the crops, flooring, fruit trees, or grass can't be placed because the tile is occupied.
* No longer fails if a building on the farm no longer has data.
|-
| <samp>slimecraft</samp>
| No longer fails if you already have one or both recipes.
|-
|-
| <samp>toggleTimingOverlay</samp>
| <samp>toggleTimingOverlay</samp>
Line 520: Line 682:
<li>Fixed <samp>$r</samp> response IDs not tracked correctly if you reuse an NPC reaction key across multiple <samp>$r</samp> options.</li>
<li>Fixed <samp>$r</samp> response IDs not tracked correctly if you reuse an NPC reaction key across multiple <samp>$r</samp> options.</li>
</ul>
</ul>
See also [[#Other translation changes|''other translation changes'']].
===Ephemeral characters===
You can now mark a character or farm animal as ''ephemeral'' (via [[#Data/Characters|<samp>SpawnAsEphemeral</samp> in <samp>Data/Characters</samp>]] or <samp>character.IsEphemeral</samp> in C#), which means they'll be removed automatically before saving and before the day ends. This works for any character in the <samp>characters</samp> or <samp>animals</samp> location fields.
In particular, this allows adding custom classes to the world since they're guaranteed to be removed before the game saves. Ephemeral characters are still synchronized in multiplayer. If a monster is ephemeral, any monsters it spawns will inherit its ephemerality (e.g. slimes spawned by a big slime).
In the base game, this replaces the previous custom logic which managed...
* [[Junimo Hut|farm Junimos]];
* community center Junimos;
* Marnie's cows (which are now in the standard <samp>gameLocation.animals</samp> field);
* [[Morris]] and the [[Old Mariner]];
* [[Movie Theater|movie theater]] patrons;
* monsters on the farm, island farm, [[Secret Woods|secret woods]], [[Secrets#Dove Children|witch's hut]], and [[Witch's Swamp|witch's swamp]];
* and [[SquidFest]] + [[Trout Derby]] contestants.


===[[Modding:Event data|Event]] changes===
===[[Modding:Event data|Event]] changes===
Line 564: Line 742:


The [[#Deprecated commands|fork-related event commands are deprecated]].
The [[#Deprecated commands|fork-related event commands are deprecated]].
====Removed manual event pause management====
When a dialogue or menu is shown, or certain animations are playing, the event needs to pause until they finish. How that works changed:
{| class="wikitable"
|-
! version
! behavior
|-
| &lt;1.6.16
| The event was paused using a combination of the <samp>null</samp> command (which pauses the event indefinitely), manually incrementing <samp>event.CurrentCommand</samp> (sometimes incremented twice to skip the <samp>null</samp>), and special handling in command logic while a menu was open. This was tricky and led to many edge cases in both the base game and mods (e.g. soft locks if a <samp>null</samp> command didn't get skipped correctly, other commands getting skipped unintentionally, commands not working correctly if a menu was opened, etc).
|-
| ≥1.6.16
| This is much simpler in 1.6.16+:
* Events now pause automatically while any menu is up, and resume once it's closed. That guarantees that no menu is open when a command handler is called.
* Characters/players add an entry to <samp>event.PauseWhile</samp> to pause the event until they finish certain animations (e.g. showing an emote or holding up an item).
This means that <samp>null</samp> commands and extra <samp>event.CurrentCommand</samp> increments are no longer needed in most cases.
|}
Update note for mod events:
* You no longer need a <samp>null</samp> command after <samp>awardFestivalPrize</samp> or <samp>itemAboveHead</samp>. (For backwards compatibility, the game will ignore a <samp>null</samp> command immediately after either of those.)
'''Breaking changes for custom commands added by C# mods:'''
* The game no longer auto-increments <samp>event.CurrentCommand</samp> when closing dialogues, certain menus (<samp>ItemGrabMenu</samp>, <samp>ItemListMenu</samp>, <samp>MenuWithInventory</samp>, <samp>ReadyCheckDialog</samp>, and <samp>TutorialMenu</samp>), or methods which open them (like <samp>Game1.drawDialogue</samp>, <samp>Game1.drawDialogueNoTyping</samp>, <samp>Game1.drawObjectDialogue</samp>, and <samp>Game1.multipleDialogues</samp>). Custom commands which open one of those must now increment <samp>event.CurrentCommand</samp> like any other command.
* When a menu is opened, no further command will run until it's closed. Event updates still happen (e.g. NPCs will continue moves they already started), but command logic which checks if a menu is open will never work.


====Precondition slash now required for numeric event IDs====
====Precondition slash now required for numeric event IDs====
Line 573: Line 777:
|-
|-
! event key format
! event key format
! behavior in 1.6.15
! behavior
! &rarr;
|-
! behavior in 1.6.16
| <samp>{{t|id}}</samp><br /><small>(string ID)</small>
| manual script (unchanged)
|-
|-
| <samp>{{t|id}}</samp>
| <samp>{{t|id}}</samp><br /><small>(numeric ID)</small>
| event if numeric, else manual script
| event (1.6.15) → manual script (1.6.16)
| &rarr;
| manual script
|-
|-
| <samp>{{t|id}}/{{o|preconditions}}</samp>
| <samp>{{t|id}}/{{o|preconditions}}</samp>
| event
| event (unchanged)
| &rarr;
| event
|}
|}


Line 707: Line 908:


'''Note:''' you can't use <samp>end</samp> as a label name, since that automatically matches the <samp>end</samp> event command.
'''Note:''' you can't use <samp>end</samp> as a label name, since that automatically matches the <samp>end</samp> event command.
|-
| <samp>removeSpriteById</samp>
| Remove a temporary animated sprite (e.g. added via the <samp>temporaryAnimatedSprite</samp> command) using its ID.
|}
|}


Line 720: Line 924:
| <samp>move</samp>
| <samp>move</samp>
| Fixed event softlock if it only applies to missing optional NPCs.
| Fixed event softlock if it only applies to missing optional NPCs.
|-
| <samp>removeSprite</samp>
| Renamed to <samp>removeSpriteAt</samp>. The old name still works as an alias.
|-
|-
| <samp>skippable</samp>
| <samp>skippable</samp>
Line 750: Line 957:
| <samp>spriteText</samp>
| <samp>spriteText</samp>
| The {{o|text}} argument can now be a [[Modding:Common data field types#Translation key|translation key]] to get the text from.
| The {{o|text}} argument can now be a [[Modding:Common data field types#Translation key|translation key]] to get the text from.
|}
|-
 
| <samp>temporaryAnimatedSprite</samp>
====Deprecated commands====
|
These event commands are deprecated. '''They still work just like before''' (except the ones at the bottom of the table), but if you use the [[#EventValidator|<samp>EventValidator</samp>]] it'll report them as an error.
<ul>
<li>The position (index 8) and scale (index 14) fields are no longer restricted to integer values. (This applies to both forms of the command.)</li>
<li>Added more flag options:


{| class="wikitable"
{| class="wikitable"
|-
|-
! event command
! flag
! migration
! effect
|-
| <samp>id {{t|int id}}</samp>
| A unique ID for this sprite. Default none.
 
This can be passed to other event commands (like <samp>removeSpriteById</samp>) or flags (like <samp>parent_sprite</samp>).
|-
|-
| <samp>fork</samp><br /><samp>resetVariable</samp><br /><samp>switchEvent</samp>
| <samp>alpha</samp>
| Use the <samp>choose</samp> or <samp>goto</samp> commands instead. If you used dialogue containing the <samp>%fork</samp> token, it should be removed and replaced with equivalent event commands.
| The sprite's transparency, as a value between <samp>0</samp> (transparent) and <samp>1</samp> (opaque). Default 1.
|-
|-
| <samp>question forkX</samp>
| <samp>stop_accelerating_when_velocity_is_zero</samp>
| Use the <samp>choose</samp> command instead, and replace the event fork with a label.
| When the current motion passes zero, whether to (a) set the X/Y accelerations to zero and (b) apply the <samp>after_accel_stop_motion_[x&#124;y]</samp> options. Default false.


For example, this script:
This is used for item-above-head sprites.
<pre>
|-
// main event
| <samp>after_accel_stop_motion_x {{t|float x}}</samp><br /><samp>after_accel_stop_motion_y {{t|float y}}</samp>
question fork1 "#I believe in you!#Wow, you're really arrogant."/
| The motion value to set when <samp>stop_accelerating_when_velocity_is_zero</samp> is triggered. Default 0.
fork arrogant/
|-
speak Alex "Thanks, @. I'll remember that."/
| <samp>x_stop_coordinate {{t|float x}}</samp><br /><samp>y_stop_coordinate {{t|float y}}</samp>
...
| If set, the target coordinate at which motion and acceleration on that axis stop. The sprite will keep moving normally until it reaches or passes that coordinate. Default -1 (disabled).
|-
| <samp>firework_type {{t|int type}}</samp>
| If set, adds the [[fireworks]] glows and (when the animation completes) explosion for the sprite. The possible types are <samp>0</samp> (red), <samp>1</samp> (blue), <samp>2</samp> (green). Default none.


// 'arrogant' event
Requires the <samp>set_owner</samp> and <samp>set_location</samp> flags.
emote Alex 12/
|-
speak Alex "Hmmph... I think someone's a little jealous.$a"/
| <samp>vertical_flipped</samp>
</pre>
| If set, mirror the sprite vertically (i.e. flip top-to-bottom). Default false.


Becomes this script:
Ignored if <samp>flipped</samp> is set.
<pre>
|-
choose "" "I believe in you!" believe "Wow, you're really arrogant." arrogant/
| <samp>vector_scale {{t|float x}} {{t|float y}}</samp>
| The horizontal and vertical scale to apply to the sprite. Default none.


label believe/
If set, the scale (index 14) argument is ignored.
speak Alex "Thanks, @. I'll remember that."/
|-
...
| <samp>alpha_fade_fade {{t|float alpha}}</samp>
| The multiplier applied to the alpha change (index 13) argument each frame. For example, specifying 2 means the sprite will fade out twice as fast. Default 1.
|-
| <samp>scale_change_change {{t|float scale}}</samp>
| The multiplier applied to the scale change (index 15) each frame. For example, specifying 2 means the sprite will grow/shrink twice as fast. Default 1.
|-
| <samp>light_id {{t|string id}}</samp>
| If set, add a light with the given [[Modding:Common data field types#Unique string ID|unique ID]] which follows this sprite. Default none.


label arrogant/
See the next flags to configure the light.
emote Alex 12/
|-
speak Alex "Hmmph... I think someone's a little jealous.$a"/
| <samp>light_color {{t|string color}}</samp>
...
| If <samp>light_id</samp> is set, the [[Modding:Common data field types#Color|color]] to tint the light. Defaults to <span style="border: 1px solid #004180; border-left-width:1.5em; padding: 2px;">#004180</span>.
</pre>


Forks often duplicated the end of the script. In that case, you can have both variants just <samp>goto</samp> the common ending instead.
Setting this to <samp>White</samp> (or equivalent) will apply the default color.
|-
| <samp>light_radius {{t|float scale}}</samp>
| If <samp>light_id</samp> is set, the size of the lighted area.
|-
| <samp>light_fade {{t|int value}}</samp>
| If <samp>light_id</samp> is set, the amount to subtract from the light's opacity each draw tick. Specified as a value between 0 (none) and 1 (instantly becomes transparent). Default none.
|-
|-
| <samp>question null</samp>
| <samp>x_periodic</samp><br /><samp>y_periodic</samp>
| Use <samp>choose</samp> with <samp>_</samp> labels instead. (Setting a label argument to <samp>_</samp> means it'll just continue to the next command instead.)
| If set, make the sprite oscillate horizontally and/or vertically along a sine wave (based on the next options). When both are specified, this causes the sprite to move in a circle.


For example, this command:
When set, the acceleration and motion values are ignored.
<pre>question null "But what am I going to say to Vincent?#It's best to be honest with kids.#You did the right thing. Kids should have hope."/</pre>
|-
 
| <samp>x_periodic_range {{t|float x}}</samp><br /><samp>y_periodic_range {{t|float y}}</samp>
Would become this command:
| If <samp>x_periodic</samp> and/or <samp>y_periodic</samp> are set, the pixel amplitude of the periodic motion. Default none.
<pre>choose "But what am I going to say to Vincent?" "It's best to be honest with kids." _ "You did the right thing. Kids should have hope." _/</pre>
|-
| <samp>x_periodic_loop_time {{t|float x}}</samp><br /><samp>y_periodic_loop_time {{t|float y}}</samp>
| If <samp>x_periodic</samp> and/or <samp>y_periodic</samp> are set, the time in milliseconds for one full oscillation cycle. Default none.
|-
| <samp>shake_intensity {{t|float value}}</samp>
| If set, the max pixel offset to apply random each frame. Default none.
|-
| <samp>shake_intensity_change {{t|float value}}</samp>
| If set, apply the elapsed duration multiplied by this value to the <samp>shake_intensity</samp> each frame. Default none.
|-
|-
| <samp>quickQuestion</samp>
| <samp>pulse</samp>
| Use the <samp>choose</samp> command instead. The {{t|question}} and {{t|answerX}} have matching <samp>choose</samp> arguments, while the {{t|answerX script}} arguments become labels.
| If set, rhythmically and continuously grow and shrink the sprite size. Default false.


For example, this command:
See the next flags to configure the pulse.
<pre>quickQuestion #I'd like to help#Nah, I'll pass...(break)emote Willy 32\speak Willy "Aye... I thought you would.$h#$b#I'll leave this door unlocked for ya... you can come drop off the materials whenever you like."(break)emote Willy 28\speak Willy "Alright, suit yourself...$s#$b#If you have a change of heart, you can always come back and help out. I'll leave this door unlocked, anyhow."/</pre>
|-
| <samp>pulse_amount {{t|float value}}</samp>
| If <samp>pulse</samp> is set, the scale multiplier to apply each tick. For example, 1.1 will grow/shrink the sprite by 10% per tick. Default <samp>1.1</samp>.
|-
| <samp>pulse_time {{t|float ms}}</samp>
| If <samp>pulse</samp> is set, the time in milliseconds before the pulse switches direction. Default zero (i.e. alternates every tick, or 30 times per second).
|-
| <samp>start_sound {{t|string name}}</samp><br /><samp>end_sound {{t|string name}}</samp>
| The [[Modding:Audio|audio cue ID]] to play when the animation starts and/or ends. Default none.
|-
| <samp>text {{t|string text}}</samp>
| If set, draws the given text instead of the actual sprite. The displayed text is affected by <samp>color</samp> and all transform fields, but unaffected by <samp>flip</samp> (index 11) or <samp>vertical_flipped</samp>.
|-
| <samp>attached_actor {{t|string name}}</samp>
| The name of the event actor NPC to which to attach the sprite. Default none.


Becomes this script:
If set by itself, this moves the attached NPC to follow the sprite. This may be overridden by the next flag.
<pre>
|-
choose "" "I'd like to help" accept "Nah, I'll pass..." refuse/
| <samp>position_follows_attached_actor</samp>
| If <samp>attached_actor</samp> is set, causes the sprite to follow the attached NPC (instead of moving the NPC to follow the sprite). In that case, the sprite's position is relative to the NPC's position.
|-
| <samp>parent_sprite {{t|int id}}</samp>
| The ID of the parent sprite. If set, this sprite's position is relative to the parent sprite's position.
|-
| <samp>draw_above_always_front</samp>
| If set, draw this sprite above the <samp>AlwaysFront</samp> layer (so it's above all map layers and features).
|-
| <samp>delay_before_animation_start {{t|int delay}}</samp>
| If set, a millisecond delay before the animation starts playing.
|-
| <samp>local</samp>
| If set, draws this sprite relative to the viewport (top-left corner of the screen) instead of the world position.
|-
| <samp>set_owner</samp>
| If set, sets the sprite owner field to the current player. This is required for some sprite behaviours like bombs and fireworks.
|-
| <samp>set_location</samp>
| If set, sets the sprite location field to the current location. This is required for some sprite behaviours like bombs and fireworks.
|}</li>
</ul>
|-
| <samp>textAboveHead</samp>
| Can now be applied to players.
|}


label accept/
====Deprecated commands====
emote Willy 32/
These event commands are deprecated. '''They still work just like before''' (except the ones at the bottom of the table), but if you use the [[#EventValidator|<samp>EventValidator</samp>]] it'll report them as an error.
speak Willy "Aye... I thought you would.$h#$b#I'll leave this door unlocked for ya... you can come drop off the materials whenever you like."/
goto resume/


label refuse/
{| class="wikitable"
emote Willy 28/
|-
speak Willy "Alright, suit yourself...$s#$b#If you have a change of heart, you can always come back and help out. I'll leave this door unlocked, anyhow."/
! event command
! migration
|-
| <samp>fork</samp><br /><samp>resetVariable</samp><br /><samp>switchEvent</samp>
| Use the <samp>choose</samp> or <samp>goto</samp> commands instead. If you used dialogue containing the <samp>%fork</samp> token, it should be removed and replaced with equivalent event commands.
|-
| <samp>question forkX</samp>
| Use the <samp>choose</samp> command instead, and replace the event fork with a label.
 
For example, this script:
<pre>
// main event
question fork1 "#I believe in you!#Wow, you're really arrogant."/
fork arrogant/
speak Alex "Thanks, @. I'll remember that."/
...


label resume/
// 'arrogant' event
emote Alex 12/
speak Alex "Hmmph... I think someone's a little jealous.$a"/
</pre>
</pre>
|-
| <samp>cutscene bandfork</samp><br /><samp>elliottBookTalk</samp><br /><samp>question haleyDarkRoom</samp><br /><samp>question shaneCliffs</samp><br /><samp>question shaneLoan</samp>
| These commands are '''deleted''' and will no longer work. They're unlikely to be used by mod events, but see their relevant events for the new equivalents if needed.
|}


====Changed event keys====
Becomes this script:
Events were generally unified and de-hardcoded in 1.6.16. In particular...
<pre>
choose "" "I believe in you!" believe "Wow, you're really arrogant." arrogant/


<ul>
label believe/
<li>Several events were previously defined in the game's C# code, where they couldn't be changed by content packs. Most of these were moved into <samp>Data/Events/*</samp> with translations in <samp>Strings/Events</samp>:
speak Alex "Thanks, @. I'll remember that."/
{| class="wikitable"
...
! event
 
! new asset name
label arrogant/
! new event ID
emote Alex 12/
speak Alex "Hmmph... I think someone's a little jealous.$a"/
...
</pre>
 
Forks often duplicated the end of the script. In that case, you can have both variants just <samp>goto</samp> the common ending instead.
|-
|-
| [[Giant Stump|forest raccoon]] finished event
| <samp>question null</samp>
| <samp>Data/Events/Forest</samp>
| Use <samp>choose</samp> with <samp>_</samp> labels instead. (Setting a label argument to <samp>_</samp> means it'll just continue to the next command instead.)
| <samp>RaccoonFinish</code>
 
For example, this command:
<pre>question null "But what am I going to say to Vincent?#It's best to be honest with kids.#You did the right thing. Kids should have hope."/</pre>
 
Would become this command:
<pre>choose "But what am I going to say to Vincent?" "It's best to be honest with kids." _ "You did the right thing. Kids should have hope." _/</pre>
|-
|-
| [[Trash Bear|forest trash bear]] cleanup
| <samp>quickQuestion</samp>
| <samp>Data/Events/Forest</samp>
| Use the <samp>choose</samp> command instead. The {{t|question}} and {{t|answerX}} have matching <samp>choose</samp> arguments, while the {{t|answerX script}} arguments become labels.
| <samp>777111</samp>
 
|-
For example, this command:
| [[Ginger Island#Gourmand Frog|island Gourmand crop inspection]]
<pre>quickQuestion #I'd like to help#Nah, I'll pass...(break)emote Willy 32\speak Willy "Aye... I thought you would.$h#$b#I'll leave this door unlocked for ya... you can come drop off the materials whenever you like."(break)emote Willy 28\speak Willy "Alright, suit yourself...$s#$b#If you have a change of heart, you can always come back and help out. I'll leave this door unlocked, anyhow."/</pre>
| <samp>Data/Events/islandFarmCave</samp>
 
| <samp>GourmandInspection</samp>
Becomes this script:
<pre>
choose "" "I'd like to help" accept "Nah, I'll pass..." refuse/
 
label accept/
emote Willy 32/
speak Willy "Aye... I thought you would.$h#$b#I'll leave this door unlocked for ya... you can come drop off the materials whenever you like."/
goto resume/
 
label refuse/
emote Willy 28/
speak Willy "Alright, suit yourself...$s#$b#If you have a change of heart, you can always come back and help out. I'll leave this door unlocked, anyhow."/
 
label resume/
</pre>
|-
|-
| [[The Summit#Cutscene|summit perfection cutscene]]
| <samp>cutscene bandfork</samp><br /><samp>elliottBookTalk</samp><br /><samp>question haleyDarkRoom</samp><br /><samp>question shaneCliffs</samp><br /><samp>question shaneLoan</samp>
| <samp>Data/Events/Summit</samp>
| These commands are '''deleted''' and will no longer work. They're unlikely to be used by mod events, but see their relevant events for the new equivalents if needed.
| <samp>SummitPerfection</samp>
|}
|-
 
| [[The_Summit#Illegitimate access|summit cheat event]]
====Changed event keys====
| <samp>Data/Events/Summit</samp>
Events were generally unified and de-hardcoded in 1.6.16. In particular...
| <samp>SummitCheat</samp>
 
|}</li>
<ul>
<li>Others were moved from non-event data into <samp>Data/Events/*</samp>:
<li>Several events were previously defined in the game's C# code, where they couldn't be changed by content packs. Most of these were moved into <samp>Data/Events/*</samp> with translations in <samp>Strings/Events</samp>:
{| class="wikitable"
{| class="wikitable"
! event
! event
! old location
! new asset name
! new asset
! new event ID
! new event ID
|-
|-
| [[Birdie]] quest intro & completed
| [[Giant Stump|forest raccoon]] finished event
| <samp>Data/Events/Forest</samp>
| <samp>RaccoonFinish</code>
|-
| [[Trash Bear|forest trash bear]] cleanup
| <samp>Data/Events/Forest</samp>
| <samp>777111</samp>
|-
| [[Ginger Island#Gourmand Frog|island Gourmand crop inspection]]
| <samp>Data/Events/islandFarmCave</samp>
| <samp>GourmandInspection</samp>
|-
| [[The Summit#Cutscene|summit perfection cutscene]]
| <samp>Data/Events/Summit</samp>
| <samp>SummitPerfection</samp>
|-
| [[The_Summit#Illegitimate access|summit cheat event]]
| <samp>Data/Events/Summit</samp>
| <samp>SummitCheat</samp>
|}</li>
<li>Others were moved from non-event data into <samp>Data/Events/*</samp>:
{| class="wikitable"
! event
! old location
! new asset
! new event ID
|-
| [[Birdie]] quest intro & completed
| <samp>Strings/Locations:IslandSecret_Event_BirdieIntro</samp><br /><samp>Strings/Locations:IslandSecret_Event_BirdieFinished</samp><br /><samp><samp>Strings/Locations:alreadyGotNuts</samp>
| <samp>Strings/Locations:IslandSecret_Event_BirdieIntro</samp><br /><samp>Strings/Locations:IslandSecret_Event_BirdieFinished</samp><br /><samp><samp>Strings/Locations:alreadyGotNuts</samp>
| <samp>Data/Events/IslandWest</samp>
| <samp>Data/Events/IslandWest</samp>
Line 931: Line 1,270:
* Moved all vanilla events' on-skip behavior into their event scripts (except the pet adoption logic).
* Moved all vanilla events' on-skip behavior into their event scripts (except the pet adoption logic).


===[[Modding:Fish ponds|Fish pond]] changes===
===[[Modding:Fish ponds|Fish pond]] asset===
* Fixed the translation key suffix from a custom <samp>fish_talk_*</samp> [[Modding:Context tags|context tag]] being capitalized differently from the vanilla suffixes. (For example, <samp>fish_talk_some_example</samp> would incorrectly result in a <samp>someExample</samp> suffix instead of <samp>SomeExample</samp>.)
* Fixed the translation key suffix from a custom <samp>fish_talk_*</samp> [[Modding:Context tags|context tag]] being capitalized differently from the vanilla suffixes. (For example, <samp>fish_talk_some_example</samp> would incorrectly result in a <samp>someExample</samp> suffix instead of <samp>SomeExample</samp>.)


===[[Modding:Game state queries|Game state query]] changes===
===[[Modding:Fish data|Fish tank]] decorations===
<ul>
Decorations in [[Fish Tank|fish tanks]] have been de-hardcoded into a new <samp>Data/AquariumDecorations</samp> asset.
<li>Added new game state queries:
 
The data asset consists of a string → model lookup, where...
* The key is the [[Modding:Common data field types#Item ID|''qualified'' item ID]] of the item which can be added to the fish tank.
* The value is a model with the fields listed below.
 
{| class="wikitable"
{| class="wikitable"
|-
|-
! query
! field
! effect
! effect
|-
|-
| <samp>COMPLETED_ALL_MONSTER_SLAYER_GOALS</samp>
| <samp>Texture</samp>
| Whether all [[Adventurer's Guild#Monster Eradication Goals|monster eradication goals]] have been completed.
| The [[Modding:Common data field types#Asset name|asset name]] for the texture to draw, or <samp>null</samp> for the default <samp>LooseSprites/AquariumFish</samp> asset. (Custom decorations should use a custom texture to avoid conflicts.)
|-
| <samp>SpritePosition</samp>
| The pixel position(s) in the <samp>Texture</samp> for the sprite to draw. If you specify multiple positions, one is randomly chosen for each sprite.
|-
| <samp>SpriteCount</samp>
| ''(Optional)'' The number of sprites to add to the fish tank.
 
For example, [[seaweed]] sets this to 4; so adding a seaweed to a fish tank will add four randomized seaweed decoration sprites to the tank.
|}
 
If an item has an entry in the asset, players can add one instance of the item to a fish tank to add its decoration.
 
Fish tanks have a limited number of decoration 'slots' available, consisting of three depth layers for each tile width. For example, a 2-tile-wide fish tank can display 6 decoration sprites at once (3 deep × 2 wide). Each sprite added based on the <samp>SpriteCount</samp> field fills a slot (e.g. seaweed uses 4 decoration slots). If the player adds more decorations than can be displayed, the fish tank will fill slots in the order they appear in <samp>Data/AquariumDecorations</samp>.
 
===[[Modding:Game state queries|Game state query]] changes===
<ul>
<li>Added new game state queries:
{| class="wikitable"
|-
! query
! effect
|-
| <samp>COMPLETED_ALL_MONSTER_SLAYER_GOALS</samp>
| Whether all [[Adventurer's Guild#Monster Eradication Goals|monster eradication goals]] have been completed.
|-
|-
| <samp>IS_DEBRIS_WEATHER</samp><br /><samp>IS_GREEN_RAINING</samp><br /><samp>IS_LIGHTNING</samp><br /><samp>IS_RAINING</samp><br /><samp>IS_SNOWING</samp>
| <samp>IS_DEBRIS_WEATHER</samp><br /><samp>IS_GREEN_RAINING</samp><br /><samp>IS_LIGHTNING</samp><br /><samp>IS_RAINING</samp><br /><samp>IS_SNOWING</samp>
| Whether the weather in the [[Modding:Game state queries#Target location|given location]] sets the related [[Modding:Weather data#Save files|weather field]]. For example, <samp>IS_RAINING</samp> is true for the <samp>Rain</samp>, <samp>GreenRain</samp>, and <samp>Storm</samp> weathers.
| Whether the weather in the [[Modding:Game state queries#Target location|given location]] sets the related [[Modding:Weather data#Save files|weather field]]. For example, <samp>IS_RAINING</samp> is true for the <samp>Rain</samp>, <samp>GreenRain</samp>, and <samp>Storm</samp> weathers.
|-
| <samp>IS_BOOKSELLER_DAY {{o|day offset}}</samp>
| Whether the [[bookseller]] is visiting today, with an optional {{o|day offset}} (e.g. 1 for tomorrow).
|-
| <samp>IS_TRAVELING_CART_DAY {{o|day offset}}</samp>
| Whether the [[Traveling Cart|traveling cart]] is visiting today, with an optional {{o|day offset}} (e.g. 1 for tomorrow).
|-
|-
| <samp>LOCATION_MINE_DIFFICULTY {{t|location}} {{t|min}} {{o|max}}</samp>
| <samp>LOCATION_MINE_DIFFICULTY {{t|location}} {{t|min}} {{o|max}}</samp>
Line 989: Line 1,362:
| <samp>PLAYER_STAT {{t|player}} {{t|stat key}} {{o|min value}} {{o|max value}}</samp>
| <samp>PLAYER_STAT {{t|player}} {{t|stat key}} {{o|min value}} {{o|max value}}</samp>
| The {{o|min value}} argument is now optional.
| The {{o|min value}} argument is now optional.
|-
| <samp>IS_GREEN_RAIN_DAY {{o|day}}</samp>
| The {{o|day}} argument has been added. Valid values are <samp>today</samp>, <samp>tomorrow</samp>, and a number of days offset from the current day (ex. <samp>-1</samp> would be yesterday).
If not specified, it will default to <samp>tomorrow</samp>.
|}</li>
|}</li>
</ul>
</ul>
Line 1,029: Line 1,407:
</ul>
</ul>


===[[Modding:Maps|Map property]] changes===
===[[Modding:Maps|Map & tile property]] changes===
<dl>
<dt>Map properties</dd>
<dd>
<ul>
<ul>
<li>Added new map properties:
<li>Added new map properties:
Line 1,043: Line 1,424:


If omitted, a [[Single Bed|single bed]] is placed at position (9, 8).
If omitted, a [[Single Bed|single bed]] is placed at position (9, 8).
|-
| <samp>@MergeInto {{t|property}} {{t|ID}} {{o|options}}</samp>
| Merge a list of space-delimited values into an existing map property (creating it if needed).
The parameters in the <samp>@MergeInto</samp> name are:
* {{t|property}}: the name of the map property to merge the values into.
* {{t|ID}}: a [[Modding:Common data field types#Unique string ID|unique string ID]] for the merge property. This is used to distinguish between merge properties (since each map property key must be unique), and may be used for error reporting.
* {{o|position}}: where to put the new values if the property already exists (<samp>Append</samp> or <samp>Prepend</samp>). The default is <samp>Append</samp> for most properties, or <samp>Prepend</samp> for <samp>Warp</samp>. C# mods can set the default for custom properties via the static <samp>GameLocation.MergeIntoPrependByDefaultProperties</samp> field.
The property value is a space-delimited list of values to merge into the target property.
For example, these properties:
<syntaxhighlight lang="json">
"Warp": "5 5 Town 10 10 5 6 Town 10 11",
"@MergeInto Warp {{ModId}}/BeachWarp Append": "20 5 Sewer 25 25",
"@MergeInto Warp {{ModId}}/TownWarp": "15 20 Beach 30 70 16 20 Beach 31 70",
</syntaxhighlight>
Would be combined into one once the map loads:
<syntaxhighlight lang="json">
"Warp": "15 20 Beach 30 70 16 20 Beach 31 70 5 5 Town 10 10 5 6 Town 10 11 20 5 Sewer 25 25",
</syntaxhighlight>
<samp>@MergeInto</samp> properties are applied in the order in which they were added (e.g. based on patch priority order).
|}</li>
|}</li>
<li>Improved map properties:
<li>Improved map properties:
Line 1,056: Line 1,460:
| Fixed property only allowing numeric item IDs.
| Fixed property only allowing numeric item IDs.
|-
|-
| All properties which accept multiple sets of space-delimited values, like <samp>Warp</samp> or <samp>NightTiles</samp>
| <samp>TreatAsOutdoors</samp>
| Multiple of the same property can defined by adding a space and a label after the property name. They will be combined with a space between them when the map loads, with the original property value coming first. Labels are not used, and are solely for identification and separation purposes. The order they are combined cannot be specified.
| Fixed footstep sounds not always respecting <samp>TreatAsOutdoors</samp> for indoor locations.
 
For example, the following properties:
<pre>
"Warp": "5 5 Town 10 10 5 6 Town 10 11",
"Warp spacechase0.SuperSecretMod/CodeJailEscapeRoute": "20 5 Sewer 25 25",
"Warp spacechase0.SuperSecretMod/EntranceToTheAbyss": "15 20 AbyssEntranceArea 30 70 16 20 AbyssEntranceArea 31 70",
</pre>
Would be combined into a single property once the map loads:
<pre>
"Warp": "5 5 Town 10 10 5 6 Town 10 11 20 5 Sewer 25 25 15 20 AbyssEntranceArea 30 70 16 20 AbyssEntranceArea 31 70",
</pre>
|}</li>
|}</li>
</ul>
</ul>
</dd>
<dt>Tile properties</dt>
<dd>
* Removed <samp>Treasure</samp> tile property (unused).
</dd>
</dl>


===[[Modding:Quest data|Quest]] changes===
===[[Modding:Quest data|Quest]] changes===
Line 1,081: Line 1,481:


===[[Modding:Schedule data|Schedule]] changes===
===[[Modding:Schedule data|Schedule]] changes===
NPCs will no longer be affected by warps they touch while following their schedule if those warps are not the one they intend to go to.
<ul>
 
<li>NPCs are longer affected by warps they touch while following their schedule if those warps aren't the ones they intend to use.</li>
Added new schedule keys:
<li>Added new schedule keys:
{| class="wikitable"
{| class="wikitable"
|-
|-
Line 1,096: Line 1,496:
| <samp>marriage</samp><br /><samp>roommate</samp>
| <samp>marriage</samp><br /><samp>roommate</samp>
| A fallback schedule to use if a more specific schedule doesn't apply. If this is omitted and no other schedule applies, the NPC won't have a schedule that day.
| A fallback schedule to use if a more specific schedule doesn't apply. If this is omitted and no other schedule applies, the NPC won't have a schedule that day.
|}
|}</li>
</ul>


===[[Modding:Stats|Stat]] changes===
===[[Modding:Stats|Stat]] changes===
Added new stats:
<ul>
<li>Added new stats:
{| class="wikitable"
{| class="wikitable"
|-
|-
Line 1,138: Line 1,540:
| <samp>ArtifactsNotDonated</samp>
| <samp>ArtifactsNotDonated</samp>
| The number of artifacts missing from the museum.
| The number of artifacts missing from the museum.
|}
|}</li>
<li>Changed existing stats:
{| class="wikitable"
|-
! stat key
! changes
|-
| <samp>AverageBedTime</samp>
| Fixed incorrect time averaging (e.g. the average of 600 + 700 was incorrectly calculated as 650 instead of 630).
|-
| <samp>CaveCarrotsFound</samp>
| Removed. This was never fully implemented.
|-
| <samp>OtherPreciousGemsFound</samp>
| Fixed stat not updated in later versions.
|-
| <samp>WeedsEliminated</samp>
| Fixed stat only incremented when destroying weeds indirectly (e.g. with a bomb), not when cutting them with a tool.
|}</li>
</ul>


===[[Modding:Trigger actions|Trigger action]] changes===
===[[Modding:Trigger actions|Trigger action]] changes===
Line 1,150: Line 1,571:
| <samp>CompleteQuest {{t|quest ID}}</samp>
| <samp>CompleteQuest {{t|quest ID}}</samp>
| Complete all active quests with this ID in the player's journal.
| Complete all active quests with this ID in the player's journal.
|}</li>
|-
| <samp>ShowPrivateChatMessage {{t|message}} {{o|color}}</samp>
| Add a message to the chat box which is only visible to the current player. The {{t|message}} is the [[Modding:Tokenizable strings|tokenizable string]] to show, and {{o|color}} is the text [[Modding:Common data field types#Color|color]].
|-
| <samp>AddItemFromQuery {{t|query}}</samp>
| Adds a random item from the specified item query.
|}
</ul>
</ul>


Line 1,184: Line 1,611:
</li>
</li>
|}
|}
</ul>
===Other translation changes===
<ul>
<li>You can now override the relationship status labels (shown in the social and profile menus) for specific NPCs:
{| class="wikitable"
|-
! asset
! original key
! overridden by
|-
|rowspan="5"| <samp>Strings/StringsFromCSFiles</samp>
| <samp>SocialPage_Relationship_Housemate_Female</samp><br /><samp>SocialPage_Relationship_Housemate_Male</samp>
| <samp>SocialPage_Relationship_Housemate_{{t|NPC name}}</samp>
|-
| <samp>SocialPage_Relationship_Husband</samp><br /><samp>SocialPage_Relationship_Wife</samp>
| <samp>SocialPage_Relationship_Spouse_{{t|NPC name}}</samp>
|-
| <samp>SocialPage_Relationship_Boyfriend</samp><br /><samp>SocialPage_Relationship_Girlfriend</samp>
| <samp>SocialPage_Relationship_{{t|NPC name}}</samp>
|-
| <samp>SocialPage_Relationship_ExHusband</samp><br /><samp>SocialPage_Relationship_ExWife</samp>
| <samp>SocialPage_Relationship_Ex_{{t|NPC name}}</samp>
|-
| <samp>SocialPage_Relationship_Single_Female</samp><br /><samp>SocialPage_Relationship_Single_Male</samp>
| <samp>SocialPage_Relationship_Single_{{t|NPC name}}</samp>
|-
| <samp>Strings/UI</samp>
| <samp>SocialPage_Relationship_MarriedToOtherPlayer_FemaleNpc</samp><br /><samp>SocialPage_Relationship_MarriedToOtherPlayer_MaleNpc</samp>
| <samp>SocialPage_Relationship_MarriedToOtherPlayer_{{t|NPC name}}</samp>
|}</li>
</ul>
</ul>


===Other changes===
===Other changes===
* Added validation for schedule <samp>offset</samp> command in end-of-route animations.
* Playing an empty audio ID (<code>null</code> or <code>""</code>) now does nothing instead of crashing. For required audio cue fields, you can also use the new ID <code>silent</code> to do nothing.
* Custom achievements now benefit from [[Achievements#Retroactive Achievements|retroactive unlock]] too if they implement the new <samp>UnlockCondition</samp> field in <samp>Data/Achievements</samp>.
* Custom achievements now benefit from [[Achievements#Retroactive Achievements|retroactive unlock]] too if they implement the new <samp>UnlockCondition</samp> field in <samp>Data/Achievements</samp>.
* [[Modding:Shops|Shop]] dialogues with <code>[SuggestedItem]</code> are now skipped automatically if there's no matching item to suggest.
* In [[Modding:Shops|shop data]]:
** Shop dialogues with <code>[SuggestedItem]</code> are now skipped automatically if there's no matching item to suggest.
** Fixed <samp>ActionsOnPurchase</samp> not applied if you were already holding an item.
* For NPCs:
** Added validation for schedule <samp>offset</samp> command in end-of-route animations.
** Fixed NPCs treating a non-existent spritesheet asset as successfully loaded, so they would show an error texture. They now log a warning and continue to the next texture.
** Fixed [[Modding:NPC data|NPC <samp>FlowerDanceCanDance</samp> field]] ignored for non-datable NPCs with no dialogue.
** Fixed <samp>RejectItem_*</samp> dialogue disabling the NPC's normal dialogue after it's shown.
* De-hardcoded the giant [[Qi Fruit|Qi fruit]] mystery box drop and Easter egg into <samp>Data/GiantCrops</samp>, and replaced the <samp>QiChallenge2</samp> special order check with a <samp>DROP_QI_BEANS</samp> special order rule check.
* The value of a <samp>(O)GoldCoin</samp> item (e.g. dropped by a [[Cindersap Forest#Pot of Gold|pot of gold]]) is now fully determined by its stack size, which is no longer limited to 999. This lets you give arbitrary gold rewards via item debris.
* The value of a <samp>(O)GoldCoin</samp> item (e.g. dropped by a [[Cindersap Forest#Pot of Gold|pot of gold]]) is now fully determined by its stack size, which is no longer limited to 999. This lets you give arbitrary gold rewards via item debris.
* The game now accepts a <samp>--saves-path some/saves/path/override</samp> command line argument, which will change where save files are checked for.
* Fixed crash when loading a save with missing building interiors.
* Fixed crash when loading a save with missing building interiors.
* Fixed <samp>RejectItem_*</samp> dialogue disabling the NPC's normal dialogue after it's shown.
* Fixed [[Modding:NPC data|NPC <samp>FlowerDanceCanDance</samp> field]] ignored for non-datable NPCs with no dialogue.
* Fixed NPCs treating a non-existent spritesheet asset as successfully loaded, so they would show an error texture. They now log a warning and continue to the next texture.
* Fixed farm animals in non-instanced building interiors (like the farmhouse) getting deleted on day start.
* Fixed farm animals in non-instanced building interiors (like the farmhouse) getting deleted on day start.
* Fixed fruit trees' falling leaves not applying the tree's cosmetic season.
* Fixed fruit trees' falling leaves not applying the tree's cosmetic season.
Line 1,205: Line 1,670:
In Stardew Valley 1.6.16, the game now only does this for the main game assembly to improve performance. If a mod was using <code>[InstancedStatic]</code>, it should use SMAPI's built-in [[Modding:Modder Guide/APIs/Utilities#Per-screen data|per-screen data]] utility instead.
In Stardew Valley 1.6.16, the game now only does this for the main game assembly to improve performance. If a mod was using <code>[InstancedStatic]</code>, it should use SMAPI's built-in [[Modding:Modder Guide/APIs/Utilities#Per-screen data|per-screen data]] utility instead.


===AssetNameUtility===
===Content manager changes===
The new <samp>AssetNameUtility</samp> class has methods for working with [[Modding:Common data field types#Asset name|asset names]]:
The base game's 'content manager' API changed in Stardew Valley 1.6.16. This mainly affects <samp>LanguageCode</samp>, <code>Game1.content</code>, and other content manager fields. This does ''not'' affect mods which only use [[Modding:Modder Guide/APIs/Content|SMAPI's content API]].


{| class="wikitable"
In particular:
|-
* The game now uses <samp>IContentManager</samp> instead of <samp>LocalizedContentManager</samp> in most places. That includes fields like <code>Game1.content</code>, methods like <code>Game1.content.CreateTemporary()</code>, etc. The new interface also includes full IntelliSense docs.
! method
* Moved the content manager types into a new <samp>StardewValley.ContentManagement</samp> namespace, and removed type nesting.
! usage
* Made all methods non-static.
|-
* Adjusted naming for clarity.
| <samp>Normalize</samp>
* Removed unused code.
| A low-level method which normalizes path separators in an [[Modding:Common data field types#Asset name|asset name]]. For example:
 
See [[#Other breaking API changes|''other breaking API changes'']] for specific changes.
 
===Inventory add-item overhaul===
1.6.16 overhauls how items are added to chest & player inventories, which fixes a wide variety of bugs when an item can't be fully collected due to a full or nearly-full inventory. The core change is [[#Utility fields & methods|a set of new methods]] which allow explicitly handling partial success when adding an item.
 
For example, the new methods let you avoid duplicate rewards when partly collecting the item stack:
<syntaxhighlight lang="c#">
<syntaxhighlight lang="c#">
string assetName = AssetNameUtility.Normalize("Characters/\\/Abigail"); // produces "Characters/Abigail"
if (Game1.player.TryAddToInventory(this.heldItem).FullyAdded)
{
    this.heldItem = null;
    Game1.player.gainExperience(Farmer.farmingSkill, 20); // grant XP once when the stack is fully collected
}
</syntaxhighlight>
</syntaxhighlight>


Consider using SMAPI's <samp>PathUtilities.NormalizeAssetName</samp> instead, which is more thorough.
Or in cases where a partial item stack can't be left behind (like animal harvesting), you can handle any remainder:
|-
| <samp>TryParseTranslationKey</samp>
| Parses a [[Modding:Common data field types#Translation key|translation key]] into its component parts. For example:
<syntaxhighlight lang="c#">
<syntaxhighlight lang="c#">
if (AssetNameUtility.TryParseTranslationKey("Strings/UI:Confirm", out string assetName, out string fieldKey, out string error))
AddToInventoryResult result = Game1.player.TryAddToInventory(producedItem);
   ...; // assetName: Strings/UI, fieldKey: Confirm, error: null
if (!result.FullyAdded)
   Game1.player.DropItemAtFeet(result.Remainder);
</syntaxhighlight>
</syntaxhighlight>


This doesn't check whether the asset or key exists; see <samp>Game1.content.IsValidTranslationKey</samp> to do that.
Which you can also simplify using the convenience <samp>CollectOr*</samp> methods:
<syntaxhighlight lang="c#">
Game1.player.CollectOrDrop(producedItem);
</syntaxhighlight>
 
This [[#Other API changes|removes the <samp>Farmer.addItemToInventoryBool</samp> method]], but otherwise mods should be unaffected. However, mods should consider using the newer methods to handle partial success where needed.
 
===Current-location tracking more consistent===
The game tracks the current location using two properties: <code>Game1.currentLocation</code> and <code>Game1.player.currentLocation</code>. These were often used interchangeably (even in base-game code), but they're not always equivalent.
 
Stardew Valley 1.6.16 formalizes the distinction and applies it more consistently:
* <code>Game1.currentLocation</code> is the location being viewed by the local player (i.e. the "camera location"), which doesn't necessarily contain the player.
* <code>Game1.player.currentLocation</code> is the location which contains the local player.
 
For example, let's say the player is at Robin's shop placing a building on the farm; in that case <code>Game1.currentLocation.Name</code> is the location being viewed (i.e. <samp>Farm</samp>) while <code>Game1.player.currentLocation.Name</code> is the location which contains the player (i.e. <samp>ScienceHouse</samp>).
 
This changes the behavior in some cases which affect mods. For example, [[Modding:Trigger actions|trigger actions]] with the <samp>LocationChanged</samp> trigger now see the new location as expected, and are no longer triggered when the camera shows a different location without moving the player.
 
===New system for spawning synced TAS in a more network-bandwidth-friendly way===
Spawning many <samp>TemporaryAnimatedSprite</samp>s at once can strain network connections due to all the fields on a TAS. There is now a new system to allow spawning predefined sets of temporary animated sprites in a much more bandwidth friendly.
 
In a similar manner to custom tile actions, you can call the static <samp>GameLocation.RegisterBulkSpriteType</samp> function, with an ID and an <samp>Action<GameLocation, SpawnBulkSpritesNetEventArgs></samp>:
{| class="wikitable"
|-
! field
! use
! maximum element count
|-
| <samp>Id</samp>
| The ID of the bulk sprite callback that was invoked.
| n/a
|-
| <samp>FloatArgs</samp>
| ''(Optional)'' An array of floats that can be used in the resulting callback.
| 31
|-
| <samp>StringArgs</samp>
| ''(Optional)'' An array of strings that can be used in the resulting callback.
| 7
|}
|}


===EventValidator===
To trigger one of these events for everyone, call `.Fire()` on the net event field. Any callbacks will only be triggered if the currently visible location is the one they happen on. Otherwise, they are skipped.
====Overview====
The new <samp>EventValidator</samp> class analyses [[Modding:Event data|event scripts]] to detect issues like...
* command names which don't match a registered command or alias;
* command arguments which don't match those expected by the command;
* and custom rule violations based on the <samp>EventValidator.CommandValidators</samp> field (used for commands like <samp>goto</samp>).


This is mainly meant to implement unit tests for events. For example, to validate all events in a data asset:
<syntaxhighlight lang="c#">
<syntaxhighlight lang="c#">
string assetName = "Data/Events/Farm";
GameLocation.RegisterBulkSpriteType("TellPeopleAnImportantMessage", (location, args) =>
var events = Game1.content.Load<Dictionary<string, string>>(assetName);
{
    if ( args.FloatArgs.Length != 3 || args.StringArgs.Length != 1 )
        return;
    Vector2 pos = new Vector2( args.FloatArgs[0], args.FloatArsg[1] );
    int times = (int) args.FloatArgs[2];
    string veryImportantMessage = args.StringArgs[0];
   
    // Typically you would just use `location.playSound` once on the original player's game for this, but for demonstration purposes we are using `location.localSound` instead
    location.localSound( "cat", pos );
   
    for ( int i = 0; i < times; ++i )
    {
        Game1.log.Info( veryImportantMessage );
    }
});
</syntaxhighlight>
 
<syntaxhighlight lang="c#">
GameLocation location = Game1.currentLocation;


var validator = new EventValidator();
location.spawnBulkSprites.Fire(new GameLocation.SpawnBulkSpritesNetEventArgs(
foreach ((string key, string script) in events)
    "TellPeopleAnImportantMessage",
{
    floats: new float[] { pos.X, pos.Y, 3 },
    foreach (var issue in validator.Validator(assetName, key, script))
    strings: new string[] { "cats are amazing" }
        Assert.Fail($"Validation failed for event '{key}' > command '{issue.CommandText}': {issue.SuggestedError}.");
));
}
</syntaxhighlight>
</syntaxhighlight>


====Command argument validation====
===Data model attributes===
Argument validation is enabled if the command's handler method has an <samp>EventArguments</samp> attribute, which defines the argument pattern using a special syntax. Each command can list multiple patterns, and it'll be considered valid if any of them matches. If the pattern is an empty string, the validator will ensure no arguments are provided.
Stardew Valley 1.6.16 adds attributes to its content data models which describe what each field contains.


For example, the default <samp>showFrame</samp> command is defined like this:
For example:
<syntaxhighlight lang="c#">
<syntaxhighlight lang="c#">
[EventArguments("int", "actor int bool?")]
[DataField(FieldType.AudioCue)]
public static void ShowFrame(Event @event, string[] args, EventContext context)
public string BarkSound;
</syntaxhighlight>
</syntaxhighlight>


An argument pattern consists of space-delimited ''tokens'', where each token defines the format for an argument. For example, <code>actor int bool?</code> has three tokens representing three arguments: an actor name, a positive integer, and an optional boolean.
The available attributes are:
{| class="wikitable"
|-
! attribute
! usage
|-
| <code>[DataField]</code>
| The attribute applied to most fields, which describes the data type.


These are the tokens recognized by the validator:
Its <samp>FieldType</samp> property describes the data type, which can be any of...
{| class="wikitable"
{| class="wikitable"
|-
|-
! token
! field type
! meaning
! meaning
|-
|-
!colspan="2"| generic argument types
| <samp>AssetName</samp>
| A [[Modding:Common data field types#Asset name|content asset name]] (without file extension).
|-
|-
| <samp>bool</samp>
| <samp>AudioCue</samp>
| A boolean value (<samp>true</samp> or <samp>false</samp>).
| An [[Modding|Audio|audio cue ID]].
|-
|-
| <samp>float</samp>
| <samp>Chance</samp>
| A positive number with optional decimal point (like <samp>5</samp> or <samp>0.5</samp>).
| A percentage probability expressed as a number between 0 (never) and 1 (always).
|-
|-
| <samp>-float</samp>
| <samp>Color</samp>
| A number with optional decimal point and optional negative sign (like <samp>5</samp>, <samp>-5</samp>, or <samp>-0.5</samp>).
| A [[Modding:Common data field types#Color|color in string format]].
|-
|-
| <samp>int</samp>
| <samp>ContextTag</samp>
| A positive integer (like <samp>5</samp>).
| A [[Modding:Context tags|context tag]] or list thereof.
|-
|-
| <samp>-int</samp>
| <samp>ContextTagQuery</samp>
| An integer with optional negative sign (like <samp>5</samp> or <samp>-5</samp>).
| A [[Modding:Context tags|context tag query]] or list thereof.
|-
|-
| <samp>string</samp>
| <samp>CustomFields</samp>
| A quoted sequence of arbitrary text like <samp>"some words here"</samp>. If the argument has no quotes, this is equivalent to the <samp>word</samp> token.
| A [[Modding:Common data field types#Custom fields|dictionary of custom fields]] intended for mod use, which aren't synchronized or persisted.
|-
|-
| <samp>word</samp>
| <samp>Direction</samp>
| A simple sequence of letters, numbers, periods, and/or underscores (usually an ID or similar value). While the command will accept quotes, they're redundant and will be rejected by the validator.
| A [[Modding:Event data#Directions|direction]]. This can be a standard name (up, left, right, or down) or a matching numeric constant.
|-
|-
| <samp>remainder</samp>
| <samp>GameStateQuery</samp>
| One or more arguments of any type.
| A [[Modding:Game state queries|game state query]] which indicates dynamic conditions.
|-
|-
!colspan="2"| specific string formats
| <samp>ModData</samp>
| A [[Modding:Common data field types#Mod data|dictionary of custom data]] about an instance, which are persisted in the created entities and synchronized in multiplayer. This should typically be omitted by the game.
|-
|-
| <samp>actor</samp>
| <samp>TokenizableString</samp>
| An actor name in the event format (like <samp>Abigail</samp> or <samp>Kent?</samp>).
| A [[Modding:Tokenizable strings|tokenizable string]].
|-
|-
| <samp>assetName</samp>
| <samp>TriggerAction</samp>
| An [[Modding:Common data field types#Asset name|asset name]] like <samp>Data/Achievements</samp>.
| A [[Modding:Trigger actions|trigger action]] or list thereof.
|}
 
Its optional <samp>PlaceholderValues</samp> property indicates special values that are replaced by the game (e.g. <samp>MOD_FARM</samp> in a [[Modding:World map|world map]] texture field).
|-
|-
| <samp>direction</samp>
| <code>[AssetNameField]</code>
| A [[Modding:Event data#Directions|direction]] which can be specified as either a number (like <samp>0</samp>) or name (like <samp>up</samp>).
| An extension of <code>[DataField]</code> applied to [[Modding:Common data field types#Asset name|asset name]] fields, which adds two properties:
{| class="wikitable"
|-
|-
| <samp>goToLabel</samp>
! property
| An event label (see the <samp>goto</samp> and <samp>label</samp> event commands). This is equivalent to <samp>word</samp>, but is used by <samp>EventValidator</samp> to validate label references.
! usage
|-
|-
| <samp>itemId</samp>
| <samp>AssetType</samp>
| An [[Modding:Common data field types#Item ID|item ID]] which can be qualified or unqualified (like <samp>(O)MossySoup</samp> or <samp>MossySoup</samp>).
| The type of asset referenced by the field (one of <samp>Data</samp>, <samp>BitMapFont</samp>, <samp>Map</samp>, or <samp>Texture</samp>).
|-
|-
| <samp>translationKey</samp>
| <samp>PathFormat</samp>
| A [[Modding:Common data field types#Translation key|translation key]] like <samp>Strings/Locations:SomeKey</samp>.
| ''(Optional)'' The asset name format (where <samp>{0}</samp> is the field value), if the field value isn't used as-is. For example, [[Modding:Buildings|building]] indoor map fields set this to <code>Maps/{0}</code> (since the <samp>Maps/</samp> prefix is added automatically).
|}
|-
|-
!colspan="2"| custom formats
| <code>[StrictlyOrderedWithoutId]</code>
|-
| A specialized attribute applied to list fields which contain an ordered list of non-unique models. For example, this is used for [[Modding:Pets|pet]] animation frames. This is very rarely used.
| <samp>'...'</samp>
| The literal text or regex pattern to match, like <code>'continue'</code> or <code>'[\w-]+'</code>.
|}
|}


In addition, you can extend tokens with these indicators:
===Item changes===
* Suffix with <samp>+</samp> for repeating argument of that type. For example, <samp>int+</samp> would allow both <samp>5</samp> and <samp>5 6 7</samp>.
* Added <code>IItemDataDefinition.GetContextTags(itemData)</code> method, so custom item data definitions can add [[Modding:Context tags|context tags]] from their data if applicable.
* Suffix with <samp>?</samp> for an optional argument which can be omitted. All tokens after this token must also be optional. (You can have optional repeating arguments like <samp>int+?</samp>.)
* Fixed <code>item.CopyFieldsFrom(other)</code> always setting the stack size for the copy to 1.
* Infix with <samp>|</samp> for a parameter which can be one of multiple types. For example <samp>int|bool</samp> will allow either integer or boolean values.
* Fixed <code>object.IsBreakableStone()⁩</code> returning false for [[Calico Egg|calico egg]] stones in the skull cavern.


===TickCache===
===New utility types===
The new <samp>TickCache</samp> class loads a value on-demand and caches it for a given number of game ticks.
====AssetNameUtility====
The new <samp>AssetNameUtility</samp> class has methods for working with [[Modding:Common data field types#Asset name|asset names]]:


It only has two public methods:
{| class="wikitable"
{| class="wikitable"
|-
|-
! member
! method
! usage
! usage
|-
|-
| <samp>Value</samp>
| <samp>Normalize</samp>
| Get the cached value, reloading it if needed.
| A low-level method which normalizes path separators in an [[Modding:Common data field types#Asset name|asset name]]. For example:
<syntaxhighlight lang="c#">
string assetName = AssetNameUtility.Normalize("Characters/\\/Abigail"); // produces "Characters/Abigail"
</syntaxhighlight>
 
Consider using SMAPI's <samp>PathUtilities.NormalizeAssetName</samp> instead, which is more thorough.
|-
|-
| <samp>Clear()</samp>
| <samp>TryParseTranslationKey</samp>
| Reset the cache time, so it'll be reloaded next time <samp>Value</samp> is requested.
| Parses a [[Modding:Common data field types#Translation key|translation key]] into its component parts. For example:
<syntaxhighlight lang="c#">
if (AssetNameUtility.TryParseTranslationKey("Strings/UI:Confirm", out string assetName, out string fieldKey, out string error))
  ...;  // assetName: Strings/UI, fieldKey: Confirm, error: null
</syntaxhighlight>
 
This doesn't check whether the asset or key exists; see <samp>Game1.content.IsValidTranslationKey</samp> to do that.
|}
|}


For example, let's say you do this:
====EventValidator====
<syntaxhighlight lang="c#">
; Overview
private readonly TickCache<int> Cached = new TickCache<int>(GetValue, cacheTicks: 3);
: The new <samp>EventValidator</samp> class analyses [[Modding:Event data|event scripts]] to detect issues like...
:* command names which don't match a registered command or alias;
:* command arguments which don't match those expected by the command;
:* and custom rule violations based on the <samp>EventValidator.CommandValidators</samp> field (used for commands like <samp>goto</samp>).


/// <inheritdoc />
: This is mainly meant to implement unit tests for events. For example, to validate all events in a data asset:
public override void Entry(IModHelper helper)
: <syntaxhighlight lang="c#">
{
string assetName = "Data/Events/Farm";
    helper.Events.GameLoop.UpdateTicked += (sender, e) => _ = this.Cached.Value;
var events = Game1.content.Load<Dictionary<string, string>>(assetName);
}


private int GetValue()
var validator = new EventValidator();
foreach ((string key, string script) in events)
{
{
  this.Monitor.Log($"Fetching value at game tick {Game1.ticks}.");
    foreach (var issue in validator.Validator(assetName, key, script))
  return 0;
        Assert.Fail($"Validation failed for event '{key}' > command '{issue.CommandText}': {issue.SuggestedError}.");
}
}
</syntaxhighlight>
</syntaxhighlight>


When you run the mod, you would see something like...
; Command argument validation
<blockquote>Fetching value at game tick 100...<br />Fetching value at game tick 103...<br />Fetching value at game tick 106...</blockquote>
: Argument validation is enabled if the command's handler method has an <samp>EventArguments</samp> attribute, which defines the argument pattern using a special syntax. Each command can list multiple patterns, and it'll be considered valid if any of them matches. If the pattern is an empty string, the validator will ensure no arguments are provided.


The [[#Cache changes|game uses this to cache a few frequently-accessed methods]] like <samp>npc.GetData()</samp>.
: For example, the default <samp>showFrame</samp> command is defined like this:
: <syntaxhighlight lang="c#">
[EventArguments("int", "actor int bool?")]
public static void ShowFrame(Event @event, string[] args, EventContext context)
</syntaxhighlight>


===Content manager changes===
: An argument pattern consists of space-delimited ''tokens'', where each token defines the format for an argument. For example, <code>actor int bool?</code> has three tokens representing three arguments: an actor name, a positive integer, and an optional boolean.
The base game's 'content manager' API changed in Stardew Valley 1.6.16. This mainly affects <samp>LanguageCode</samp>, <code>Game1.content</code>, and other content manager fields. This does ''not'' affect mods which only use [[Modding:Modder Guide/APIs/Content|SMAPI's content API]].


In particular:
: These are the tokens recognized by the validator:
* The game now uses <samp>IContentManager</samp> instead of <samp>LocalizedContentManager</samp> in most places. That includes fields like <code>Game1.content</code>, methods like <code>Game1.content.CreateTemporary()</code>, etc. The new interface also includes full IntelliSense docs.
: {| class="wikitable"
* Moved the content manager types into a new <samp>StardewValley.ContentManagement</samp> namespace, and removed type nesting.
|-
* Made all methods non-static.
! token
* Adjusted naming for clarity.
! meaning
* Removed unused code.
|-
 
!colspan="2"| generic argument types
See [[#Other breaking API changes|''other breaking API changes'']] for specific changes.
|-
 
| <samp>bool</samp>
===Inventory add-item overhaul===
| A boolean value (<samp>true</samp> or <samp>false</samp>).
1.6.16 overhauls how items are added to chest & player inventories, which fixes a wide variety of bugs when an item can't be fully collected due to a full or nearly-full inventory. The core change is [[#Utility fields & methods|a set of new methods]] which allow explicitly handling partial success when adding an item.
 
For example, the new methods let you avoid duplicate rewards when partly collecting the item stack:
<syntaxhighlight lang="c#">
if (Game1.player.TryAddToInventory(this.heldItem).FullyAdded)
{
    this.heldItem = null;
    Game1.player.gainExperience(Farmer.farmingSkill, 20); // grant XP once when the stack is fully collected
}
</syntaxhighlight>
 
Or in cases where a partial item stack can't be left behind (like animal harvesting), you can handle any remainder:
<syntaxhighlight lang="c#">
AddToInventoryResult result = Game1.player.TryAddToInventory(producedItem);
if (!result.FullyAdded)
  Game1.player.DropItemAtFeet(result.Remainder);
</syntaxhighlight>
 
Which you can also simplify using the convenience <samp>CollectOr*</samp> methods:
<syntaxhighlight lang="c#">
Game1.player.CollectOrDrop(producedItem);
</syntaxhighlight>
 
This [[#Other API changes|removes the <samp>Farmer.addItemToInventoryBool</samp> method]], but otherwise mods should be unaffected. However, mods should consider using the newer methods to handle partial success where needed.
 
===Item changes===
* Added <code>IItemDataDefinition.GetContextTags(itemData)</code> method, so custom item data definitions can add [[Modding:Context tags|context tags]] from their data if applicable.
* Fixed <code>item.CopyFieldsFrom(other)</code> always setting the stack size for the copy to 1.
* Fixed <code>object.IsBreakableStone()⁩</code> returning false for [[Calico Egg|calico egg]] stones in the skull cavern.
 
===Utility fields & methods===
<ul>
<li>1.6.16 adds some new utility methods and fields. For example:
{| class="wikitable"
|-
|-
! type
| <samp>float</samp>
! member
| A positive number with optional decimal point (like <samp>5</samp> or <samp>0.5</samp>).
! usage
|-
|-
| <samp>Character</samp>
| <samp>-float</samp>
| <samp>DropItemAtFeet(…)</samp>
| A number with optional decimal point and optional negative sign (like <samp>5</samp>, <samp>-5</samp>, or <samp>-0.5</samp>).
| Place a floating item next to the character (e.g. monster, NPC, player, etc). This includes options to set the direction, max stack size, and whether to play the 'item dropped' sound.
 
For example, this places a pufferfish in front of the player:
<syntaxhighlight lang="c#">
Item pufferfish = ItemRegistry.Create("(O)128");
Game1.player.DropItemAtFeet(pufferfish);
</syntaxhighlight>
 
This causes 100 pufferfish to 'explode' into individual stacks in random directions around a monster and play the 'item dropped' sound (once):
<syntaxhighlight lang="c#">
Item pufferfish = ItemRegistry.Create("(O)128", 100);
monster.DropItemAtFeet(pufferfish, stackSize: 1, playSound: true);
</syntaxhighlight>
|-
|-
| <samp>Chest</samp>
| <samp>int</samp>
| <samp>TryAddItem(…)</samp>
| A positive integer (like <samp>5</samp>).
| Merge an item stack into the chest if possible, and return a result which describes how much of the item as added.
 
See the equivalent <samp>Farmer.TryAddToInventory(…)</samp> below for examples.
|-
|-
|rowspan="3"| <samp>Farmer</samp>
| <samp>-int</samp>
| <samp>TryAddToInventory(…)</samp>
| An integer with optional negative sign (like <samp>5</samp> or <samp>-5</samp>).
| Merge an item stack into the player's inventory if possible, and return a result which describes how much of the item as added.
 
The result fields are:
{| class="wikitable"
|-
|-
! field
| <samp>string</samp>
! usage
| A quoted sequence of arbitrary text like <samp>"some words here"</samp>. If the argument has no quotes, this is equivalent to the <samp>word</samp> token.
|-
|-
| <samp>TotalAdded</samp>
| <samp>word</samp>
| The stack count which was added to the inventory.
| A simple sequence of letters, numbers, periods, and/or underscores (usually an ID or similar value). While the command will accept quotes, they're redundant and will be rejected by the validator.
|-
|-
| <samp>TotalRemaining</samp>
| <samp>remainder</samp>
| The stack count which couldn't be added to the inventory.
| One or more arguments of any type.
|-
|-
| <samp>Remainder</samp>
!colspan="2"| specific string formats
| A stack for the items which couldn't be added to the inventory, or <samp>null</samp> if it was fully added.
 
This is always a reference to the original input item if there's any remainder.
|-
|-
| <samp>AnyAdded</samp>
| <samp>actor</samp>
| Whether any items were added to the inventory.
| An actor name in the event format (like <samp>Abigail</samp> or <samp>Kent?</samp>).
|-
|-
| <samp>FullyAdded</samp>
| <samp>assetName</samp>
| Whether the item was fully added to the inventory.
| An [[Modding:Common data field types#Asset name|asset name]] like <samp>Data/Achievements</samp>.
|}
 
This allows handling partial failures in a more intuitive way. For example:
<syntaxhighlight lang="c#">
AddToInventoryResult result = Game1.player.TryAddToInventory(this.heldItem);
this.heldItem = result.Remainder;
 
if (result.FullyAdded)
    Game1.player.gainExperience(Farmer.farmingSkill, 20); // grant XP once when the stack is fully collected
</syntaxhighlight>
|-
|-
| <samp>CollectOrDrop(…)</samp>
| <samp>direction</samp>
| Merge an item stack into the player's inventory, and drop any remainder that doesn't fit at the player's feet. If the player isn't in a stable location (e.g. they're warping or watching an event), the item will be dropped when they resume control.
| A [[Modding:Event data#Directions|direction]] which can be specified as either a number (like <samp>0</samp>) or name (like <samp>up</samp>).
 
This replaces the former <samp>Utility.CollectOrDrop(…)</samp>, with added support for use in non-stable locations.
|-
|-
| <samp>CollectOrLostAndFound(Item item)</samp>
| <samp>goToLabel</samp>
| Merge an item stack into the player's inventory, and add any remainder to the [[Mayor's Manor#Lost and Found|lost & found]].
| An event label (see the <samp>goto</samp> and <samp>label</samp> event commands). This is equivalent to <samp>word</samp>, but is used by <samp>EventValidator</samp> to validate label references.
|-
|-
| <samp>Object</samp>
| <samp>itemId</samp>
| <samp>IsDigSpot()</samp>
| An [[Modding:Common data field types#Item ID|item ID]] which can be qualified or unqualified (like <samp>(O)MossySoup</samp> or <samp>MossySoup</samp>).
| Get whether the object is an [[Artifact Spot|artifact spot]] or [[Seed Spot|seed spot]] which can be dug up with a hoe (or a custom modded item with similar behavior).
|-
|-
|rowspan="3"| <samp>PassiveFestivalData</samp>
| <samp>translationKey</samp>
| <samp>CoversDate(…)</samp>
| A [[Modding:Common data field types#Translation key|translation key]] like <samp>Strings/Locations:SomeKey</samp>.
| Get whether the festival is active on the given date.
|-
|-
| <samp>GetFestivalLocations()</samp>
!colspan="2"| custom formats
| Get the locations in which the passive festival happens (based on the <samp>InLocations</samp> or <samp>MapReplacements</samp> fields in [[Modding:Passive Festival data|<samp>Data/PassiveFestivals</samp>]]).
|-
|-
| <samp>TryGetLocationReplacement(…)</samp>
| <samp>'...'</samp>
| Get the new location to load instead of a normal one when the passive festival is active. For example, the [[Night Market]] replaces <samp>Beach</samp> with <samp>BeachNightMarket</samp>.
| The literal text or regex pattern to match, like <code>'continue'</code> or <code>'[\w-]+'</code>.
|}
 
: In addition, you can extend tokens with these indicators:
:* Suffix with <samp>+</samp> for repeating argument of that type. For example, <samp>int+</samp> would allow both <samp>5</samp> and <samp>5 6 7</samp>.
:* Suffix with <samp>?</samp> for an optional argument which can be omitted. All tokens after this token must also be optional. (You can have optional repeating arguments like <samp>int+?</samp>.)
:* Infix with <samp>|</samp> for a parameter which can be one of multiple types. For example <samp>int|bool</samp> will allow either integer or boolean values.
 
====SourceCodeContentManager====
The new <samp>SourceCodeContentManager</samp> isn't relevant for mod authors except as an example. It implements <samp>IContentManager</samp> to support reading assets from the original content assets (e.g. in <samp>.tide</samp> and <samp>.xml</samp> format) instead of the packed XNB files.
 
====TickCache====
The new <samp>TickCache</samp> class loads a value on-demand and caches it for a given number of game ticks.
 
It only has two public methods:
{| class="wikitable"
|-
|-
|rowspan="2"| <samp>TextBox</samp>
! member
| <samp>FilterText</samp>
! usage
| A callback raised when the text changes, but before it's saved. It receives the textbox and new text, and returns the filtered text to save.
|-
|-
| <samp>OnTextChanged</samp>
| <samp>Value</samp>
| An event raised when the text in the textbox changes (after <samp>FilterText</samp> is applied). It receives the textbox, the previous text, and the new text.
| Get the cached value, reloading it if needed.
|-
|-
| <samp>Utility</samp>
| <samp>Clear()</samp>
| <samp>TryGetPassiveFestivalDataForDayHere(…)</samp>
| Reset the cache time, so it'll be reloaded next time <samp>Value</samp> is requested.
| Get the passive festival which occurs on a given date within the given location, if any. This is equivalent to <samp>Utility.TryGetPassiveFestivalDataForDay(…)</samp>, but also checks the given location against the passive festival's <samp>InLocation</samp> or <samp>MapReplacements</samp> field.
|}
|}</li>
</ul>


===Other breaking API changes===
For example, let's say you do this:
''(This section is meant as a quick reference if you have build errors; there's no need to read through it otherwise.)''
<syntaxhighlight lang="c#">
private readonly TickCache<int> Cached = new TickCache<int>(GetValue, cacheTicks: 3);


====Removed types====
/// <inheritdoc />
These types were removed in 1.6.16:
public override void Entry(IModHelper helper)
{| class="wikitable"
{
|-
    helper.Events.GameLoop.UpdateTicked += (sender, e) => _ = this.Cached.Value;
! type
}
! migration
|-
| <samp>Events.DiaryEvent</samp>
| Removed. This was unused.
|}


====Renamed or moved types====
private int GetValue()
These types were renamed or moved in 1.6.16:
{
{| class="wikitable"
  this.Monitor.Log($"Fetching value at game tick {Game1.ticks}.");
  return 0;
}
</syntaxhighlight>
 
When you run the mod, you would see something like...
<blockquote>Fetching value at game tick 100...<br />Fetching value at game tick 103...<br />Fetching value at game tick 106...</blockquote>
 
The [[#Cache changes|game uses this to cache a few frequently-accessed methods]] like <samp>npc.GetData()</samp>.
 
====DataCache====
The new <samp>DataCache&lt;T&gt;</samp> class loads a value on-demand and caches it until a counter is incremented.
 
This is primarily intended for caching values from data assets until that asset is reloaded, and there are static methods on <samp>DataCache</samp> for doing that with several existing assets.
 
<samp>DataCache&lt;T&gt;</samp> instances only have two public methods:
{| class="wikitable"
|-
|-
! type
! member
! migration
! usage
|-
|-
| <samp>LocalizedContentManager</samp>
| <samp>Value</samp>
| Moved from the <code>StardewValley</code> namespace into <code>StardewValley.ContentManagement</code>. See ''[[#Content manager changes|content manager changes]]''.
| Get the cached value, reloading it if needed.
|-
|-
| <samp>LocalizedContentManager.LanguageCode</samp><br /><samp>LocalizedContentManager.LanguageChangedHandler</samp>
| <samp>Clear()</samp>
| &#32;
| Reset the cache time, so it'll be reloaded next time <samp>Value</samp> is requested.
* Moved from the <code>StardewValley</code> namespace into <code>StardewValley.ContentManagement</code>.
* Moved out of the nested type (e.g. change <code>LocalizedContentManager.LanguageCode</code> to just <code>LanguageCode</code> in your mod code).
 
See ''[[#Content manager changes|content manager changes]]''.
|}
|}


====Other API changes====
<samp>DataCache</samp> has several static helper methods for invalidating based on certain vanilla assets. These take a <samp>Func&lt;T&gt;</samp>, which will be called to get the appropriate value whenever the cache needs a new value. The current helper methods are:
These class members changed in 1.6.16:
 
{| class="wikitable"
{| class="wikitable"
|-
|-
! type
! member
! member
! migration
! usage
|-
|-
| <samp>Boots</samp>
| <samp>FarmAnimalData</samp>
| <samp>price</samp>
| Cache is reset when <samp>Data/FarmAnimals</samp> is reloaded.
| Removed. This was never used, since boots prices are calculated dynamically.
|-
|-
|rowspan="2"| <samp>Bush</samp>
| <samp>CharacterData</samp>
| <samp>draw(SpriteBatch batch, int yDrawOffset)</samp>
| Cache is reset when <samp>Data/Characters</samp> is reloaded.
| Removed. Set the <samp>drawOffset</samp> field and then call <samp>draw(SpriteBatch)</samp> instead.
|-
| <samp>FenceData</samp>
| Cache is reset when <samp>Data/Fences</samp> is reloaded.
|-
|-
| <samp>yDrawOffset</samp>
| <samp>MachineData</samp>
| Replaced by <samp>drawOffset</samp>, which is now public and a <samp>Point</samp>.
| Cache is reset when <samp>Data/Machines</samp> is reloaded.
|-
|-
|rowspan="2"| <samp>Farmer</samp>
| <samp>ItemRegistry</samp>
| <samp>addItemToInventoryBool(…)</samp>
| Unlike the others, these do not reset when a specific asset is reloaded. Instead, they reset when whenever the <samp>ItemRegistry</samp> cache is rebuilt (which SMAPI triggers when any item data asset is reloaded).
| Removed. The method's return value was often misunderstood, which led to common bugs in both vanilla and mod code.
|}
 
For example, let's say you do this:
<syntaxhighlight lang="c#">
private readonly DataCache<int> Cached = DataCache.CharacterData(GetValue);
 
/// <inheritdoc />
public override void Entry(IModHelper helper)
{
    helper.Events.Input.TimeChanged += (sender, e) => if (e.NewTime % 100 == 0) helper.GameContent.InvalidateCache("Data/Characters");
    helper.Events.GameLoop.UpdateTicked += (sender, e) => _ = this.Cached.Value;
}


You can convert code directly to the new <samp>TryAddToInventory</samp> method added in 1.6.16. For example:
private int GetValue()
<syntaxhighlight lang="diff">
{
- if (Game1.player.addItemToInventoryBool(this.heldItem))
  this.Monitor.Log($"Fetching some character data at {Game1.timeOfDay}");
+ if (Game1.player.TryAddToInventory(this.heldItem).AnyAdded)
  return 0;
  {
}
      this.heldItem = null;
      Game1.player.gainExperience(Farmer.farmingSkill, 20);
  }
</syntaxhighlight>
</syntaxhighlight>


However, note that <samp>addItemToInventoryBool</samp> returned whether ''any'' of the item stack was added to the inventory (even if it wasn't fully added). Consider whether updated code needs to handle partial success. For example:
When you run the mod, you would see something like this (assuming no other mods are invalidating <samp>Data/Characters</samp>)...
<syntaxhighlight lang="c#">
<blockquote>Fetching some character data at 600...<br />Fetching some character data at 700...<br />Fetching some character data at 800...</blockquote>
var result = Game1.player.TryAddToInventory(item);
this.heldItem = result.Remainder;


if (result.FullyAdded)
The [[#Cache changes|game uses this to cache a few frequently-accessed methods]] like <samp>npc.GetData()</samp>.
    Game1.player.gainExperience(Farmer.farmingSkill, 20); // grant XP once when the stack is fully collected
 
===Utility fields & methods===
<ul>
<li>1.6.16 adds some new utility methods and fields. For example:
{| class="wikitable"
|-
! type
! member
! usage
|-
|rowspan="2"| <samp>Character</samp>
| <samp>DropItemAtFeet(…)</samp>
| Place a floating item next to the character (e.g. monster, NPC, player, etc). This includes options to set the direction, max stack size, and whether to play the 'item dropped' sound.
 
For example, this places a pufferfish in front of the player:
<syntaxhighlight lang="c#">
Item pufferfish = ItemRegistry.Create("(O)128");
Game1.player.DropItemAtFeet(pufferfish);
</syntaxhighlight>
 
This causes 100 pufferfish to 'explode' into individual stacks in random directions around a monster and play the 'item dropped' sound (once):
<syntaxhighlight lang="c#">
Item pufferfish = ItemRegistry.Create("(O)128", 100);
monster.DropItemAtFeet(pufferfish, stackSize: 1, playSound: true);
</syntaxhighlight>
</syntaxhighlight>
|-
|-
| <samp>dropItem(…)</samp>
| <samp>speechBubble</samp>
| Replaced by <samp>DropItemAtFeet(…)</samp>.
| A unified field which handles showing a speech bubble above the player's head. This can be set via <samp>showTextAboveHead(…)</samp>, <samp>clearTextAboveHead()</samp>, or the <samp>textAboveHead</samp> [[Modding:Event data|event command]].
|-
|-
| <samp>FishingRod</samp>
| <samp>Chest</samp>
| <samp>lastCatchWasJunk</samp>
| <samp>TryAddItem(…)</samp>
| Renamed to <samp>lastCatchSkippedMinigame</samp> to more accurately convey what it does.
| Merge an item stack into the chest if possible, and return a result which describes how much of the item as added.
 
See the equivalent <samp>Farmer.TryAddToInventory(…)</samp> below for examples.
|-
|-
| <samp>Game1</samp>
| <samp>FarmAnimal</samp>
| <samp>createMultipleItemDebris</samp>
| <samp>CanPlayersInteract()</samp>
| Added an <code>int stackSize = 1</code> argument, which sets the desired size of each dropped item stack. For example, dropping a stack of 102 with a stack size of 25 will produce 4 debris × 25 and 1 debris × 2.
| Get whether players can interact with the animal (e.g. pet or milk them). By default, [[#Ephemeral characters|ephemeral animals]] are non-interactable. Mods can patch this method to change the behavior for specific animals.
|-
|-
|rowspan="2"| <samp>IKeyboardSubscriber</samp>
|rowspan="3"| <samp>Farmer</samp>
| <samp>RecieveCommandInput(char command)</samp><br /><samp>RecieveCommandInput(char command)</samp>
| <samp>TryAddToInventory(…)</samp>
| Added new parameter (<samp>KeyboardModifier modifiers</samp>).
| Merge an item stack into the player's inventory if possible, and return a result which describes how much of the item as added.
|-
| <samp>string ClipboardCopy()</samp><br /><samp>string ClipboardCut()</samp><br /><samp>void SelectAll()</samp>
| Added.
|-
|rowspan="8"| <samp>LocalizedContentManager</samp>
| <samp>CurrentLanguageCode</samp><br /><samp>CurrentLanguageLatin</samp><br /><samp>CurrentLanguageString</samp><br /><samp>CurrentModLanguage</samp><br /><samp>GetDefaultLanguageCode()</samp><br /><samp>OnLanguageChange</samp><br /><samp>SetModLanguage(…)</samp>
| These are no longer static, so they need to be called through an instance like <samp>Game1.content</samp>. For example, change <code>LocalizedContentManager.GetDefaultLanguageCode()</code> in mod code to <code>Game1.content.GetDefaultLanguageCode()</code>.


Some of these are also renamed (see the next rows).
The result fields are:
{| class="wikitable"
|-
|-
| <samp>CurrentCulture</samp>
! field
| Removed (it was unused).
! usage
|-
|-
| <samp>CurrentLanguageCode</samp>
| <samp>TotalAdded</samp>
| Renamed to <samp>LanguageCode</samp>.
| The stack count which was added to the inventory.
|-
|-
| <samp>CurrentLanguageLatin</samp>
| <samp>TotalRemaining</samp>
| Renamed to <samp>LanguageUsesLatinFont</samp>.
| The stack count which couldn't be added to the inventory.
|-
|-
| <samp>CurrentLanguageString</samp>
| <samp>Remainder</samp>
| Renamed to <samp>LanguageString</samp>.
| A stack for the items which couldn't be added to the inventory, or <samp>null</samp> if it was fully added.
 
This is always a reference to the original input item if there's any remainder.
|-
|-
| <samp>CurrentModLanguage</samp>
| <samp>AnyAdded</samp>
| Renamed to <samp>LanguageModData</samp>.
| Whether any items were added to the inventory.
|-
|-
| <samp>GetCurrentLanguage()</samp>
| <samp>FullyAdded</samp>
| Removed. Use the <samp>LanguageCode</samp> property instead.
| Whether the item was fully added to the inventory.
|}
 
This allows handling partial failures in a more intuitive way. For example:
<syntaxhighlight lang="c#">
AddToInventoryResult result = Game1.player.TryAddToInventory(this.heldItem);
this.heldItem = result.Remainder;
 
if (result.FullyAdded)
    Game1.player.gainExperience(Farmer.farmingSkill, 20); // grant XP once when the stack is fully collected
</syntaxhighlight>
|-
|-
| <samp>OnLanguageChange</samp>
| <samp>CollectOrDrop(…)</samp>
| Renamed to <samp>OnGlobalLanguageChanged</samp>.
| Merge an item stack into the player's inventory, and drop any remainder that doesn't fit at the player's feet. If the player isn't in a stable location (e.g. they're warping or watching an event), the item will be dropped when they resume control.
 
This replaces the former <samp>Utility.CollectOrDrop(…)</samp>, with added support for use in non-stable locations.
|-
|-
|rowspan="5"| <samp>NPC</samp>
| <samp>CollectOrLostAndFound(Item item)</samp>
| <samp>birthday_Day</samp><br /><samp>birthday_Season</samp><br /><samp>manners</samp><br /><samp>optimism</samp><br /><samp>socialAnxiety</samp>
| Merge an item stack into the player's inventory, and add any remainder to the [[Mayor's Manor#Lost and Found|lost & found]].
| Removed. See the equivalent properties (e.g. <samp>Manners</samp>) instead.
|-
|-
| <samp>Birthday_Season</samp>
| <samp>FarmHouse</samp>
| &#32;
| <samp>GetSpouseRoomRelativeTile(…)</samp>
* Changed from string to the <samp>Season</samp> enum.
| Get a tile coordinate relative to the spouse room bounds. For example, the frog terrarium in Sebastian's spouse room is at <code>farmHouse.GetSpouseRoomRelativeTile(1, 6)</code>.
* Removed setter (now reads the value from the [[#Cache changes|cached NPC data]]).
|-
|-
| <samp>Birthday_Day</samp><br /><samp>Manners</samp><br /><samp>Optimism</samp><br /><samp>SocialAnxiety</samp>
| <samp>Forest</samp>
| Removed setter (now reads the value from the [[#Cache changes|cached NPC data]]).
| <samp>ShouldTravelingMerchantVisit(…)</samp>
| Get whether the [[Traveling Cart|traveling cart]] should visit on the given date.
|-
|-
| <samp>isDatable</samp>
| <samp>FruitTree</samp>
| Replaced by the <samp>CanBeRomanced</samp> property, which gets the value from the [[#Cache changes|cached NPC data]].
| <samp>DropAllFruit()</samp>
| Drops all fruit onto the ground (as if the player shook the tree).
|-
|-
| <samp>loveInterest</samp>
| <samp>Object</samp>
| Removed. This was unused.
| <samp>IsDigSpot()</samp>
| Get whether the object is an [[Artifact Spot|artifact spot]] or [[Seed Spot|seed spot]] which can be dug up with a hoe (or a custom modded item with similar behavior).
|-
|-
|rowspan="3"| <samp>NPCDialogueResponse</samp><br /><samp>Response</samp>
|rowspan="3"| <samp>PassiveFestivalData</samp>
| <samp>id</samp><br /><samp>friendshipChange</samp><br /><samp>extraArgument</samp><br /><samp>hotkey</samp><br /><samp>responseText</samp>
| <samp>CoversDate(…)</samp>
| Fields changed to get-only properties.
| Get whether the festival is active on the given date.
|-
| <samp>GetFestivalLocations()</samp>
| Get the locations in which the passive festival happens (based on the <samp>InLocations</samp> or <samp>MapReplacements</samp> fields in [[Modding:Passive Festival data|<samp>Data/PassiveFestivals</samp>]]).
|-
| <samp>TryGetLocationReplacement(…)</samp>
| Get the new location to load instead of a normal one when the passive festival is active. For example, the [[Night Market]] replaces <samp>Beach</samp> with <samp>BeachNightMarket</samp>.
|-
|rowspan="2"| <samp>TextBox</samp>
| <samp>FilterText</samp>
| A callback raised when the text changes, but before it's saved. It receives the textbox and new text, and returns the filtered text to save.
|-
|-
| <samp>responseKey</samp>
| <samp>OnTextChanged</samp>
| &#32;
| An event raised when the text in the textbox changes (after <samp>FilterText</samp> is applied). It receives the textbox, the previous text, and the new text.
* Field changed to get-only property.
* Previously <samp>NPCDialogueResponse</samp> stored the NPC's reaction dialogue key in this field. You should now use <samp>npcReactionKey</samp> for that instead.
|-
|-
| <samp>SetHotKey(…)</samp>
| <samp>Town</samp>
| Removed. Set the hotkey through the constructor instead.
| <samp>ShouldBooksellerVisit(…)</samp>
| Get whether the [[bookseller]] should visit on the given date.
|-
|-
| <samp>StartupPreferences</samp>
| <samp>TriggerActionManager</samp>
| <samp>levelTenCombat</samp><br /><samp>levelTenFishing</samp><br /><samp>levelTenForaging</samp><br /><samp>levelTenMining</samp>
| <samp>TryRunActions(…)</samp>
| Removed. These were unused.
| Run a list of [[Modding:Trigger actions|actions]] with the game's default error logging.
|-
|-
| <samp>Utility</samp>
| <samp>Utility</samp>
| <samp>CollectOrDrop(…)</samp>
| <samp>TryGetPassiveFestivalDataForDayHere(…)</samp>
| Replaced by <samp>Game1.player.CollectOrDrop(…)</samp>. See also [[#Utility fields & methods|''utility fields & methods'']] for improvements to it.
| Get the passive festival which occurs on a given date within the given location, if any. This is equivalent to <samp>Utility.TryGetPassiveFestivalDataForDay(…)</samp>, but also checks the given location against the passive festival's <samp>InLocation</samp> or <samp>MapReplacements</samp> field.
|}
|}</li>
 
<li>And improves some existing methods:
===Other changes===
{| class="wikitable"
* Added <samp>event.floorSprites</samp> field for temporary animated sprites that should be drawn on the ground (e.g. under NPC shadows).
|-
* Added <samp>GameStateQuery.TryResolveCommandName</samp> method to get the actual query name given a case-insensitive name or alias.
! type
* The game now uses forward slashes in all asset names (like <samp>Maps/Town</samp> instead of <samp>Maps\Town</samp>). This shouldn't affect most mods, since SMAPI already converted all asset names to forward slashes.
! member
* Removed broken <samp>Lantern</samp> tool, <samp>Raft</samp> tool, and their related logic.
! usage
* <samp>TrashBear</samp> item ID fields are now [[Modding:Common data field types#Item ID|qualified]].
|-
* Fixed <code>Event.TryGetEventCommandHandler</code> not loading commands if it's called before any other methods.
| <samp>Item</samp>
* Fixed machine auto-load leaving empty slots in chests when taking a secondary ingredient.
| <samp>getOne(…)</samp>
* Fixed issue where placing a storage furniture (e.g. a dresser or fish tank) on a table would discard any items inside it.
| &#32;
* Now copies held and inner items too.
* Added an optional <samp>copyStackSize</samp> argument (default false).
|}
</ul>


==Name translation changes for wiki maintainers==
===Nullable reference types===
Some in-game item and monster names were retranslated in some languages for clarity or correctness.
Stardew Valley 1.6.16 adds [https://learn.microsoft.com/en-us/dotnet/csharp/nullable-references nullable reference types] to many of its generic utilities (like <samp>ArgUtility</samp>), core systems (like <samp>ItemRegistry</samp> and <samp>GameStateQuery</samp>), extensions, and various methods.
 
For example, if you do this in modern mod code:
<syntaxhighlight lang="c#">
ArgUtility.TryGet(args, 0, out string? argValue, out string? error);
 
if (argValue.Length > 0)
  ...;
</syntaxhighlight>
 
You'll now see a build warning like "''CS8602: Dereference of a possibly null reference''" because <code>argValue</code> may be null there.
 
Changing the code to this would fix the warning:
<syntaxhighlight lang="c#">
if (ArgUtility.TryGet(args, 0, out string? argValue, out string? error))
{
    if (argValue.Length > 0)
      ...;
}
</syntaxhighlight>


This list is mostly provided to help wiki maintainers update pages, so it doesn't include names which only changed capitalization, changed <code>'</code> (straight apostrophe) to <code>’</code> (curly) in French, or aren't visible to vanilla players (like mine rocks).
===Other breaking API changes===
''(This section is meant as a quick reference if you have build errors; there's no need to read through it otherwise.)''


===Objects===
====Removed types====
; Hungarian
These types were removed in 1.6.16:
: {| class="wikitable"
{| class="wikitable"
|-
! type
! migration
|-
|-
! item
| <samp>Events.DiaryEvent</samp>
! old name
| Removed (unused).
! new name
|-
|-
| [[Artichoke Dip]]
| <samp>Lantern</samp>
| ''Articsóka mártás''
| Removed (broken tool).
| ''Articsókamártás''
|-
|-
| [[Blackberry Cobbler]]
| <samp>ObjToStr</samp>
| ''Szeder kosár''
| Removed (unused in release builds).
| ''Szedres kosárka''
|-
| <samp>Raft</samp>
| Removed (broken tool).
|}
 
====Readonly structs====
These structs became [https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/struct#readonly-struct readonly structs] in 1.6.16, which makes them much more efficient (e.g. they're no longer defensively copied on every access).
 
The effect on mods depends on the struct:
* For structs whose fields were already <samp>readonly</samp>, this has no effect on mod code (besides making it more efficient).
* For structs whose fields became readonly in 1.6.16, mod code which sets fields directly will need to use the constructor instead. These are mentioned in the ''breaking API changes'' column below.
 
{| class="wikitable"
|-
|-
| [[Bone Mill]]
! type
| ''Csontőrlő''
! breaking API changes
| ''Csontdaráló''
|-
|-
| [[Chocolate Cake]]
| <samp>AnimationFrame</samp>
| ''Csokis torta''
| &#32;
| ''Csokitorta''
* Fields changed to <samp>readonly</samp>.
* [[#Other API changes|Removed <samp>AddFrameAction(…)</samp> and <samp>AddFrameEndAction(…)</samp> methods]].
|-
|-
| [[Cranberry Candy]]
| <samp>BundleIngredientDescription</samp>
| ''Vörös áfonyás cukorka''
| Some fields (<samp>preservesId</samp> and <samp>completed</samp>) changed to <samp>readonly</samp>.
| ''Vörös áfonyás üdítő''
|-
|-
| [[Geode Crusher]]
| <samp>ButtonCollection</samp>
| ''Geóda zúzó''
| ''none''
| ''Geódazúzó''
|-
|-
| [[Maple Syrup]]
| <samp>FarmerPair</samp>
| ''Juharfaszirup''
| Fields changed to <samp>readonly</samp>.
| ''Juharszirup''
|-
|-
| [[Tea Sapling]]
| <samp>Flooring.Neighbor</samp><br /><samp>Flooring.NeighborLoc</samp>
| ''Tea csemete''
| ''none''
| ''Teacsemete''
|-
|-
| [[Woodcutter's Weekly]]
| <samp>HoeDirt.Neighbor</samp><br /><samp>HoeDirt.NeighborLoc</samp>
| ''Favágok hetilapja''
| ''none''
| ''Favágók hetilapja''
|}
 
; Russian
: {| class="wikitable"
|-
|-
! item
| <samp>InteriorDoorDictionary.DoorCollection</samp>
! old name
| ''none''
! new name
|-
|-
|rowspan="71" valign="top"| [[Aged Roe]] (flavored)
| <samp>NetDictionary.KeysCollection</samp><br /><samp>NetDictionary.PairsCollection</samp><br /><samp>NetDictionary.ValuesCollection</samp>
| ''Вяленая икра (Альбакор)''<!--Albacore-->
| ''none''
| ''Вяленая икра альбакора''
|-
|-
| ''Вяленая икра (Анчоус)''<!--Anchovy-->
| <samp>OutgoingMessage</samp>
| ''Вяленая икра анчоуса''
| Fields changed to <samp>readonly</samp>.
|-
|-
| ''Вяленая икра (Морской черт)''<!--Angler-->
| <samp>SerializableDictionary.ChangeArgs</samp>
| ''Вяленая икра Морского черта''
| ''none''
|-
|-
| ''Вяленая икра (Рыба-капля)''<!--Blobfish-->
| <samp>StaticDelegateBuilder.CachedDelegate</samp>
| ''Вяленая икра рыбы-капли''
| ''none''
|-
|-
| ''Вяленая икра (Голубой дискус)''<!--Blue Discus-->
| <samp>WaterTiles.WaterTileData</samp>
| ''Вяленая икра голубого дискуса''
| Fields changed to <samp>readonly</samp>.
|}
 
====Renamed or moved types====
These types were renamed or moved in 1.6.16:
{| class="wikitable"
|-
|-
| ''Вяленая икра (Лещ)''<!--Bream-->
! type
| ''Вяленая икра леща''
! migration
|-
|-
| ''Вяленая икра (Сомик)''<!--Bullhead-->
| <samp>LocalizedContentManager</samp>
| ''Вяленая икра сомика''
| Moved from the <code>StardewValley</code> namespace into <code>StardewValley.ContentManagement</code>. See ''[[#Content manager changes|content manager changes]]''.
|-
|-
| ''Вяленая икра (Карп)''<!--Carp-->
| <samp>LocalizedContentManager.LanguageCode</samp><br /><samp>LocalizedContentManager.LanguageChangedHandler</samp>
| ''Вяленая икра карпа''
| &#32;
|-
* Moved from the <code>StardewValley</code> namespace into <code>StardewValley.ContentManagement</code>.
| ''Вяленая икра (Сом)''<!--Catfish-->
* Moved out of the nested type (e.g. change <code>LocalizedContentManager.LanguageCode</code> to just <code>LanguageCode</code> in your mod code).
| ''Вяленая икра сома''
 
See ''[[#Content manager changes|content manager changes]]''.
|}
 
====Other API changes====
These class members changed in 1.6.16:
 
{| class="wikitable"
|-
|-
| ''Вяленая икра (Голавль)''<!--Chub-->
! type
| ''Вяленая икра голавля''
! member
! migration
|-
|-
| ''Вяленая икра (Гребешок)''<!--Clam-->
| <samp>AnimationFrame</samp>
| ''Вяленая икра гребешка''
| <samp>AddFrameAction(…)</samp><br /><samp>AddFrameEndAction(…)</samp>
| Removed per [[#Readonly structs|readonly structs]]. To add multiple frame actions, pass them into the constructor instead.
 
For example, if you previously had code like this:
<syntaxhighlight lang="c#">
var frame = new FarmerSprite.AnimationFrame(…);
frame.AddFrameEndAction(this.PerformAnimationSound);
frame.AddFrameEndAction(this.OnAnimationEnded);
</syntaxhighlight>
 
You can pass the combined actions into the constructor instead:
<syntaxhighlight lang="c#">
var frame = new FarmerSprite.AnimationFrame(…, this.PerformAnimationSound + this.OnAnimationEnded);
</syntaxhighlight>
|-
|-
| ''Вяленая икра (Сердцевидка)''<!--Cockle-->
| <samp>ArgUtility</samp>
| ''Вяленая икра сердцевидки''
| <samp>TryGetOptionalRemainder(…)</samp>
| Removed; use <samp>ArgUtility.GetRemainder(…)</samp> instead. The methods are equivalent, since <samp>TryGetOptionalRemainder</samp> was guaranteed to return true.
|-
|-
| ''Вяленая икра (Краб)''<!--Crab-->
| <samp>Boots</samp>
| ''Вяленая икра краба''
| <samp>price</samp>
| Removed. This was never used, since boots prices are calculated dynamically.
|-
|-
| ''Вяленая икра (Рак)''<!--Crayfish-->
|rowspan="2"| <samp>Buff</samp>
| ''Вяленая икра рака''
| <samp>goblinsCurse</samp><br /><samp>slimed</samp><br /><samp>evilEye</samp><br /><samp>tipsy</samp><br /><samp>fear</samp><br /><samp>frozen</samp><br /><samp>warriorEnergy</samp><br /><samp>yobaBlessing</samp><br /><samp>adrenalineRush</samp><br /><samp>avoidMonsters</samp><br /><samp>full</samp><br /><samp>quenched</samp><br /><samp>spawnMonsters</samp><br /><samp>nauseous</samp><br /><samp>darkness</samp><br /><samp>weakness</samp><br /><samp>squidInkRavioli</samp>
| Replaced by <samp>BuffIds</samp> constants:
* <samp>Buff.avoidMonsters</samp> → <samp>BuffIds.OilOfGarlic</samp>;
* <samp>Buff.evilEye</samp> → <samp>BuffIds.Jinxed</samp>;
* <samp>Buff.goblinsCurse</samp> → <samp>BuffIds.Burnt</samp>;
* <samp>Buff.spawnMonsters</samp> → <samp>BuffIds.MonsterMusk</samp>;
* <samp>Buff.nauseous</samp> → <samp>BuffIds.Nauseated</samp>;
* and the others have equivalent names (e.g. <samp>Buff.slimed</samp> → <samp>BuffIds.Slimed</samp>).
|-
|-
| ''Вяленая икра (Багрянник)''<!--Crimsonfish-->
| <samp>fullnessLength</samp><br /><samp>quenchedLength</samp>
| ''Вяленая икра Багрянника''
| Removed. Their lengths are set in <samp>Data/Buffs</samp> instead.
|-
|-
| ''Вяленая икра (Дорада)''<!--Dorado-->
| <samp>BuffManager</samp>
| ''Вяленая икра дорады''
| <samp>Apply(…)</samp>
| Split into <code>Apply(string id)</code> + <code>ApplyLocal(Buff buff)</code>, to clarify that applying a custom buff model (instead of a buff ID) won't synchronize if it's not the local player.
|-
|-
| ''Вяленая икра (Угорь)''<!--Eel-->
|rowspan="2"| <samp>Bush</samp>
| ''Вяленая икра угря''
| <samp>draw(SpriteBatch batch, int yDrawOffset)</samp>
| Removed. Set the <samp>drawOffset</samp> field and then call <samp>draw(SpriteBatch)</samp> instead.
|-
|-
| ''Вяленая икра (Камбала)''<!--Flounder-->
| <samp>yDrawOffset</samp>
| ''Вяленая икра камбалы''
| Replaced by <samp>drawOffset</samp>, which is now public and a <samp>Point</samp>.
|-
|-
| ''Вяленая икра (Пятнистый криворот)''<!--Ghostfish-->
| <samp>FarmAnimal</samp>
| ''Вяленая икра пятнистого криворота''
| <samp>buildingTypeILiveIn</samp>
| Removed. Use the <code>AnimalData.Value?.House</code> field instead.
|-
|-
| ''Вяленая икра (Ледорыб)''<!--Glacierfish-->
|rowspan="4"| <samp>Farmer</samp>
| ''Вяленая икра Ледорыба''
| <samp>addItemToInventoryBool(…)</samp>
| Removed. The method's return value was often misunderstood, which led to common bugs in both vanilla and mod code.
 
You can convert code directly to the new <samp>TryAddToInventory</samp> method added in 1.6.16. For example:
<syntaxhighlight lang="diff">
- if (Game1.player.addItemToInventoryBool(this.heldItem))
+ if (Game1.player.TryAddToInventory(this.heldItem).AnyAdded)
  {
      this.heldItem = null;
      Game1.player.gainExperience(Farmer.farmingSkill, 20);
  }
</syntaxhighlight>
 
However, note that <samp>addItemToInventoryBool</samp> returned whether ''any'' of the item stack was added to the inventory (even if it wasn't fully added). Consider whether updated code needs to handle partial success. For example:
<syntaxhighlight lang="c#">
var result = Game1.player.TryAddToInventory(item);
this.heldItem = result.Remainder;
 
if (result.FullyAdded)
    Game1.player.gainExperience(Farmer.farmingSkill, 20); // grant XP once when the stack is fully collected
</syntaxhighlight>
|-
|-
| ''Вяленая икра (Ледорыб-младший)''<!--Glacierfish Jr.-->
| <samp>applyBuff(Buff)</samp>
| ''Вяленая икра Ледорыба-младшего''
| Renamed to <samp>applyLocalBuff</samp>, to clarify that applying a custom buff model (instead of a buff ID) won't synchronize if it's not the local player.
|-
|-
| ''Вяленая икра (Бычок)''<!--Goby-->
| <samp>dropItem(…)</samp>
| ''Вяленая икра бычка''
| Replaced by <samp>DropItemAtFeet(…)</samp>.
|-
|-
| ''Вяленая икра (Палтус)''<!--Halibut-->
| <samp>nextEventcommandAfterEmote</samp>
| ''Вяленая икра палтуса''
| Removed; see [[#Removed manual event pause management|''removed manual event pause management'']].
|-
|-
| ''Вяленая икра (Сельдь)''<!--Herring-->
| <samp>Forest</samp>
| ''Вяленая икра сельди''
| <samp>ShouldTravelingMerchantVisitToday()</samp>
| Replaced by the static <samp>ShouldTravelingMerchantVisit</samp> method:
<syntaxhighlight lang="c#">
bool shouldVisitToday = Forest.ShouldTravelingMerchantVisit(Game1.Date);
</syntaxhighlight>
|-
|-
| ''Вяленая икра (Ледопип)''<!--Ice Pip-->
| <samp>FishingRod</samp>
| ''Вяленая икра ледопипа''
| <samp>lastCatchWasJunk</samp>
| Renamed to <samp>lastCatchSkippedMinigame</samp> to more accurately convey what it does.
|-
|-
| ''Вяленая икра (Большеротый окунь)''<!--Largemouth Bass-->
| <samp>Furniture</samp>
| ''Вяленая икра большеротого окуня''
| <samp>rotations</samp>
| Removed. You can read it from the data instead:
<syntaxhighlight lang="c#">
string[] data = furniture.getData();
int rawRotations = ArgUtility.GetInt(data, 4);
</syntaxhighlight>
|-
|-
| ''Вяленая икра (Лавовый угорь)''<!--Lava Eel-->
| <samp>Game1</samp>
| ''Вяленая икра лавового угря''
| <samp>createMultipleItemDebris</samp>
| Added an <code>int stackSize = 1</code> argument, which sets the desired size of each dropped item stack. For example, dropping a stack of 102 with a stack size of 25 will produce 4 debris × 25 and 1 debris × 2.
|-
|-
| ''Вяленая икра (Легенда)''<!--Legend-->
|rowspan="2"| <samp>IKeyboardSubscriber</samp>
| ''Вяленая икра Легенды''
| <samp>RecieveCommandInput(char command)</samp><br /><samp>RecieveCommandInput(char command)</samp>
| Added new parameter (<samp>KeyboardModifier modifiers</samp>).
|-
|-
| ''Вяленая икра (Легенда II)''<!--Legend II-->
| <samp>string ClipboardCopy()</samp><br /><samp>string ClipboardCut()</samp><br /><samp>void SelectAll()</samp>
| ''Вяленая икра Легенды II''
| Added.
|-
|-
| ''Вяленая икра (Змеезуб)''<!--Lingcod-->
| <samp>ItemRegistry</samp>
| ''Вяленая икра змеезуба''
| <samp>Create(…)</samp>
| Split into two methods: <samp>Create</samp> (returns an Error Item if the item doesn't exist) and <samp>CreateOrNull</samp> (returns null if an item doesn't exist).
 
To migrate existing code:
* If you set <code>allowNull: false</code> or omitted it, use <samp>Create</samp>.
* If you set <code>allowNull: true</code>, use <samp>CreateOrNull</samp>.
|-
|-
| ''Вяленая икра (Крылатка)''<!--Lionfish-->
|rowspan="8"| <samp>LocalizedContentManager</samp>
| ''Вяленая икра крылатки''
| <samp>CurrentLanguageCode</samp><br /><samp>CurrentLanguageLatin</samp><br /><samp>CurrentLanguageString</samp><br /><samp>CurrentModLanguage</samp><br /><samp>GetDefaultLanguageCode()</samp><br /><samp>OnLanguageChange</samp><br /><samp>SetModLanguage(…)</samp>
| These are no longer static, so they need to be called through an instance like <samp>Game1.content</samp>. For example, change <code>LocalizedContentManager.GetDefaultLanguageCode()</code> in mod code to <code>Game1.content.GetDefaultLanguageCode()</code>.
 
Some of these are also renamed (see the next rows).
|-
|-
| ''Вяленая икра (Омар)''<!--Lobster-->
| <samp>CurrentCulture</samp>
| ''Вяленая икра омара''
| Removed (it was unused).
|-
|-
| ''Вяленая икра (Полуночный карп)''<!--Midnight Carp-->
| <samp>CurrentLanguageCode</samp>
| ''Вяленая икра полуночного карпа''
| Renamed to <samp>LanguageCode</samp>.
|-
|-
| ''Вяленая икра (Ночной кальмар)''<!--Midnight Squid-->
| <samp>CurrentLanguageLatin</samp>
| ''Вяленая икра ночного кальмара''
| Renamed to <samp>LanguageUsesLatinFont</samp>.
|-
|-
| ''Вяленая икра (Мисс Морской черт)''<!--Ms. Angler-->
| <samp>CurrentLanguageString</samp>
| ''Вяленая икра Мисс Морской черт''
| Renamed to <samp>LanguageString</samp>.
|-
|-
| ''Вяленая икра (Мидия)''<!--Mussel-->
| <samp>CurrentModLanguage</samp>
| ''Вяленая икра мидий''
| Renamed to <samp>LanguageModData</samp>.
|-
|-
| ''Вяленая икра (Карп-мутант)''<!--Mutant Carp-->
| <samp>GetCurrentLanguage()</samp>
| ''Вяленая икра Карпа-мутанта''
| Removed. Use the <samp>LanguageCode</samp> property instead.
|-
|-
| ''Вяленая икра (Осьминог)''<!--Octopus-->
| <samp>OnLanguageChange</samp>
| ''Вяленая икра осьминога''
| Renamed to <samp>OnGlobalLanguageChanged</samp>.
|-
|-
| ''Вяленая икра (Устрица)''<!--Oyster-->
|rowspan="7"| <samp>NPC</samp>
| ''Вяленая икра устриц''
| <samp>birthday_Day</samp><br /><samp>birthday_Season</samp><br /><samp>manners</samp><br /><samp>optimism</samp><br /><samp>socialAnxiety</samp>
| Removed. See the equivalent properties (e.g. <samp>Manners</samp>) instead.
|-
|-
| ''Вяленая икра (Окунь)''<!--Perch-->
| <samp>Birthday_Season</samp>
| ''Вяленая икра окуня''
| &#32;
* Changed from string to the <samp>Season</samp> enum.
* Removed setter (now reads the value from the [[#Cache changes|cached NPC data]]).
|-
|-
| ''Вяленая икра (Литорина)''<!--Periwinkle-->
| <samp>Birthday_Day</samp><br /><samp>Manners</samp><br /><samp>Optimism</samp><br /><samp>SocialAnxiety</samp>
| ''Вяленая икра литорин''
| Removed setter (now reads the value from the [[#Cache changes|cached NPC data]]).
|-
|-
| ''Вяленая икра (Щука)''<!--Pike-->
| <samp>isDatable</samp>
| ''Вяленая икра щуки''
| Replaced by the <samp>CanBeRomanced</samp> property, which gets the value from the [[#Cache changes|cached NPC data]].
|-
|-
| ''Вяленая икра (Иглобрюх)''<!--Pufferfish-->
| <samp>loveInterest</samp>
| ''Вяленая икра иглобрюха''
| Removed. Use the equivalent data field instead:
<syntaxhighlight lang="c#">
string? loveInterest = npc.GetData()?.LoveInterest;
</syntaxhighlight>
|-
|-
| ''Вяленая икра (Радиоактивный карп)''<!--Radioactive Carp-->
| <samp>textAboveHead</samp><br /><samp>textAboveHeadAlpha</samp><br /><samp>textAboveHeadColor</samp><br /><samp>textAboveHeadPreTimer</samp><br /><samp>textAboveHeadStyle</samp><br /><samp>textAboveHeadTimer</samp>
| ''Вяленая икра Радиоактивного карпа''
| Replaced by <samp>npc.speechBubble</samp>. To add/remove a speech bubble, see <samp>npc.showTextAboveHead(…)</samp> and <samp>npc.clearTextAboveHead()</samp>.
|-
|-
| ''Вяленая икра (Радужная форель)''<!--Rainbow Trout-->
| <samp>textStyle_None</samp><br /><samp>textStyle_Shake</samp>
| ''Вяленая икра радужной форели''
| Replaced by <samp>SpeechBubble.textStyle_None</samp> and <samp>SpeechBubble.textStyle_Shake</samp>.
|-
|-
| ''Вяленая икра (Барабулька)''<!--Red Mullet-->
|rowspan="3"| <samp>NPCDialogueResponse</samp><br /><samp>Response</samp>
| ''Вяленая икра барабульки''
| <samp>id</samp><br /><samp>friendshipChange</samp><br /><samp>extraArgument</samp><br /><samp>hotkey</samp><br /><samp>responseText</samp>
| Fields changed to get-only properties.
|-
|-
| ''Вяленая икра (Берикс)''<!--Red Snapper-->
| <samp>responseKey</samp>
| ''Вяленая икра берикса''
| &#32;
* Field changed to get-only property.
* Previously <samp>NPCDialogueResponse</samp> stored the NPC's reaction dialogue key in this field. You should now use <samp>npcReactionKey</samp> for that instead.
|-
|-
| ''Вяленая икра (Лосось)''<!--Salmon-->
| <samp>SetHotKey(…)</samp>
| ''Вяленая икра лосося''
| Removed. Set the hotkey through the constructor instead.
|-
|-
| ''Вяленая икра (Песковник)''<!--Sandfish-->
| <samp>PetData</samp>
| ''Вяленая икра песковника''
| <samp>GetBreedById(…)</samp>
| Removed. To migrate existing code:
* If you set <code>allowNull: false</code> or omitted it, use the new <code>GetPreferredBreed</code> method.
* If you set <code>allowNull: true</code>, use <code>petData.Breeds.FirstOrDefault(p => p.Id == breedId)</code>.
|-
|-
| ''Вяленая икра (Сардина)''<!--Sardine-->
| <samp>StartupPreferences</samp>
| ''Вяленая икра сардины''
| <samp>levelTenCombat</samp><br /><samp>levelTenFishing</samp><br /><samp>levelTenForaging</samp><br /><samp>levelTenMining</samp>
| Removed. These were unused.
|-
|-
| ''Вяленая икра (Скорпионовый карп)''<!--Scorpion Carp-->
| <samp>TrashBear</samp>
| ''Вяленая икра скорпионового карпа''
| <samp>itemBeingEaten</samp><br /><samp>itemWantedIndex</samp>
| Replaced by <samp>eatingItemId</samp> and <samp>wantedItemId</samp>. Note that these contain [[Modding:Common data field types#Item ID|qualified item IDs]], whereas the old fields had unqualified IDs.
|-
|-
| ''Вяленая икра (Морской огурец)''<!--Sea Cucumber-->
|rowspan="3"| <samp>Utility</samp>
| ''Вяленая икра морского огурца''
| <samp>CollectOrDrop(…)</samp>
| Replaced by <samp>Game1.player.CollectOrDrop(…)</samp>. See also [[#Utility fields & methods|''utility fields & methods'']] for improvements to it.
|-
|-
| ''Вяленая икра (Морской еж)''<!--Sea Urchin-->
| <samp>getLoveInterest(…)</samp>
| ''Вяленая икра морского ежа''
| Removed. Use the equivalent data field instead:
<syntaxhighlight lang="js">
// from an NPC
string loveInterest = npc.GetData()?.LoveInterest;
 
// or from an NPC name
if (NPC.TryGetData(name, out var data))
{
    string loveInterest = data.LoveInterest;
}
</syntaxhighlight>
|-
|-
| ''Вяленая икра (Шэд)''<!--Shad-->
| <samp>IsLegacyIdAbove(…)</samp><br /><samp>IsLegacyIdBetween(…)</samp>
| ''Вяленая икра шэда''
| Removed. No longer used by the base game.
|-
|-
| ''Вяленая икра (Креветка)''<!--Shrimp-->
| <samp>Wallpaper</samp>
| ''Вяленая икра креветок''
| <samp>GetSetData()</samp>
| Removed. The equivalent new code is:
<syntaxhighlight lang="js">
var setData = ItemRegistry.GetData(item.QualifiedItemId)?.RawData as ModWallpaperOrFlooring;
</syntaxhighlight>
|}
 
===Other changes===
<ul>
<li>Added <samp>event.floorSprites</samp> field for temporary animated sprites that should be drawn on the ground (e.g. under NPC shadows).</li>
<li>Added <samp>GameStateQuery.TryResolveCommandName</samp> method to get the actual query name given a case-insensitive name or alias.</li>
<li>The game now uses forward slashes in all asset names (like <samp>Maps/Town</samp> instead of <samp>Maps\Town</samp>). This shouldn't affect most mods, since SMAPI already converted all asset names to forward slashes.</li>
<li>Applying or removing buffs on a remote player will now sync the change to that player. This only works for buffs in <samp>Data/Buffs</samp>; the other method signatures have been renamed to <samp>ApplyLocal*</samp> for clarity.</li>
<li>Fixed broken sprite when drawing a flooring/wallpaper item based on its <samp>parsedItemData.GetSourceRect()</samp>.</li>
<li>Fixed machine auto-load leaving empty slots in chests when taking a secondary ingredient.</li>
<li>Fixed issue where placing a storage furniture (e.g. a dresser or fish tank) on a table would discard any items inside it.</li>
<li>Fixed the read-book animation not setting <samp>Farmer.canMoveNow()</samp> as intended.</li>
<li>Fixed issues with specific APIs:
 
{| class="wikitable"
|-
|-
| ''Вяленая икра (Слаймджек)''<!--Slimejack-->
! type
| ''Вяленая икра слаймджека''
! member
! changes
|-
|-
| ''Вяленая икра (Малоротый окунь)''<!--Smallmouth Bass-->
| <samp>CollisionMask</samp>
| ''Вяленая икра малоротого окуня''
| <samp>Characters</samp>
| This enum now includes actors in events and festivals.
|-
|-
| ''Вяленая икра (Улитка)''<!--Snail-->
| <samp>Event</samp>
| ''Вяленая икра улиток''
| <samp>TryGetEventCommandHandler(…)</samp>
| Fixed commands not being registered if it's called before any other event method.
|-
|-
| ''Вяленая икра (Малек Багрянника)''<!--Son of Crimsonfish-->
| <samp>Inventory</samp>
| ''Вяленая икра Малька Багрянника''
| <samp>OnSlotChanged</samp>
| Fixed event raised before the new value is visible.
|-
|-
| ''Вяленая икра (Жуть-рыба)''<!--Spook Fish-->
| <samp>MarriageDialogueReference</samp>
| ''Вяленая икра жуть-рыбы''
| <samp>GetHashCode()</samp>
| Fixed the same hash sometimes returned for two keys in the same asset.
|-
|-
| ''Вяленая икра (Кальмар)''<!--Squid-->
| <samp>NetList</samp>
| ''Вяленая икра кальмара''
| <samp>OnElementChanged</samp>
| Fixed event raised before the new value is visible.
|-
|-
| ''Вяленая икра (Скат)''<!--Stingray-->
| <samp>NetMutex</samp>
| ''Вяленая икра ската''
| <samp>ReleaseLock()</samp>
| When locked multiple times locally (ex. a successfully acquired callback calling another function which also locks the same <samp>NetMutex</samp> and both call <samp>ReleaseLock()</samp> in their acquired callback), fixes the lock being fully released upon the first call, rather than after all local locks are undone.
|-
|-
| ''Вяленая икра (Рыба-камень)''<!--Stonefish-->
| <samp>MultipleMutexRequest</samp>
| ''Вяленая икра рыбы-камня''
| general usage
| Allows success if a <samp>NetMutex</samp> is already owned locally, matching the existing <samp>NetMutex</samp> behavior.
|}</li>
</ul>
 
==Name translation changes for wiki maintainers==
Some in-game item and monster names were retranslated in some languages for clarity or correctness.
 
This list is mostly provided to help wiki maintainers update pages, so it doesn't include names which only changed capitalization, changed <code>'</code> (straight apostrophe) to <code>’</code> (curly) in French, or aren't visible to vanilla players (like mine rocks).
 
===Objects===
; Hungarian
: {| class="wikitable"
|-
|-
| ''Вяленая икра (Солнечник)''<!--Sunfish-->
! item
| ''Вяленая икра солнечника''
! old name
! new name
|-
|-
| ''Вяленая икра (Чудо-огурец)''<!--Super Cucumber-->
| [[Artichoke Dip]]
| ''Вяленая икра чудо-огурца''
| ''Articsóka mártás''
| ''Articsókamártás''
|-
|-
| ''Вяленая икра (Тигровая форель)''<!--Tiger Trout-->
| [[Blackberry Cobbler]]
| ''Вяленая икра тигровой форели''
| ''Szeder kosár''
| ''Szedres kosárka''
|-
|-
| ''Вяленая икра (Тиляпия)''<!--Tilapia-->
| [[Bone Mill]]
| ''Вяленая икра тиляпии''
| ''Csontőrlő''
| ''Csontdaráló''
|-
|-
| ''Вяленая икра (Тунец)''<!--Tuna-->
| [[Chocolate Cake]]
| ''Вяленая икра тунца''
| ''Csokis torta''
| ''Csokitorta''
|-
|-
| ''Вяленая икра (Лосось пустоты)''<!--Void Salmon-->
| [[Cranberry Candy]]
| ''Вяленая икра лосося пустоты''
| ''Vörös áfonyás cukorka''
| ''Vörös áfonyás üdítő''
|-
|-
| ''Вяленая икра (Желтый судак)''<!--Walleye-->
| [[Geode Crusher]]
| ''Вяленая икра желтого судака''
| ''Geóda zúzó''
| ''Geódazúzó''
|-
|-
| ''Вяленая икра (Лесоплюх)''<!--Woodskip-->
| [[Maple Syrup]]
| ''Вяленая икра лесоплюха''
| ''Juharfaszirup''
| ''Juharszirup''
|-
|-
| [[Bait]]
| [[Tea Sapling]]
| ''Приманка''
| ''Tea csemete''
| ''Наживка''
| ''Teacsemete''
|-
|-
| [[Basic Retaining Soil]]
| [[Woodcutter's Weekly]]
| ''Обычная влагосохраняющая почва''
| ''Favágok hetilapja''
| ''Обычный аквагрунт''
| ''Favágók hetilapja''
|}
 
; Russian
: {| class="wikitable"
|-
|-
| [[Deluxe Retaining Soil]]
! item
| ''Влагосохраняющая почва Делюкс''
! old name
| ''Аквагрунт Делюкс''
! new name
|-
|-
| [[Dried Fruit]] (flavored)
|rowspan="71" valign="top"| [[Aged Roe]] (flavored)
| ''Сушеная морошка''<!--Salmonberry-->
| ''Вяленая икра (Альбакор)''<!--Albacore-->
| ''Сушеная малина''
| ''Вяленая икра альбакора''
|-
|-
| [[Jellies and Pickles|Jelly]] (flavored)
| ''Вяленая икра (Анчоус)''<!--Anchovy-->
| ''Джем из морошки''<!--Salmonberry-->
| ''Вяленая икра анчоуса''
| ''Малиновый джем''
|-
|-
| [[Juice]] (flavored)
| ''Вяленая икра (Морской черт)''<!--Angler-->
| ''Сок сквоша''<!--Summer Squash-->
| ''Вяленая икра Морского черта''
| ''Кабачковый сок''
|-
|-
| [[Magic Bait]]
| ''Вяленая икра (Рыба-капля)''<!--Blobfish-->
| ''Волшебная приманка''
| ''Вяленая икра рыбы-капли''
| ''Волшебная наживка''
|-
|-
| [[Quality Fertilizer]]
| ''Вяленая икра (Голубой дискус)''<!--Blue Discus-->
| ''Высококачественное удобрение''
| ''Вяленая икра голубого дискуса''
| ''Улучшенное удобрение''
|-
|-
| [[Quality Retaining Soil]]
| ''Вяленая икра (Лещ)''<!--Bream-->
| ''Высококачественная влагосохраняющая почва''
| ''Вяленая икра леща''
| ''Улучшенный аквагрунт''
|-
|-
| [[Quality Sprinkler]]
| ''Вяленая икра (Сомик)''<!--Bullhead-->
| ''Высококачественный спринклер''
| ''Вяленая икра сомика''
| ''Улучшенный спринклер''
|-
|-
|rowspan="72" valign="top"| [[Roe]] (flavored)
| ''Вяленая икра (Карп)''<!--Carp-->
| ''Икра (Альбакор)''<!--Albacore-->
| ''Вяленая икра карпа''
| ''Икра альбакора''
|-
|-
| ''Икра (Анчоус)''<!--Anchovy-->
| ''Вяленая икра (Сом)''<!--Catfish-->
| ''Икра анчоуса''
| ''Вяленая икра сома''
|-
|-
| ''Икра (Морской черт)''<!--Angler-->
| ''Вяленая икра (Голавль)''<!--Chub-->
| ''Икра Морского черта''
| ''Вяленая икра голавля''
|-
|-
| ''Икра (Рыба-капля)''<!--Blobfish-->
| ''Вяленая икра (Гребешок)''<!--Clam-->
| ''Икра рыбы-капли''
| ''Вяленая икра гребешка''
|-
|-
| ''Икра (Голубой дискус)''<!--Blue Discus-->
| ''Вяленая икра (Сердцевидка)''<!--Cockle-->
| ''Икра голубого дискуса''
| ''Вяленая икра сердцевидки''
|-
|-
| ''Икра (Лещ)''<!--Bream-->
| ''Вяленая икра (Краб)''<!--Crab-->
| ''Икра леща''
| ''Вяленая икра краба''
|-
|-
| ''Икра (Сомик)''<!--Bullhead-->
| ''Вяленая икра (Рак)''<!--Crayfish-->
| ''Икра сомика''
| ''Вяленая икра рака''
|-
|-
| ''Икра (Карп)''<!--Carp-->
| ''Вяленая икра (Багрянник)''<!--Crimsonfish-->
| ''Икра карпа''
| ''Вяленая икра Багрянника''
|-
|-
| ''Икра (Сом)''<!--Catfish-->
| ''Вяленая икра (Дорада)''<!--Dorado-->
| ''Икра сома''
| ''Вяленая икра дорады''
|-
|-
| ''Икра (Голавль)''<!--Chub-->
| ''Вяленая икра (Угорь)''<!--Eel-->
| ''Икра голавля''
| ''Вяленая икра угря''
|-
|-
| ''Икра (Гребешок)''<!--Clam-->
| ''Вяленая икра (Камбала)''<!--Flounder-->
| ''Икра гребешка''
| ''Вяленая икра камбалы''
|-
|-
| ''Икра (Сердцевидка)''<!--Cockle-->
| ''Вяленая икра (Пятнистый криворот)''<!--Ghostfish-->
| ''Икра сердцевидки''
| ''Вяленая икра пятнистого криворота''
|-
|-
| ''Икра (Краб)''<!--Crab-->
| ''Вяленая икра (Ледорыб)''<!--Glacierfish-->
| ''Икра краба''
| ''Вяленая икра Ледорыба''
|-
|-
| ''Икра (Рак)''<!--Crayfish-->
| ''Вяленая икра (Ледорыб-младший)''<!--Glacierfish Jr.-->
| ''Икра рака''
| ''Вяленая икра Ледорыба-младшего''
|-
|-
| ''Икра (Багрянник)''<!--Crimsonfish-->
| ''Вяленая икра (Бычок)''<!--Goby-->
| ''Икра Багрянника''
| ''Вяленая икра бычка''
|-
|-
| ''Икра (Дорада)''<!--Dorado-->
| ''Вяленая икра (Палтус)''<!--Halibut-->
| ''Икра дорады''
| ''Вяленая икра палтуса''
|-
|-
| ''Икра (Угорь)''<!--Eel-->
| ''Вяленая икра (Сельдь)''<!--Herring-->
| ''Икра угря''
| ''Вяленая икра сельди''
|-
|-
| ''Икра (Камбала)''<!--Flounder-->
| ''Вяленая икра (Ледопип)''<!--Ice Pip-->
| ''Икра камбалы''
| ''Вяленая икра ледопипа''
|-
|-
| ''Икра (Пятнистый криворот)''<!--Ghostfish-->
| ''Вяленая икра (Большеротый окунь)''<!--Largemouth Bass-->
| ''Икра пятнистого криворота''
| ''Вяленая икра большеротого окуня''
|-
|-
| ''Икра (Ледорыб)''<!--Glacierfish-->
| ''Вяленая икра (Лавовый угорь)''<!--Lava Eel-->
| ''Икра Ледорыба''
| ''Вяленая икра лавового угря''
|-
|-
| ''Икра (Ледорыб-младший)''<!--Glacierfish Jr.-->
| ''Вяленая икра (Легенда)''<!--Legend-->
| ''Икра Ледорыба-младшего''
| ''Вяленая икра Легенды''
|-
|-
| ''Икра (Бычок)''<!--Goby-->
| ''Вяленая икра (Легенда II)''<!--Legend II-->
| ''Икра бычка''
| ''Вяленая икра Легенды II''
|-
|-
| ''Икра (Палтус)''<!--Halibut-->
| ''Вяленая икра (Змеезуб)''<!--Lingcod-->
| ''Икра палтуса''
| ''Вяленая икра змеезуба''
|-
|-
| ''Икра (Сельдь)''<!--Herring-->
| ''Вяленая икра (Крылатка)''<!--Lionfish-->
| ''Икра сельди''
| ''Вяленая икра крылатки''
|-
|-
| ''Икра (Ледопип)''<!--Ice Pip-->
| ''Вяленая икра (Омар)''<!--Lobster-->
| ''Икра ледопипа''
| ''Вяленая икра омара''
|-
|-
| ''Икра (Большеротый окунь)''<!--Largemouth Bass-->
| ''Вяленая икра (Полуночный карп)''<!--Midnight Carp-->
| ''Икра большеротого окуня''
| ''Вяленая икра полуночного карпа''
|-
|-
| ''Икра (Лавовый угорь)''<!--Lava Eel-->
| ''Вяленая икра (Ночной кальмар)''<!--Midnight Squid-->
| ''Икра лавового угря''
| ''Вяленая икра ночного кальмара''
|-
|-
| ''Икра (Легенда)''<!--Legend-->
| ''Вяленая икра (Мисс Морской черт)''<!--Ms. Angler-->
| ''Икра Легенды''
| ''Вяленая икра Мисс Морской черт''
|-
|-
| ''Икра (Легенда II)''<!--Legend II-->
| ''Вяленая икра (Мидия)''<!--Mussel-->
| ''Икра Легенды II''
| ''Вяленая икра мидий''
|-
|-
| ''Икра (Змеезуб)''<!--Lingcod-->
| ''Вяленая икра (Карп-мутант)''<!--Mutant Carp-->
| ''Икра змеезуба''
| ''Вяленая икра Карпа-мутанта''
|-
|-
| ''Икра (Крылатка)''<!--Lionfish-->
| ''Вяленая икра (Осьминог)''<!--Octopus-->
| ''Икра крылатки''
| ''Вяленая икра осьминога''
|-
|-
| ''Икра (Омар)''<!--Lobster-->
| ''Вяленая икра (Устрица)''<!--Oyster-->
| ''Икра омара''
| ''Вяленая икра устриц''
|-
|-
| ''Икра (Полуночный карп)''<!--Midnight Carp-->
| ''Вяленая икра (Окунь)''<!--Perch-->
| ''Икра полуночного карпа''
| ''Вяленая икра окуня''
|-
|-
| ''Икра (Ночной кальмар)''<!--Midnight Squid-->
| ''Вяленая икра (Литорина)''<!--Periwinkle-->
| ''Икра ночного кальмара''
| ''Вяленая икра литорин''
|-
|-
| ''Икра (Мисс Морской черт)''<!--Ms. Angler-->
| ''Вяленая икра (Щука)''<!--Pike-->
| ''Икра Мисс Морской черт''
| ''Вяленая икра щуки''
|-
|-
| ''Икра (Мидия)''<!--Mussel-->
| ''Вяленая икра (Иглобрюх)''<!--Pufferfish-->
| ''Икра мидий''
| ''Вяленая икра иглобрюха''
|-
|-
| ''Икра (Карп-мутант)''<!--Mutant Carp-->
| ''Вяленая икра (Радиоактивный карп)''<!--Radioactive Carp-->
| ''Икра Карпа-мутанта''
| ''Вяленая икра Радиоактивного карпа''
|-
|-
| ''Икра (Осьминог)''<!--Octopus-->
| ''Вяленая икра (Радужная форель)''<!--Rainbow Trout-->
| ''Икра осьминога''
| ''Вяленая икра радужной форели''
|-
|-
| ''Икра (Устрица)''<!--Oyster-->
| ''Вяленая икра (Барабулька)''<!--Red Mullet-->
| ''Икра устриц''
| ''Вяленая икра барабульки''
|-
|-
| ''Икра (Окунь)''<!--Perch-->
| ''Вяленая икра (Берикс)''<!--Red Snapper-->
| ''Икра окуня''
| ''Вяленая икра берикса''
|-
|-
| ''Икра (Литорина)''<!--Periwinkle-->
| ''Вяленая икра (Лосось)''<!--Salmon-->
| ''Икра литорин''
| ''Вяленая икра лосося''
|-
|-
| ''Икра (Щука)''<!--Pike-->
| ''Вяленая икра (Песковник)''<!--Sandfish-->
| ''Икра щуки''
| ''Вяленая икра песковника''
|-
|-
| ''Икра (Иглобрюх)''<!--Pufferfish-->
| ''Вяленая икра (Сардина)''<!--Sardine-->
| ''Икра иглобрюха''
| ''Вяленая икра сардины''
|-
|-
| ''Икра (Радиоактивный карп)''<!--Radioactive Carp-->
| ''Вяленая икра (Скорпионовый карп)''<!--Scorpion Carp-->
| ''Икра Радиоактивного карпа''
| ''Вяленая икра скорпионового карпа''
|-
|-
| ''Икра (Радужная форель)''<!--Rainbow Trout-->
| ''Вяленая икра (Морской огурец)''<!--Sea Cucumber-->
| ''Икра радужной форели''
| ''Вяленая икра морского огурца''
|-
|-
| ''Икра (Барабулька)''<!--Red Mullet-->
| ''Вяленая икра (Морской еж)''<!--Sea Urchin-->
| ''Икра барабульки''
| ''Вяленая икра морского ежа''
|-
|-
| ''Икра (Берикс)''<!--Red Snapper-->
| ''Вяленая икра (Шэд)''<!--Shad-->
| ''Икра берикса''
| ''Вяленая икра шэда''
|-
|-
| ''Икра (Лосось)''<!--Salmon-->
| ''Вяленая икра (Креветка)''<!--Shrimp-->
| ''Икра лосося''
| ''Вяленая икра креветок''
|-
|-
| ''Икра (Песковник)''<!--Sandfish-->
| ''Вяленая икра (Слаймджек)''<!--Slimejack-->
| ''Икра песковника''
| ''Вяленая икра слаймджека''
|-
|-
| ''Икра (Сардина)''<!--Sardine-->
| ''Вяленая икра (Малоротый окунь)''<!--Smallmouth Bass-->
| ''Икра сардины''
| ''Вяленая икра малоротого окуня''
|-
|-
| ''Икра (Скорпионовый карп)''<!--Scorpion Carp-->
| ''Вяленая икра (Улитка)''<!--Snail-->
| ''Икра скорпионового карпа''
| ''Вяленая икра улиток''
|-
|-
| ''Икра (Морской огурец)''<!--Sea Cucumber-->
| ''Вяленая икра (Малек Багрянника)''<!--Son of Crimsonfish-->
| ''Икра морского огурца''
| ''Вяленая икра Малька Багрянника''
|-
|-
| ''Икра (Морской еж)''<!--Sea Urchin-->
| ''Вяленая икра (Жуть-рыба)''<!--Spook Fish-->
| ''Икра морского ежа''
| ''Вяленая икра жуть-рыбы''
|-
|-
| ''Икра (Шэд)''<!--Shad-->
| ''Вяленая икра (Кальмар)''<!--Squid-->
| ''Икра шэда''
| ''Вяленая икра кальмара''
|-
|-
| ''Икра (Креветка)''<!--Shrimp-->
| ''Вяленая икра (Скат)''<!--Stingray-->
| ''Икра креветок''
| ''Вяленая икра ската''
|-
|-
| ''Икра (Слаймджек)''<!--Slimejack-->
| ''Вяленая икра (Рыба-камень)''<!--Stonefish-->
| ''Икра слаймджека''
| ''Вяленая икра рыбы-камня''
|-
|-
| ''Икра (Малоротый окунь)''<!--Smallmouth Bass-->
| ''Вяленая икра (Солнечник)''<!--Sunfish-->
| ''Икра малоротого окуня''
| ''Вяленая икра солнечника''
|-
|-
| ''Икра (Улитка)''<!--Snail-->
| ''Вяленая икра (Чудо-огурец)''<!--Super Cucumber-->
| ''Икра улиток''
| ''Вяленая икра чудо-огурца''
|-
|-
| ''Икра (Малек Багрянника)''<!--Son of Crimsonfish-->
| ''Вяленая икра (Тигровая форель)''<!--Tiger Trout-->
| ''Икра Малька Багрянника''
| ''Вяленая икра тигровой форели''
|-
|-
| ''Икра (Жуть-рыба)''<!--Spook Fish-->
| ''Вяленая икра (Тиляпия)''<!--Tilapia-->
| ''Икра жуть-рыбы''
| ''Вяленая икра тиляпии''
|-
|-
| ''Икра (Кальмар)''<!--Squid-->
| ''Вяленая икра (Тунец)''<!--Tuna-->
| ''Икра кальмара''
| ''Вяленая икра тунца''
|-
|-
| ''Икра (Скат)''<!--Stingray-->
| ''Вяленая икра (Лосось пустоты)''<!--Void Salmon-->
| ''Икра ската''
| ''Вяленая икра лосося пустоты''
|-
|-
| ''Икра (Рыба-камень)''<!--Stonefish-->
| ''Вяленая икра (Желтый судак)''<!--Walleye-->
| ''Икра рыбы-камня''
| ''Вяленая икра желтого судака''
|-
|-
| ''Икра (Осетр)''<!--Sturgeon-->
| ''Вяленая икра (Лесоплюх)''<!--Woodskip-->
| ''Икра осетра''
| ''Вяленая икра лесоплюха''
|-
| [[Artifact Spot]]
| ''Место для артефакта''
| ''Клетка с артефактом''
|-
|-
| ''Икра (Солнечник)''<!--Sunfish-->
| [[Bait]]
| ''Икра солнечника''
| ''Приманка''
| ''Наживка''
|-
|-
| ''Икра (Чудо-огурец)''<!--Super Cucumber-->
| [[Basic Retaining Soil]]
| ''Икра чудо-огурца''
| ''Обычная влагосохраняющая почва''
| ''Обычный аквагрунт''
|-
|-
| ''Икра (Тигровая форель)''<!--Tiger Trout-->
| [[Deluxe Retaining Soil]]
| ''Икра тигровой форели''
| ''Влагосохраняющая почва Делюкс''
| ''Аквагрунт Делюкс''
|-
|-
| ''Икра (Тиляпия)''<!--Tilapia-->
| [[Dried Fruit]] (flavored)
| ''Икра тиляпии''
| ''Сушеная морошка''<!--Salmonberry-->
| ''Сушеная малина''
|-
|-
| ''Икра (Тунец)''<!--Tuna-->
| [[Goat Milk]]
| ''Икра тунца''
| ''Бутыль козьего молока''
| ''Козье молоко''
|-
|-
| ''Икра (Лосось пустоты)''<!--Void Salmon-->
| [[Jellies and Pickles|Jelly]] (flavored)
| ''Икра лосося пустоты''
| ''Джем из морошки''<!--Salmonberry-->
| ''Малиновый джем''
|-
|-
| ''Икра (Желтый судак)''<!--Walleye-->
| [[Juice]] (flavored)
| ''Икра желтого судака''
| ''Сок сквоша''<!--Summer Squash-->
| ''Кабачковый сок''
|-
|-
| ''Икра (Лесоплюх)''<!--Woodskip-->
| [[Large Goat Milk]]
| ''Икра лесоплюха''
| ''Бол. бутыль козьего молока''
| ''Большое козье молоко''
|-
|-
| [[Salmonberry]]
| [[Large Milk]]
| ''Морошка''
| ''Бидон молока''
| ''Малина''
| ''Большое молоко''
|-
|-
| [[Smoked Fish]] (flavored)
| [[Magic Bait]]
| ''Копченый {1}''
| ''Волшебная приманка''
| ''Копчен. {1}''<br /><small>(This is the default neutral prefix. All vanilla fish are<br />overridden to use the previous name.)</small>
| ''Волшебная наживка''
|-
|-
| [[Summer Squash Seeds]]
| [[Milk]]
| ''Семена сквоша''
| ''Ведерко молока''
| ''Семена кабачка''
| ''Молоко''
|-
|-
| [[Summer Squash]]
| [[Quality Fertilizer]]
| ''Сквош''
| ''Высококачественное удобрение''
| ''Кабачок''
| ''Улучшенное удобрение''
|-
|-
|rowspan="71" valign="top"| [[Targeted Bait]]
| [[Quality Retaining Soil]]
| ''Наживка: Альбакор''<!--Albacore-->
| ''Высококачественная влагосохраняющая почва''
| ''Наживка на альбакора''
| ''Улучшенный аквагрунт''
|-
|-
| ''Наживка: Анчоус''<!--Anchovy-->
| [[Quality Sprinkler]]
| ''Наживка на анчоуса''
| ''Высококачественный спринклер''
| ''Улучшенный спринклер''
|-
|-
| ''Наживка: Морской черт''<!--Angler-->
|rowspan="72" valign="top"| [[Roe]] (flavored)
| ''Наживка на Морского черта''
| ''Икра (Альбакор)''<!--Albacore-->
| ''Икра альбакора''
|-
|-
| ''Наживка: Рыба-капля''<!--Blobfish-->
| ''Икра (Анчоус)''<!--Anchovy-->
| ''Наживка на рыбу-каплю''
| ''Икра анчоуса''
|-
|-
| ''Наживка: Голубой дискус''<!--Blue Discus-->
| ''Икра (Морской черт)''<!--Angler-->
| ''Наживка на голубого дискуса''
| ''Икра Морского черта''
|-
|-
| ''Наживка: Лещ''<!--Bream-->
| ''Икра (Рыба-капля)''<!--Blobfish-->
| ''Наживка на леща''
| ''Икра рыбы-капли''
|-
|-
| ''Наживка: Сомик''<!--Bullhead-->
| ''Икра (Голубой дискус)''<!--Blue Discus-->
| ''Наживка на сомика''
| ''Икра голубого дискуса''
|-
|-
| ''Наживка: Карп''<!--Carp-->
| ''Икра (Лещ)''<!--Bream-->
| ''Наживка на карпа''
| ''Икра леща''
|-
|-
| ''Наживка: Сом''<!--Catfish-->
| ''Икра (Сомик)''<!--Bullhead-->
| ''Наживка на сома''
| ''Икра сомика''
|-
|-
| ''Наживка: Голавль''<!--Chub-->
| ''Икра (Карп)''<!--Carp-->
| ''Наживка на голавля''
| ''Икра карпа''
|-
|-
| ''Наживка: Гребешок''<!--Clam-->
| ''Икра (Сом)''<!--Catfish-->
| ''Приманка для гребешков''
| ''Икра сома''
|-
|-
| ''Наживка: Сердцевидка''<!--Cockle-->
| ''Икра (Голавль)''<!--Chub-->
| ''Приманка для сердцевидок''
| ''Икра голавля''
|-
|-
| ''Наживка: Краб''<!--Crab-->
| ''Икра (Гребешок)''<!--Clam-->
| ''Приманка для крабов''
| ''Икра гребешка''
|-
|-
| ''Наживка: Рак''<!--Crayfish-->
| ''Икра (Сердцевидка)''<!--Cockle-->
| ''Приманка для раков''
| ''Икра сердцевидки''
|-
|-
| ''Наживка: Багрянник''<!--Crimsonfish-->
| ''Икра (Краб)''<!--Crab-->
| ''Наживка на Багрянника''
| ''Икра краба''
|-
|-
| ''Наживка: Дорада''<!--Dorado-->
| ''Икра (Рак)''<!--Crayfish-->
| ''Наживка на дораду''
| ''Икра рака''
|-
|-
| ''Наживка: Угорь''<!--Eel-->
| ''Икра (Багрянник)''<!--Crimsonfish-->
| ''Наживка на угря''
| ''Икра Багрянника''
|-
|-
| ''Наживка: Камбала''<!--Flounder-->
| ''Икра (Дорада)''<!--Dorado-->
| ''Наживка на камбалу''
| ''Икра дорады''
|-
|-
| ''Наживка: Пятнистый криворот''<!--Ghostfish-->
| ''Икра (Угорь)''<!--Eel-->
| ''Наживка на пятнистого криворота''
| ''Икра угря''
|-
|-
| ''Наживка: Ледорыб''<!--Glacierfish-->
| ''Икра (Камбала)''<!--Flounder-->
| ''Наживка на Ледорыба''
| ''Икра камбалы''
|-
|-
| ''Наживка: Ледорыб-младший''<!--Glacierfish Jr.-->
| ''Икра (Пятнистый криворот)''<!--Ghostfish-->
| ''Наживка на Ледорыба-младшего''
| ''Икра пятнистого криворота''
|-
|-
| ''Наживка: Бычок''<!--Goby-->
| ''Икра (Ледорыб)''<!--Glacierfish-->
| ''Наживка на бычка''
| ''Икра Ледорыба''
|-
|-
| ''Наживка: Палтус''<!--Halibut-->
| ''Икра (Ледорыб-младший)''<!--Glacierfish Jr.-->
| ''Наживка на палтуса''
| ''Икра Ледорыба-младшего''
|-
|-
| ''Наживка: Сельдь''<!--Herring-->
| ''Икра (Бычок)''<!--Goby-->
| ''Наживка на сельдь''
| ''Икра бычка''
|-
|-
| ''Наживка: Ледопип''<!--Ice Pip-->
| ''Икра (Палтус)''<!--Halibut-->
| ''Наживка на ледопипа''
| ''Икра палтуса''
|-
|-
| ''Наживка: Большеротый окунь''<!--Largemouth Bass-->
| ''Икра (Сельдь)''<!--Herring-->
| ''Наживка на большеротого окуня''
| ''Икра сельди''
|-
|-
| ''Наживка: Лавовый угорь''<!--Lava Eel-->
| ''Икра (Ледопип)''<!--Ice Pip-->
| ''Наживка на лавового угря''
| ''Икра ледопипа''
|-
|-
| ''Наживка: Легенда''<!--Legend-->
| ''Икра (Большеротый окунь)''<!--Largemouth Bass-->
| ''Наживка на Легенду''
| ''Икра большеротого окуня''
|-
|-
| ''Наживка: Легенда II''<!--Legend II-->
| ''Икра (Лавовый угорь)''<!--Lava Eel-->
| ''Наживка на Легенду II''
| ''Икра лавового угря''
|-
|-
| ''Наживка: Змеезуб''<!--Lingcod-->
| ''Икра (Легенда)''<!--Legend-->
| ''Наживка на змеезуба''
| ''Икра Легенды''
|-
|-
| ''Наживка: Крылатка''<!--Lionfish-->
| ''Икра (Легенда II)''<!--Legend II-->
| ''Наживка на крылатку''
| ''Икра Легенды II''
|-
|-
| ''Наживка: Омар''<!--Lobster-->
| ''Икра (Змеезуб)''<!--Lingcod-->
| ''Приманка для омаров''
| ''Икра змеезуба''
|-
|-
| ''Наживка: Полуночный карп''<!--Midnight Carp-->
| ''Икра (Крылатка)''<!--Lionfish-->
| ''Наживка на полуночного карпа''
| ''Икра крылатки''
|-
|-
| ''Наживка: Ночной кальмар''<!--Midnight Squid-->
| ''Икра (Омар)''<!--Lobster-->
| ''Наживка на ночного кальмара''
| ''Икра омара''
|-
|-
| ''Наживка: Мисс Морской черт''<!--Ms. Angler-->
| ''Икра (Полуночный карп)''<!--Midnight Carp-->
| ''Наживка на Мисс Морской черт''
| ''Икра полуночного карпа''
|-
|-
| ''Наживка: Мидия''<!--Mussel-->
| ''Икра (Ночной кальмар)''<!--Midnight Squid-->
| ''Приманка для мидий''
| ''Икра ночного кальмара''
|-
|-
| ''Наживка: Карп-мутант''<!--Mutant Carp-->
| ''Икра (Мисс Морской черт)''<!--Ms. Angler-->
| ''Наживка на Карпа-мутанта''
| ''Икра Мисс Морской черт''
|-
|-
| ''Наживка: Осьминог''<!--Octopus-->
| ''Икра (Мидия)''<!--Mussel-->
| ''Наживка на осьминога''
| ''Икра мидий''
|-
|-
| ''Наживка: Устрица''<!--Oyster-->
| ''Икра (Карп-мутант)''<!--Mutant Carp-->
| ''Приманка для устриц''
| ''Икра Карпа-мутанта''
|-
|-
| ''Наживка: Окунь''<!--Perch-->
| ''Икра (Осьминог)''<!--Octopus-->
| ''Наживка на окуня''
| ''Икра осьминога''
|-
|-
| ''Наживка: Литорина''<!--Periwinkle-->
| ''Икра (Устрица)''<!--Oyster-->
| ''Приманка для литорин''
| ''Икра устриц''
|-
|-
| ''Наживка: Щука''<!--Pike-->
| ''Икра (Окунь)''<!--Perch-->
| ''Наживка на щуку''
| ''Икра окуня''
|-
|-
| ''Наживка: Иглобрюх''<!--Pufferfish-->
| ''Икра (Литорина)''<!--Periwinkle-->
| ''Наживка на иглобрюха''
| ''Икра литорин''
|-
|-
| ''Наживка: Радиоактивный карп''<!--Radioactive Carp-->
| ''Икра (Щука)''<!--Pike-->
| ''Наживка на Радиоактивного карпа''
| ''Икра щуки''
|-
|-
| ''Наживка: Радужная форель''<!--Rainbow Trout-->
| ''Икра (Иглобрюх)''<!--Pufferfish-->
| ''Наживка на радужную форель''
| ''Икра иглобрюха''
|-
|-
| ''Наживка: Барабулька''<!--Red Mullet-->
| ''Икра (Радиоактивный карп)''<!--Radioactive Carp-->
| ''Наживка на барабульку''
| ''Икра Радиоактивного карпа''
|-
|-
| ''Наживка: Берикс''<!--Red Snapper-->
| ''Икра (Радужная форель)''<!--Rainbow Trout-->
| ''Наживка на берикса''
| ''Икра радужной форели''
|-
|-
| ''Наживка: Лосось''<!--Salmon-->
| ''Икра (Барабулька)''<!--Red Mullet-->
| ''Наживка на лосося''
| ''Икра барабульки''
|-
|-
| ''Наживка: Песковник''<!--Sandfish-->
| ''Икра (Берикс)''<!--Red Snapper-->
| ''Наживка на песковника''
| ''Икра берикса''
|-
|-
| ''Наживка: Сардина''<!--Sardine-->
| ''Икра (Лосось)''<!--Salmon-->
| ''Наживка на сардину''
| ''Икра лосося''
|-
|-
| ''Наживка: Скорпионовый карп''<!--Scorpion Carp-->
| ''Икра (Песковник)''<!--Sandfish-->
| ''Наживка на скорпионового карпа''
| ''Икра песковника''
|-
|-
| ''Наживка: Морской огурец''<!--Sea Cucumber-->
| ''Икра (Сардина)''<!--Sardine-->
| ''Наживка на морского огурца''
| ''Икра сардины''
|-
|-
| ''Наживка: Шэд''<!--Shad-->
| ''Икра (Скорпионовый карп)''<!--Scorpion Carp-->
| ''Наживка на шэда''
| ''Икра скорпионового карпа''
|-
|-
| ''Наживка: Креветка''<!--Shrimp-->
| ''Икра (Морской огурец)''<!--Sea Cucumber-->
| ''Приманка для креветок''
| ''Икра морского огурца''
|-
|-
| ''Наживка: Слаймджек''<!--Slimejack-->
| ''Икра (Морской еж)''<!--Sea Urchin-->
| ''Наживка на слаймджека''
| ''Икра морского ежа''
|-
|-
| ''Наживка: Малоротый окунь''<!--Smallmouth Bass-->
| ''Икра (Шэд)''<!--Shad-->
| ''Наживка на малоротого окуня''
| ''Икра шэда''
|-
|-
| ''Наживка: Улитка''<!--Snail-->
| ''Икра (Креветка)''<!--Shrimp-->
| ''Приманка для улиток''
| ''Икра креветок''
|-
|-
| ''Наживка: Малек Багрянника''<!--Son of Crimsonfish-->
| ''Икра (Слаймджек)''<!--Slimejack-->
| ''Наживка на Малька Багрянника''
| ''Икра слаймджека''
|-
|-
| ''Наживка: Жуть-рыба''<!--Spook Fish-->
| ''Икра (Малоротый окунь)''<!--Smallmouth Bass-->
| ''Наживка на жуть-рыбу''
| ''Икра малоротого окуня''
|-
|-
| ''Наживка: Кальмар''<!--Squid-->
| ''Икра (Улитка)''<!--Snail-->
| ''Наживка на кальмара''
| ''Икра улиток''
|-
|-
| ''Наживка: Скат''<!--Stingray-->
| ''Икра (Малек Багрянника)''<!--Son of Crimsonfish-->
| ''Наживка на ската''
| ''Икра Малька Багрянника''
|-
|-
| ''Наживка: Рыба-камень''<!--Stonefish-->
| ''Икра (Жуть-рыба)''<!--Spook Fish-->
| ''Наживка на рыбу-камень''
| ''Икра жуть-рыбы''
|-
|-
| ''Наживка: Осетр''<!--Sturgeon-->
| ''Икра (Кальмар)''<!--Squid-->
| ''Наживка на осетра''
| ''Икра кальмара''
|-
|-
| ''Наживка: Солнечник''<!--Sunfish-->
| ''Икра (Скат)''<!--Stingray-->
| ''Наживка на солнечника''
| ''Икра ската''
|-
|-
| ''Наживка: Чудо-огурец''<!--Super Cucumber-->
| ''Икра (Рыба-камень)''<!--Stonefish-->
| ''Наживка на чудо-огурца''
| ''Икра рыбы-камня''
|-
|-
| ''Наживка: Тигровая форель''<!--Tiger Trout-->
| ''Икра (Осетр)''<!--Sturgeon-->
| ''Наживка на тигровую форель''
| ''Икра осетра''
|-
|-
| ''Наживка: Тиляпия''<!--Tilapia-->
| ''Икра (Солнечник)''<!--Sunfish-->
| ''Наживка на тиляпию''
| ''Икра солнечника''
|-
|-
| ''Наживка: Тунец''<!--Tuna-->
| ''Икра (Чудо-огурец)''<!--Super Cucumber-->
| ''Наживка на тунца''
| ''Икра чудо-огурца''
|-
|-
| ''Наживка: Лосось пустоты''<!--Void Salmon-->
| ''Икра (Тигровая форель)''<!--Tiger Trout-->
| ''Наживка на лосося пустоты''
| ''Икра тигровой форели''
|-
|-
| ''Наживка: Желтый судак''<!--Walleye-->
| ''Икра (Тиляпия)''<!--Tilapia-->
| ''Наживка на желтого судака''
| ''Икра тиляпии''
|-
|-
| ''Наживка: Лесоплюх''<!--Woodskip-->
| ''Икра (Тунец)''<!--Tuna-->
| ''Наживка на лесоплюха''
| ''Икра тунца''
|-
|-
| [[Wine]] (flavored)
| ''Икра (Лосось пустоты)''<!--Void Salmon-->
| ''Вино из морошки''<!--Salmonberry-->
| ''Икра лосося пустоты''
| ''Малиновое вино''
|}
 
===Furniture===
; Hungarian
: {| class="wikitable"
|-
|-
! item
| ''Икра (Желтый судак)''<!--Walleye-->
! old name
| ''Икра желтого судака''
! new name
|-
|-
| [[Artist Bookcase]]
| ''Икра (Лесоплюх)''<!--Woodskip-->
| ''Művészi könyvespolc''
| ''Икра лесоплюха''
| ''Művészi könyvszekrény''
|-
|-
| [[Birch Double Bed]]
| [[Salmonberry]]
| ''Birs dupla ágy''
| ''Морошка''
| ''Nyírfa dupla ágy''
| ''Малина''
|-
|-
| [[Birch Lamp End Table]]
| [[Smoked Fish]] (flavored)
| ''Nyírfa lámpás éjjeliszekrény''
| ''Копченый {1}''
| ''Nyírfa éjjeliszekrény lámpával''
| ''Копчен. {1}''<br /><small>(This is the default neutral prefix. All vanilla fish are<br />overridden to use the previous name.)</small>
|-
|-
| [[China Cabinet]]
| [[Summer Squash Seeds]]
| ''Kínai vitrin''
| ''Семена сквоша''
| ''Porcelános vitrin''
| ''Семена кабачка''
|-
|-
| [[Coffee Table]]
| [[Summer Squash]]
| ''Kávésasztal''
| ''Сквош''
| ''Kávézó asztal''
| ''Кабачок''
|-
|-
| [[Dark Bookcase]]
|rowspan="71" valign="top"| [[Targeted Bait]]
| ''Sötét könyvespolc''
| ''Наживка: Альбакор''<!--Albacore-->
| ''Sötét könyvszekrény''
| ''Наживка на альбакора''
|-
|-
| [[Gray Joja Bookcase]]
| ''Наживка: Анчоус''<!--Anchovy-->
| ''Szürke Joja könyvespolc''
| ''Наживка на анчоуса''
| ''Szürke Joja könyvszekrény''
|-
|-
| [[Gray Joja Coffee Table]]
| ''Наживка: Морской черт''<!--Angler-->
| ''Szürke Joja kávésasztal''
| ''Наживка на Морского черта''
| ''Szürke Joja kávézó asztal''
|-
|-
| [[Joja Bookcase]]
| ''Наживка: Рыба-капля''<!--Blobfish-->
| ''Joja könyvespolc''
| ''Наживка на рыбу-каплю''
| ''Joja könyvszekrény''
|-
|-
| [[Joja Coffee Table]]
| ''Наживка: Голубой дискус''<!--Blue Discus-->
| ''Joja kávésasztal''
| ''Наживка на голубого дискуса''
| ''Joja kávézó asztal''
|-
|-
| [[Junimo Bookcase]]
| ''Наживка: Лещ''<!--Bream-->
| ''Junimo könyvespolc''
| ''Наживка на леща''
| ''Junimo könyvszekrény''
|-
|-
| [[Large Wizard Bookcase]]
| ''Наживка: Сомик''<!--Bullhead-->
| ''Nagy varázsló könyvespolc''
| ''Наживка на сомика''
| ''Nagy varázsló könyvszekrény''
|-
|-
| [[Luxury Bookcase]]
| ''Наживка: Карп''<!--Carp-->
| ''Luxus könyvespolc''
| ''Наживка на карпа''
| ''Luxus könyvszekrény''
|-
|-
| [[Mahogany Lamp End Table]]
| ''Наживка: Сом''<!--Catfish-->
| ''Mahagóni lámpás éjjeliszekrény''
| ''Наживка на сома''
| ''Mahagóni éjjeliszekrény lámpával''
|-
|-
| [[Modern Bookcase]]
| ''Наживка: Голавль''<!--Chub-->
| ''Modern könyvespolc''
| ''Наживка на голавля''
| ''Modern könyvszekrény''
|-
|-
| [[Oak Lamp End Table]]
| ''Наживка: Гребешок''<!--Clam-->
| ''Tölgyfa lámpás éjjeliszekrény''
| ''Приманка для гребешков''
| ''Tölgyfa éjjeliszekrény lámpával''
|-
| ''Наживка: Сердцевидка''<!--Cockle-->
| ''Приманка для сердцевидок''
|-
|-
| [[Retro Bookcase]]
| ''Наживка: Краб''<!--Crab-->
| ''Retro könyvespolc''
| ''Приманка для крабов''
| ''Retro könyvszekrény''
|-
|-
| [[Short Bookcase]]
| ''Наживка: Рак''<!--Crayfish-->
| ''Kicsi könyvespolc''
| ''Приманка для раков''
| ''Kicsi könyvszekrény''
|-
|-
| [[Short Wizard Bookcase]]
| ''Наживка: Багрянник''<!--Crimsonfish-->
| ''Alacsony varázsló könyvespolc''
| ''Наживка на Багрянника''
| ''Alacsony varázsló könyvszekrény''
|-
|-
| [[Small Wizard Bookcase]]
| ''Наживка: Дорада''<!--Dorado-->
| ''Kicsi varázsló könyvespolc''
| ''Наживка на дораду''
| ''Kicsi varázsló könyvszekrény''
|-
|-
| [[Spirits Table]]
| ''Наживка: Угорь''<!--Eel-->
| ''Italosasztal''
| ''Наживка на угря''
| ''Italos asztal''
|-
|-
| [[Walnut Lamp End Table]]
| ''Наживка: Камбала''<!--Flounder-->
| ''Diófa lámpás éjjeliszekrény''
| ''Наживка на камбалу''
| ''Diófa éjjeliszekrény lámpával''
|-
|-
| [[Wizard Bookcase]]
| ''Наживка: Пятнистый криворот''<!--Ghostfish-->
| ''Varázsló könyvespolc''
| ''Наживка на пятнистого криворота''
| ''Varázsló könyvszekrény''
|-
|}
| ''Наживка: Ледорыб''<!--Glacierfish-->
 
| ''Наживка на Ледорыба''
; Russian
: {| class="wikitable"
|-
|-
! item
| ''Наживка: Ледорыб-младший''<!--Glacierfish Jr.-->
! old name
| ''Наживка на Ледорыба-младшего''
! new name
|-
|-
| [[Corn Plant]]
| ''Наживка: Бычок''<!--Goby-->
| ''Кукуруза''
| ''Наживка на бычка''
| ''Драцена''
|-
|-
| [[Pierre's Sign]]
| ''Наживка: Палтус''<!--Halibut-->
| ''Знак Пьера''
| ''Наживка на палтуса''
| ''Вывеска Пьера''
|}
 
===Hats===
; French
: {| class="wikitable"
|-
|-
! item
| ''Наживка: Сельдь''<!--Herring-->
! old name
| ''Наживка на сельдь''
! new name
|-
|-
| [[Good Ol' Cap]]
| ''Наживка: Ледопип''<!--Ice Pip-->
| ''Veille casquette''
| ''Наживка на ледопипа''
| ''Vieille casquette''
|}
 
; Russian
: {| class="wikitable"
|-
|-
! item
| ''Наживка: Большеротый окунь''<!--Largemouth Bass-->
! old name
| ''Наживка на большеротого окуня''
! new name
|-
|-
| [[Blobfish Mask]]
| ''Наживка: Лавовый угорь''<!--Lava Eel-->
| ''Маска рыбы-пузыря''
| ''Наживка на лавового угря''
| ''Маска рыбы-капли''
|-
|-
| [[Bluebird Mask]]
| ''Наживка: Легенда''<!--Legend-->
| ''Маска сиалии''
| ''Наживка на Легенду''
| ''Маска синей птицы''
|-
|-
| [[Cowgal Hat]]
| ''Наживка: Легенда II''<!--Legend II-->
| ''Шляпа девушки-ковбоя''
| ''Наживка на Легенду II''
| ''Женская ковбойская шляпа''
|-
|-
| [[Deluxe Pirate Hat]]
| ''Наживка: Змеезуб''<!--Lingcod-->
| ''Элитная пиратская шляпа''
| ''Наживка на змеезуба''
| ''Роскошная пиратская шляпа''
|-
|-
| [[Dinosaur Hat]]
| ''Наживка: Крылатка''<!--Lionfish-->
| ''Шляпа-динозавр''
| ''Наживка на крылатку''
| ''Шапка динозавра''
|-
|-
| [[Official Cap]]
| ''Наживка: Омар''<!--Lobster-->
| ''Кепка от униформы''
| ''Приманка для омаров''
| ''Фуражка''
|-
| ''Наживка: Полуночный карп''<!--Midnight Carp-->
| ''Наживка на полуночного карпа''
|-
|-
| [[Panda Hat]]
| ''Наживка: Ночной кальмар''<!--Midnight Squid-->
| ''Шляпка Панды''
| ''Наживка на ночного кальмара''
| ''Шапка панды''
|-
|-
| Party Hat
| ''Наживка: Мисс Морской черт''<!--Ms. Angler-->
| ''Шляпа тусовщика''
| ''Наживка на Мисс Морской черт''
| ''Праздничный колпак''
|-
|-
| [[Santa Hat]]
| ''Наживка: Мидия''<!--Mussel-->
| ''Шляпа Санты''
| ''Приманка для мидий''
| ''Шапка Санты''
|-
|-
| [[Star Helmet]]
| ''Наживка: Карп-мутант''<!--Mutant Carp-->
| ''Звездный шлем''
| ''Наживка на Карпа-мутанта''
| ''Шапка со звездами''
|-
|-
| [[Sunglasses]]
| ''Наживка: Осьминог''<!--Octopus-->
| ''Солнечные очки''
| ''Наживка на осьминога''
| ''Солнцезащитные очки''
|-
|-
| [[Tiger Hat]]
| ''Наживка: Устрица''<!--Oyster-->
| ''Тигриная шляпа''
| ''Приманка для устриц''
| ''Тигриная шапка''
|}
 
===Pants===
; Russian
: {| class="wikitable"
|-
|-
! item
| ''Наживка: Окунь''<!--Perch-->
! old name
| ''Наживка на окуня''
! new name
|-
|-
| Dinosaur Pants
| ''Наживка: Литорина''<!--Periwinkle-->
| ''Динозавровы штаны''
| ''Приманка для литорин''
| ''Динозавровые штаны''
|}
 
===Shirts===
; Hungarian
: {| class="wikitable"
|-
|-
! item
| ''Наживка: Щука''<!--Pike-->
! old name
| ''Наживка на щуку''
! new name
|-
|-
| Goodnight Shirt
| ''Наживка: Иглобрюх''<!--Pufferfish-->
| ''Jóéjt póló''
| ''Наживка на иглобрюха''
| ''Jó éjt póló''
|}
 
===Tools===
; Hungarian
: {| class="wikitable"
|-
|-
! item
| ''Наживка: Радиоактивный карп''<!--Radioactive Carp-->
! old name
| ''Наживка на Радиоактивного карпа''
! new name
|-
| ''Наживка: Радужная форель''<!--Rainbow Trout-->
| ''Наживка на радужную форель''
|-
| ''Наживка: Барабулька''<!--Red Mullet-->
| ''Наживка на барабульку''
|-
| ''Наживка: Берикс''<!--Red Snapper-->
| ''Наживка на берикса''
|-
| ''Наживка: Лосось''<!--Salmon-->
| ''Наживка на лосося''
|-
| ''Наживка: Песковник''<!--Sandfish-->
| ''Наживка на песковника''
|-
| ''Наживка: Сардина''<!--Sardine-->
| ''Наживка на сардину''
|-
| ''Наживка: Скорпионовый карп''<!--Scorpion Carp-->
| ''Наживка на скорпионового карпа''
|-
| ''Наживка: Морской огурец''<!--Sea Cucumber-->
| ''Наживка на морского огурца''
|-
| ''Наживка: Шэд''<!--Shad-->
| ''Наживка на шэда''
|-
| ''Наживка: Креветка''<!--Shrimp-->
| ''Приманка для креветок''
|-
| ''Наживка: Слаймджек''<!--Slimejack-->
| ''Наживка на слаймджека''
|-
| ''Наживка: Малоротый окунь''<!--Smallmouth Bass-->
| ''Наживка на малоротого окуня''
|-
| ''Наживка: Улитка''<!--Snail-->
| ''Приманка для улиток''
|-
| ''Наживка: Малек Багрянника''<!--Son of Crimsonfish-->
| ''Наживка на Малька Багрянника''
|-
| ''Наживка: Жуть-рыба''<!--Spook Fish-->
| ''Наживка на жуть-рыбу''
|-
| ''Наживка: Кальмар''<!--Squid-->
| ''Наживка на кальмара''
|-
| ''Наживка: Скат''<!--Stingray-->
| ''Наживка на ската''
|-
| ''Наживка: Рыба-камень''<!--Stonefish-->
| ''Наживка на рыбу-камень''
|-
| ''Наживка: Осетр''<!--Sturgeon-->
| ''Наживка на осетра''
|-
| ''Наживка: Солнечник''<!--Sunfish-->
| ''Наживка на солнечника''
|-
| ''Наживка: Чудо-огурец''<!--Super Cucumber-->
| ''Наживка на чудо-огурца''
|-
| ''Наживка: Тигровая форель''<!--Tiger Trout-->
| ''Наживка на тигровую форель''
|-
| ''Наживка: Тиляпия''<!--Tilapia-->
| ''Наживка на тиляпию''
|-
| ''Наживка: Тунец''<!--Tuna-->
| ''Наживка на тунца''
|-
| ''Наживка: Лосось пустоты''<!--Void Salmon-->
| ''Наживка на лосося пустоты''
|-
| ''Наживка: Желтый судак''<!--Walleye-->
| ''Наживка на желтого судака''
|-
| ''Наживка: Лесоплюх''<!--Woodskip-->
| ''Наживка на лесоплюха''
|-
| [[Tree Fertilizer]]
| ''Древесное удобрение''
| ''Удобрение для деревьев''
|-
| [[Wine]] (flavored)
| ''Вино из морошки''<!--Salmonberry-->
| ''Малиновое вино''
|}
 
===Furniture===
; Hungarian
: {| class="wikitable"
|-
! item
! old name
! new name
|-
| [[Artist Bookcase]]
| ''Művészi könyvespolc''
| ''Művészi könyvszekrény''
|-
| [[Birch Double Bed]]
| ''Birs dupla ágy''
| ''Nyírfa dupla ágy''
|-
| [[Birch Lamp End Table]]
| ''Nyírfa lámpás éjjeliszekrény''
| ''Nyírfa éjjeliszekrény lámpával''
|-
| [[China Cabinet]]
| ''Kínai vitrin''
| ''Porcelános vitrin''
|-
| [[Coffee Table]]
| ''Kávésasztal''
| ''Kávézó asztal''
|-
| [[Dark Bookcase]]
| ''Sötét könyvespolc''
| ''Sötét könyvszekrény''
|-
| [[Gray Joja Bookcase]]
| ''Szürke Joja könyvespolc''
| ''Szürke Joja könyvszekrény''
|-
| [[Gray Joja Coffee Table]]
| ''Szürke Joja kávésasztal''
| ''Szürke Joja kávézó asztal''
|-
| [[Joja Bookcase]]
| ''Joja könyvespolc''
| ''Joja könyvszekrény''
|-
| [[Joja Coffee Table]]
| ''Joja kávésasztal''
| ''Joja kávézó asztal''
|-
| [[Junimo Bookcase]]
| ''Junimo könyvespolc''
| ''Junimo könyvszekrény''
|-
| [[Large Wizard Bookcase]]
| ''Nagy varázsló könyvespolc''
| ''Nagy varázsló könyvszekrény''
|-
| [[Luxury Bookcase]]
| ''Luxus könyvespolc''
| ''Luxus könyvszekrény''
|-
| [[Mahogany Lamp End Table]]
| ''Mahagóni lámpás éjjeliszekrény''
| ''Mahagóni éjjeliszekrény lámpával''
|-
| [[Modern Bookcase]]
| ''Modern könyvespolc''
| ''Modern könyvszekrény''
|-
| [[Oak Lamp End Table]]
| ''Tölgyfa lámpás éjjeliszekrény''
| ''Tölgyfa éjjeliszekrény lámpával''
|-
| [[Retro Bookcase]]
| ''Retro könyvespolc''
| ''Retro könyvszekrény''
|-
| [[Short Bookcase]]
| ''Kicsi könyvespolc''
| ''Kicsi könyvszekrény''
|-
| [[Short Wizard Bookcase]]
| ''Alacsony varázsló könyvespolc''
| ''Alacsony varázsló könyvszekrény''
|-
| [[Small Wizard Bookcase]]
| ''Kicsi varázsló könyvespolc''
| ''Kicsi varázsló könyvszekrény''
|-
| [[Spirits Table]]
| ''Italosasztal''
| ''Italos asztal''
|-
| [[Walnut Lamp End Table]]
| ''Diófa lámpás éjjeliszekrény''
| ''Diófa éjjeliszekrény lámpával''
|-
| [[Wizard Bookcase]]
| ''Varázsló könyvespolc''
| ''Varázsló könyvszekrény''
|}
 
; Russian
: {| class="wikitable"
|-
! item
! old name
! new name
|-
| [[Corn Plant]]
| ''Кукуруза''
| ''Драцена''
|-
| [[Pierre's Sign]]
| ''Знак Пьера''
| ''Вывеска Пьера''
|}
 
===Hats===
; French
: {| class="wikitable"
|-
! item
! old name
! new name
|-
| [[Good Ol' Cap]]
| ''Veille casquette''
| ''Vieille casquette''
|}
 
; Russian
: {| class="wikitable"
|-
! item
! old name
! new name
|-
| [[Blobfish Mask]]
| ''Маска рыбы-пузыря''
| ''Маска рыбы-капли''
|-
| [[Bluebird Mask]]
| ''Маска сиалии''
| ''Маска синей птицы''
|-
| [[Cowgal Hat]]
| ''Шляпа девушки-ковбоя''
| ''Женская ковбойская шляпа''
|-
| [[Deluxe Pirate Hat]]
| ''Элитная пиратская шляпа''
| ''Роскошная пиратская шляпа''
|-
| [[Dinosaur Hat]]
| ''Шляпа-динозавр''
| ''Шапка динозавра''
|-
| [[Official Cap]]
| ''Кепка от униформы''
| ''Фуражка''
|-
| [[Panda Hat]]
| ''Шляпка Панды''
| ''Шапка панды''
|-
| Party Hat
| ''Шляпа тусовщика''
| ''Праздничный колпак''
|-
| [[Santa Hat]]
| ''Шляпа Санты''
| ''Шапка Санты''
|-
| [[Star Helmet]]
| ''Звездный шлем''
| ''Шапка со звездами''
|-
| [[Sunglasses]]
| ''Солнечные очки''
| ''Солнцезащитные очки''
|-
| [[Tiger Hat]]
| ''Тигриная шляпа''
| ''Тигриная шапка''
|}
 
===Pants===
; Russian
: {| class="wikitable"
|-
! item
! old name
! new name
|-
| Dinosaur Pants
| ''Динозавровы штаны''
| ''Динозавровые штаны''
|}
 
===Shirts===
; Hungarian
: {| class="wikitable"
|-
! item
! old name
! new name
|-
| Goodnight Shirt
| ''Jóéjt póló''
| ''Jó éjt póló''
|}
 
; Russian
: {| class="wikitable"
|-
! item
! old name
! new name
|-
| 80's Shirt (female)
| ''Майка их 80-х (Ж)''
| ''Майка из 80-х (Ж)''
|-
| 80's Shirt (male)
| ''Майка их 80-х (М)''
| ''Майка из 80-х (М)''
|}
 
===Tools===
; Hungarian
: {| class="wikitable"
|-
! item
! old name
! new name
|-
| [[Advanced Iridium Rod]]
| ''Fejlett irídium horgászbot''
| ''Profi irídium horgászbot''
|-
| [[Milk Pail]]
| ''Tejesvödör''
| ''Tejes vödör''
|}
 
===Weapons===
; Hungarian
: {| class="wikitable"
|-
! item
! old name
! new name
|-
| [[Iridium Needle]]
| ''Irídium tű''
| ''Irídiumtű''
|-
| [[Iridium Scythe]]
| ''Irídium kasza''
| ''Irídiumkasza''
|}
 
; Russian
: {| class="wikitable"
|-
! item
! old name
! new name
|-
| [[Abby's Planchette]]
| ''Дощечка Эбби''
| ''Спиритическая планшетка Эбби''
|-
| [[Dark Sword]]
| ''Темный Меч''
| ''Темный клинок''
|-
| [[Dragontooth Club]]
| ''Драконозубья дубинка''
| ''Дубина из драконьего зуба''
|-
| [[Dragontooth Cutlass]]
| ''Драконозубья сабля''
| ''Сабля из драконьего зуба''
|-
| [[Dragontooth Shiv]]
| ''Драконозубья заточка''
| ''Заточка из драконьего зуба''
|-
| [[Dwarf Dagger]]
| ''Кинжал Дварфов''
| ''Дварфийский кинжал''
|-
| [[Dwarf Hammer]]
| ''Молот Дварфов''
| ''Дварфийский молот''
|-
| [[Dwarf Sword]]
| ''Меч Дварфов''
| ''Дварфийский меч''
|-
| [[Insect Head]]
| ''Жучья Голова''
| ''Жучиная голова''
|-
| [[Leah's Whittler]]
| ''Точилка Леи''
| ''Резец Леи''
|-
|-
| [[Advanced Iridium Rod]]
| [[Seb's Lost Mace]]
| ''Fejlett irídium horgászbot''
| ''Потерянная палица Себа''
| ''Profi irídium horgászbot''
| ''Потерянная булава Себа''
|-
|-
| [[Milk Pail]]
| [[Wind Spire]]
| ''Tejesvödör''
| ''Башня Ветров''
| ''Tejes vödör''
| ''Пика ветров''
|}
|}


===Weapons===
===Monsters===
; Hungarian
; Hungarian
: {| class="wikitable"
: {| class="wikitable"
|-
|-
! item
! monster
! old name
! old name
! new name
! new name
|-
|-
| [[Iridium Needle]]
| [[Truffle Crab]]
| ''Irídium tű''
| ''Kőrák''
| ''Irídiumtű''
| ''Szarvasgombarák''
|-
| [[Iridium Scythe]]
| ''Irídium kasza''
| ''Irídiumkasza''
|}
|}


; Russian
==XNB impact==
: {| class="wikitable"
<!--
|-
 
! item
Updated up to 1.6.16 alpha 2025-09-13.
! old name
 
! new name
-->
|-
===Overview===
| [[Abby's Planchette]]
This section provides a summary of the XNB files which changed in Stardew Valley 1.6.16. This doesn't include new files (since they won't impact existing mods), text changes in non-English files, or the switch from <samp>\</samp> to <samp>/</samp> in asset names (since that's backwards compatible).
| ''Дощечка Эбби''
 
| ''Спиритическая планшетка Эбби''
[[Modding:Using XNB mods|XNB mods]] are disproportionately affected, since...
|-
# they replace the entire file;
| [[Dark Sword]]
# they're loaded through the MonoGame content pipeline which is less tolerant of format changes;
| ''Темный Меч''
# they don't benefit from the compatibility rewrites [[Modding:Content Patcher|Content Patcher]] provides for its content packs.
| ''Темный клинок''
 
Content Patcher packs are typically unaffected (and Content Patcher will try to rewrite content packs automatically). However if a content pack replaces an entire asset instead of editing, it's more likely to be affected like an XNB mod.
 
===Changed assets===
Compatibility is broadly grouped into four categories:
* "'''✘ broken'''": mods will remove new content or significant changes, or the mod's intended changes will no longer work. Effects may range from display bugs to crashes, depending how the game uses that specific content.
* "✘ will remove changes": mods will remove minor changes in 1.6.16 (e.g. typo fixes).
* "✓ mostly unaffected": mods will only be affected if they edit specific entries or fields.
* Blank: no expected impact for the vast majority of mods.
 
{| class="wikitable"
|-
|-
| [[Dragontooth Club]]
!rowspan="2"| content asset
| ''Драконозубья дубинка''
!rowspan="2"| changes in 1.6.16
| ''Дубина из драконьего зуба''
!colspan="2"| compatibility for pre-1.6.16 mods
|-
|-
| [[Dragontooth Cutlass]]
! XNB mods
| ''Драконозубья сабля''
! Content Patcher packs
| ''Сабля из драконьего зуба''
|-
|-
| [[Dragontooth Shiv]]
| <samp>Characters/Dialogue/Abigail</samp><br /><samp>Characters/Dialogue/Alex</samp><br /><samp>Characters/Dialogue/Clint</samp><br />samp>Characters/Dialogue/Demetrius</samp><br /><samp>Characters/Dialogue/Emily</samp><br /><samp>Characters/Dialogue/Elliott</samp><br /><samp>Characters/Dialogue/Evelyn</samp><br /><samp>Characters/Dialogue/Haley</samp><br /><samp>Characters/Dialogue/Harvey</samp><br /><samp>Characters/Dialogue/Kent</samp><br /><samp>Characters/Dialogue/Leah</samp>
| ''Драконозубья заточка''
| [[#Removed or moved translation keys|Removed or moved event dialogues]].
| ''Заточка из драконьего зуба''
|
|
|-
|-
| [[Dwarf Dagger]]
| <samp>Characters/Dialogue/LeoMainland</samp>
| ''Кинжал Дварфов''
| Added missing <samp>AcceptGift_(TR)ParrotEgg</samp> dialogue key (copied from <samp>Characters/Dialogue/Leo</samp>).
| ''Дварфийский кинжал''
| ✘ will remove changes
|
|-
|-
| [[Dwarf Hammer]]
| <samp>Characters/Dialogue/Lewis</samp>
| ''Молот Дварфов''
| &#32;
| ''Дварфийский молот''
* [[#Removed or moved translation keys|Removed or moved event dialogues]].
* Added missing <samp>$h</samp> portrait in <samp>summer_Town_57_40</samp> dialogue.
| ✘ will remove changes
|
|-
|-
| [[Dwarf Sword]]
| <samp>Characters/Dialogue/Marnie</samp>
| ''Меч Дварфов''
| Fixed a capitalization typo.
| ''Дварфийский меч''
| ✘ will remove changes
|
|-
|-
| [[Insect Head]]
| <samp>Characters/Dialogue/MarriageDialogue</samp>
| ''Жучья Голова''
| [[#Removed or moved translation keys|Removed some redundant dialogues]].
| ''Жучиная голова''
| ✘ will remove changes
|
|-
|-
| [[Leah's Whittler]]
| <samp>Characters/Dialogue/Maru</samp><br /><samp>Characters/Dialogue/Pam</samp><br /><samp>Characters/Dialogue/Penny</samp><br /><samp>Characters/Dialogue/Pierre</samp><br /><samp>Characters/Dialogue/Robin</samp>
| ''Точилка Леи''
| [[#Removed or moved translation keys|Removed or moved event dialogues]].
| ''Резец Леи''
|
|
|-
|-
| [[Seb's Lost Mace]]
| <samp>Characters/Dialogue/Sam</samp>
| ''Потерянная палица Себа''
| [[#Removed or moved translation keys|Merged, removed, or moved event dialogue keys]].
| ''Потерянная булава Себа''
| '''✘ broken'''
| ✓ mostly unaffected
|-
| <samp>Characters/Dialogue/Sebastian</samp><br /><samp>Characters/Dialogue/Shane</samp>
| [[#Removed or moved translation keys|Removed or moved event dialogues]].
|
|
|-
|-
| [[Wind Spire]]
| <samp>Data/Achievements</samp>
| ''Башня Ветров''
| [[#Data/Achievements|Overhauled data format]].
| ''Пика ветров''
| '''✘ broken'''
|}
| '''✘ broken'''
 
|-
===Monsters===
| <samp>Data/Buildings</samp>
; Hungarian
| &#32;
: {| class="wikitable"
* Added [[#Item spawn field changes|new item spawn fields]] and [[#New Id fields|new <samp>Id</samp> fields]].
* The <samp>ModData</samp> field is now null by default.
* Fixed some non-unique inner IDs.
| '''✘ broken'''
|
|-
|-
! monster
| <samp>Data/Characters</samp>
! old name
| &#32;
! new name
* Added [[#Darta/Characters|new fields]] and [[#Item spawn field changes|new item spawn fields]].
* Fixed a broken asset name for the <samp>???</samp> character.
| '''✘ broken'''
|
|-
|-
| [[Truffle Crab]]
| <samp>Data/CookingRecipes</samp>
| ''Kőrák''
| [[#Data/CookingRecipes|Changed some recipe keys]].
| ''Szarvasgombarák''
| '''✘ broken'''
|}
| ✓ mostly unaffected
 
==XNB impact==
<!--
 
Updated up to 1.6.16 alpha 2025-09-13.
 
-->
===Overview===
This section provides a summary of the XNB files which changed in Stardew Valley 1.6.16. This doesn't include new files (since they won't impact existing mods), text changes in non-English files, or the switch from <samp>\</samp> to <samp>/</samp> in asset names (since that's backwards compatible).
 
[[Modding:Using XNB mods|XNB mods]] are disproportionately affected, since...
# they replace the entire file;
# they're loaded through the MonoGame content pipeline which is less tolerant of format changes;
# they don't benefit from the compatibility rewrites [[Modding:Content Patcher|Content Patcher]] provides for its content packs.
 
Content Patcher packs are typically unaffected (and Content Patcher will try to rewrite content packs automatically). However if a content pack replaces an entire asset instead of editing, it's more likely to be affected like an XNB mod.
 
===Changed assets===
Compatibility is broadly grouped into four categories:
* "'''✘ broken'''": mods will remove new content or significant changes, or the mod's intended changes will no longer work. Effects may range from display bugs to crashes, depending how the game uses that specific content.
* "✘ will remove changes": mods will remove minor changes in 1.6.16 (e.g. typo fixes).
* "✓ mostly unaffected": mods will only be affected if they edit specific entries or fields.
* Blank: no expected impact for the vast majority of mods.
 
{| class="wikitable"
|-
|-
!rowspan="2"| content asset
| <samp>Data/Events/*</samp><br /><samp>Data/Events/Festivals/*</samp>
!rowspan="2"| changes in 1.6.16
| [[#Event changes|Major changes]] including [[#Multilingual events|multilingual events]], [[#Forking deprecated|event labels]], [[#Changed event keys|event key changes]], replacing dialogue commands with event commands, etc.
!colspan="2"| compatibility for pre-1.6.16 mods
| '''✘ broken'''
| ✓ mostly unaffected
|-
|-
! XNB mods
| <samp>Data/Events/AnimalShop</samp><br /><samp>Data/Events/ArchaeologyHouse</samp>
! Content Patcher packs
| Replaced <samp>removeQuest</samp> commands with <samp>completeQuest</samp>.
| '''✘ broken'''
| ✓ mostly unaffected
|-
|-
| <samp>Characters/Dialogue/Abigail</samp><br /><samp>Characters/Dialogue/Alex</samp><br /><samp>Characters/Dialogue/Clint</samp><br />samp>Characters/Dialogue/Demetrius</samp><br /><samp>Characters/Dialogue/Emily</samp><br /><samp>Characters/Dialogue/Elliott</samp><br /><samp>Characters/Dialogue/Evelyn</samp><br /><samp>Characters/Dialogue/Haley</samp><br /><samp>Characters/Dialogue/Harvey</samp><br /><samp>Characters/Dialogue/Kent</samp><br /><samp>Characters/Dialogue/Leah</samp>
| <samp>Data/Events/Beach</samp>
| [[#Removed or moved translation keys|Removed or moved event dialogues]].
| &#32;
|
* Replaced <samp>awardFestivalPrize</samp> commands with <samp>addItem</samp>.
|
* Replaced <samp>removeQuest</samp> commands with <samp>completeQuest</samp>.
| '''✘ broken'''
| ✓ mostly unaffected
|-
|-
| <samp>Characters/Dialogue/LeoMainland</samp>
| <samp>Data/Events/Farm</samp><br /><samp>Data/Events/FarmHouse</samp>
| Added missing <samp>AcceptGift_(TR)ParrotEgg</samp> dialogue key (copied from <samp>Characters/Dialogue/Leo</samp>).
| Replaced <samp>awardFestivalPrize</samp> commands with <samp>addItem</samp>.
| ✘ will remove changes
| ✘ will remove changes
|
| ✓ mostly unaffected
|-
|-
| <samp>Characters/Dialogue/Lewis</samp>
| <samp>Data/Events/Forest</samp>
| &#32;
| &#32;
* [[#Removed or moved translation keys|Removed or moved event dialogues]].
* Replaced <samp>awardFestivalPrize</samp> commands with <samp>addItem</samp>.
* Added missing <samp>$h</samp> portrait in <samp>summer_Town_57_40</samp> dialogue.
* Fixed event commands with invalid arguments.
| ✘ will remove changes
| ✘ will remove changes
|
| ✓ mostly unaffected
|-
|-
| <samp>Characters/Dialogue/Marnie</samp>
| <samp>Data/Events/HaleyHouse</samp><br /><samp>Data/Events/Hospital</samp>
| Fixed a capitalization typo.
| Fixed event commands with invalid arguments.
| ✘ will remove changes
| ✘ will remove changes
|
| ✓ mostly unaffected
|-
|-
| <samp>Characters/Dialogue/MarriageDialogue</samp>
| <samp>Data/Events/IslandHut</samp>
| [[#Removed or moved translation keys|Removed some redundant dialogues]].
| Quoted "???" names for consistency.
| ✘ will remove changes
|
|-
| <samp>Characters/Dialogue/Maru</samp><br /><samp>Characters/Dialogue/Pam</samp><br /><samp>Characters/Dialogue/Penny</samp><br /><samp>Characters/Dialogue/Pierre</samp><br /><samp>Characters/Dialogue/Robin</samp>
| [[#Removed or moved translation keys|Removed or moved event dialogues]].
|
|
|
|
|-
|-
| <samp>Characters/Dialogue/Sam</samp>
| <samp>Data/Events/IslandSouth</samp>
| [[#Removed or moved translation keys|Merged, removed, or moved event dialogue keys]].
| &#32;
* Updated for [[#Other event changes|event skip changes]].
* Fixed event commands with invalid arguments.
| '''✘ broken'''
| '''✘ broken'''
| ✓ mostly unaffected
| ✓ mostly unaffected
|-
|-
| <samp>Characters/Dialogue/Sebastian</samp><br /><samp>Characters/Dialogue/Shane</samp>
| <samp>Data/Events/JoshHouse</samp>
| [[#Removed or moved translation keys|Removed or moved event dialogues]].
| &#32;
|
* Updated for [[#Data/CookingRecipes|new cooking recipe keys]].
|
* Fixed a George dialogue line which wasn't shown in 1.6.9+.
|-
| <samp>Data/Buildings</samp><br /><samp>Data/Characters</samp>
| [[#Item spawn field changes|Added new item spawn fields]].
| '''✘ broken'''
|
|-
| <samp>Data/CookingRecipes</samp>
| [[#Data/CookingRecipes|Changed some recipe keys]].
| '''✘ broken'''
| '''✘ broken'''
| ✓ mostly unaffected
| ✓ mostly unaffected
|-
|-
| <samp>Data/Events/*</samp><br /><samp>Data/Events/Festivals/*</samp>
| <samp>Data/Events/Mine</samp>
| [[#Event changes|Major changes]] including [[#Multilingual events|multilingual events]], [[#Forking deprecated|event labels]], [[#Changed event keys|event key changes]], replacing dialogue commands with event commands, etc.
| Replaced <samp>awardFestivalPrize</samp> commands with <samp>addItem</samp>.
| '''✘ broken'''
| ✘ will remove changes
| ✓ mostly unaffected
| ✓ mostly unaffected
|-
|-
| <samp>Data/Events/AnimalShop</samp><br /><samp>Data/Events/ArchaeologyHouse</samp>
| <samp>Data/Events/Mountain</samp>
| Replaced <samp>removeQuest</samp> commands with <samp>completeQuest</samp>.
| '''✘ broken'''
| ✓ mostly unaffected
|-
| <samp>Data/Events/Beach</samp>
| &#32;
| &#32;
* Replaced <samp>awardFestivalPrize</samp> commands with <samp>addItem</samp>.
* Replaced <samp>awardFestivalPrize</samp> commands with <samp>addItem</samp>.
* Replaced <samp>removeQuest</samp> commands with <samp>completeQuest</samp>.
* Fixed event commands with invalid arguments.
| '''✘ broken'''
| ✘ will remove changes
| ✓ mostly unaffected
| ✓ mostly unaffected
|-
| <samp>Data/Events/Farm</samp><br /><samp>Data/Events/FarmHouse</samp>
| Replaced <samp>awardFestivalPrize</samp> commands with <samp>addItem</samp>.
| ✘ will remove changes
| ✓ mostly unaffected
|-
| <samp>Data/Events/Forest</samp>
| &#32;
* Replaced <samp>awardFestivalPrize</samp> commands with <samp>addItem</samp>.
* Fixed event commands with invalid arguments.
| ✘ will remove changes
| ✓ mostly unaffected
|-
| <samp>Data/Events/HaleyHouse</samp><br /><samp>Data/Events/Hospital</samp>
| Fixed event commands with invalid arguments.
| ✘ will remove changes
| ✓ mostly unaffected
|-
| <samp>Data/Events/IslandHut</samp>
| Quoted "???" names for consistency.
|
|
|-
| <samp>Data/Events/IslandSouth</samp>
| &#32;
* Updated for [[#Other event changes|event skip changes]].
* Fixed event commands with invalid arguments.
| '''✘ broken'''
| ✓ mostly unaffected
|-
| <samp>Data/Events/JoshHouse</samp>
| &#32;
* Updated for [[#Data/CookingRecipes|new cooking recipe keys]].
* Fixed a George dialogue line which wasn't shown in 1.6.9+.
| '''✘ broken'''
| ✓ mostly unaffected
|-
| <samp>Data/Events/Mine</samp>
| Replaced <samp>awardFestivalPrize</samp> commands with <samp>addItem</samp>.
| ✘ will remove changes
| ✓ mostly unaffected
|-
| <samp>Data/Events/Mountain</samp>
| &#32;
* Replaced <samp>awardFestivalPrize</samp> commands with <samp>addItem</samp>.
* Fixed event commands with invalid arguments.
| ✘ will remove changes
| ✓ mostly unaffected
|-
|-
| <samp>Data/Events/Saloon</samp>
| <samp>Data/Events/Saloon</samp>
Line 2,944: Line 3,949:
| ✓ mostly unaffected
| ✓ mostly unaffected
|-
|-
| <samp>Data/FishPondData</samp><br /><samp>Data/FruitTrees</samp>
| <samp>Data/FishPondData</samp>
| [[#Item spawn field changes|Added new item spawn fields]].
| [[#Item spawn field changes|Added new item spawn fields]].
| '''✘ broken'''
|
|-
| <samp>Data/FruitTrees</samp>
| &#32;
* [[#Item spawn field changes|Added new item spawn fields]].
* Fixed some non-unique inner IDs.
| '''✘ broken'''
| '''✘ broken'''
|
|
Line 2,958: Line 3,970:
| <samp>Data/GarbageCans</samp><br /><samp>Data/GiantCrops</samp>
| <samp>Data/GarbageCans</samp><br /><samp>Data/GiantCrops</samp>
| [[#Item spawn field changes|Added new item spawn fields]].
| [[#Item spawn field changes|Added new item spawn fields]].
| '''✘ broken'''
|
|-
| <samp>Data/HomeRenovations</samp>
| [[#New Id fields|Added new <samp>Id</samp> fields]].
| '''✘ broken'''
| '''✘ broken'''
|
|
Line 2,971: Line 3,988:
* Added <samp>FOR_TUTORIAL_CATCH</samp> arguments to <samp>LOCATION_FISH</samp> queries.
* Added <samp>FOR_TUTORIAL_CATCH</samp> arguments to <samp>LOCATION_FISH</samp> queries.
* Changed [[Legend]] condition to use new <samp>IS_RAINING</samp> [[Modding:Game state queries|query]] to support mods weathers.
* Changed [[Legend]] condition to use new <samp>IS_RAINING</samp> [[Modding:Game state queries|query]] to support mods weathers.
* Fixed some non-unique inner IDs.
| '''✘ broken'''
| '''✘ broken'''
| ✓ mostly unaffected
| ✓ mostly unaffected
|-
|-
| <samp>Data/LostItemsShop</samp>
| <samp>Data/LostItemsShop</samp>
| [[#Data/LostItemsShop|Added new field to data model]].
| [[#Data/LostItemsShop|Added new field]].
| '''✘ broken'''
| '''✘ broken'''
|
|
|-
|-
| <samp>Data/Machines</samp><br /><samp>Data/Movies</samp>
| <samp>Data/Machines</samp>
| Added [[#Item spawn field changes|new item spawn fields]] and [[#New Id fields|new <samp>Id</samp> fields]].
| '''✘ broken'''
|
|-
| <samp>Data/Movies</samp>
| [[#Item spawn field changes|Added new item spawn fields]].
| [[#Item spawn field changes|Added new item spawn fields]].
| '''✘ broken'''
|
|-
| <samp>Data/MuseumRewards</samp>
| [[#New Id fields|Added new <samp>Id</samp> fields]].
| '''✘ broken'''
| '''✘ broken'''
|
|
Line 2,993: Line 4,021:
| <samp>Data/PassiveFestivals</samp>
| <samp>Data/PassiveFestivals</samp>
| &#32;
| &#32;
* [[#Data/PassiveFestivals|Added new field to data model]].
* [[#Data/PassiveFestivals|Added new field]].
* Added <samp>InLocations</samp> values for [[Trout Derby]] and [[Squidfest]].
* Added <samp>InLocations</samp> values for [[Trout Derby]] and [[Squidfest]].
| '''✘ broken'''
| '''✘ broken'''
Line 2,999: Line 4,027:
|-
|-
| <samp>Data/Pets</samp>
| <samp>Data/Pets</samp>
| [[#Item spawn field changes|Added new item spawn fields]].
| Added [[#Item spawn field changes|new item spawn fields]] and [[#New Id fields|new <samp>Id</samp> fields]].
| '''✘ broken'''
| '''✘ broken'''
|
|
Line 3,010: Line 4,038:
| <samp>Data/Shops</samp>
| <samp>Data/Shops</samp>
| &#32;
| &#32;
* [[#Item spawn field changes|Added new item spawn fields]].
* Added [[#Item spawn field changes|new item spawn fields]] and [[#New Id fields|new <samp>Id</samp> fields]].
* Updated for [[#Data/CookingRecipes|new cooking recipe keys]].
* Updated for [[#Data/CookingRecipes|new cooking recipe keys]].
* Fixed Pierre's shop selling duplicate corn/sunflower/wheat seeds when you gave him the missing stocklist.
* Fixed Pierre's shop selling duplicate corn/sunflower/wheat seeds when you gave him the missing stocklist.
* Furniture catalogue's <samp>ALL_ITEMS</samp> item query entry now additionally excludes items with the <samp>exclude_from_furniture_catalogue</samp> context tag.
| ✘ will remove fixes
| ✘ will remove fixes
| ✓ mostly unaffected
| ✓ mostly unaffected
|-
|-
| <samp>Data/SpecialOrders</samp>
| <samp>Data/SpecialOrders</samp>
| [[#Data/SpecialOrders|Added new field to data model]].
| Added [[#Data/SpecialOrders|new fields]] and [[#New Id fields|new <samp>Id</samp> fields]].
| '''✘ broken'''
| '''✘ broken'''
|
|
Line 3,023: Line 4,052:
| <samp>Data/Tools</samp>
| <samp>Data/Tools</samp>
| &#32;
| &#32;
* [[#Data/Tools|Added new field to data model]].
* Added [[#Data/Tools|new field]] and [[#New Id fields|new <samp>Id</samp> fields]].
* Removed <samp>Lantern</samp> tool.
* Removed <samp>Lantern</samp> tool.
| '''✘ broken'''
| '''✘ broken'''
Line 3,030: Line 4,059:
| <samp>Data/Weapons</samp>
| <samp>Data/Weapons</samp>
| &#32;
| &#32;
* [[#Data/Weapons|Added new field to data model]] and [[#Item spawn field changes|new item spawn fields]].
* Added [[#Data/Weapons|new field]] and [[#Item spawn field changes|new item spawn fields]].
* Added [[#New context tags|new context tags]] (<samp>is_scythe</samp>).
* Added [[#New context tags|new context tags]] (<samp>is_scythe</samp>).
| '''✘ broken'''
| '''✘ broken'''
Line 3,036: Line 4,065:
|-
|-
| <samp>Data/WildTrees</samp>
| <samp>Data/WildTrees</samp>
| [[#Item spawn field changes|Added new item spawn fields]].
| &#32;
* Added [[#Item spawn field changes|new item spawn fields]] and [[#New Id fields|new <samp>Id</samp> fields]].
* Fixed some non-unique inner IDs.
| '''✘ broken'''
| '''✘ broken'''
|
|

Latest revision as of 21:20, 20 September 2026

←Index

This page is for mod authors. Players: see the mod compatibility list instead.

This is a potential patch before the announced Stardew Valley 1.7 to release bug fixes, but has no planned release date.

This page helps mod authors prepare their mods for the upcoming Stardew Valley 1.6.16, and documents some of the changes and new functionality.

FAQs

SMAPI mod compatibility over time.

What's changing?

Stardew Valley 1.6.16...

  • significantly overhauls events, which may break some mods (though most should still work fine);
  • and adds many backwards-compatible changes and improvements for mod authors.

See the sections below for more details.

Is this the modapocalypse?

Probably not. SMAPI and Content Patcher will automatically rewrite older mods for many of the changes, so they should still work as-is. Some mods may need an update.

How to update your mod

Here's a suggested 'quick start' guide to update a mod for Stardew Valley 1.6.16.

For C# mods:
  1. Update for Stardew Valley 1.6.9 if you haven't already.
  2. Rebuild the solution.
  3. Fix any build errors and review any build warnings. You can search this page and previous migration guides for relevant info as needed.
  4. Increment your mod version in manifest.json.
    (Some mods may be added to SMAPI's compatibility blacklist due to runtime errors. Incrementing the mod version will fix that if so.)
  5. Test to make sure the mod works.
  6. Skim through this page, and check any section that might be relevant to the mod.
For Content Patcher packs:
  1. Update for Stardew Valley 1.6.9 if you haven't already.
  2. Skim through this page, and check any section that might be relevant to the mod.
For content packs which use another framework:
See the documentation for the framework mod. Often you won't need to update the content pack if the framework mod itself was updated.

Data asset changes

New Id fields

Stardew Valley 1.6.16 adds Id fields for all data models which didn't have one, so content packs can easily edit them.

This affects...

asset added to fields
Data/Buildings AdditionalPlacementTiles.
Data/HomeRenovations RectGroups;
RectGroups → Rects;
RenovateActions;
Requirements.
Data/Machines AdditionalConsumedItems.
Data/MuseumRewards TargetContextTags.
Data/Pets Behaviors;
Behaviors → AnimationEndBehaviorChanges;
Behaviors → PlayerNearbyBehaviorChanges;
Behaviors → TimeoutBehaviorChanges.
Data/Shops VisualTheme.
Data/SpecialOrders Objectives;
RandomizedElements;
RandomizedElements → Values;
Rewards.
Data/Tools UpgradeFrom.
Data/WildTrees Textures.

Data/AdditionalWallpaperFlooring

  • The Texture asset no longer needs to be exactly 256 pixels wide.

Data/Achievements

This has been overhauled into a data model asset, with...

  • support for string achievement IDs;
  • translations moved into a new Strings/Achievements asset;
  • and new fields like IsSharedAchievement and SendToChat which weren't available in the old format.

The data asset now consists of a string → model lookup, where...

field effect
basic info
DisplayName
Description
A tokenizable string for the achievement's in-game display name and description.
IsSharedAchievement (Optional) Whether the achievement should be unlocked for all players when any player unlocks it. Default false.
in-game behavior
UnlockCondition (Optional) A game state query which indicates when the achievement should be unlocked. If omitted, it must be unlocked manually (e.g. via the addAchievement event command).
KnownBeforeUnlockCondition (Optional) If ShowInCollection is true, a game state query which indicates whether the achievement name and description should be shown on the collection tab before it's been unlocked; if false, it'll be shown as "???" with no description. Defaults to always shown.
ShowInCollection (Optional) Whether the achievement should be listed on the collections tab. Default true.
ShowNotification (Optional) Whether to show a HUD notification when the achievement is unlocked. Default true.

This should usually be true for custom achievements. The field exists to support platform-only achievements in the base game.

SendToChat (Optional) Whether to send a message to multiplayer chat when a player unlocks the achievement. Default false.
advanced
PlatformIds (Optional) The achievement's ID within each platform, if different from the achievement ID. Default none.

This generally isn't applicable for custom achievements.

CustomFields (Optional) The custom fields for this entry.

Data/BigCraftables

Added one new field:

field effect
CanFlipSpriteWhenPlaced (Optional) Whether the object has a 50% chance to horizontally flip its sprite when placed to improve visual diversity. Default false.

Data/ChairTiles

  • Fixed support for tilesheet asset names containing a dot. (For example, a tileseet asset named ExampleAuthor.ModName_Tilesheet now correctly uses that as the data key instead of ExampleAuthor.)

Data/Characters

  • Added new fields:
    field effect
    FootstepSound (Optional) The sound to play when this NPC walks.

    This can be an audio cue ID, an empty string ("") for no sound, or omitted for the default sound. If omitted, the NPC plays the default Cowboy_Footstep sound.

    ForceOneTileWide (Optional) Whether the character should be one tile wide for the purposes of collisions and positioning, regardless of their sprite size. Default false.
    KissSpriteIndexWhenFlipped (Optional) The sprite index within the TextureName used when facing the opposite direction from KissSpriteIndex. If omitted or -1, it'll flip the sprite from KissSpriteIndex instead.

    This is assumed to be facing left, unless KissSpriteFacingRight is false.

    SpawnAsEphemeral (Optional) Whether the character is ephemeral when spawned automatically (e.g. via the SpawnIfNeeded field), so they're removed automatically before save and before the day ends. This doesn't affect NPCs which are already spawned, or which are spawned directly in game or mod code. Default false.
  • The LoveInterest field now affects Flower Dance dance partner selection.

Data/CookingRecipes

These cooking recipe keys were changed to match their object name (like all the other recipes):

old name new name
Cheese Cauli. Cheese Cauliflower
Cookies Cookie
Cran. Sauce Cranberry Sauce
Dish o' The Sea Dish O' The Sea
Eggplant Parm. Eggplant Parmesan
Vegetable Stew Vegetable Medley

This has no effect on the display text, but mods which reference these recipe keys will need to be updated.

Data/Events/*

See event changes below.

Data/FishPondData

  • The MaxPopulation field is no longer limited to a maximum of 10.

Data/GiantCrops

In the HarvestItems list, added one new field:

field effect
ActionsOnDrop (Optional) The actions to run when the item is dropped. The actions are run once per entry drop. Default none.

Data/LostItemsShop

Added one new field:

field effect
RequireCondition (Optional) The game state queries which must match to add this item. The Target player is the one being checked.

This field should generally only be used with deterministic game state queries.

If you specify multiple criteria fields, only one is applied in this order: RequireMailReceived, then RequireEventSeen, then RequireCondition.

Data/Objects

Added one new field:

field effect
CanFlipSpriteWhenPlaced (Optional) Whether the object has a 50% chance to horizontally flip its sprite when placed to improve visual diversity. Default false.

Data/PassiveFestivals

Added one new field:

field effect
InLocations (Optional) The locations in which the festival happens. This affects various game logic like NPC dialogues, tent placement restrictions, weather, etc. If omitted, defaults to the keys in MapReplacements.

Data/SpecialOrders

  • Added new fields:
    field effect
    CanBeCancelled (Optional) Whether the special order can be cancelled. In multiplayer, any player cancelling the special order will remove it for all players. Default false.
    ActionsOnReward (Optional) A list of trigger actions to run when the special order is completed. These are run locally for each player. This field accepts special order tokens.

    For example:

    "ActionsOnReward": [
        "AddMail Current {{ModId}}_MailId Received",
        "MarkCookingRecipeKnown Current Hopper"
    ]
    

    You should usually prefer ActionsOnReward instead of Rewards, except that the Gems (Qi board only), Object (town board only), or Money reward types are drawn in the special order board UI.

    And improved one field:

    field effect
    Duration This can now be set to "Indefinite" for a special order with no expiry. It will remain active until it's completed or cancelled. Consider enabling CanBeCancelled if applicable.

Data/Tools

Added one field:

field effect
ContextTags (Optional) The custom context tags to add for this item (in addition to the tags added automatically based on the other item data), specified as an array.

Data/Trinkets

Added one field:

field effect
ContextTags (Optional) The custom context tags to add for this item (in addition to the tags added automatically based on the other item data), specified as an array.

Data/Weapons

Added one field:

field effect
ContextTags (Optional) The custom context tags to add for this item (in addition to the tags added automatically based on the other item data), specified as an array.

Changes for all mod authors

Cache changes

Stardew Valley 1.6.16 adds internal caching to improve performance. Typically the relevant caches will be reset right away.

Some entities have been changed to take advantage of this, which may impact some mods.

entity type field effect technical notes
Items Sprite index If SpriteIndex in the data asset is changed, existing items will be updated to match (unless something else has overridden it for that existing item, such as certain big craftables changing appearance based on the season). Items in existing saves will be updated for this when loaded in 1.6.16, assuming their sprite index matches the data asset value.

The parentSheetIndex netfield will have a value of -1 when the data asset value should be used. The ParentSheetIndex property will have the "effective" parentSheetIndex (meaning that if the netfield has -1, it will return the data asset value).

The value from the data asset can easily retrieved from the DataParentSheetIndex propery.

Context tag changes

Added new context tags:

context tag item types behavior effect
axe
error_tool
fishing_rod
generic_tool
hoe
melee_weapon
milk_pail
pan
pickaxe
shears
slingshot
wand
watering_can
tools and weapons informational The C# type which implements the tool or melee weapon.

Note that the vanilla scythes are melee_weapon. See also the is_scythe context tag below.

is_edible
is_edible_bad
is_edible_good
objects informational Indicates the item can be eaten/drunk.

This is set automatically based on the item's edibility value:

  • -299 to -1: is_edible is_edible_bad;
  • 0: is_edible;
  • 1+: is_edible is_edible_good.
fish_skip_minigame any functional If the player catches this item while fishing, it'll be caught directly without the fishing minigame. This matches the behavior when catching junk items like seaweed (which now have the context tag where needed).
ignore_gift_limits any giftable item functional Makes this item ignore the gift limits when given as a gift (similar to stardrop tea). Items with this tag don't count towards the daily/weekly limits, and can be given even if those limits have been reached.
is_scythe tools and weapons functional Marks the tool as a scythe. This is set for vanilla scythes through Data/Weapons.
spawns_butterflies furniture functional Whether butterflies spawn around this furniture, similar to the butterfly hutch.
exclude_from_furniture_catalogue furniture functional Prevents the furniture from showing up in the furniture catalogue
trash_bear_ignore any cooking recipe output functional When the trash bear requests random items produced by cooking recipes, items with this context tag will be skipped.
upgrade_level_* tools and weapons informational The tool upgrade level. These tags are added automatically based on the tool's current level. For example, a copper axe will have both upgrade_level_0 (base axe) and upgrade_level_1 (copper axe).

Debug command changes

  • Added new commands:
    command description
    giantCrop <id> [x] [y] Place the specified giant crop ID at the given tile position. The ID is case-insensitive, and will list fuzzy matches if an exact match isn't found. If the position isn't specified, it'll be placed just to the right of the farmer.
    heldItem Shows info about the currently held item like its name, category, item ID, and context tags.
    mineAll
    volcanoAll
    warpAll
    Warps you through every top-level location (warpAll), mine levels 1–120 and the quarry mine (mineAll), or volcano dungeon level (volcanoAll). After 1.5 seconds in each location, you'll automatically warp to the next. This will continue until you've warped through every available location, at which point you'll warp one last time to your farmhouse/cabin.

    ⚠️ Side effects:

    • warpAll will remove the perfection flag on your save.
    • mineAll will affect stats like 'deepest level reached' and achievements like To The Bottom.
    testAchievement <achievement ID> Shows diagnostic info about an achievement's unlock conditions and the current player's progress towards them. The <achievement ID> is the achievement's unique key in Data/Achievements..
    placeTemporaryWarp <targetLocation> <targetTileX> <targetTileY> [positionOffsetX] [positionOffsetY] Places a warp at the player's position (adjusted by the amount of tiles indicated by [positionOffsetX] and [positionOffsetY], if specified) leading to (<targetTileX>, <targetTileY>) in <targetLocation>. If the player is touching the resulting warp (such as if no offset was specified), they are immediately warped.

    This warp does not persist across saves, and may disappear at any time based on other game code.

    currency <currencyType> <amount> Gives yourself <amount> of the specified currency type. Valid currency types are:
    currency ID name
    0 data-sort-value="0">0g
    1 data-sort-value="0">0
    2 data-sort-value="0">0
    4 data-sort-value="0"> 0
    printEvent If there is an event currently running, prints the event ID and current event command.
  • Improved existing commands:
    command description
    achieve
    achievement
    Merged achieve <ID> (unlock platform achievement) and achievement <ID> (unlock in-game achievement) into one command that unlocks both automatically based on the achievement data. The achieve command is now just an alias for achievement.
    addAllCrafting No longer fails if the player already knows some of the crafting recipes.
    animalInfo
    characterInfo
    daysPlayed
    gamepad
    Now shows output in the console instead of showing a HUD notification.
    cookingRecipe
    craftingRecipe
    No longer throws an exception if the player already knows the recipe.
    dye Now accepts any standard color value.
    experience Fixed validation errors for the 'skill' argument never logged correctly.
    fuzzyItemNamed Now drops multiple items if the requested count exceeds the item's max stack size.
    gameQuery Can now be used with queries which check an item; the Input and Target item are now the item selected on the player's toolbar.
    jump Fixed error if the NPC doesn't exist.
    perfection Fixed error when run on a save which already has some requirements partly met.
    setupBigFarm
    • No longer fails if some of the crops, flooring, fruit trees, or grass can't be placed because the tile is occupied.
    • No longer fails if a building on the farm no longer has data.
    slimecraft No longer fails if you already have one or both recipes.
    toggleTimingOverlay Now shows more metrics like FPS and memory usage.
  • Removed some commands:
    command description
    furniture
    hat
    pole
    shirt
    tv
    wallpaper
    Replaced by generic commands like item and fuzzyItemNamed.
    getIndex
    listTags
    lookup
    qualifiedId
    Replaced by heldItem.
    lantern
    refuel
    stopRafting
    These were unimplemented or cut content.
    shiftToolbarLeft
    shiftToolbarRight
    Replaced by in-game hotkeys.

Diagnostic chat commands

  • Stardew Valley 1.6.16 enables hidden 'diagnostic commands' in chat, which are enabled for all players but not shown by /help. These allow specific console debug commands to be run even if cheat commands aren't enabled:
    command description
    diagnostic commands
    daysPlayed,
    dp
    Shows the number of in-game days since the game started (starting at 1 on spring 1 in year 1).
    animalInfo Shows the total number of farm animals in all locations.
    CharacterInfo Shows the total number of NPCs in the current location.
    doesItemExist Syntax: doesItemExist <item ID>

    Shows whether the given qualified or unqualified item ID exists anywhere in the world. This doesn't indicate where the item is located if any were found. See the whereIsItem command for more detailed output.

    gameQuery,
    gq
    Syntax: gameQuery <query>

    Parses a game state query and shows the result.

    getStat Syntax: getStat <stat key>

    Shows the value of a tracked stat.

    heldItem Shows info about the currently held item like its name, category, item ID, and context tags.
    listLights Shows debug info about all currently active light sources.
    logBandwidth Toggles whether multiplayer network bandwidth info should be written to the SMAPI console or (if /logFile was enabled) the log file.
    logFile Begins logging information to a file on disk, if supported by the platform. This can be useful for troubleshooting errors.
    logSounds Toggles whether each sound effect played should be written to the SMAPI console or (if /logFile was enabled) the log file.
    mineInfo Shows two mine-related stats (lowest level reached and deepest mine level).
    printPlayerPos,
    ppp
    Shows the player's current position in both tile and pixel coordinates.
    sdlVersion,
    sdlv
    Shows the current SDL version. (SDL is the low-level input library used by the game.)
    showExperience Syntax: showExperience <skill ID>

    Shows the player's total experience points for the given skill. The <skill ID> is one of 0 (farming), 1 (fishing), 2 (foraging), 3 (mining), or 4 (combat).

    testAchievement Syntax: testAchievement <achievement ID>

    Shows diagnostic info about an achievement's unlock conditions and your progress towards them. The <achievement ID> is the achievement's unique key in Data/Achievements.

    toggleTimingOverlay,
    tto
    Shows an on-screen overlay with basic info for performance monitoring.
    tokens Syntax: tokens <expression>

    Parses a tokenizable string and shows the result.

    version Shows the game's assembly version. This usually matches the version shown in-game (e.g. 1.6.15 build 24356 has assembly version 1.6.15.24356).
    whereIsItem,
    whereItem
    Searches the entire world (including other players' inventories) for items matching the qualified or unqualified item ID, and lists all matches.

    Unlike the equivalent console command, this doesn't list spawned objects like artifact spots and weeds.

    other commands
    copyOutfit Copies your current outfit (i.e. pants, shirt, etc) into your desktop clipboard in an XML format, and also shows it in the chat box.
    holdItem Make your player character play the 'hold up item' animation using your currently selected item.
    sprinkle Show a sparkle animation around your player character (the same animation used when applying fairy dust to a machine).
  • It also removes these chat commands:
    command reason
    logFile
    sdlVersion
    Replaced by the equivalent debug commands above.

Dialogue changes

  • Added Characters/Dialogue/Default asset. Dialogues in this asset apply to every NPC, except where the key is also defined in their own dialogue asset. This replaces some previous translations.
  • Added new dialogue keys in Characters/Dialogue/*:
    key description
    passive festival dialogue Identical to location dialogue, but you can use the passive festival ID as the location name. Any passive festival dialogue has priority over location dialogue in the same location.
    FirstMeeting If set, shown the first time the player ever speaks to that NPC.
    AskedToDance_Prompt
    AskedToDance_Prompt_Spouse
    AskedToDance_Ask
    AskedToDance_Cancel
    At the Flower Dance, the prompt which lets the player ask the NPC to dance. If omitted, defaults to the matching key in Characters/Dialogue/Default.
    TermsOfEndearment_Roommate
    TermsOfEndearment_Spouse
    TermsOfEndearment_Spouse_Rare
    TermsOfEndearment_Spouse_VeryRare
    The pet names which the NPC can use when addressing the player. This affects the message shown above their head when the NPC says good night (80% of the time), and the %endearment and %endearmentlower marriage dialogue tokens (not used in any vanilla dialogues).

    Each translation is a comma-delimited list of possible pet names. Each time it's displayed, one of the values will be selected at random.

    The translations are selected in this order:

    1. TermsOfEndearment_Roommate if the NPC is a roommate.
    2. TermsOfEndearment_Spouse_VeryRare (8% chance) or TermsOfEndearment_Spouse_Rare if the player has at least 9 hearts with the NPC, and the game requested a 'happy' term. This is only used when the NPC says good night, with a 10% chance.
    3. TermsOfEndearment_Spouse if the player has at least 9 hearts with the NPC.
    4. Otherwise the NPC just uses the player's name.

    If omitted, defaults to the matching key in Characters/Dialogue/Default.

  • Added new conversation topics:
    id trigger
    specialOrderComplete_<id> Player completes the given special order for the first time.
  • Fixed <location>_<x>_<y> and <location>_<dayOfWeek> dialogue keys never used in 1.6.0+ if a player has at least two hearts with the NPC.
  • Fixed location dialogues not recognizing the spring prefix (they only allowed summer, fall, and winter).
  • Fixed $r response IDs not tracked correctly if you reuse an NPC reaction key across multiple $r options.

See also other translation changes.

Ephemeral characters

You can now mark a character or farm animal as ephemeral (via SpawnAsEphemeral in Data/Characters or character.IsEphemeral in C#), which means they'll be removed automatically before saving and before the day ends. This works for any character in the characters or animals location fields.

In particular, this allows adding custom classes to the world since they're guaranteed to be removed before the game saves. Ephemeral characters are still synchronized in multiplayer. If a monster is ephemeral, any monsters it spawns will inherit its ephemerality (e.g. slimes spawned by a big slime).

In the base game, this replaces the previous custom logic which managed...

Event changes

Multilingual events

All vanilla events are now multilingual, with a single copy of each event script which uses translation keys. Translations from the old per-language event files were moved into a per-language Strings/Events file.

For example:

files in 1.6.15 files in 1.6.16
Data/Events/Beach
Data/Events/Beach.de-DE
Data/Events/Beach.es-ES
Data/Events/Beach.fr-FR
Data/Events/Beach.hu-HU
Data/Events/Beach.it-IT
Data/Events/Beach.ja-JP
Data/Events/Beach.ko-KR
Data/Events/Beach.pt-BR
Data/Events/Beach.ru-RU
Data/Events/Beach.tr-TR
Data/Events/Beach.zh-CN
Data/Events/Beach

Content Patcher content packs should generally be unaffected, since their edits were applied to the active version of the file automatically (which will just become the base file in all languages).

In rare cases, a mod which directly targets a specific localized asset name like Data/Events/Beach.fr-FR may no longer work or break vanilla events (depending on how it edits them). That should be a very rare case, since the APIs for both Content Patcher and SMAPI were designed to discourage doing that.

Forking deprecated

All vanilla events which used forking now use goto labels instead.

Forking still works like before for backwards compatibility, but mod events should prefer goto labels since...

  • they work more consistently and intuitively with other features like skip labels;
  • it's the approach that the game will be applying and developing in future versions;
  • deprecated commands will be reported as an error if you use the EventValidator;
  • and there's no guarantee forking will always work in future versions.

The fork-related event commands are deprecated.

Removed manual event pause management

When a dialogue or menu is shown, or certain animations are playing, the event needs to pause until they finish. How that works changed:

version behavior
<1.6.16 The event was paused using a combination of the null command (which pauses the event indefinitely), manually incrementing event.CurrentCommand (sometimes incremented twice to skip the null), and special handling in command logic while a menu was open. This was tricky and led to many edge cases in both the base game and mods (e.g. soft locks if a null command didn't get skipped correctly, other commands getting skipped unintentionally, commands not working correctly if a menu was opened, etc).
≥1.6.16 This is much simpler in 1.6.16+:
  • Events now pause automatically while any menu is up, and resume once it's closed. That guarantees that no menu is open when a command handler is called.
  • Characters/players add an entry to event.PauseWhile to pause the event until they finish certain animations (e.g. showing an emote or holding up an item).

This means that null commands and extra event.CurrentCommand increments are no longer needed in most cases.

Update note for mod events:

  • You no longer need a null command after awardFestivalPrize or itemAboveHead. (For backwards compatibility, the game will ignore a null command immediately after either of those.)

Breaking changes for custom commands added by C# mods:

  • The game no longer auto-increments event.CurrentCommand when closing dialogues, certain menus (ItemGrabMenu, ItemListMenu, MenuWithInventory, ReadyCheckDialog, and TutorialMenu), or methods which open them (like Game1.drawDialogue, Game1.drawDialogueNoTyping, Game1.drawObjectDialogue, and Game1.multipleDialogues). Custom commands which open one of those must now increment event.CurrentCommand like any other command.
  • When a menu is opened, no further command will run until it's closed. Event updates still happen (e.g. NPCs will continue moves they already started), but command logic which checks if a menu is open will never work.

Precondition slash now required for numeric event IDs

In Stardew Valley 1.6.0–15, the behavior of an event key with no / depended on whether the ID was numeric. A numeric event ID like 10040609 was treated as an event with no precondition, while a string event ID like PlayerKilled was treated as a manual script. In 1.6.16+, the behavior is now consistent: any event ID without a slash (like 10040609) is treated as a manual script, and any with a slash (like 10040609/) is treated as an event.

In other words:

event key format behavior
<id>
(string ID)
manual script (unchanged)
<id>
(numeric ID)
event (1.6.15) → manual script (1.6.16)
<id>/[preconditions] event (unchanged)

New event commands

command description
addAchievement <achievement ID> Unlock an achievement for the current player. The <achievement ID> can be a platform achievement ID (like Achievement_LocalLegend) or internal ID (like 17 for Gourmet Chef).
addActor <actorName> <x> <y> <direction> Add a character or player to the event. This is mostly equivalent to adding them through the character positions field, but can be done at any point in the script (e.g. for use with goto for event variations).
choose <question> [<answer> <go to label>]+ Show a dialogue box to choose from a list of responses, then optionally skip to a label based on the selected answer.

Arguments:

argument usage
<question> The translation key or literal text to show above the choices. This can be empty ("") to omit the question line.
<answer> The translation key or literal text for an answer to show.
<go to label> If the player chooses this answer, jump to this label in the event (see the goto command for more info). This can be "" or _ to continue to the next command instead.

For example, here's a simple choice which doesn't affect anything:

choose "Do you like apples?" "I love them." _ "I hate them." _/

Or you can change the course of the event based on the choice:

speak Abigail "Do you... like me?$l"/
choose "" "Yes!" happy "No." heartbroken/

label heartbroken/
speak Abigail "Oh. I understand.$s"/
faceDirection Abigail left/
pause 3000/
end/

label happy/
speak Abigail "We should explore the mines together next time!$h"/
...
completeQuest <id> Mark a quest complete. If the quest has no reward to collect, this also removes it from the in-game journal.
conditionSpeak <npc> [<dialogue> [condition]]+ Make an NPC say a dialogue based on arbitrary conditions. The first dialogue with a matching dialogue is spoken; if none match, the command is skipped.

Arguments:

argument usage
<npc> The internal name of the NPC who should speak (which can be marked optional).
<dialogue> The translation key or literal text for the dialogue to speak. If omitted or empty, the command is skipped when the condition is matched.
[condition] One of:
  • a game state query;
  • or ANSWERED <response ID>+ as a shortcut for the PLAYER_HAS_DIALOGUE_ANSWER Current query;
  • or omitted/blank to always match this dialogue if no previous one matched.

For example, here Maru says a different line if the player suggested she tell the truth:

conditionSpeak Maru "I accidentally dropped one of the samples... I'm so sorry.$s" "ANSWERED 38" "@ came in and slammed the door so loud I dropped this sample.$u"
goto [<target> [condition]]+ Skip forward or backward to a specific position in the event script. Each <target> can be:
target description
end Jump to the last end event command in the script.
any other value Jump to the first label command with this name.

You can list any number of label/condition pairs, and it will go to the first label with a matching condition. If a condition is omitted, it defaults to always true. If none of the conditions match, it continues to the next command normally.

For example, this event script uses goto to repeat a question until a specific answer is selected:

.../
label question/
choose Abigail "Hey! Did you have your eye on someone?" "Abigail" correct "Penny" wrong "Alex" wrong/

label wrong/
speak Abigail "Oh?$u"/
pause 500/
goto question/

label correct/
speak Abigail \"I thought so!$l\"/
pause 500/
end

You can make goto conditional using game state queries. For example, this will go to the divorced label if you divorced Abigail, and continue to the next command if not:

goto divorced "PLAYER_NPC_RELATIONSHIP Current Abigail Divorced"/
label <label> Set a named position in the event script, which you can go to using the goto command.

Note: you can't use end as a label name, since that automatically matches the end event command.

removeSpriteById Remove a temporary animated sprite (e.g. added via the temporaryAnimatedSprite command) using its ID.

Improved existing commands

command description
gainSkill Added argument validation.
move Fixed event softlock if it only applies to missing optional NPCs.
removeSprite Renamed to removeSpriteAt. The old name still works as an alias.
skippable Added an optional [skip to label] argument. If set, the event will jump to that label when the player clicks the skip button (see goto for more info). The last skippable command run before the player skips is applied.

This is meant to clean up or grant unlocks before the event ends. For example:

skippable beforeEnd/
.../

label beforeEnd/
gainSkill Fishing 1/
addItem (T)TrainingRod/
end

Technically you can jump to any point in the event (e.g. to cancel the skip). However, the skip action will still cancel any ongoing event behavior like ongoing player/NPC movements, so you should be careful doing this.

splitSpeak You should now specify each dialogue as a separate argument (though the old syntax will still work):
// in 1.6.15
splitSpeak Sam "You think so?~Yeah... kids should play and have fun while they still have the chance."

// in 1.6.16
splitSpeak Sam "You think so?" "Yeah... kids should play and have fun while they still have the chance."

This also now works with the new choose command too.

spriteText The [text] argument can now be a translation key to get the text from.
temporaryAnimatedSprite
  • The position (index 8) and scale (index 14) fields are no longer restricted to integer values. (This applies to both forms of the command.)
  • Added more flag options:
    flag effect
    id <int id> A unique ID for this sprite. Default none.

    This can be passed to other event commands (like removeSpriteById) or flags (like parent_sprite).

    alpha The sprite's transparency, as a value between 0 (transparent) and 1 (opaque). Default 1.
    stop_accelerating_when_velocity_is_zero When the current motion passes zero, whether to (a) set the X/Y accelerations to zero and (b) apply the after_accel_stop_motion_[x|y] options. Default false.

    This is used for item-above-head sprites.

    after_accel_stop_motion_x <float x>
    after_accel_stop_motion_y <float y>
    The motion value to set when stop_accelerating_when_velocity_is_zero is triggered. Default 0.
    x_stop_coordinate <float x>
    y_stop_coordinate <float y>
    If set, the target coordinate at which motion and acceleration on that axis stop. The sprite will keep moving normally until it reaches or passes that coordinate. Default -1 (disabled).
    firework_type <int type> If set, adds the fireworks glows and (when the animation completes) explosion for the sprite. The possible types are 0 (red), 1 (blue), 2 (green). Default none.

    Requires the set_owner and set_location flags.

    vertical_flipped If set, mirror the sprite vertically (i.e. flip top-to-bottom). Default false.

    Ignored if flipped is set.

    vector_scale <float x> <float y> The horizontal and vertical scale to apply to the sprite. Default none.

    If set, the scale (index 14) argument is ignored.

    alpha_fade_fade <float alpha> The multiplier applied to the alpha change (index 13) argument each frame. For example, specifying 2 means the sprite will fade out twice as fast. Default 1.
    scale_change_change <float scale> The multiplier applied to the scale change (index 15) each frame. For example, specifying 2 means the sprite will grow/shrink twice as fast. Default 1.
    light_id <string id> If set, add a light with the given unique ID which follows this sprite. Default none.

    See the next flags to configure the light.

    light_color <string color> If light_id is set, the color to tint the light. Defaults to #004180.

    Setting this to White (or equivalent) will apply the default color.

    light_radius <float scale> If light_id is set, the size of the lighted area.
    light_fade <int value> If light_id is set, the amount to subtract from the light's opacity each draw tick. Specified as a value between 0 (none) and 1 (instantly becomes transparent). Default none.
    x_periodic
    y_periodic
    If set, make the sprite oscillate horizontally and/or vertically along a sine wave (based on the next options). When both are specified, this causes the sprite to move in a circle.

    When set, the acceleration and motion values are ignored.

    x_periodic_range <float x>
    y_periodic_range <float y>
    If x_periodic and/or y_periodic are set, the pixel amplitude of the periodic motion. Default none.
    x_periodic_loop_time <float x>
    y_periodic_loop_time <float y>
    If x_periodic and/or y_periodic are set, the time in milliseconds for one full oscillation cycle. Default none.
    shake_intensity <float value> If set, the max pixel offset to apply random each frame. Default none.
    shake_intensity_change <float value> If set, apply the elapsed duration multiplied by this value to the shake_intensity each frame. Default none.
    pulse If set, rhythmically and continuously grow and shrink the sprite size. Default false.

    See the next flags to configure the pulse.

    pulse_amount <float value> If pulse is set, the scale multiplier to apply each tick. For example, 1.1 will grow/shrink the sprite by 10% per tick. Default 1.1.
    pulse_time <float ms> If pulse is set, the time in milliseconds before the pulse switches direction. Default zero (i.e. alternates every tick, or 30 times per second).
    start_sound <string name>
    end_sound <string name>
    The audio cue ID to play when the animation starts and/or ends. Default none.
    text <string text> If set, draws the given text instead of the actual sprite. The displayed text is affected by color and all transform fields, but unaffected by flip (index 11) or vertical_flipped.
    attached_actor <string name> The name of the event actor NPC to which to attach the sprite. Default none.

    If set by itself, this moves the attached NPC to follow the sprite. This may be overridden by the next flag.

    position_follows_attached_actor If attached_actor is set, causes the sprite to follow the attached NPC (instead of moving the NPC to follow the sprite). In that case, the sprite's position is relative to the NPC's position.
    parent_sprite <int id> The ID of the parent sprite. If set, this sprite's position is relative to the parent sprite's position.
    draw_above_always_front If set, draw this sprite above the AlwaysFront layer (so it's above all map layers and features).
    delay_before_animation_start <int delay> If set, a millisecond delay before the animation starts playing.
    local If set, draws this sprite relative to the viewport (top-left corner of the screen) instead of the world position.
    set_owner If set, sets the sprite owner field to the current player. This is required for some sprite behaviours like bombs and fireworks.
    set_location If set, sets the sprite location field to the current location. This is required for some sprite behaviours like bombs and fireworks.
textAboveHead Can now be applied to players.

Deprecated commands

These event commands are deprecated. They still work just like before (except the ones at the bottom of the table), but if you use the EventValidator it'll report them as an error.

event command migration
fork
resetVariable
switchEvent
Use the choose or goto commands instead. If you used dialogue containing the %fork token, it should be removed and replaced with equivalent event commands.
question forkX Use the choose command instead, and replace the event fork with a label.

For example, this script:

// main event
question fork1 "#I believe in you!#Wow, you're really arrogant."/
fork arrogant/
speak Alex "Thanks, @. I'll remember that."/
...

// 'arrogant' event
emote Alex 12/
speak Alex "Hmmph... I think someone's a little jealous.$a"/

Becomes this script:

choose "" "I believe in you!" believe "Wow, you're really arrogant." arrogant/

label believe/
speak Alex "Thanks, @. I'll remember that."/
...

label arrogant/
emote Alex 12/
speak Alex "Hmmph... I think someone's a little jealous.$a"/
...

Forks often duplicated the end of the script. In that case, you can have both variants just goto the common ending instead.

question null Use choose with _ labels instead. (Setting a label argument to _ means it'll just continue to the next command instead.)

For example, this command:

question null "But what am I going to say to Vincent?#It's best to be honest with kids.#You did the right thing. Kids should have hope."/

Would become this command:

choose "But what am I going to say to Vincent?" "It's best to be honest with kids." _ "You did the right thing. Kids should have hope." _/
quickQuestion Use the choose command instead. The <question> and <answerX> have matching choose arguments, while the <answerX script> arguments become labels.

For example, this command:

quickQuestion #I'd like to help#Nah, I'll pass...(break)emote Willy 32\speak Willy "Aye... I thought you would.$h#$b#I'll leave this door unlocked for ya... you can come drop off the materials whenever you like."(break)emote Willy 28\speak Willy "Alright, suit yourself...$s#$b#If you have a change of heart, you can always come back and help out. I'll leave this door unlocked, anyhow."/

Becomes this script:

choose "" "I'd like to help" accept "Nah, I'll pass..." refuse/

label accept/
emote Willy 32/
speak Willy "Aye... I thought you would.$h#$b#I'll leave this door unlocked for ya... you can come drop off the materials whenever you like."/
goto resume/

label refuse/
emote Willy 28/
speak Willy "Alright, suit yourself...$s#$b#If you have a change of heart, you can always come back and help out. I'll leave this door unlocked, anyhow."/

label resume/
cutscene bandfork
elliottBookTalk
question haleyDarkRoom
question shaneCliffs
question shaneLoan
These commands are deleted and will no longer work. They're unlikely to be used by mod events, but see their relevant events for the new equivalents if needed.

Changed event keys

Events were generally unified and de-hardcoded in 1.6.16. In particular...

  • Several events were previously defined in the game's C# code, where they couldn't be changed by content packs. Most of these were moved into Data/Events/* with translations in Strings/Events:
    event new asset name new event ID
    forest raccoon finished event Data/Events/Forest RaccoonFinish
    forest trash bear cleanup Data/Events/Forest 777111
    island Gourmand crop inspection Data/Events/islandFarmCave GourmandInspection
    summit perfection cutscene Data/Events/Summit SummitPerfection
    summit cheat event Data/Events/Summit SummitCheat
  • Others were moved from non-event data into Data/Events/*:
    event old location new asset new event ID
    Birdie quest intro & completed Strings/Locations:IslandSecret_Event_BirdieIntro
    Strings/Locations:IslandSecret_Event_BirdieFinished
    Strings/Locations:alreadyGotNuts
    Data/Events/IslandWest -888999 (intro)
    -666777 (completed)
    field office intro & completed Strings/Locations:IslandFieldOffice_Intro_Event
    Strings/Locations:FieldOfficeFinale
    Data/Events/IslandFieldOffice FieldOfficeIntro
    FieldOfficeDone
    Leo intro Strings/Locations:IslandHut_Event_ParrotBoyIntro Data/Events/IslandHut LeoIntro
    Meowmere event Strings/1_6_Strings:ForestPylonEvent Data/Events/WizardHouseBasement ForestPylon
    Mr. Qi Skull Cavern level 100 Data/ExtraDialogue:SkullCavern_100_event
    Data/ExtraDialogue:SkullCavern_100_event_honorable
    Data/Events/SkullCave SkullCavern100
    Professor Snail exits cave Strings/Locations:IslandNorth_Event_SafariManAppear Data/Events/IslandNorth ProfSnailIntro
  • Other event keys were changed or merged as part of the other event changes:
    asset entry key change in 1.6.16
    Data/Events/AbandonedJojaMart missingBundleComplete Event key changed to 192393 to match the event ID.
    Data/Events/Farm 992559/t 600 1130/n clothFound/o Emily/w sunny
    992559/t 600 1130/n clothFound/O Emily/w sunny
    Merged into a single 992559/Time 600 1130/LocalMail clothFound/Weather sunny event.
    Data/Events/QiNutRoom 10040609 Event key changed to 10040609/ per the precondition change.
    Data/Events/SamHouse 94/e 93/k 95/t 1800 1950/i 136/y 1
    94/e 93/k 95/t 1800 1950/i 136/y 2
    Merged into a single 95/SawEvent 93/!SawEvent 94/Time 1800 1950/HasItem 136 event.
    Data/Events/Town 611173/Hn pamHouseUpgrade/o Penny Merged into the existing 611173/Hn pamHouseUpgrade event.

For events that didn't previously have an event ID, their new IDs will be added to the player's seen-events list automatically if needed when the save is loaded.

Other event changes

  • Moved all vanilla events' on-skip behavior into their event scripts (except the pet adoption logic).

Fish pond asset

  • Fixed the translation key suffix from a custom fish_talk_* context tag being capitalized differently from the vanilla suffixes. (For example, fish_talk_some_example would incorrectly result in a someExample suffix instead of SomeExample.)

Fish tank decorations

Decorations in fish tanks have been de-hardcoded into a new Data/AquariumDecorations asset.

The data asset consists of a string → model lookup, where...

  • The key is the qualified item ID of the item which can be added to the fish tank.
  • The value is a model with the fields listed below.
field effect
Texture The asset name for the texture to draw, or null for the default LooseSprites/AquariumFish asset. (Custom decorations should use a custom texture to avoid conflicts.)
SpritePosition The pixel position(s) in the Texture for the sprite to draw. If you specify multiple positions, one is randomly chosen for each sprite.
SpriteCount (Optional) The number of sprites to add to the fish tank.

For example, seaweed sets this to 4; so adding a seaweed to a fish tank will add four randomized seaweed decoration sprites to the tank.

If an item has an entry in the asset, players can add one instance of the item to a fish tank to add its decoration.

Fish tanks have a limited number of decoration 'slots' available, consisting of three depth layers for each tile width. For example, a 2-tile-wide fish tank can display 6 decoration sprites at once (3 deep × 2 wide). Each sprite added based on the SpriteCount field fills a slot (e.g. seaweed uses 4 decoration slots). If the player adds more decorations than can be displayed, the fish tank will fill slots in the order they appear in Data/AquariumDecorations.

Game state query changes

  • Added new game state queries:
    query effect
    COMPLETED_ALL_MONSTER_SLAYER_GOALS Whether all monster eradication goals have been completed.
    IS_DEBRIS_WEATHER
    IS_GREEN_RAINING
    IS_LIGHTNING
    IS_RAINING
    IS_SNOWING
    Whether the weather in the given location sets the related weather field. For example, IS_RAINING is true for the Rain, GreenRain, and Storm weathers.
    IS_BOOKSELLER_DAY [day offset] Whether the bookseller is visiting today, with an optional [day offset] (e.g. 1 for tomorrow).
    IS_TRAVELING_CART_DAY [day offset] Whether the traveling cart is visiting today, with an optional [day offset] (e.g. 1 for tomorrow).
    LOCATION_MINE_DIFFICULTY <location> <min> [max] Whether the given location is in the mines or Skull Cavern, and its difficulty level is between <min> and [max] (default unlimited) inclusively. Difficulty 0 is the default difficulty, and modifiers like the Shrine of Challenge or some special orders each increase it by one.
    LOCATION_MINE_LEVEL <location> <min> [max] Whether the given location is in the mines or Skull Cavern, and its floor level is between <min> and [max] (default unlimited) inclusively. The Skull Cavern implicitly starts at level 121 (e.g. Skull Cavern level 10 is mine level 130).
    PLAYER_HAS_ALL_STARDROPS <player> Whether the specified player(s) have found every stardrop.
    PLAYER_HAS_DEEPEST_MINE_LEVEL <player> [min] [max] Whether the specified player(s) have reached a mine level between [min] (default 1) and [max] (default unlimited) inclusively.
    PLAYER_HAS_PREVIOUS_CONVERSATION_TOPIC <player> <id>+ Whether the specified player(s) have previously had any of the specified conversation topics active. This doesn't include current topics (unless they're a repeat of a previous one).
    PLAYER_QUEST_ACTIVE <player> <id>+
    PLAYER_QUEST_COMPLETE <player> <id>+
    Whether the specified player(s) have any of the specified quest IDs open (PLAYER_QUEST_ACTIVE) or previously completed (PLAYER_QUEST_COMPLETE).
    PLAYER_SHIPPED_ALL_BASIC_ITEMS <player> Whether any one of the specified player(s) have shipped at least one of each basic item whose shipment is tracked by the game.
    PLAYER_SHIPPED_MONOCULTURE <player> [min] [max] Whether any one of the specified player(s) have shipped between [min] (default 300) and [max] (default unlimited) inclusively of any crop for which CountForMonoculture in Data/Crops is true.
    PLAYER_SHIPPED_POLYCULTURE <player> [min] Whether any one of the specified player(s) have shipped at least [min] (default 15) of any crop for which CountForPolyculture in Data/Crops is true.
  • Improved some queries:
    query changes
    PLAYER_HAS_ALL_ACHIEVEMENTS <player> [achievement ID]+ Added optional [achievement ID] field to specify the list of required achievements. If omitted, defaults to all achievements in Data/Achievements (including the platform-only achievements which weren't in the asset before 1.6.16).
    PLAYER_HAS_CAUGHT_FISH <player> [fish item ID]+ Now accepts unqualified item IDs too.
    PLAYER_STAT <player> <stat key> [min value] [max value] The [min value] argument is now optional.
    IS_GREEN_RAIN_DAY [day] The [day] argument has been added. Valid values are today, tomorrow, and a number of days offset from the current day (ex. -1 would be yesterday).

    If not specified, it will default to tomorrow.

Item spawn field changes

  • Added new item spawn fields:
    field effect
    Color (Optional) For item types that support it (e.g. objects and clothes), a tint color to apply to the produced item. Default none.
    IsSpecial (Optional) Whether to mark the produced item as a special permanent item, which can't be destroyed or dropped. Default false.
    ObjectIsQuestItem (Optional) Whether to mark the dropped item as a quest item. This enables special rules like not being able to gift the item, and the item getting auto-recovered when it's lost in some cases. Default false.
    TempData (Optional) Set temporary item info that's not synchronized in multiplayer or written to the save file. This is somewhat specialized, and does nothing if there's no game logic or C# mod logic which reads it. Default none.

    For example, this adds a custom flag:

    "TempData": {
        "SomeExampleKey": "Example Value"
    }
    

    A C# code can then check for the field on the dropped items:

    if (item.TryGetTempData("SomeExampleKey", out object value))
        ...;
    
  • The ObjectColor field is obsolete and replaced by Color. Content packs which set it will still work (since the game will pass the value through to Color automatically).

Map & tile property changes

Map properties
  • Added new map properties:
    action effect
    FarmHouseBed <x> <y> [item ID]
    (valid in farm or farmhouse)
    Sets the initial bed to place when creating the farmhouse or cabin. The arguments are:
    • <x> <y>: the tile position at which to place it.
    • [item ID]: if set, the qualified or unqualified item ID for the bed furniture to place. This must match a furniture item with item type Bed. Defaults to (F)2048 (single bed).

    If omitted, a single bed is placed at position (9, 8).

    @MergeInto <property> <ID> [options] Merge a list of space-delimited values into an existing map property (creating it if needed).

    The parameters in the @MergeInto name are:

    • <property>: the name of the map property to merge the values into.
    • <ID>: a unique string ID for the merge property. This is used to distinguish between merge properties (since each map property key must be unique), and may be used for error reporting.
    • [position]: where to put the new values if the property already exists (Append or Prepend). The default is Append for most properties, or Prepend for Warp. C# mods can set the default for custom properties via the static GameLocation.MergeIntoPrependByDefaultProperties field.

    The property value is a space-delimited list of values to merge into the target property.

    For example, these properties:

    "Warp": "5 5 Town 10 10 5 6 Town 10 11",
    "@MergeInto Warp {{ModId}}/BeachWarp Append": "20 5 Sewer 25 25",
    "@MergeInto Warp {{ModId}}/TownWarp": "15 20 Beach 30 70 16 20 Beach 31 70",
    

    Would be combined into one once the map loads:

    "Warp": "15 20 Beach 30 70 16 20 Beach 31 70 5 5 Town 10 10 5 6 Town 10 11 20 5 Sewer 25 25",
    

    @MergeInto properties are applied in the order in which they were added (e.g. based on patch priority order).

  • Improved map properties:
    action changes
    FarmHouseFlooring
    FarmHouseFurniture
    FarmHouseStarterGift
    FarmHouseStarterSeedsPosition
    FarmHouseWallpaper
    Can now be set on the farmhouse map to override the farm map's equivalent property.
    FarmHouseFurniture Fixed property only allowing numeric item IDs.
    TreatAsOutdoors Fixed footstep sounds not always respecting TreatAsOutdoors for indoor locations.
Tile properties
  • Removed Treasure tile property (unused).

Quest changes

Schedule changes

  • NPCs are longer affected by warps they touch while following their schedule if those warps aren't the ones they intend to use.
  • Added new schedule keys:
    syntax summary
    roommate_<festival ID>_<festival day>
    roommate_<festival ID>
    roommate_<season>_<day of month>
    roommate_<day of week>
    roommateJob
    Equivalent to the marriage schedules, but only apply if the NPC is a roommate.

    If a roommate NPC has both roommate* and marriage* schedules, it'll use a roommate* schedule if any of them apply. If none apply, it'll default to marriage* schedules. You can avoid that by setting the fallback roommate schedule key.

    marriage
    roommate
    A fallback schedule to use if a more specific schedule doesn't apply. If this is omitted and no other schedule applies, the NPC won't have a schedule that day.

Stat changes

  • Added new stats:
    stat key tracks
    Player activity
    CookingRecipesUsed The number of cooking recipes which the player used at least once.
    CookingRecipesNotUsed The number of cooking recipes which the player never used.
    CraftingRecipesUsed The number of crafting recipes which the player used at least once.
    CraftingRecipesNotUsed The number of crafting recipes which the player never used.
    FishTypesCaught The unique fish species caught by the player while fishing.
    FishTypesNotCaught The unique fish species that were never caught by the player while fishing.
    FriendsWith5Hearts The number of NPCs with which the player has 5+ hearts of friendship.
    FriendsWith10Hearts The number of NPCs with which the player has 10+ hearts of friendship.
    World activity
    ArtifactsDonated The number of artifacts donated to the museum by any player.
    ArtifactsNotDonated The number of artifacts missing from the museum.
  • Changed existing stats:
    stat key changes
    AverageBedTime Fixed incorrect time averaging (e.g. the average of 600 + 700 was incorrectly calculated as 650 instead of 630).
    CaveCarrotsFound Removed. This was never fully implemented.
    OtherPreciousGemsFound Fixed stat not updated in later versions.
    WeedsEliminated Fixed stat only incremented when destroying weeds indirectly (e.g. with a bomb), not when cutting them with a tool.

Trigger action changes

  • Added new trigger actions:
    action effect
    CompleteQuest <quest ID> Complete all active quests with this ID in the player's journal.
    ShowPrivateChatMessage <message> [color] Add a message to the chat box which is only visible to the current player. The <message> is the tokenizable string to show, and [color] is the text color.
    AddItemFromQuery <query> Adds a random item from the specified item query.

Tokenizable string changes

  • Improved an existing token:
    token format output
    [SuggestedItem [interval] [sync key] [options]] (For shops only.)
    • The token is now case-insensitive.
    • Added optional arguments, which can be specified in any order:
      argument effect
      @edible <include> Whether food/drink items can be suggested (i.e. objects with an edibility > 0). This can be true (only suggest edible items), false (only suggest non-edible items), or omitted (suggest any).
      @recipe <include> Whether recipes can be suggested (i.e. shop item entries with IsRecipe: true). This can be true (only suggest recipes), false (only suggest non-recipes), or omitted (suggest any).
      @ignoreFiltersIfNeeded If set, the @edible and @recipe arguments will be ignored if they'd result in no item being suggested.

Other translation changes

  • You can now override the relationship status labels (shown in the social and profile menus) for specific NPCs:
    asset original key overridden by
    Strings/StringsFromCSFiles SocialPage_Relationship_Housemate_Female
    SocialPage_Relationship_Housemate_Male
    SocialPage_Relationship_Housemate_<NPC name>
    SocialPage_Relationship_Husband
    SocialPage_Relationship_Wife
    SocialPage_Relationship_Spouse_<NPC name>
    SocialPage_Relationship_Boyfriend
    SocialPage_Relationship_Girlfriend
    SocialPage_Relationship_<NPC name>
    SocialPage_Relationship_ExHusband
    SocialPage_Relationship_ExWife
    SocialPage_Relationship_Ex_<NPC name>
    SocialPage_Relationship_Single_Female
    SocialPage_Relationship_Single_Male
    SocialPage_Relationship_Single_<NPC name>
    Strings/UI SocialPage_Relationship_MarriedToOtherPlayer_FemaleNpc
    SocialPage_Relationship_MarriedToOtherPlayer_MaleNpc
    SocialPage_Relationship_MarriedToOtherPlayer_<NPC name>

Other changes

  • Playing an empty audio ID (null or "") now does nothing instead of crashing. For required audio cue fields, you can also use the new ID silent to do nothing.
  • Custom achievements now benefit from retroactive unlock too if they implement the new UnlockCondition field in Data/Achievements.
  • In shop data:
    • Shop dialogues with [SuggestedItem] are now skipped automatically if there's no matching item to suggest.
    • Fixed ActionsOnPurchase not applied if you were already holding an item.
  • For NPCs:
    • Added validation for schedule offset command in end-of-route animations.
    • Fixed NPCs treating a non-existent spritesheet asset as successfully loaded, so they would show an error texture. They now log a warning and continue to the next texture.
    • Fixed NPC FlowerDanceCanDance field ignored for non-datable NPCs with no dialogue.
    • Fixed RejectItem_* dialogue disabling the NPC's normal dialogue after it's shown.
  • De-hardcoded the giant Qi fruit mystery box drop and Easter egg into Data/GiantCrops, and replaced the QiChallenge2 special order check with a DROP_QI_BEANS special order rule check.
  • The value of a (O)GoldCoin item (e.g. dropped by a pot of gold) is now fully determined by its stack size, which is no longer limited to 999. This lets you give arbitrary gold rewards via item debris.
  • The game now accepts a --saves-path some/saves/path/override command line argument, which will change where save files are checked for.
  • Fixed crash when loading a save with missing building interiors.
  • Fixed farm animals in non-instanced building interiors (like the farmhouse) getting deleted on day start.
  • Fixed fruit trees' falling leaves not applying the tree's cosmetic season.
  • Fixed issue where a building placed inside a decoratable location would cause the flooring under it to not change when you put down a different flooring.

Changes for C# mod authors

Instance statics no longer affect mod assemblies

In multiplayer, split-screen mode works by swapping the values of static fields for each screen (called instanced statics). In previous versions, Stardew Valley would scan all loaded assemblies for static fields marked with [InstancedStatic] attributes except a few ignored assemblies like MonoGame.

In Stardew Valley 1.6.16, the game now only does this for the main game assembly to improve performance. If a mod was using [InstancedStatic], it should use SMAPI's built-in per-screen data utility instead.

Content manager changes

The base game's 'content manager' API changed in Stardew Valley 1.6.16. This mainly affects LanguageCode, Game1.content, and other content manager fields. This does not affect mods which only use SMAPI's content API.

In particular:

  • The game now uses IContentManager instead of LocalizedContentManager in most places. That includes fields like Game1.content, methods like Game1.content.CreateTemporary(), etc. The new interface also includes full IntelliSense docs.
  • Moved the content manager types into a new StardewValley.ContentManagement namespace, and removed type nesting.
  • Made all methods non-static.
  • Adjusted naming for clarity.
  • Removed unused code.

See other breaking API changes for specific changes.

Inventory add-item overhaul

1.6.16 overhauls how items are added to chest & player inventories, which fixes a wide variety of bugs when an item can't be fully collected due to a full or nearly-full inventory. The core change is a set of new methods which allow explicitly handling partial success when adding an item.

For example, the new methods let you avoid duplicate rewards when partly collecting the item stack:

if (Game1.player.TryAddToInventory(this.heldItem).FullyAdded)
{
    this.heldItem = null;
    Game1.player.gainExperience(Farmer.farmingSkill, 20); // grant XP once when the stack is fully collected
}

Or in cases where a partial item stack can't be left behind (like animal harvesting), you can handle any remainder:

AddToInventoryResult result = Game1.player.TryAddToInventory(producedItem);
if (!result.FullyAdded)
   Game1.player.DropItemAtFeet(result.Remainder);

Which you can also simplify using the convenience CollectOr* methods:

Game1.player.CollectOrDrop(producedItem);

This removes the Farmer.addItemToInventoryBool method, but otherwise mods should be unaffected. However, mods should consider using the newer methods to handle partial success where needed.

Current-location tracking more consistent

The game tracks the current location using two properties: Game1.currentLocation and Game1.player.currentLocation. These were often used interchangeably (even in base-game code), but they're not always equivalent.

Stardew Valley 1.6.16 formalizes the distinction and applies it more consistently:

  • Game1.currentLocation is the location being viewed by the local player (i.e. the "camera location"), which doesn't necessarily contain the player.
  • Game1.player.currentLocation is the location which contains the local player.

For example, let's say the player is at Robin's shop placing a building on the farm; in that case Game1.currentLocation.Name is the location being viewed (i.e. Farm) while Game1.player.currentLocation.Name is the location which contains the player (i.e. ScienceHouse).

This changes the behavior in some cases which affect mods. For example, trigger actions with the LocationChanged trigger now see the new location as expected, and are no longer triggered when the camera shows a different location without moving the player.

New system for spawning synced TAS in a more network-bandwidth-friendly way

Spawning many TemporaryAnimatedSprites at once can strain network connections due to all the fields on a TAS. There is now a new system to allow spawning predefined sets of temporary animated sprites in a much more bandwidth friendly.

In a similar manner to custom tile actions, you can call the static GameLocation.RegisterBulkSpriteType function, with an ID and an Action<GameLocation, SpawnBulkSpritesNetEventArgs>:

field use maximum element count
Id The ID of the bulk sprite callback that was invoked. n/a
FloatArgs (Optional) An array of floats that can be used in the resulting callback. 31
StringArgs (Optional) An array of strings that can be used in the resulting callback. 7

To trigger one of these events for everyone, call `.Fire()` on the net event field. Any callbacks will only be triggered if the currently visible location is the one they happen on. Otherwise, they are skipped.

GameLocation.RegisterBulkSpriteType("TellPeopleAnImportantMessage", (location, args) =>
{
    if ( args.FloatArgs.Length != 3 || args.StringArgs.Length != 1 )
        return;
    Vector2 pos = new Vector2( args.FloatArgs[0], args.FloatArsg[1] );
    int times = (int) args.FloatArgs[2];
    string veryImportantMessage = args.StringArgs[0];
    
    // Typically you would just use `location.playSound` once on the original player's game for this, but for demonstration purposes we are using `location.localSound` instead
    location.localSound( "cat", pos );
    
    for ( int i = 0; i < times; ++i )
    {
        Game1.log.Info( veryImportantMessage );
    }
});
GameLocation location = Game1.currentLocation;

location.spawnBulkSprites.Fire(new GameLocation.SpawnBulkSpritesNetEventArgs(
    "TellPeopleAnImportantMessage",
    floats: new float[] { pos.X, pos.Y, 3 },
    strings: new string[] { "cats are amazing" }
));

Data model attributes

Stardew Valley 1.6.16 adds attributes to its content data models which describe what each field contains.

For example:

[DataField(FieldType.AudioCue)]
public string BarkSound;

The available attributes are:

attribute usage
[DataField] The attribute applied to most fields, which describes the data type.

Its FieldType property describes the data type, which can be any of...

field type meaning
AssetName A content asset name (without file extension).
AudioCue An Audio|audio cue ID.
Chance A percentage probability expressed as a number between 0 (never) and 1 (always).
Color A color in string format.
ContextTag A context tag or list thereof.
ContextTagQuery A context tag query or list thereof.
CustomFields A dictionary of custom fields intended for mod use, which aren't synchronized or persisted.
Direction A direction. This can be a standard name (up, left, right, or down) or a matching numeric constant.
GameStateQuery A game state query which indicates dynamic conditions.
ModData A dictionary of custom data about an instance, which are persisted in the created entities and synchronized in multiplayer. This should typically be omitted by the game.
TokenizableString A tokenizable string.
TriggerAction A trigger action or list thereof.

Its optional PlaceholderValues property indicates special values that are replaced by the game (e.g. MOD_FARM in a world map texture field).

[AssetNameField] An extension of [DataField] applied to asset name fields, which adds two properties:
property usage
AssetType The type of asset referenced by the field (one of Data, BitMapFont, Map, or Texture).
PathFormat (Optional) The asset name format (where {0} is the field value), if the field value isn't used as-is. For example, building indoor map fields set this to Maps/{0} (since the Maps/ prefix is added automatically).
[StrictlyOrderedWithoutId] A specialized attribute applied to list fields which contain an ordered list of non-unique models. For example, this is used for pet animation frames. This is very rarely used.

Item changes

  • Added IItemDataDefinition.GetContextTags(itemData) method, so custom item data definitions can add context tags from their data if applicable.
  • Fixed item.CopyFieldsFrom(other) always setting the stack size for the copy to 1.
  • Fixed object.IsBreakableStone()⁩ returning false for calico egg stones in the skull cavern.

New utility types

AssetNameUtility

The new AssetNameUtility class has methods for working with asset names:

method usage
Normalize A low-level method which normalizes path separators in an asset name. For example:
string assetName = AssetNameUtility.Normalize("Characters/\\/Abigail"); // produces "Characters/Abigail"

Consider using SMAPI's PathUtilities.NormalizeAssetName instead, which is more thorough.

TryParseTranslationKey Parses a translation key into its component parts. For example:
if (AssetNameUtility.TryParseTranslationKey("Strings/UI:Confirm", out string assetName, out string fieldKey, out string error))
   ...;  // assetName: Strings/UI, fieldKey: Confirm, error: null

This doesn't check whether the asset or key exists; see Game1.content.IsValidTranslationKey to do that.

EventValidator

Overview
The new EventValidator class analyses event scripts to detect issues like...
  • command names which don't match a registered command or alias;
  • command arguments which don't match those expected by the command;
  • and custom rule violations based on the EventValidator.CommandValidators field (used for commands like goto).
This is mainly meant to implement unit tests for events. For example, to validate all events in a data asset:
string assetName = "Data/Events/Farm";
var events = Game1.content.Load<Dictionary<string, string>>(assetName);

var validator = new EventValidator();
foreach ((string key, string script) in events)
{
    foreach (var issue in validator.Validator(assetName, key, script))
        Assert.Fail($"Validation failed for event '{key}' > command '{issue.CommandText}': {issue.SuggestedError}.");
}
Command argument validation
Argument validation is enabled if the command's handler method has an EventArguments attribute, which defines the argument pattern using a special syntax. Each command can list multiple patterns, and it'll be considered valid if any of them matches. If the pattern is an empty string, the validator will ensure no arguments are provided.
For example, the default showFrame command is defined like this:
[EventArguments("int", "actor int bool?")]
public static void ShowFrame(Event @event, string[] args, EventContext context)
An argument pattern consists of space-delimited tokens, where each token defines the format for an argument. For example, actor int bool? has three tokens representing three arguments: an actor name, a positive integer, and an optional boolean.
These are the tokens recognized by the validator:
token meaning
generic argument types
bool A boolean value (true or false).
float A positive number with optional decimal point (like 5 or 0.5).
-float A number with optional decimal point and optional negative sign (like 5, -5, or -0.5).
int A positive integer (like 5).
-int An integer with optional negative sign (like 5 or -5).
string A quoted sequence of arbitrary text like "some words here". If the argument has no quotes, this is equivalent to the word token.
word A simple sequence of letters, numbers, periods, and/or underscores (usually an ID or similar value). While the command will accept quotes, they're redundant and will be rejected by the validator.
remainder One or more arguments of any type.
specific string formats
actor An actor name in the event format (like Abigail or Kent?).
assetName An asset name like Data/Achievements.
direction A direction which can be specified as either a number (like 0) or name (like up).
goToLabel An event label (see the goto and label event commands). This is equivalent to word, but is used by EventValidator to validate label references.
itemId An item ID which can be qualified or unqualified (like (O)MossySoup or MossySoup).
translationKey A translation key like Strings/Locations:SomeKey.
custom formats
'...' The literal text or regex pattern to match, like 'continue' or '[\w-]+'.
In addition, you can extend tokens with these indicators:
  • Suffix with + for repeating argument of that type. For example, int+ would allow both 5 and 5 6 7.
  • Suffix with ? for an optional argument which can be omitted. All tokens after this token must also be optional. (You can have optional repeating arguments like int+?.)
  • Infix with | for a parameter which can be one of multiple types. For example int|bool will allow either integer or boolean values.

SourceCodeContentManager

The new SourceCodeContentManager isn't relevant for mod authors except as an example. It implements IContentManager to support reading assets from the original content assets (e.g. in .tide and .xml format) instead of the packed XNB files.

TickCache

The new TickCache class loads a value on-demand and caches it for a given number of game ticks.

It only has two public methods:

member usage
Value Get the cached value, reloading it if needed.
Clear() Reset the cache time, so it'll be reloaded next time Value is requested.

For example, let's say you do this:

private readonly TickCache<int> Cached = new TickCache<int>(GetValue, cacheTicks: 3);

/// <inheritdoc />
public override void Entry(IModHelper helper)
{
    helper.Events.GameLoop.UpdateTicked += (sender, e) => _ = this.Cached.Value;
}

private int GetValue()
{
   this.Monitor.Log($"Fetching value at game tick {Game1.ticks}.");
   return 0;
}

When you run the mod, you would see something like...

Fetching value at game tick 100...
Fetching value at game tick 103...
Fetching value at game tick 106...

The game uses this to cache a few frequently-accessed methods like npc.GetData().

DataCache

The new DataCache<T> class loads a value on-demand and caches it until a counter is incremented.

This is primarily intended for caching values from data assets until that asset is reloaded, and there are static methods on DataCache for doing that with several existing assets.

DataCache<T> instances only have two public methods:

member usage
Value Get the cached value, reloading it if needed.
Clear() Reset the cache time, so it'll be reloaded next time Value is requested.

DataCache has several static helper methods for invalidating based on certain vanilla assets. These take a Func<T>, which will be called to get the appropriate value whenever the cache needs a new value. The current helper methods are:

member usage
FarmAnimalData Cache is reset when Data/FarmAnimals is reloaded.
CharacterData Cache is reset when Data/Characters is reloaded.
FenceData Cache is reset when Data/Fences is reloaded.
MachineData Cache is reset when Data/Machines is reloaded.
ItemRegistry Unlike the others, these do not reset when a specific asset is reloaded. Instead, they reset when whenever the ItemRegistry cache is rebuilt (which SMAPI triggers when any item data asset is reloaded).

For example, let's say you do this:

private readonly DataCache<int> Cached = DataCache.CharacterData(GetValue);

/// <inheritdoc />
public override void Entry(IModHelper helper)
{
    helper.Events.Input.TimeChanged += (sender, e) => if (e.NewTime % 100 == 0) helper.GameContent.InvalidateCache("Data/Characters");
    helper.Events.GameLoop.UpdateTicked += (sender, e) => _ = this.Cached.Value;
}

private int GetValue()
{
   this.Monitor.Log($"Fetching some character data at {Game1.timeOfDay}");
   return 0;
}

When you run the mod, you would see something like this (assuming no other mods are invalidating Data/Characters)...

Fetching some character data at 600...
Fetching some character data at 700...
Fetching some character data at 800...

The game uses this to cache a few frequently-accessed methods like npc.GetData().

Utility fields & methods

  • 1.6.16 adds some new utility methods and fields. For example:
    type member usage
    Character DropItemAtFeet(…) Place a floating item next to the character (e.g. monster, NPC, player, etc). This includes options to set the direction, max stack size, and whether to play the 'item dropped' sound.

    For example, this places a pufferfish in front of the player:

    Item pufferfish = ItemRegistry.Create("(O)128");
    Game1.player.DropItemAtFeet(pufferfish);
    

    This causes 100 pufferfish to 'explode' into individual stacks in random directions around a monster and play the 'item dropped' sound (once):

    Item pufferfish = ItemRegistry.Create("(O)128", 100);
    monster.DropItemAtFeet(pufferfish, stackSize: 1, playSound: true);
    
    speechBubble A unified field which handles showing a speech bubble above the player's head. This can be set via showTextAboveHead(…), clearTextAboveHead(), or the textAboveHead event command.
    Chest TryAddItem(…) Merge an item stack into the chest if possible, and return a result which describes how much of the item as added.

    See the equivalent Farmer.TryAddToInventory(…) below for examples.

    FarmAnimal CanPlayersInteract() Get whether players can interact with the animal (e.g. pet or milk them). By default, ephemeral animals are non-interactable. Mods can patch this method to change the behavior for specific animals.
    Farmer TryAddToInventory(…) Merge an item stack into the player's inventory if possible, and return a result which describes how much of the item as added.

    The result fields are:

    field usage
    TotalAdded The stack count which was added to the inventory.
    TotalRemaining The stack count which couldn't be added to the inventory.
    Remainder A stack for the items which couldn't be added to the inventory, or null if it was fully added.

    This is always a reference to the original input item if there's any remainder.

    AnyAdded Whether any items were added to the inventory.
    FullyAdded Whether the item was fully added to the inventory.

    This allows handling partial failures in a more intuitive way. For example:

    AddToInventoryResult result = Game1.player.TryAddToInventory(this.heldItem);
    this.heldItem = result.Remainder;
    
    if (result.FullyAdded)
        Game1.player.gainExperience(Farmer.farmingSkill, 20); // grant XP once when the stack is fully collected
    
    CollectOrDrop(…) Merge an item stack into the player's inventory, and drop any remainder that doesn't fit at the player's feet. If the player isn't in a stable location (e.g. they're warping or watching an event), the item will be dropped when they resume control.

    This replaces the former Utility.CollectOrDrop(…), with added support for use in non-stable locations.

    CollectOrLostAndFound(Item item) Merge an item stack into the player's inventory, and add any remainder to the lost & found.
    FarmHouse GetSpouseRoomRelativeTile(…) Get a tile coordinate relative to the spouse room bounds. For example, the frog terrarium in Sebastian's spouse room is at farmHouse.GetSpouseRoomRelativeTile(1, 6).
    Forest ShouldTravelingMerchantVisit(…) Get whether the traveling cart should visit on the given date.
    FruitTree DropAllFruit() Drops all fruit onto the ground (as if the player shook the tree).
    Object IsDigSpot() Get whether the object is an artifact spot or seed spot which can be dug up with a hoe (or a custom modded item with similar behavior).
    PassiveFestivalData CoversDate(…) Get whether the festival is active on the given date.
    GetFestivalLocations() Get the locations in which the passive festival happens (based on the InLocations or MapReplacements fields in Data/PassiveFestivals).
    TryGetLocationReplacement(…) Get the new location to load instead of a normal one when the passive festival is active. For example, the Night Market replaces Beach with BeachNightMarket.
    TextBox FilterText A callback raised when the text changes, but before it's saved. It receives the textbox and new text, and returns the filtered text to save.
    OnTextChanged An event raised when the text in the textbox changes (after FilterText is applied). It receives the textbox, the previous text, and the new text.
    Town ShouldBooksellerVisit(…) Get whether the bookseller should visit on the given date.
    TriggerActionManager TryRunActions(…) Run a list of actions with the game's default error logging.
    Utility TryGetPassiveFestivalDataForDayHere(…) Get the passive festival which occurs on a given date within the given location, if any. This is equivalent to Utility.TryGetPassiveFestivalDataForDay(…), but also checks the given location against the passive festival's InLocation or MapReplacements field.
  • And improves some existing methods:
    type member usage
    Item getOne(…)
    • Now copies held and inner items too.
    • Added an optional copyStackSize argument (default false).

Nullable reference types

Stardew Valley 1.6.16 adds nullable reference types to many of its generic utilities (like ArgUtility), core systems (like ItemRegistry and GameStateQuery), extensions, and various methods.

For example, if you do this in modern mod code:

ArgUtility.TryGet(args, 0, out string? argValue, out string? error);

if (argValue.Length > 0)
   ...;

You'll now see a build warning like "CS8602: Dereference of a possibly null reference" because argValue may be null there.

Changing the code to this would fix the warning:

if (ArgUtility.TryGet(args, 0, out string? argValue, out string? error))
{
    if (argValue.Length > 0)
       ...;
}

Other breaking API changes

(This section is meant as a quick reference if you have build errors; there's no need to read through it otherwise.)

Removed types

These types were removed in 1.6.16:

type migration
Events.DiaryEvent Removed (unused).
Lantern Removed (broken tool).
ObjToStr Removed (unused in release builds).
Raft Removed (broken tool).

Readonly structs

These structs became readonly structs in 1.6.16, which makes them much more efficient (e.g. they're no longer defensively copied on every access).

The effect on mods depends on the struct:

  • For structs whose fields were already readonly, this has no effect on mod code (besides making it more efficient).
  • For structs whose fields became readonly in 1.6.16, mod code which sets fields directly will need to use the constructor instead. These are mentioned in the breaking API changes column below.
type breaking API changes
AnimationFrame
BundleIngredientDescription Some fields (preservesId and completed) changed to readonly.
ButtonCollection none
FarmerPair Fields changed to readonly.
Flooring.Neighbor
Flooring.NeighborLoc
none
HoeDirt.Neighbor
HoeDirt.NeighborLoc
none
InteriorDoorDictionary.DoorCollection none
NetDictionary.KeysCollection
NetDictionary.PairsCollection
NetDictionary.ValuesCollection
none
OutgoingMessage Fields changed to readonly.
SerializableDictionary.ChangeArgs none
StaticDelegateBuilder.CachedDelegate none
WaterTiles.WaterTileData Fields changed to readonly.

Renamed or moved types

These types were renamed or moved in 1.6.16:

type migration
LocalizedContentManager Moved from the StardewValley namespace into StardewValley.ContentManagement. See content manager changes.
LocalizedContentManager.LanguageCode
LocalizedContentManager.LanguageChangedHandler
  • Moved from the StardewValley namespace into StardewValley.ContentManagement.
  • Moved out of the nested type (e.g. change LocalizedContentManager.LanguageCode to just LanguageCode in your mod code).

See content manager changes.

Other API changes

These class members changed in 1.6.16:

type member migration
AnimationFrame AddFrameAction(…)
AddFrameEndAction(…)
Removed per readonly structs. To add multiple frame actions, pass them into the constructor instead.

For example, if you previously had code like this:

var frame = new FarmerSprite.AnimationFrame(…);
frame.AddFrameEndAction(this.PerformAnimationSound);
frame.AddFrameEndAction(this.OnAnimationEnded);

You can pass the combined actions into the constructor instead:

var frame = new FarmerSprite.AnimationFrame(…, this.PerformAnimationSound + this.OnAnimationEnded);
ArgUtility TryGetOptionalRemainder(…) Removed; use ArgUtility.GetRemainder(…) instead. The methods are equivalent, since TryGetOptionalRemainder was guaranteed to return true.
Boots price Removed. This was never used, since boots prices are calculated dynamically.
Buff goblinsCurse
slimed
evilEye
tipsy
fear
frozen
warriorEnergy
yobaBlessing
adrenalineRush
avoidMonsters
full
quenched
spawnMonsters
nauseous
darkness
weakness
squidInkRavioli
Replaced by BuffIds constants:
  • Buff.avoidMonsters → BuffIds.OilOfGarlic;
  • Buff.evilEye → BuffIds.Jinxed;
  • Buff.goblinsCurse → BuffIds.Burnt;
  • Buff.spawnMonsters → BuffIds.MonsterMusk;
  • Buff.nauseous → BuffIds.Nauseated;
  • and the others have equivalent names (e.g. Buff.slimed → BuffIds.Slimed).
fullnessLength
quenchedLength
Removed. Their lengths are set in Data/Buffs instead.
BuffManager Apply(…) Split into Apply(string id) + ApplyLocal(Buff buff), to clarify that applying a custom buff model (instead of a buff ID) won't synchronize if it's not the local player.
Bush draw(SpriteBatch batch, int yDrawOffset) Removed. Set the drawOffset field and then call draw(SpriteBatch) instead.
yDrawOffset Replaced by drawOffset, which is now public and a Point.
FarmAnimal buildingTypeILiveIn Removed. Use the AnimalData.Value?.House field instead.
Farmer addItemToInventoryBool(…) Removed. The method's return value was often misunderstood, which led to common bugs in both vanilla and mod code.

You can convert code directly to the new TryAddToInventory method added in 1.6.16. For example:

- if (Game1.player.addItemToInventoryBool(this.heldItem))
+ if (Game1.player.TryAddToInventory(this.heldItem).AnyAdded)
  {
      this.heldItem = null;
      Game1.player.gainExperience(Farmer.farmingSkill, 20);
  }

However, note that addItemToInventoryBool returned whether any of the item stack was added to the inventory (even if it wasn't fully added). Consider whether updated code needs to handle partial success. For example:

var result = Game1.player.TryAddToInventory(item);
this.heldItem = result.Remainder;

if (result.FullyAdded)
    Game1.player.gainExperience(Farmer.farmingSkill, 20); // grant XP once when the stack is fully collected
applyBuff(Buff) Renamed to applyLocalBuff, to clarify that applying a custom buff model (instead of a buff ID) won't synchronize if it's not the local player.
dropItem(…) Replaced by DropItemAtFeet(…).
nextEventcommandAfterEmote Removed; see removed manual event pause management.
Forest ShouldTravelingMerchantVisitToday() Replaced by the static ShouldTravelingMerchantVisit method:
bool shouldVisitToday = Forest.ShouldTravelingMerchantVisit(Game1.Date);
FishingRod lastCatchWasJunk Renamed to lastCatchSkippedMinigame to more accurately convey what it does.
Furniture rotations Removed. You can read it from the data instead:
string[] data = furniture.getData();
int rawRotations = ArgUtility.GetInt(data, 4);
Game1 createMultipleItemDebris Added an int stackSize = 1 argument, which sets the desired size of each dropped item stack. For example, dropping a stack of 102 with a stack size of 25 will produce 4 debris × 25 and 1 debris × 2.
IKeyboardSubscriber RecieveCommandInput(char command)
RecieveCommandInput(char command)
Added new parameter (KeyboardModifier modifiers).
string ClipboardCopy()
string ClipboardCut()
void SelectAll()
Added.
ItemRegistry Create(…) Split into two methods: Create (returns an Error Item if the item doesn't exist) and CreateOrNull (returns null if an item doesn't exist).

To migrate existing code:

  • If you set allowNull: false or omitted it, use Create.
  • If you set allowNull: true, use CreateOrNull.
LocalizedContentManager CurrentLanguageCode
CurrentLanguageLatin
CurrentLanguageString
CurrentModLanguage
GetDefaultLanguageCode()
OnLanguageChange
SetModLanguage(…)
These are no longer static, so they need to be called through an instance like Game1.content. For example, change LocalizedContentManager.GetDefaultLanguageCode() in mod code to Game1.content.GetDefaultLanguageCode().

Some of these are also renamed (see the next rows).

CurrentCulture Removed (it was unused).
CurrentLanguageCode Renamed to LanguageCode.
CurrentLanguageLatin Renamed to LanguageUsesLatinFont.
CurrentLanguageString Renamed to LanguageString.
CurrentModLanguage Renamed to LanguageModData.
GetCurrentLanguage() Removed. Use the LanguageCode property instead.
OnLanguageChange Renamed to OnGlobalLanguageChanged.
NPC birthday_Day
birthday_Season
manners
optimism
socialAnxiety
Removed. See the equivalent properties (e.g. Manners) instead.
Birthday_Season
  • Changed from string to the Season enum.
  • Removed setter (now reads the value from the cached NPC data).
Birthday_Day
Manners
Optimism
SocialAnxiety
Removed setter (now reads the value from the cached NPC data).
isDatable Replaced by the CanBeRomanced property, which gets the value from the cached NPC data.
loveInterest Removed. Use the equivalent data field instead:
string? loveInterest = npc.GetData()?.LoveInterest;
textAboveHead
textAboveHeadAlpha
textAboveHeadColor
textAboveHeadPreTimer
textAboveHeadStyle
textAboveHeadTimer
Replaced by npc.speechBubble. To add/remove a speech bubble, see npc.showTextAboveHead(…) and npc.clearTextAboveHead().
textStyle_None
textStyle_Shake
Replaced by SpeechBubble.textStyle_None and SpeechBubble.textStyle_Shake.
NPCDialogueResponse
Response
id
friendshipChange
extraArgument
hotkey
responseText
Fields changed to get-only properties.
responseKey
  • Field changed to get-only property.
  • Previously NPCDialogueResponse stored the NPC's reaction dialogue key in this field. You should now use npcReactionKey for that instead.
SetHotKey(…) Removed. Set the hotkey through the constructor instead.
PetData GetBreedById(…) Removed. To migrate existing code:
  • If you set allowNull: false or omitted it, use the new GetPreferredBreed method.
  • If you set allowNull: true, use petData.Breeds.FirstOrDefault(p => p.Id == breedId).
StartupPreferences levelTenCombat
levelTenFishing
levelTenForaging
levelTenMining
Removed. These were unused.
TrashBear itemBeingEaten
itemWantedIndex
Replaced by eatingItemId and wantedItemId. Note that these contain qualified item IDs, whereas the old fields had unqualified IDs.
Utility CollectOrDrop(…) Replaced by Game1.player.CollectOrDrop(…). See also utility fields & methods for improvements to it.
getLoveInterest(…) Removed. Use the equivalent data field instead:
// from an NPC
string loveInterest = npc.GetData()?.LoveInterest;

// or from an NPC name
if (NPC.TryGetData(name, out var data))
{
    string loveInterest = data.LoveInterest;
}
IsLegacyIdAbove(…)
IsLegacyIdBetween(…)
Removed. No longer used by the base game.
Wallpaper GetSetData() Removed. The equivalent new code is:
var setData = ItemRegistry.GetData(item.QualifiedItemId)?.RawData as ModWallpaperOrFlooring;

Other changes

  • Added event.floorSprites field for temporary animated sprites that should be drawn on the ground (e.g. under NPC shadows).
  • Added GameStateQuery.TryResolveCommandName method to get the actual query name given a case-insensitive name or alias.
  • The game now uses forward slashes in all asset names (like Maps/Town instead of Maps\Town). This shouldn't affect most mods, since SMAPI already converted all asset names to forward slashes.
  • Applying or removing buffs on a remote player will now sync the change to that player. This only works for buffs in Data/Buffs; the other method signatures have been renamed to ApplyLocal* for clarity.
  • Fixed broken sprite when drawing a flooring/wallpaper item based on its parsedItemData.GetSourceRect().
  • Fixed machine auto-load leaving empty slots in chests when taking a secondary ingredient.
  • Fixed issue where placing a storage furniture (e.g. a dresser or fish tank) on a table would discard any items inside it.
  • Fixed the read-book animation not setting Farmer.canMoveNow() as intended.
  • Fixed issues with specific APIs:
    type member changes
    CollisionMask Characters This enum now includes actors in events and festivals.
    Event TryGetEventCommandHandler(…) Fixed commands not being registered if it's called before any other event method.
    Inventory OnSlotChanged Fixed event raised before the new value is visible.
    MarriageDialogueReference GetHashCode() Fixed the same hash sometimes returned for two keys in the same asset.
    NetList OnElementChanged Fixed event raised before the new value is visible.
    NetMutex ReleaseLock() When locked multiple times locally (ex. a successfully acquired callback calling another function which also locks the same NetMutex and both call ReleaseLock() in their acquired callback), fixes the lock being fully released upon the first call, rather than after all local locks are undone.
    MultipleMutexRequest general usage Allows success if a NetMutex is already owned locally, matching the existing NetMutex behavior.

Name translation changes for wiki maintainers

Some in-game item and monster names were retranslated in some languages for clarity or correctness.

This list is mostly provided to help wiki maintainers update pages, so it doesn't include names which only changed capitalization, changed ' (straight apostrophe) to ’ (curly) in French, or aren't visible to vanilla players (like mine rocks).

Objects

Hungarian
item old name new name
Artichoke Dip Articsóka mártás Articsókamártás
Blackberry Cobbler Szeder kosár Szedres kosárka
Bone Mill Csontőrlő Csontdaráló
Chocolate Cake Csokis torta Csokitorta
Cranberry Candy Vörös áfonyás cukorka Vörös áfonyás üdítő
Geode Crusher Geóda zúzó Geódazúzó
Maple Syrup Juharfaszirup Juharszirup
Tea Sapling Tea csemete Teacsemete
Woodcutter's Weekly Favágok hetilapja Favágók hetilapja
Russian
item old name new name
Aged Roe (flavored) Вяленая икра (Альбакор) Вяленая икра альбакора
Вяленая икра (Анчоус) Вяленая икра анчоуса
Вяленая икра (Морской черт) Вяленая икра Морского черта
Вяленая икра (Рыба-капля) Вяленая икра рыбы-капли
Вяленая икра (Голубой дискус) Вяленая икра голубого дискуса
Вяленая икра (Лещ) Вяленая икра леща
Вяленая икра (Сомик) Вяленая икра сомика
Вяленая икра (Карп) Вяленая икра карпа
Вяленая икра (Сом) Вяленая икра сома
Вяленая икра (Голавль) Вяленая икра голавля
Вяленая икра (Гребешок) Вяленая икра гребешка
Вяленая икра (Сердцевидка) Вяленая икра сердцевидки
Вяленая икра (Краб) Вяленая икра краба
Вяленая икра (Рак) Вяленая икра рака
Вяленая икра (Багрянник) Вяленая икра Багрянника
Вяленая икра (Дорада) Вяленая икра дорады
Вяленая икра (Угорь) Вяленая икра угря
Вяленая икра (Камбала) Вяленая икра камбалы
Вяленая икра (Пятнистый криворот) Вяленая икра пятнистого криворота
Вяленая икра (Ледорыб) Вяленая икра Ледорыба
Вяленая икра (Ледорыб-младший) Вяленая икра Ледорыба-младшего
Вяленая икра (Бычок) Вяленая икра бычка
Вяленая икра (Палтус) Вяленая икра палтуса
Вяленая икра (Сельдь) Вяленая икра сельди
Вяленая икра (Ледопип) Вяленая икра ледопипа
Вяленая икра (Большеротый окунь) Вяленая икра большеротого окуня
Вяленая икра (Лавовый угорь) Вяленая икра лавового угря
Вяленая икра (Легенда) Вяленая икра Легенды
Вяленая икра (Легенда II) Вяленая икра Легенды II
Вяленая икра (Змеезуб) Вяленая икра змеезуба
Вяленая икра (Крылатка) Вяленая икра крылатки
Вяленая икра (Омар) Вяленая икра омара
Вяленая икра (Полуночный карп) Вяленая икра полуночного карпа
Вяленая икра (Ночной кальмар) Вяленая икра ночного кальмара
Вяленая икра (Мисс Морской черт) Вяленая икра Мисс Морской черт
Вяленая икра (Мидия) Вяленая икра мидий
Вяленая икра (Карп-мутант) Вяленая икра Карпа-мутанта
Вяленая икра (Осьминог) Вяленая икра осьминога
Вяленая икра (Устрица) Вяленая икра устриц
Вяленая икра (Окунь) Вяленая икра окуня
Вяленая икра (Литорина) Вяленая икра литорин
Вяленая икра (Щука) Вяленая икра щуки
Вяленая икра (Иглобрюх) Вяленая икра иглобрюха
Вяленая икра (Радиоактивный карп) Вяленая икра Радиоактивного карпа
Вяленая икра (Радужная форель) Вяленая икра радужной форели
Вяленая икра (Барабулька) Вяленая икра барабульки
Вяленая икра (Берикс) Вяленая икра берикса
Вяленая икра (Лосось) Вяленая икра лосося
Вяленая икра (Песковник) Вяленая икра песковника
Вяленая икра (Сардина) Вяленая икра сардины
Вяленая икра (Скорпионовый карп) Вяленая икра скорпионового карпа
Вяленая икра (Морской огурец) Вяленая икра морского огурца
Вяленая икра (Морской еж) Вяленая икра морского ежа
Вяленая икра (Шэд) Вяленая икра шэда
Вяленая икра (Креветка) Вяленая икра креветок
Вяленая икра (Слаймджек) Вяленая икра слаймджека
Вяленая икра (Малоротый окунь) Вяленая икра малоротого окуня
Вяленая икра (Улитка) Вяленая икра улиток
Вяленая икра (Малек Багрянника) Вяленая икра Малька Багрянника
Вяленая икра (Жуть-рыба) Вяленая икра жуть-рыбы
Вяленая икра (Кальмар) Вяленая икра кальмара
Вяленая икра (Скат) Вяленая икра ската
Вяленая икра (Рыба-камень) Вяленая икра рыбы-камня
Вяленая икра (Солнечник) Вяленая икра солнечника
Вяленая икра (Чудо-огурец) Вяленая икра чудо-огурца
Вяленая икра (Тигровая форель) Вяленая икра тигровой форели
Вяленая икра (Тиляпия) Вяленая икра тиляпии
Вяленая икра (Тунец) Вяленая икра тунца
Вяленая икра (Лосось пустоты) Вяленая икра лосося пустоты
Вяленая икра (Желтый судак) Вяленая икра желтого судака
Вяленая икра (Лесоплюх) Вяленая икра лесоплюха
Artifact Spot Место для артефакта Клетка с артефактом
Bait Приманка Наживка
Basic Retaining Soil Обычная влагосохраняющая почва Обычный аквагрунт
Deluxe Retaining Soil Влагосохраняющая почва Делюкс Аквагрунт Делюкс
Dried Fruit (flavored) Сушеная морошка Сушеная малина
Goat Milk Бутыль козьего молока Козье молоко
Jelly (flavored) Джем из морошки Малиновый джем
Juice (flavored) Сок сквоша Кабачковый сок
Large Goat Milk Бол. бутыль козьего молока Большое козье молоко
Large Milk Бидон молока Большое молоко
Magic Bait Волшебная приманка Волшебная наживка
Milk Ведерко молока Молоко
Quality Fertilizer Высококачественное удобрение Улучшенное удобрение
Quality Retaining Soil Высококачественная влагосохраняющая почва Улучшенный аквагрунт
Quality Sprinkler Высококачественный спринклер Улучшенный спринклер
Roe (flavored) Икра (Альбакор) Икра альбакора
Икра (Анчоус) Икра анчоуса
Икра (Морской черт) Икра Морского черта
Икра (Рыба-капля) Икра рыбы-капли
Икра (Голубой дискус) Икра голубого дискуса
Икра (Лещ) Икра леща
Икра (Сомик) Икра сомика
Икра (Карп) Икра карпа
Икра (Сом) Икра сома
Икра (Голавль) Икра голавля
Икра (Гребешок) Икра гребешка
Икра (Сердцевидка) Икра сердцевидки
Икра (Краб) Икра краба
Икра (Рак) Икра рака
Икра (Багрянник) Икра Багрянника
Икра (Дорада) Икра дорады
Икра (Угорь) Икра угря
Икра (Камбала) Икра камбалы
Икра (Пятнистый криворот) Икра пятнистого криворота
Икра (Ледорыб) Икра Ледорыба
Икра (Ледорыб-младший) Икра Ледорыба-младшего
Икра (Бычок) Икра бычка
Икра (Палтус) Икра палтуса
Икра (Сельдь) Икра сельди
Икра (Ледопип) Икра ледопипа
Икра (Большеротый окунь) Икра большеротого окуня
Икра (Лавовый угорь) Икра лавового угря
Икра (Легенда) Икра Легенды
Икра (Легенда II) Икра Легенды II
Икра (Змеезуб) Икра змеезуба
Икра (Крылатка) Икра крылатки
Икра (Омар) Икра омара
Икра (Полуночный карп) Икра полуночного карпа
Икра (Ночной кальмар) Икра ночного кальмара
Икра (Мисс Морской черт) Икра Мисс Морской черт
Икра (Мидия) Икра мидий
Икра (Карп-мутант) Икра Карпа-мутанта
Икра (Осьминог) Икра осьминога
Икра (Устрица) Икра устриц
Икра (Окунь) Икра окуня
Икра (Литорина) Икра литорин
Икра (Щука) Икра щуки
Икра (Иглобрюх) Икра иглобрюха
Икра (Радиоактивный карп) Икра Радиоактивного карпа
Икра (Радужная форель) Икра радужной форели
Икра (Барабулька) Икра барабульки
Икра (Берикс) Икра берикса
Икра (Лосось) Икра лосося
Икра (Песковник) Икра песковника
Икра (Сардина) Икра сардины
Икра (Скорпионовый карп) Икра скорпионового карпа
Икра (Морской огурец) Икра морского огурца
Икра (Морской еж) Икра морского ежа
Икра (Шэд) Икра шэда
Икра (Креветка) Икра креветок
Икра (Слаймджек) Икра слаймджека
Икра (Малоротый окунь) Икра малоротого окуня
Икра (Улитка) Икра улиток
Икра (Малек Багрянника) Икра Малька Багрянника
Икра (Жуть-рыба) Икра жуть-рыбы
Икра (Кальмар) Икра кальмара
Икра (Скат) Икра ската
Икра (Рыба-камень) Икра рыбы-камня
Икра (Осетр) Икра осетра
Икра (Солнечник) Икра солнечника
Икра (Чудо-огурец) Икра чудо-огурца
Икра (Тигровая форель) Икра тигровой форели
Икра (Тиляпия) Икра тиляпии
Икра (Тунец) Икра тунца
Икра (Лосось пустоты) Икра лосося пустоты
Икра (Желтый судак) Икра желтого судака
Икра (Лесоплюх) Икра лесоплюха
Salmonberry Морошка Малина
Smoked Fish (flavored) Копченый {1} Копчен. {1}
(This is the default neutral prefix. All vanilla fish are
overridden to use the previous name.)
Summer Squash Seeds Семена сквоша Семена кабачка
Summer Squash Сквош Кабачок
Targeted Bait Наживка: Альбакор Наживка на альбакора
Наживка: Анчоус Наживка на анчоуса
Наживка: Морской черт Наживка на Морского черта
Наживка: Рыба-капля Наживка на рыбу-каплю
Наживка: Голубой дискус Наживка на голубого дискуса
Наживка: Лещ Наживка на леща
Наживка: Сомик Наживка на сомика
Наживка: Карп Наживка на карпа
Наживка: Сом Наживка на сома
Наживка: Голавль Наживка на голавля
Наживка: Гребешок Приманка для гребешков
Наживка: Сердцевидка Приманка для сердцевидок
Наживка: Краб Приманка для крабов
Наживка: Рак Приманка для раков
Наживка: Багрянник Наживка на Багрянника
Наживка: Дорада Наживка на дораду
Наживка: Угорь Наживка на угря
Наживка: Камбала Наживка на камбалу
Наживка: Пятнистый криворот Наживка на пятнистого криворота
Наживка: Ледорыб Наживка на Ледорыба
Наживка: Ледорыб-младший Наживка на Ледорыба-младшего
Наживка: Бычок Наживка на бычка
Наживка: Палтус Наживка на палтуса
Наживка: Сельдь Наживка на сельдь
Наживка: Ледопип Наживка на ледопипа
Наживка: Большеротый окунь Наживка на большеротого окуня
Наживка: Лавовый угорь Наживка на лавового угря
Наживка: Легенда Наживка на Легенду
Наживка: Легенда II Наживка на Легенду II
Наживка: Змеезуб Наживка на змеезуба
Наживка: Крылатка Наживка на крылатку
Наживка: Омар Приманка для омаров
Наживка: Полуночный карп Наживка на полуночного карпа
Наживка: Ночной кальмар Наживка на ночного кальмара
Наживка: Мисс Морской черт Наживка на Мисс Морской черт
Наживка: Мидия Приманка для мидий
Наживка: Карп-мутант Наживка на Карпа-мутанта
Наживка: Осьминог Наживка на осьминога
Наживка: Устрица Приманка для устриц
Наживка: Окунь Наживка на окуня
Наживка: Литорина Приманка для литорин
Наживка: Щука Наживка на щуку
Наживка: Иглобрюх Наживка на иглобрюха
Наживка: Радиоактивный карп Наживка на Радиоактивного карпа
Наживка: Радужная форель Наживка на радужную форель
Наживка: Барабулька Наживка на барабульку
Наживка: Берикс Наживка на берикса
Наживка: Лосось Наживка на лосося
Наживка: Песковник Наживка на песковника
Наживка: Сардина Наживка на сардину
Наживка: Скорпионовый карп Наживка на скорпионового карпа
Наживка: Морской огурец Наживка на морского огурца
Наживка: Шэд Наживка на шэда
Наживка: Креветка Приманка для креветок
Наживка: Слаймджек Наживка на слаймджека
Наживка: Малоротый окунь Наживка на малоротого окуня
Наживка: Улитка Приманка для улиток
Наживка: Малек Багрянника Наживка на Малька Багрянника
Наживка: Жуть-рыба Наживка на жуть-рыбу
Наживка: Кальмар Наживка на кальмара
Наживка: Скат Наживка на ската
Наживка: Рыба-камень Наживка на рыбу-камень
Наживка: Осетр Наживка на осетра
Наживка: Солнечник Наживка на солнечника
Наживка: Чудо-огурец Наживка на чудо-огурца
Наживка: Тигровая форель Наживка на тигровую форель
Наживка: Тиляпия Наживка на тиляпию
Наживка: Тунец Наживка на тунца
Наживка: Лосось пустоты Наживка на лосося пустоты
Наживка: Желтый судак Наживка на желтого судака
Наживка: Лесоплюх Наживка на лесоплюха
Tree Fertilizer Древесное удобрение Удобрение для деревьев
Wine (flavored) Вино из морошки Малиновое вино

Furniture

Hungarian
item old name new name
Artist Bookcase Művészi könyvespolc Művészi könyvszekrény
Birch Double Bed Birs dupla ágy Nyírfa dupla ágy
Birch Lamp End Table Nyírfa lámpás éjjeliszekrény Nyírfa éjjeliszekrény lámpával
China Cabinet Kínai vitrin Porcelános vitrin
Coffee Table Kávésasztal Kávézó asztal
Dark Bookcase Sötét könyvespolc Sötét könyvszekrény
Gray Joja Bookcase Szürke Joja könyvespolc Szürke Joja könyvszekrény
Gray Joja Coffee Table Szürke Joja kávésasztal Szürke Joja kávézó asztal
Joja Bookcase Joja könyvespolc Joja könyvszekrény
Joja Coffee Table Joja kávésasztal Joja kávézó asztal
Junimo Bookcase Junimo könyvespolc Junimo könyvszekrény
Large Wizard Bookcase Nagy varázsló könyvespolc Nagy varázsló könyvszekrény
Luxury Bookcase Luxus könyvespolc Luxus könyvszekrény
Mahogany Lamp End Table Mahagóni lámpás éjjeliszekrény Mahagóni éjjeliszekrény lámpával
Modern Bookcase Modern könyvespolc Modern könyvszekrény
Oak Lamp End Table Tölgyfa lámpás éjjeliszekrény Tölgyfa éjjeliszekrény lámpával
Retro Bookcase Retro könyvespolc Retro könyvszekrény
Short Bookcase Kicsi könyvespolc Kicsi könyvszekrény
Short Wizard Bookcase Alacsony varázsló könyvespolc Alacsony varázsló könyvszekrény
Small Wizard Bookcase Kicsi varázsló könyvespolc Kicsi varázsló könyvszekrény
Spirits Table Italosasztal Italos asztal
Walnut Lamp End Table Diófa lámpás éjjeliszekrény Diófa éjjeliszekrény lámpával
Wizard Bookcase Varázsló könyvespolc Varázsló könyvszekrény
Russian
item old name new name
Corn Plant Кукуруза Драцена
Pierre's Sign Знак Пьера Вывеска Пьера

Hats

French
item old name new name
Good Ol' Cap Veille casquette Vieille casquette
Russian
item old name new name
Blobfish Mask Маска рыбы-пузыря Маска рыбы-капли
Bluebird Mask Маска сиалии Маска синей птицы
Cowgal Hat Шляпа девушки-ковбоя Женская ковбойская шляпа
Deluxe Pirate Hat Элитная пиратская шляпа Роскошная пиратская шляпа
Dinosaur Hat Шляпа-динозавр Шапка динозавра
Official Cap Кепка от униформы Фуражка
Panda Hat Шляпка Панды Шапка панды
Party Hat Шляпа тусовщика Праздничный колпак
Santa Hat Шляпа Санты Шапка Санты
Star Helmet Звездный шлем Шапка со звездами
Sunglasses Солнечные очки Солнцезащитные очки
Tiger Hat Тигриная шляпа Тигриная шапка

Pants

Russian
item old name new name
Dinosaur Pants Динозавровы штаны Динозавровые штаны

Shirts

Hungarian
item old name new name
Goodnight Shirt Jóéjt póló Jó éjt póló
Russian
item old name new name
80's Shirt (female) Майка их 80-х (Ж) Майка из 80-х (Ж)
80's Shirt (male) Майка их 80-х (М) Майка из 80-х (М)

Tools

Hungarian
item old name new name
Advanced Iridium Rod Fejlett irídium horgászbot Profi irídium horgászbot
Milk Pail Tejesvödör Tejes vödör

Weapons

Hungarian
item old name new name
Iridium Needle Irídium tű Irídiumtű
Iridium Scythe Irídium kasza Irídiumkasza
Russian
item old name new name
Abby's Planchette Дощечка Эбби Спиритическая планшетка Эбби
Dark Sword Темный Меч Темный клинок
Dragontooth Club Драконозубья дубинка Дубина из драконьего зуба
Dragontooth Cutlass Драконозубья сабля Сабля из драконьего зуба
Dragontooth Shiv Драконозубья заточка Заточка из драконьего зуба
Dwarf Dagger Кинжал Дварфов Дварфийский кинжал
Dwarf Hammer Молот Дварфов Дварфийский молот
Dwarf Sword Меч Дварфов Дварфийский меч
Insect Head Жучья Голова Жучиная голова
Leah's Whittler Точилка Леи Резец Леи
Seb's Lost Mace Потерянная палица Себа Потерянная булава Себа
Wind Spire Башня Ветров Пика ветров

Monsters

Hungarian
monster old name new name
Truffle Crab Kőrák Szarvasgombarák

XNB impact

Overview

This section provides a summary of the XNB files which changed in Stardew Valley 1.6.16. This doesn't include new files (since they won't impact existing mods), text changes in non-English files, or the switch from \ to / in asset names (since that's backwards compatible).

XNB mods are disproportionately affected, since...

  1. they replace the entire file;
  2. they're loaded through the MonoGame content pipeline which is less tolerant of format changes;
  3. they don't benefit from the compatibility rewrites Content Patcher provides for its content packs.

Content Patcher packs are typically unaffected (and Content Patcher will try to rewrite content packs automatically). However if a content pack replaces an entire asset instead of editing, it's more likely to be affected like an XNB mod.

Changed assets

Compatibility is broadly grouped into four categories:

  • "✘ broken": mods will remove new content or significant changes, or the mod's intended changes will no longer work. Effects may range from display bugs to crashes, depending how the game uses that specific content.
  • "✘ will remove changes": mods will remove minor changes in 1.6.16 (e.g. typo fixes).
  • "✓ mostly unaffected": mods will only be affected if they edit specific entries or fields.
  • Blank: no expected impact for the vast majority of mods.
content asset changes in 1.6.16 compatibility for pre-1.6.16 mods
XNB mods Content Patcher packs
Characters/Dialogue/Abigail
Characters/Dialogue/Alex
Characters/Dialogue/Clint
samp>Characters/Dialogue/Demetrius
Characters/Dialogue/Emily
Characters/Dialogue/Elliott
Characters/Dialogue/Evelyn
Characters/Dialogue/Haley
Characters/Dialogue/Harvey
Characters/Dialogue/Kent
Characters/Dialogue/Leah
Removed or moved event dialogues.
Characters/Dialogue/LeoMainland Added missing AcceptGift_(TR)ParrotEgg dialogue key (copied from Characters/Dialogue/Leo). ✘ will remove changes
Characters/Dialogue/Lewis ✘ will remove changes
Characters/Dialogue/Marnie Fixed a capitalization typo. ✘ will remove changes
Characters/Dialogue/MarriageDialogue Removed some redundant dialogues. ✘ will remove changes
Characters/Dialogue/Maru
Characters/Dialogue/Pam
Characters/Dialogue/Penny
Characters/Dialogue/Pierre
Characters/Dialogue/Robin
Removed or moved event dialogues.
Characters/Dialogue/Sam Merged, removed, or moved event dialogue keys. ✘ broken ✓ mostly unaffected
Characters/Dialogue/Sebastian
Characters/Dialogue/Shane
Removed or moved event dialogues.
Data/Achievements Overhauled data format. ✘ broken ✘ broken
Data/Buildings ✘ broken
Data/Characters ✘ broken
Data/CookingRecipes Changed some recipe keys. ✘ broken ✓ mostly unaffected
Data/Events/*
Data/Events/Festivals/*
Major changes including multilingual events, event labels, event key changes, replacing dialogue commands with event commands, etc. ✘ broken ✓ mostly unaffected
Data/Events/AnimalShop
Data/Events/ArchaeologyHouse
Replaced removeQuest commands with completeQuest. ✘ broken ✓ mostly unaffected
Data/Events/Beach
  • Replaced awardFestivalPrize commands with addItem.
  • Replaced removeQuest commands with completeQuest.
✘ broken ✓ mostly unaffected
Data/Events/Farm
Data/Events/FarmHouse
Replaced awardFestivalPrize commands with addItem. ✘ will remove changes ✓ mostly unaffected
Data/Events/Forest
  • Replaced awardFestivalPrize commands with addItem.
  • Fixed event commands with invalid arguments.
✘ will remove changes ✓ mostly unaffected
Data/Events/HaleyHouse
Data/Events/Hospital
Fixed event commands with invalid arguments. ✘ will remove changes ✓ mostly unaffected
Data/Events/IslandHut Quoted "???" names for consistency.
Data/Events/IslandSouth ✘ broken ✓ mostly unaffected
Data/Events/JoshHouse ✘ broken ✓ mostly unaffected
Data/Events/Mine Replaced awardFestivalPrize commands with addItem. ✘ will remove changes ✓ mostly unaffected
Data/Events/Mountain
  • Replaced awardFestivalPrize commands with addItem.
  • Fixed event commands with invalid arguments.
✘ will remove changes ✓ mostly unaffected
Data/Events/Saloon Fixed event commands with invalid arguments. ✘ will remove changes ✓ mostly unaffected
Data/Events/SamHouse
  • Replaced removeQuest commands with completeQuest.
  • Updated for merged Characters/Dialogue/Sam:Event_band[1|2|3|4] dialogues.
✘ broken ✓ mostly unaffected
Data/Events/Town
  • Replaced awardFestivalPrize commands with addItem.
  • Replaced removeQuest commands with completeQuest.
  • Fixed event commands with invalid arguments.
✘ broken ✓ mostly unaffected
Data/Events/Woods Replaced removeQuest commands with completeQuest. ✘ broken ✓ mostly unaffected
Data/ExtraDialogue ✘ broken ✓ mostly unaffected
Data/FarmAnimals Removed UseFlippedRightForLeft for dinosaur. ✘ broken ✓ mostly unaffected
Data/FishPondData Added new item spawn fields. ✘ broken
Data/FruitTrees ✘ broken
Data/Furniture ✘ broken ✓ mostly unaffected
Data/GarbageCans
Data/GiantCrops
Added new item spawn fields. ✘ broken
Data/HomeRenovations Added new Id fields. ✘ broken
Data/LocationContexts Fixed non-deterministic weather conditions. ✘ will remove fixes ✓ mostly unaffected
Data/Locations
  • Added new item spawn fields.
  • Added FOR_TUTORIAL_CATCH arguments to LOCATION_FISH queries.
  • Changed Legend condition to use new IS_RAINING query to support mods weathers.
  • Fixed some non-unique inner IDs.
✘ broken ✓ mostly unaffected
Data/LostItemsShop Added new field. ✘ broken
Data/Machines Added new item spawn fields and new Id fields. ✘ broken
Data/Movies Added new item spawn fields. ✘ broken
Data/MuseumRewards Added new Id fields. ✘ broken
Data/Objects ✘ broken ✓ mostly unaffected
Data/PassiveFestivals ✘ broken ✓ mostly unaffected
Data/Pets Added new item spawn fields and new Id fields. ✘ broken
Data/Quests Removed unused quests 10 ("Copper Ore") and 131 ("Willy's Challenge").
Data/Shops
  • Added new item spawn fields and new Id fields.
  • Updated for new cooking recipe keys.
  • Fixed Pierre's shop selling duplicate corn/sunflower/wheat seeds when you gave him the missing stocklist.
  • Furniture catalogue's ALL_ITEMS item query entry now additionally excludes items with the exclude_from_furniture_catalogue context tag.
✘ will remove fixes ✓ mostly unaffected
Data/SpecialOrders Added new fields and new Id fields. ✘ broken
Data/Tools ✘ broken
Data/Weapons ✘ broken ✓ mostly unaffected
Data/WildTrees ✘ broken
Data/Weddings
  • Fixed Lewis skipping his matrimonial dialogue at the farmer's wedding.
  • Quoted translation keys for consistency.
✘ will remove changes ✓ mostly unaffected
Strings/1_6_Strings ✘ will remove changes ✓ mostly unaffected
Strings/Events ✘ broken
Strings/Locations ✘ broken ✓ mostly unaffected
Strings/MovieReactions Removed unused translations.
Strings/StringsFromCSFiles
Strings/Tools Removed unused translations.
Strings/UI Merged male/female variants of translation keys. ✘ broken ✓ mostly unaffected

Removed unused assets

Stardew Valley 1.6.16 deletes assets which weren't used by the game. Mods usually aren't affected by this.

  • Maps/Bus(people)
  • Maps/busPeople
  • Maps/Island_Secret

Removed or moved translation keys

These translation keys were moved or removed in 1.6.16. (For changes to the content, see changed assets above.)

asset key changes
Characters/Dialogue/Abigail Event_Tragic_1
Event_Tragic_2
Event_Tragic_3
Event_VideoGame_No
Event_VideoGame_Yes
Removed (unused).
Event_Cave_1
Event_Cave_2
Event_Cave2_1
Event_Cave2_2
Event_Cave_3
Event_Grave1
Event_Grave2
Event_Grave3
Event_Grave4
Event_Rain_1
Event_Rain_2
Event_Rain_3
Moved into Strings/Events and renamed.
Characters/Dialogue/Alex Event_beach1
Event_beach2
Event_parents1
Event_parents2
Event_parents3
Removed (unused).
Event_books1
Event_books2
Event_books3
event_box1
event_box2
event_box3
event_box4
Moved into Strings/Events and renamed.
Characters/Dialogue/Clint event_advice1
event_advice2
Moved into Strings/Events and renamed.
Characters/Dialogue/Demetrius Event_Lab_Rat
Event_Lab_Silence
Event_tomato1
Event_tomato2
Moved into Strings/Events and renamed.
Characters/Dialogue/Elliott event_boat1
event_boat2
event_idea1
event_idea2
event_idea3
event_toast1
event_toast2
event_toast3
event_toast4
Moved into Strings/Events and renamed.
Characters/Dialogue/Emily event_dance3 Removed (unused).
event_dance1
event_dance2
Moved into Strings/Events and renamed.
Characters/Dialogue/Evelyn Event_cookies1
Event_cookies2
Moved into Strings/Events and renamed.
Characters/Dialogue/Haley Event_darkroom4
Event_darkroom5
Event_darkroom6
Event_room1
Event_room2
Event_room3
Removed (unused).
Event_beach1
Event_beach2
Event_clean1
Event_clean2
Event_clean3
Event_darkroom1
Event_darkroom2
Event_darkroom3
Event_jar1
Event_jar2
Moved into Strings/Events and renamed.
Characters/Dialogue/Harvey event_grave1
event_grave2
Removed (unused).
event_aerobics1
event_aerobics2
event_george1
event_george2
event_heart1
event_heart2
event_heart3
Moved into Strings/Events and renamed.
Characters/Dialogue/Kent event_popcorn1
event_popcorn2
event_popcorn3
Moved into Strings/Events and renamed.
Characters/Dialogue/Leah event_parents1
event_parents2
event_parents3
event_parents4
event_parents5
event_sculpt1
event_sculpt2
event_sculpt3
Moved into Strings/Events and renamed.
Characters/Dialogue/Lewis event_secret1
event_secret2
Moved into Strings/Events and renamed.
Characters/Dialogue/MarriageDialogue Indoor_Day_Abigail
Indoor_Day_Krobus
Rainy_Day_Abigail
Rainy_Day_Krobus
Removed (unused duplicates of keys in Characters/Dialogue/MarriageDialogue<npc>).
Characters/Dialogue/Maru Event_Cut1
Event_Cut2
Event_Hospital_1
Event_Hospital_2
Event_Hospital_3
event_robot1
event_robot2
event_robot3
event_robot4
event_robot_explain1
event_robot_explain2
event_robot_explain3
Event_Space1
Event_Space2
Moved into Strings/Events and renamed.
Characters/Dialogue/Pam event_credit1
event_credit2
Moved into Strings/Events and renamed.
Characters/Dialogue/Penny event_family1
event_family2
event_family3
Removed (unused).
event_cook1
event_cook2
event_cook3
event_mail1
event_mail2
event_mail3
event_old1
event_old2
event_old3
event_old4
event_pool1
event_pool2
event_pool3
event_pool4
event_pool5
event_speaker_kids1
event_speaker_kids2
event_speaker_kids3
event_speaker_kids4
event_speaker_kids5
event_speaker_kids6
event_speaker_no
event_speaker_yes
Moved into Strings/Events and renamed.
Characters/Dialogue/Pierre Event_naga1
Event_naga2
Moved into Strings/Events and renamed.
Characters/Dialogue/Robin event_wood1
event_wood2
Moved into Strings/Events and renamed.
Characters/Dialogue/Sam event_room1
event_room2
Thu_3
Removed (unused).
Event_band1
Event_band2
Event_band3
Merged into single translation, moved into Strings/Events, and renamed.
event_snack1
event_snack2
event_snack3
Moved into Strings/Events and renamed.
Characters/Dialogue/Sebastian Event_cave1
Event_cave2
Event_cave3
Event_game1
Event_game2
fall_Fri_bad
fall_Fri_good
Removed (unused).
event_city1
event_city2
event_city3
event_city4
event_garage1
event_garage2
event_garage3
Moved into Strings/Events and renamed.
Characters/Dialogue/Shane event_noLoan1
event_noLoan2
event_noLoan3
event_room1
event_room2
Removed (unused).
event_apologize1
event_apologize2
event_apologize3
event_stadium1
event_stadium2
Moved into Strings/Events and renamed.
Data/ExtraDialogue SkullCavern_100_event
SkullCavern_100_event_honorable
Removed; replaced by the de-hardcoded Data/Events/SkullCave:SkullCavern100 event.
Spouse_MonstersInHouse Removed; replaced by Characters/Dialogue/Default:Spouse_MonstersInHouse.
SummitEvent_closingmessage2
SummitEvent_closingmessage3
SummitEvent_closingmessage4
SummitEvent_closingmessage5
SummitEvent_closingmessage
SummitEvent_Dialogue1_Lewis
SummitEvent_Dialogue1_Morris
SummitEvent_Dialogue1_Spouse
SummitEvent_Dialogue1B_Spouse
SummitEvent_Dialogue2_Lewis
SummitEvent_Dialogue2_Morris
SummitEvent_Dialogue2_Spouse
SummitEvent_Dialogue3_Abigail
SummitEvent_Dialogue3_Alex
SummitEvent_Dialogue3_Elliott
SummitEvent_Dialogue3_Emily
SummitEvent_Dialogue3_Haley
SummitEvent_Dialogue3_Harvey
SummitEvent_Dialogue3_Leah
SummitEvent_Dialogue3_Maru
SummitEvent_Dialogue3_Penny
SummitEvent_Dialogue3_Sam
SummitEvent_Dialogue3_Sebastian
SummitEvent_Dialogue3_Shane
SummitEvent_Intro2_Spouse
SummitEvent_Intro2_Spouse_Gruff
SummitEvent_Intro_Lewis
SummitEvent_Intro_Morris
SummitEvent_Intro_Spouse
SummitEvent_Outro_Lewis
SummitEvent_Outro_Morris
Moved into Strings/Events and renamed.
Strings/1_6_Strings ForestPylonEvent Removed; replaced by the de-hardcoded Data/Events/WizardHouseBasement:ForestPylon event.
Strings/Locations FieldOfficeFinale Removed; replaced by the de-hardcoded Data/Events/IslandFieldOffice:FieldOfficeDone event.
Gourmand_Request_0_Success
Gourmand_Request_1_Success
Gourmand_Request_2_Success
Moved into Strings/Events and renamed.
IslandFieldOffice_Intro_Event Removed; replaced by the de-hardcoded Data/Events/IslandFieldOffice:FieldOfficeIntro event.
IslandHut_Event_ParrotBoyIntro Removed; replaced by the de-hardcoded Data/Events/IslandHut:LeoIntro event.
IslandNorth_Event_SafariManAppear Removed; replaced by the de-hardcoded Data/Events/IslandNorth:ProfSnailIntro event.
IslandSecret_Event_BirdieFinished
alreadyGotNuts
Removed; replaced by the de-hardcoded Data/Events/IslandWest:-666777 event.
IslandSecret_Event_BirdieIntro Removed; replaced by the de-hardcoded Data/Events/IslandWest:-888999 event.
Strings/MovieReactions Penny_seen_dislike_BeforeMovie
Penny_seen_like_BeforeMovie
Penny_seen_love_BeforeMovie
Removed (unused).
Strings/StringsFromCSFiles DiaryEvent.cs.6658
DiaryEvent.cs.6660
DiaryEvent.cs.6664
DiaryEvent.cs.6667
DiaryEvent.cs.6669
DiaryEvent.cs.6670
Event.cs.1257
Event.cs.1258
Event.cs.1259
Event.cs.1260
QuestionEvent.cs.6692
Raft.cs.14204
Raft.cs.14205
Removed (unused).
Event.cs.1736
Event.cs.1738
Removed; replaced by Characters/Dialogue/Default:AskedToDance_*.
NPC.cs.3985 Removed; moved to Characters/Dialogue/Default:SpouseGiftJealous.
NPC.cs.3990 Removed; moved to Characters/Dialogue/Krobus:FirstMeeting.
NPC.cs.4001 Removed; moved to Characters/Dialogue/Default:SpouseStardrop.
NPC.cs.4507
NPC.cs.4508
NPC.cs.4509
NPC.cs.4510
NPC.cs.4511
NPC.cs.4512
NPC.cs.4513
NPC.cs.4514
NPC.cs.4515
NPC.cs.4516
NPC.cs.4517
NPC.cs.4518
NPC.cs.4519
NPC.cs.4522
NPC.cs.4523
Removed; replaced by Characters/Dialogue/Default:TermsOfEndearment_*.
Strings/Tools Lantern_Description
Lantern_Name
Removed (unused).
Strings/UI PondQuery_StatusRequestPending_Rude0_Female
PondQuery_StatusRequestPending_Rude0_Male
PondQuery_StatusRequestPending_Rude1_Female
PondQuery_StatusRequestPending_Rude1_Male
PondQuery_StatusRequestPending_Rude2_Female
PondQuery_StatusRequestPending_Rude2_Male
Merged into new keys without gender suffix (e.g. PondQuery_StatusRequestPending_Rude0).