You are viewing a potentially older version of this package. View all versions.
MidnightMods-RecipeManager-0.11.0 icon

RecipeManager

A very lightweight recipe and piece modification framework

Date uploaded 18 hours ago
Version 0.11.0
Download link MidnightMods-RecipeManager-0.11.0.zip
Downloads 762
Dependency string MidnightMods-RecipeManager-0.11.0

This mod requires the following mods to function

denikson-BepInExPack_Valheim-5.4.2350 icon
denikson-BepInExPack_Valheim

BepInEx pack for Valheim. Preconfigured with the correct entry point for mods and preferred defaults for the community.

Preferred version: 5.4.2350
ValheimModding-Jotunn-2.30.0 icon
ValheimModding-Jotunn

Jötunn (/ˈjɔːtʊn/, 'giant'), the Valheim Library was created with the goal of making the lives of mod developers easier. It enables you to create mods for Valheim using an abstracted API so you can focus on the actual content creation.

Preferred version: 2.30.0
ValheimModding-YamlDotNet-16.3.0 icon
ValheimModding-YamlDotNet

Shared version 16.3.0 of YamlDotNet from Antoine Aubry and contributors, net47 package for use in Valheim mods. Maintained by the ValheimModding team.

Preferred version: 16.3.0

README

RecipeManager

This is a lightweight recipe modification tool. You can define recipes to Add, Modify, Delete etc. It does not run constantly, and it only patches the game for the few settings that need it, while a config uses one of them, see Game patches.

Coming from WackysDB? RM_Import_WackyDB converts its files, see Importing from WackysDatabase.

In Valheim a recipe is something that is crafting at a crafting station, or cooking station etc. For example, to make wood arrows you use a crafting recipe from the workbench. Building pieces (built with the hammer) are not recipes, furnace conversions (1 ore for 1 ingot etc) are not recipes.

Pieces are almost anything that is placed. Everything built with the hammer, plants placed with the cultivator, placable food etc.

Features

  • Add recipes
  • Modify recipes
  • Delete recipes
  • Disable Pieces
  • Enable Pieces
  • Modify Pieces
  • Add pieces by copying one, move pieces between tools and tabs, and change their placement rules, health, containers, fires and stations
  • Add new items by cloning an existing item, with their own name, stats, icon and textures
  • Modify the stats of items that already exist, including vanilla weapons and armor, down to their attacks, durability and upgrade levels
  • Add new status effects and change the ones that exist
  • Dump any prefab's icons and textures to disk so you can repaint them
  • Convert WackysDatabase recipe, item, piece and status effect files into RecipeManager files

Upgrading to 0.11

A Modify now only changes what it sets, for recipes and pieces as it already did for items. Everything it leaves out keeps the value the recipe or piece already has. Two things behave differently because of that:

  • A recipe Modify without craftedAt keeps the recipe's station. It used to become handcrafted, so write craftedAt: none if that is what you want. The same goes for minStationLevel, craftAmount, anyOneResource and the ingredients, which are all kept when left out. A craftedAt naming no station that exists also used to mean handcrafted, it now keeps the station and says so in the log.
  • A piece Modify without requirements keeps the piece's cost. It used to make the piece free, so write requirements: [] for a free piece. Every other piece setting left out is kept as well, where it used to be reset, which could lift a sapling's biome restriction or make a piece deconstructable.

Entries copied out of the PrintAll dumps list every value, so they work the same as before.

Conversions changed too: an Add for an input the station already converts now updates that conversion instead of adding a second one the station would never use. An entry also only changes the station it names, so piece_cookingstation no longer changes piece_cookingstation_iron as well.

Console commands

Each part of the mod has commands to write what is in the game out to a file, and to apply your changes without restarting. They are described in the section they belong to:

  • Recipes: RM_Recipes_PrintAll, RM_Recipes_Reload, RM_Recipes_Unapply
  • Pieces: RM_Pieces_PrintAll, RM_Pieces_Reload
  • Conversions: RM_Conversion_PrintAll, RM_Conversion_Reload
  • Items: RM_Items_PrintAll, RM_Items_Reload, RM_Textures_Dump
  • Status effects: RM_StatusEffects_PrintAll, RM_StatusEffects_Reload
  • WackysDatabase: RM_Import_WackyDB
  • Game patches: RM_Patches

The PrintAll commands write to \BepInEx\config\RecipeManager\. Those files are never loaded, they are there for you to copy entries out of.

The Reload commands only work where the configuration comes from this machine's own files: a solo game or the machine hosting. A client connected to a server always uses the server's configuration.

Commands require enabling the in-game console and running devcommands first. Valheim only treats devcommands as enabled on the instance that hosts the world, so run them in a solo game or on the machine hosting, not from a client connected to someone else's server.

If you are using Thunderstore Mod Manager or R2 Modmanager, you can enabled the console by selecting your valheim profile, going to settings (on the far left), debugging tab, set launch parameters and add --console

It is not recommended to use Vortex mod manager, however using vortex hardlink or copy deployments you can launch from steam using BepinEx with a --console launch parameter. To do so right click on the game in your library, manage, general, at the bottom add --console to the launch options.

Game patches

Almost everything this mod does is data written onto the game's own items, recipes and pieces. A few settings have nothing in the game to write to, and need a small patch instead. Each patch is only applied while a loaded config uses one of its settings, and taken off again when none does. Leave those settings out and the game is not patched at all. A dedicated server never applies them, the game only reads these settings on the players' machines.

Setting Patch
a recipe ingredient's upgradeCosts, in Recipes.yaml or an item's recipe in Items.yaml RecipeUpgradeCosts
a recipe's maxStationLevel, in either file RecipeStationLevelCap
a status effect's maxHealth, maxStamina or maxEitr StatusEffectStatBonus
a piece's minStationLevel PieceStationLevel

RM_Patches lists every patch, whether it is on, and which config entries use it. It works without devcommands.

Config files

Every config file lives in \BepInEx\config\RecipeManager\. Saving, adding or deleting one while the game is running applies it straight away, and the Reload commands do the same on demand. Files in subfolders are not loaded.

Its recommended to use a syntax highlighting yaml editor when modifying recipes to help ensure that your yaml is valid. yamlChecker is a free online linter you can use to validate also.

A file's name decides what it holds, by how it ends (upper or lower case does not matter):

  • Files ending in Recipes.yaml are recipe files, except ObjectDBRecipes.yaml. Forge_Recipes.yaml is loaded, SoupStationStuff.yaml and Recipes.yaml.bak are not.
  • Files ending in Pieces.yaml are piece files, such as CultivatorPieces.yaml.
  • Files ending in Conversions.yaml are conversion files.
  • Files ending in Items.yaml are item files, except ObjectDBItems.yaml. Food_Items.yaml is loaded, Food.yaml is not.
  • Files ending in StatusEffects.yaml are status effect files, except ObjectDBStatusEffects.yaml.

Files of one kind are read in name order. Every entry name has to be unique across all files of its kind: a name used twice keeps its first definition and the log says where the second one is. A file that does not parse is skipped with an error in the log, and the other files still load.

Recipes

Recipes can be manipulated and added through yaml. All of the existing recipes can also be dumped to a file, in the same format to help you find and understand existing recipes.

Recipe modifications are stored at \BepInEx\config\RecipeManager\Recipes.yaml. This file will be generated on the first run if it does not already exist. R2modman or Thunderstore mod manager will also detect this file as an editable config file and it can be edited or opened directly from the "Edit Config" menu, search for Recipes.yaml.

Yaml configuration example
#################################################
# Recipe Manipulation Config
#################################################
recipeModifications:                     # <- This is the top level key, all modifications live under this, it is required.
  DisableWoodArrow:                      # <- This is the modification name, its primarily for you to understand what this modification does SHOULD BE UNIQUE
    action: Disable                      # <- This is the action it should be one of [Disable, Delete, Modify, Add, Enable]
    prefab: ArrowWood                    # <- This is the prefab that the modification will target
  AddNewWoodArrowRecipe:
    action: Add
    prefab: ArrowWood
    recipeName: Recipe_ArrowWood_Cheap   # <- optional. On an Add it names the new recipe, otherwise it picks which recipe to change when an item has several
    craftedAt: piece_workbench           # <- The crafting station's prefab name, its $piece_ name works too. Left out of an Add, empty or 'none' means handcrafted
    minStationLevel: 2                   # <- This is the required crafting station level for discovery AND crafting
    recipe:                              # <- An Add needs a recipe
      anyOneResource: false              # <- This makes the recipe only require one ingrediant, first from the top will be used.
      ingredients:                       # <- Ingrediants in the recipe, is an array
        - prefab: Wood                   # <- Prefab that this ingrediant requires
          craftCost: 2                   # <- The amount of this ingrediant it takes to craft the recipe
          upgradeCost: 0                 # <- The amount of this ingrediant it takes to upgrade the item, per level
        - prefab: Feathers
          craftCost: 2
          upgradeCost: 0
  DeleteTrollHideArmorRecipe:
    action: Delete
    prefab: CapeTrollHide
  CheaperTrollHideChest:
    action: Modify                       # <- A Modify only changes what it sets, everything left out keeps the recipe's current value
    prefab: ArmorTrollLeatherChest
    minStationLevel: 2                   # <- Only the station level changes here, the station and ingredients stay as they are
  TrollHideLegsCost:
    action: Modify
    prefab: ArmorTrollLeatherLegs
    recipe:
      ingredients:                       # <- Listing ingredients replaces them all. Leave the list out to keep them, [] makes the recipe free
        - prefab: TrollHide
          craftCost: 4                   # <- Left out, an ingredient keeps the amount the recipe already had for it
          upgradeCost: 2
        - prefab: Upgrader1Armor         # <- The idol the Forge of Potential takes to upgrade this armor
          craftCost: 1                   # <- For an upgrader resource this is what every upgrade costs
          upgraderResource: true         # <- Only paid at the Forge of Potential, every other station ignores it.
                                         #    Leave the idol out of a Modify and the recipe keeps the one it had.

A Modify changes only what it sets: every field it leaves out, the ingredients included, keeps the recipe's current value. An Add starts from the game's defaults: handcrafted, station level 1, one item per craft. craftedAt and repairAt take a station's prefab name (piece_workbench, forge, piece_cauldron...) or its $piece_ name, and none makes a recipe handcrafted. A station name that matches nothing is reported in the log, and the recipe keeps its station.

Items can always be repaired at the station they are crafted at. repairAt adds a second station that can repair them.

To have an item's upgrades cost something different from crafting it, give an ingredient a craftCost of 0 and an upgradeCost. It is then only paid when upgrading, and an ingredient with an upgradeCost of 0 is only paid when crafting.

The game charges an ingredient's upgradeCost for each level gained, so the second upgrade costs twice the first. For costs that are different at each level, give the ingredient upgradeCosts, with the level reached and what it costs. A level left out costs none of that ingredient, except the Forge of Potential idol, which costs its craftCost as usual. This uses a game patch.

The game also asks for one more station level for each upgrade. maxStationLevel caps that, so an item with more upgrade levels than its station has can still be fully upgraded. It never goes below minStationLevel, and also uses a game patch.

Yaml example
recipeModifications:
  IronSwordUpgrades:
    action: Modify
    prefab: SwordIron
    maxStationLevel: 3                   # <- Upgrading never needs more than a level 3 forge
    recipe:
      ingredients:
        - prefab: Iron
          upgradeCosts:                  # <- Level reached: what it costs
            2: 5
            3: 10
            4: 20
        - prefab: Silver
          craftCost: 0                   # <- Only for the last upgrade
          upgradeCosts:
            4: 5
Optional recipe fields

Left out of a Modify, each of these keeps the value the recipe already had, and an Add starts from the game's defaults. The exception is enabled: left out, Modify and Add switch the recipe on. RM_Recipes_PrintAll writes them out wherever a recipe differs from the defaults, so copying an entry out of the dump keeps them.

    craftAmount: 1                       # <- How many items one craft makes
    repairAt: piece_workbench            # <- A second station that can repair the item
    maxStationLevel: 3                   # <- The highest station level upgrading needs, a game patch
    enabled: false                       # <- Keeps the recipe switched off
    upgradeOnly: true                    # <- Only listed in a station's upgrade tab, never the craft tab. The Deep North gold gear uses this
    listSortWeight: 100                  # <- Position in the crafting list, lower comes first. The game uses 100, fishing bait 500 and up
    qualityResultAmountMultiplier: 3     # <- With anyOneResource, how much each quality level of the ingredient used adds
    recipe:
      noRecipeCost: true                 # <- Free to craft, the ingredients are ignored. The same as ingredients: []
      ingredients:
        - prefab: TrollHide
          upgraderResource: false        # <- true for the Forge of Potential idol, see the example above
          recover: true                  # <- Whether part of this is refunded when the Forge of Potential breaks the item
          anyOneExtraAmount: 1           # <- With anyOneResource, extra items crafted when this is the ingredient used
          upgradeCosts: {2: 5, 3: 10}    # <- What upgrading to each level costs, a game patch

Recipe commands

RM_Recipes_PrintAll - Writes every recipe in the object DB, including your modifications, to ObjectDBRecipes.yaml, each one as a Modify with every value written out. To edit a recipe, copy its entry into Recipes.yaml and delete the lines you do not want to change.

RM_Recipes_Reload - Puts every recipe back the way it was, reads the recipe files again and applies them. The result is sent to connected players.

RM_Recipes_Unapply - Puts every modified recipe back the way it was without reading the files again, which is handy for comparing against the originals. It only changes the instance it is run on, and lasts until the next RM_Recipes_Reload, recipe file change or world load.

Recipe examples

The mod ships with a default example recipe file which will provide you similar explanations to what is listed above. You can find the recipe file after starting up your game with the mod installed in your BepInEx\config\RecipeManager folder.

Add a craftable chain (replace Chain-Manager)

Yaml example
recipeModifications:
  CraftableChainRecipe:
    action: Add
    prefab: Chain
    craftedAt: forge
    minStationLevel: 4
    craftAmount: 1
    recipe:
      anyOneResource: false
      ingredients:
      - prefab: Iron
        craftCost: 2
        upgradeCost: 0

Disable recipes you don't want from vanilla or other mods (disable recipes from Southsil Armors)

Yaml example
recipeModifications:
  DisableNeckHelm:
    action: Disable
    prefab: neckhelm
  DisableNeckChest:
    action: Disable
    prefab: neckchest
  DisableNeckLegs:
    action: Disable
    prefab: necklegs

Increase the bronze yield (replace triple bronze). Only the amount changes, the station and ingredients stay as they are.

Yaml example
recipeModifications:
  Recipe_Bronze:
    action: Modify
    prefab: Bronze
    recipeName: Recipe_Bronze
    craftAmount: 3
  Recipe_Bronze5:
    action: Modify
    prefab: Bronze
    recipeName: Recipe_Bronze5
    craftAmount: 15

Move a recipe from one crafting station to another (Custom mead from Honey+)

Yaml example
recipeModifications:
  custom_item_meadbase_damage:
    action: Modify
    prefab: HoneyMeadBaseDamage
    recipeName: $custom_item_meadbase_damage
    craftedAt: piece_cauldron

Pieces

Piece modifications are stored at \BepInEx\config\RecipeManager\Pieces.yaml. This file will be generated on the first run, with an explanation of the most used fields, if it does not already exist.

A Modify changes only what it sets, every field it leaves out keeps the piece's current value. requirements replaces the whole build cost when it is given, and requirements: [] makes a piece free. A requirement without recover keeps the refund setting the piece already has for that item. requiredToPlaceCraftingStation: none removes the need for a station. pieceCategory takes a build tab, one of the game's or one another mod has added, and any other name makes a tab of that name. onlyInSelectBiome takes one or more biomes separated by commas, and None or All lets the piece be placed anywhere.

Adding a piece

action: Add makes a new piece by copying clonedFrom. The copy keeps the model and every setting of the piece it was copied from, and everything else the entry sets is applied on top. pieceTable picks the tool it is built with (Hammer, Hoe, Cultivator, or a tool another mod adds), and left out it is built with the same tool as the original. Set pieceName, or it shares the original's name. A copy of a crafting station becomes a station of its own, named after the piece, so the recipes and station upgrades meant for it have to name it by its prefab name.

Like items, adding or removing a piece needs a game restart (or a trip back to the main menu). Everything else applies live with RM_Pieces_Reload.

Tools, tabs and placement

pieceTable on a Modify moves a piece to another tool. usage sets the build menu tags the game sorts pieces by (Building, Furniture, Storage and so on, several separated by commas).

minStationLevel asks for an upgraded station: the piece stays unknown until a player has seen the station at that level, and can only be placed next to one. It uses a game patch, and the build menu does not show the level.

The placement rules are all true or false: groundOnly, allowAltGroundPlacement, waterPiece, noInWater, notOnWood, notOnTiltingSurface, inCeilingOnly, notOnFloor, noClipping, clipGround, clipEverything, onlyInTeleportArea, allowedInDeepSnow, requireDeepSnow, vegetationGroundOnly, canRotate, allowRotatedOverlap, canRockJade and noVines. extraPlacementDistance lets a piece be placed further away, and blockingPieces lists pieces that cannot be within blockRadius of it.

An icon at \BepInEx\config\RecipeManager\Textures\<prefab>\icon.png replaces the piece's icon.

Piece parts

Besides how it is built, a piece can be a crafting station, a station upgrade, a container or a fire, and most pieces wear and break. Each of those parts has a block of its own, and a block for a part the piece does not have is skipped with a warning. A change to them reaches pieces already built the next time their area loads. RM_Pieces_PrintAll writes out every part a piece has.

A container made smaller can lose what is stored past its new size the next time it loads.

Yaml example
pieceModifications:
  big_chest:
    action: Add
    prefab: piece_chest_big                # <- The new piece's prefab name, it has to be unique
    clonedFrom: piece_chest_wood
    pieceName: Big chest
    pieceTable: Hammer
    pieceCategory: Storage                 # <- A new tab, named Storage
    minStationLevel: 2                     # <- Needs an upgraded workbench nearby, a game patch
    requirements:
    - prefab: FineWood
      amount: 20
    container:
      width: 8
      height: 4
    wearNTear:
      health: 800
      resistances:                         # <- The damage types left out keep the piece's own
      - type: Fire
        modifier: Resistant
  forge_reach:
    action: Modify
    prefab: forge
    station:
      buildRange: 30                       # <- How far from it pieces that need it can be built
      craftRequiresRoof: false
  bonfire_forever:
    action: Modify
    prefab: bonfire
    fireplace:
      infiniteFuel: true
Every part's fields
    wearNTear:
      health: 400
      materialType: Wood                   # <- Wood, Stone, Iron, HardWood, Marble, Ashstone, Ancient, Ice or Timberwood, decides how much it can carry
      noRoofWear: true                     # <- Spared the wear of standing in the rain
      noSupportWear: true                  # <- Spared the wear of having little support
      supports: true                       # <- Whether other pieces can rest on it
      triggerPrivateArea: true             # <- Whether damaging it alerts a nearby ward
      burnable: true
      minToolTier: 0                       # <- The lowest tool tier that can damage it
      ashDamageImmune: false
      ashDamageResist: false
      snowDamageImmune: false
      resistances: [{type: Fire, modifier: Resistant}]  # <- Only the damage types listed change
    station:
      name: $piece_forge                   # <- What recipes and upgrades know the station by
      discoveryRange: 4                    # <- How close a player has to come to learn it
      buildRange: 20
      extraRangePerLevel: 4                # <- Build range added by each upgrade
      useDistance: 2
      craftRequiresRoof: true
      craftRequiresFire: true
      showBasicRecipes: false              # <- Also lists the recipes that need no station
      canRepair: true
    stationExtension:
      station: piece_workbench             # <- The station it upgrades
      maxStationDistance: 5
      stack: false                         # <- Whether several of it count as several upgrades
      continuousConnection: false
    container:
      width: 5
      height: 2
      checkWard: true                      # <- Whether a ward keeps others out
      autoDestroyIfEmpty: false
    fireplace:
      startFuel: 3
      maxFuel: 10
      secPerFuel: 3                        # <- Seconds one fuel lasts
      infiniteFuel: false
      fuelItem: Wood
      canTurnOff: false
      canRefill: true
      igniteInterval: 0                    # <- Seconds between tries to set fire to what is around it, 0 for never
      igniteChance: 0
      igniteSpread: 4

Piece commands

RM_Pieces_PrintAll - Writes every piece in the game, including your modifications, to AllPiecesDebug.yaml, each one as a Modify with every value written out. Copied unchanged, an entry leaves its piece as it is.

RM_Pieces_Reload - Puts every piece back the way it was, reads the piece files again and applies them. The result is sent to connected players.

Piece examples

Enables all of the holiday building pieces

Yaml example
pieceModifications:
  enable_mistletoe:
    action: Enable
    prefab: piece_mistletoe
  enable_jackoturnip:
    action: Enable
    prefab: piece_jackoturnip
  enable_yuletree:
    action: Enable
    prefab: piece_xmastree
  enable_yulecrown:
    action: Enable
    prefab: piece_xmascrown
  enable_yulegarland:
    action: Enable
    prefab: piece_xmasgarland
  enable_gift1:
    action: Enable
    prefab: piece_gift1
  enable_gift2:
    action: Enable
    prefab: piece_gift2
  enable_maypole:
    action: Enable
    prefab: piece_maypole

Makes the kiln cost 100 stone, but only 1 surtling core

Yaml example
pieceModifications:
  expensive_kiln:
    action: Modify
    prefab: charcoal_kiln
    requirements:
    - prefab: Stone
      amount: 100
    - prefab: SurtlingCore
      amount: 1

Removes the stonecutter as a buildable piece

Yaml example
pieceModifications:
  remove_stonecutter:
    action: Disable
    prefab: piece_stonecutter

Conversions

Conversion modifications are stored at \BepInEx\config\RecipeManager\Conversions.yaml. This file will be generated on the first run if it does not already exist.

Conversion commands

RM_Conversion_PrintAll - Writes the conversions of every smelter type station, fermenter, cooking station and obliterator, including your modifications, to AllConversionsDebug.yaml, in the same format as Conversions.yaml.

RM_Conversion_Reload - Puts every station back the way it was, reads the conversion files again and applies them. The result is sent to connected players.

Conversion examples

Any field left out of a conversion modification keeps the station's own value, conversions included. A few values need care:

  • maxFuel: 0 makes a smelter type station need no fuel at all.
  • fuelPerProduct: 0 means fuel still has to be loaded, but it is never used up.
  • maxOres: 0 makes the station accept no items to convert.
  • Smelter type stations produce at most one item per second, and burn fuelPerProduct / conversionTime fuel each second. A conversionTime below 1 would only burn more fuel per item, so it is raised to 1. A conversionTime of 0 is ignored.
  • amount is for fermenters and cookTime is for cooking stations, smelter type stations always make one item. Left out, a conversion keeps the amount or cook time the station already has for that input, or uses the game's own 4 items and 10 seconds for a new one.
  • overCookedItem sets what a cooking station turns food into when it is left on too long.
  • spawnStack and requiresRoof are for smelter type stations: whether what it makes comes out as one stack, and whether it only works under a roof. requiresFire is for cooking stations, whether it needs a fire under it.

action: Modify sets the station's own values and, when conversions is listed, replaces its conversions with the ones listed. action: Add updates the conversion the station already has for each input listed, or adds one when it has none: a station only ever uses the first conversion for an input, so there is no point having two. action: Remove takes out the conversions for each input listed, or only the ones making toPrefab when it is given.

A modification applies to the station it names and to every copy of it already built, but not to other stations whose names start the same way, so piece_cookingstation leaves piece_cookingstation_iron alone.

Smelter type stations can leave out one side of a conversion:

  • Leave out toPrefab and the item is used up without making anything. This is how the battering ram burns wood.
  • Leave out fromPrefab and the item is made from fuel alone. This is how the frost kiln makes frozen fuel from ice. It only works on a station with maxOres: 0, and only the first conversion without a fromPrefab is ever made.
  • The battering ram has nowhere to load fuel and the frost kiln has nowhere to load items, so keep the ram at maxFuel: 0 and the kiln at maxOres: 0 or they never run.

Fermenters and cooking stations need both sides, except in an Add or Remove for an input the station already converts, where a left out toPrefab keeps or matches whatever it makes.

Makes the charcoal kiln take wood, finewood and corewood

Yaml example
conversionModifications:
  charcoal_kiln:
    action: modify
    prefab: charcoal_kiln
    conversions:
    - fromPrefab: Wood
      toPrefab: Coal
    - fromPrefab: FineWood
      toPrefab: Coal
    - fromPrefab: RoundLog
      toPrefab: Coal
    maxOres: 50
    conversionTime: 3

Makes the blast furnance take all ores, increases its holding size, and changes the time it takes to smelt an item.

Yaml example
conversionModifications:
  blastfurnace:
    prefab: blastfurnace
    action: modify
    conversions:
    - fromPrefab: FlametalOreNew
      toPrefab: FlametalNew
    - fromPrefab: BlackMetalScrap
      toPrefab: BlackMetal
    - fromPrefab: CopperOre
      toPrefab: Copper
    - fromPrefab: IronOre
      toPrefab: Iron
    - fromPrefab: IronScrap
      toPrefab: Iron
    - fromPrefab: BronzeScrap
      toPrefab: Bronze
    - fromPrefab: TinOre
      toPrefab: Tin
    - fromPrefab: SilverOre
      toPrefab: Silver
    - fromPrefab: CopperScrap
      toPrefab: Copper
    maxOres: 20
    maxFuel: 50
    fuelPerProduct: 2
    conversionTime: 15

Makes the fermenter brew very quickly, and makes every mead base produce 10 potions instead of less.

Yaml example
conversionModifications:
  fermenter:
    prefab: fermenter
    action: modify
    conversions:
    - fromPrefab: MeadBaseHealthMinor
      toPrefab: MeadHealthMinor
      amount: 10
    - fromPrefab: MeadBaseHealthMedium
      toPrefab: MeadHealthMedium
      amount: 10
    - fromPrefab: MeadBaseStaminaMinor
      toPrefab: MeadStaminaMinor
      amount: 10
    - fromPrefab: MeadBaseStaminaMedium
      toPrefab: MeadStaminaMedium
      amount: 10
    - fromPrefab: MeadBasePoisonResist
      toPrefab: MeadPoisonResist
      amount: 10
    - fromPrefab: MeadBaseFrostResist
      toPrefab: MeadFrostResist
      amount: 10
    - fromPrefab: BarleyWineBase
      toPrefab: BarleyWine
      amount: 10
    - fromPrefab: MeadBaseTasty
      toPrefab: MeadTasty
      amount: 10
    - fromPrefab: MeadBaseHealthMajor
      toPrefab: MeadHealthMajor
      amount: 10
    - fromPrefab: MeadBaseStaminaLingering
      toPrefab: MeadStaminaLingering
      amount: 10
    - fromPrefab: MeadBaseEitrMinor
      toPrefab: MeadEitrMinor
      amount: 10
    - fromPrefab: MeadBaseEitrLingering
      toPrefab: MeadEitrLingering
      amount: 10
    - fromPrefab: MeadBaseHealthLingering
      toPrefab: MeadHealthLingering
      amount: 10
    - fromPrefab: MeadBaseBzerker
      toPrefab: MeadBzerker
      amount: 10
    - fromPrefab: MeadBaseStrength
      toPrefab: MeadStrength
      amount: 10
    - fromPrefab: MeadBaseHasty
      toPrefab: MeadHasty
      amount: 10
    - fromPrefab: MeadBaseLightFoot
      toPrefab: MeadLightfoot
      amount: 10
    - fromPrefab: MeadBaseSwimmer
      toPrefab: MeadSwimmer
      amount: 10
    - fromPrefab: MeadBaseTamer
      toPrefab: MeadTamer
      amount: 10
    - fromPrefab: MeadBaseBugRepellent
      toPrefab: MeadBugRepellent
      amount: 10
    conversionTime: 10

Makes the cooking station cook faster.

Yaml example
conversionModifications:
  piece_cookingstation:
    action: modify
    prefab: piece_cookingstation
    conversions:
    - fromPrefab: RawMeat
      toPrefab: CookedMeat
      cookTime: 10
    - fromPrefab: NeckTail
      toPrefab: NeckTailGrilled
      cookTime: 10
    - fromPrefab: FishRaw
      toPrefab: FishCooked
      cookTime: 10
    - fromPrefab: DeerMeat
      toPrefab: CookedDeerMeat
      cookTime: 10
    - fromPrefab: WolfMeat
      toPrefab: CookedWolfMeat
      cookTime: 10
    - fromPrefab: ChickenMeat
      toPrefab: CookedChickenMeat
      cookTime: 10
    - fromPrefab: HareMeat
      toPrefab: CookedHareMeat
      cookTime: 10

Makes the oven cook faster, and fuel last longer.

Yaml example
conversionModifications:
  piece_oven:
    action: modify
    prefab: piece_oven
    conversions:
    - fromPrefab: LoxPieUncooked
      toPrefab: LoxPie
      cookTime: 10
    - fromPrefab: BreadDough
      toPrefab: Bread
      cookTime: 10
    - fromPrefab: FishAndBreadUncooked
      toPrefab: FishAndBread
      cookTime: 10
    - fromPrefab: MeatPlatterUncooked
      toPrefab: MeatPlatter
      cookTime: 10
    - fromPrefab: HoneyGlazedChickenUncooked
      toPrefab: HoneyGlazedChicken
      cookTime: 10
    - fromPrefab: MisthareSupremeUncooked
      toPrefab: MisthareSupreme
      cookTime: 10
    - fromPrefab: MagicallyStuffedShroomUncooked
      toPrefab: MagicallyStuffedShroom
      cookTime: 10
    - fromPrefab: RoastedCrustPieUncooked
      toPrefab: RoastedCrustPie
      cookTime: 10
    - fromPrefab: PiquantPieUncooked
      toPrefab: PiquantPie
      cookTime: 10
    maxFuel: 10
    fuelItem: Wood
    secPerFuel: 2000

Makes the spinning wheel work faster and take up to 50 flax.

Yaml example
conversionModifications:
  piece_spinningwheel:
    action: Modify
    prefab: piece_spinningwheel
    conversions:
    - fromPrefab: Flax
      toPrefab: LinenThread
    maxOres: 50
    conversionTime: 3

Lets the battering ram run on coal as well as wood, and hold twice as much.

Yaml example
conversionModifications:
  BatteringRam:
    action: Modify
    prefab: BatteringRam
    conversions:
    - fromPrefab: Wood
    - fromPrefab: FineWood
    - fromPrefab: RoundLog
    - fromPrefab: Blackwood
    - fromPrefab: Coal
    maxOres: 50

Stops the battering ram taking blackwood.

Yaml example
conversionModifications:
  ram_no_blackwood:
    action: Remove
    prefab: BatteringRam
    conversions:
    - fromPrefab: Blackwood

Makes the frost kiln produce frozen fuel twice as fast, from 2 ice instead of 5.

Yaml example
conversionModifications:
  piece_FrostKiln:
    action: Modify
    prefab: piece_FrostKiln
    conversions:
    - toPrefab: FrozenFuel
    fuelPerProduct: 2
    conversionTime: 15

The obliterator

The obliterator (incinerator) has a list of its own, incineratorConversions. Each one makes result from its ingredients, and needs at least one. Everything without a conversion turns into defaultResult, one for every defaultCost items. action: Modify replaces the list, Add updates the conversion making the same result or adds one, and Remove takes out the ones making each result listed.

Yaml example
conversionModifications:
  ObliteratorScrap:
    action: Add
    prefab: incinerator
    incineratorConversions:
    - result: Iron
      resultAmount: 1
      priority: 10                         # <- Made before the conversions with a lower priority
      anyOneIngredient: false              # <- true when any one of the ingredients is enough
      ingredients:
      - prefab: IronScrap
        amount: 5

Items

\BepInEx\config\RecipeManager\Items.yaml does two things:

  • action: Add creates a brand new item by cloning an existing one. The clone keeps the model and every stat of the item it was copied from, and anything you set in the config is applied on top.
  • action: Modify changes an item that already exists, vanilla weapons and armor included. Only the fields you set are changed, and taking a field back out of the yaml puts the original value back.

Adding or removing an item needs a game restart (or a trip back to the main menu). This is a hard requirement of how Valheim identifies items on the network, not something the mod can work around. Everything else, including every modification of an existing item, works live with RM_Items_Reload.

Item commands

RM_Items_PrintAll - Writes the items in the object DB, with the stats they currently have, to ObjectDBItems.yaml. Copy an entry out of it to see what the numbers should look like. It is a big file, so RM_Items_PrintAll sword only writes the items whose prefab name contains "sword" (upper or lower case).

RM_Items_Reload - Reads the item files again. Stats, names, icons and textures are re-applied straight away, and the item definitions are sent to connected players. Adding or removing an item needs a restart.

RM_Textures_Dump <prefabName> - Writes a prefab's icons and material textures to \BepInEx\config\RecipeManager\Textures\<prefabName>\ as PNGs, along with a _dump_info.txt describing each file. Prefab names are case sensitive. See Custom icons and textures below for what to do with them.

Adding a new item

Add a "Honey bread" food, made from bread and honey at the cauldron

Yaml example
itemAdditions:
  HoneyBread:                              # <- The name of this addition, it is for your information but SHOULD BE UNIQUE
    action: Add                            # <- REQUIRED This is the action applied, can be [Add, Modify, Remove]
    prefab: HoneyBread                     # <- REQUIRED The prefab name of the NEW item, must be globally unique
    clonedFrom: Bread                      # <- REQUIRED The existing prefab to copy
    name: Honey Bread                      # <- The display name. Start it with '$' to use your own localization token
    description: Sweet, sticky and filling. # <- The tooltip description
    weight: 0.5                            # <- Leave unset to keep the cloned item's weight
    maxStackSize: 20                       # <- Leave unset to keep the cloned item's stack size
    value: 12                              # <- The trader value of this item
    teleportable: true                     # <- Whether this item can go through a portal
    food:                                  # <- Only set this for food and drinks, leave it out otherwise
      health: 50                           # <- The max health this food grants
      stamina: 60                          # <- The max stamina this food grants
      eitr: 0                              # <- The max eitr this food grants
      duration: 1800                       # <- How long the food lasts, in seconds
      regen: 2                             # <- Health regenerated per tick while this food is active
      eatAnimTime: 1                       # <- How long the eating animation takes
      isDrink: false                       # <- Whether this is drunk rather than eaten
      consumeStatusEffect: ''              # <- A status effect to apply when consumed, one StatusEffects.yaml adds works too
    recipe:                                # <- Optional, leave it out for an item that is not crafted
      craftedAt: piece_cauldron            # <- The crafting station, leave it empty for handcrafting
      repairAt: ''                         # <- A second station that can repair the item
      minStationLevel: 1                   # <- The required crafting station level
      craftAmount: 1                       # <- How many of the item one craft produces
      anyOneResource: false                # <- Only require one of the ingredients below
      ingredients:
      - prefab: Bread                      # <- Prefab that this ingredient requires
        craftCost: 1                       # <- The amount of this ingredient it takes to craft
        upgradeCost: 0                     # <- The amount of this ingredient it takes to upgrade
      - prefab: Honey
        craftCost: 2
        upgradeCost: 0
      # Ingredients also take upgraderResource, recover, anyOneExtraAmount and upgradeCosts, and the recipe takes
      # maxStationLevel, see the optional recipe fields. A cloned weapon or armor needs an upgraderResource idol
      # (Upgrader0Weapon..Upgrader7Armor) to be upgradeable at the Forge of Potential.

New items are visible to the rest of the mod by their prefab name, so you can also refer to them from Recipes.yaml or Conversions.yaml. For example, to cook your new item in the oven instead of crafting it at the cauldron, leave out the recipe: block and add a conversion from an uncooked item to it.

Modifying an existing item

Set action: Modify and point prefab at the item you want to change. There is no clonedFrom, nothing new is created, and the change reaches every copy of that item that already exists, including the ones sitting in chests and inventories.

Anything you leave out keeps its current value, so a modification only has to list what actually differs. The reverse is true too: deleting a line and running RM_Items_Reload restores that item's original value rather than leaving the last number you set.

A recipe: block only applies to an item you add. An existing item's recipe is changed in Recipes.yaml.

Make the iron sword hit harder and set things on fire

Yaml example
itemAdditions:
  BurningIronSword:
    action: Modify
    prefab: SwordIron                        # <- The existing item to change
    weapon:
      damage:                                # <- Only the damage types listed here are touched
        slash: 60
        fire: 20
      damagePerLevel:
        slash: 5
      backstabBonus: 4
    statusEffects:
      onHit: Burning                         # <- Applied to whatever the sword hits
      onHitChance: 0.5

Give the troll armor set fire resistance and a real set bonus

Yaml example
itemAdditions:
  FireproofTrollChest:
    action: Modify
    prefab: ArmorTrollLeatherChest
    armor:
      armor: 20
      armorPerLevel: 4
      movementModifier: 0.05                 # <- 5% faster while worn
    resistances:                             # <- Replaces the item's whole resistance list
    - type: Fire
      modifier: VeryResistant
    - type: Frost
      modifier: Resistant
    setBonus:
      name: TrollLeather                     # <- Every piece of the set has to use the same name
      size: 3
      statusEffect: SetEffect_TrollArmor

Weapon, armor and set stats

These blocks work exactly the same on an item you added and on one you are modifying, so a cloned sword can be given its own damage profile the same way a vanilla one can.

weapon: - damage and tool stats.

Field Meaning
damage Base damage. Takes any of damage, blunt, slash, pierce, chop, pickaxe, fire, frost, lightning, poison, spirit, nonPlayer (the game's NonPlayer damage type). Types you leave out are not touched.
damagePerLevel Damage added by each upgrade level, same fields as damage.
attackForce Knockback.
backstabBonus Sneak attack damage multiplier.
toolTier What a tool is able to harvest. 0 is wood and stone, 2 is black metal.
skill The skill the weapon trains and uses, such as Swords, Bows or Crossbows. A skill another mod adds works too.
ammoType The kind of ammo a bow or crossbow fires, or the kind an ammo item is: $ammo_arrows or $ammo_bolts for the game's own.
dodgeable / blockable Whether its hits can be dodged, and blocked.
spawnOnHit / spawnOnHitTerrain A prefab spawned where it hits something, and where it hits the ground. None for nothing.
primaryAttack / secondaryAttack The weapon's two attacks, see More item stats.

armor: - armor, shield and equip stats.

Field Meaning
armor / armorPerLevel Armor value, and how much each upgrade level adds.
blockPower / blockPowerPerLevel How much damage a block absorbs, shields and weapons that block.
deflectionForce / deflectionForcePerLevel How far a blocked attacker is pushed back.
movementModifier Speed change while equipped, as a fraction. -0.05 is 5% slower.
eitrRegenModifier Eitr regeneration change while equipped.
heatResistanceModifier Protection from the Ashlands heat while equipped, as a fraction.
timedBlockBonus How much more a parry absorbs than a plain block, as a multiplier.
perfectBlockStaminaRegen Stamina given back by a parry.
buildBlockCharges / maxBlockCharges / blockChargeDecayTime Whether blocking builds up charges like the bucklers do, how many, and how many seconds one lasts.

resistances: - a list of type and modifier pairs. This replaces the item's whole resistance list, so include every resistance you want it to end up with, and use resistances: [] to remove them all.

  • type is one of Blunt, Slash, Pierce, Chop, Pickaxe, Fire, Frost, Lightning, Poison, Spirit, NonPlayer.
  • modifier is one of Normal, SlightlyResistant, Resistant, VeryResistant, SlightlyWeak, Weak, VeryWeak, Immune, Ignore.

statusEffects: - effects the item provides.

Field Meaning
equipped Applied for as long as the item is equipped.
onHit Applied to whatever the weapon hits.
onHitChance Chance for onHit to land, from 0 to 1.
perfectBlock Applied to the wearer when they parry.
fullAdrenaline Applied when the wearer's adrenaline fills up.

setBonus: - the armor set the item belongs to.

Field Meaning
name Grouping key. Every piece of the same set has to use the same value.
size How many pieces have to be worn. The game ignores set bonuses with a size of 1 or less.
statusEffect The effect that wearing the full set grants.

Status effects are referenced by name, an effect added in StatusEffects.yaml included. SetEffect_TrollArmor, Burning and Frost are examples of names that work. To empty a status effect slot rather than set one, use the value None.

More item stats

RM_Items_PrintAll writes every one of these that an item uses, so the dump of an item shows what its numbers are. Like everything else on an item, a field left out keeps the item's own value.

Top level:

Field Meaning
equipDuration Seconds it takes to put the item on.
questItem Kept on death and cannot be moved into a chest, like the game's keys.
appendToolTip Another item whose tooltip is shown below this one's, the way the feasts show their food. None removes it.

quality: - upgrade levels, and the Forge of Potential.

Field Meaning
maxLevel The highest upgrade level. 1 means the item cannot be upgraded at all.
weightPerLevel Weight added by each upgrade level, as a fraction of the weight.
upgradeChance / breakChance At the Forge of Potential, the chance an upgrade works, and the chance a failed one breaks the item, 0 to 1.
upgradeSteps Levels a successful upgrade at the Forge of Potential adds.
breakRefund How much of the ingredients a broken item gives back, 0 to 1.

durability:

Field Meaning
enabled Whether the item wears out at all.
max / perLevel Durability, and durability added by each upgrade level.
drainPerUse / drainPerSecond Durability lost each use, and each second while in use like a torch.
repairable Whether it can be repaired.
destroyWhenBroken For an item that wears out while equipped, like a torch, whether it is destroyed when it runs out. Weapons and armor that run out just stop working.

staminaModifiers: - stamina cost changes while equipped, as fractions. -0.1 is 10% cheaper. Takes homeItems (tools and building), jump, attack, block, dodge, swim, sneak and run.

adrenaline: - max is how much adrenaline the wearer can build up, block and perfectBlock how much a block and a parry give.

weapon.primaryAttack: and weapon.secondaryAttack: - a weapon's two attacks. Only numbers and switches that do not depend on the attack's animation can be changed, so a change can never leave a weapon stuck mid-swing. A change reaches the next swing.

Field Meaning
stamina / eitr / health / healthPercentage What the attack costs. healthPercentage is a percentage of the current health.
adrenaline / useAdrenaline Adrenaline gained for each hit, and each time the attack is used whether it hits or not.
speedFactor / rotationSpeedFactor Movement and turning speed while attacking, as a fraction of normal.
damageMultiplier / forceMultiplier / staggerMultiplier Multipliers on the weapon's damage, knockback and stagger for this attack.
lastChainDamageMultiplier Damage multiplier on the last hit of a combo.
damageMultiplierPerMissingHealth / damageMultiplierByHealthMissing / staminaReturnPerMissingHealth Extra damage, and stamina back, as the attacker's health drops, like the berserker axes.
range / height / angle / rayWidth The reach and shape of a swing. angle is in degrees.
multiHit / lowerDamagePerHit Whether a swing can hit several targets, and whether it shares its damage out between them.
hitTerrain / hitFriendly / hitThroughWalls What a swing can hit.
recoilPushback / selfDamage How far the attacker is pushed back, and damage the attacker takes.
consumeItem Whether the attack uses up the item, like throwing a bomb.
raiseSkillAmount How much skill a hit gives.
startNoise / hitNoise Noise creatures can hear when the attack starts and when it hits.
spawnOnTrigger / spawnOnHit / spawnOnHitChance A prefab spawned when the attack is used, one spawned where it hits, and the chance of the second, which starts at 0 so set it too. None for nothing.
projectile prefab, velocity, velocityMin, accuracy, accuracyMin, skillAccuracy, count, bursts, burstInterval and launchAngle. Velocity and accuracy go from the Min value to the full one as a bow is drawn, accuracy is a spread in degrees. On a bow or crossbow the ammo's numbers are added to these, and the ammo's projectile is fired.
reload time, staminaDrain and eitrDrain of a crossbow's reload. The game only reads the primary attack's.
draw durationMin (seconds to fully draw with no skill), staminaDrain and eitrDrain of a bow's draw. The game only reads the primary attack's.

Prefabs, like a projectile or spawnOnHit, are named by their prefab name, and None empties the slot. A prefab another mod adds can be used, it is looked up once the world has loaded.

Make the arbalest reload and swap faster, and make running and jumping cheaper while it is held

Yaml example
itemAdditions:
  QuickArbalest:
    action: Modify
    prefab: CrossbowArbalest
    equipDuration: 0.5
    weapon:
      primaryAttack:
        reload:
          time: 2
    staminaModifiers:
      run: -0.1
      jump: -0.1

Stop the iron sword being upgraded, and make it never wear out

Yaml example
itemAdditions:
  PlainIronSword:
    action: Modify
    prefab: SwordIron
    quality:
      maxLevel: 1
    durability:
      enabled: false

Custom icons and textures

Icons and textures are read from \BepInEx\config\RecipeManager\Textures\<prefab>\, where <prefab> is the prefab: value of your new item. Any file that is present replaces that texture, and anything missing keeps whatever the cloned item had.

The workflow is:

  1. Run RM_Textures_Dump Bread in the console. This writes Bread's icon and material textures to \BepInEx\config\RecipeManager\Textures\Bread\, along with a _dump_info.txt describing what each file is.
  2. Copy that whole folder and rename the copy to your new item's prefab name, for example Textures\HoneyBread\.
  3. Repaint the PNGs you care about and delete the ones you did not change.
  4. Restart the game, or run RM_Items_Reload.

The file names are what tie a PNG to a texture slot, so do not rename them:

  • icon_0.png is the inventory icon (icon.png also works if there is only one). This is the one most people want.
  • <renderer>__<material>__<slot>.png is a model texture, for example attach__0___MainTex.png. _MainTex is the colour texture, _BumpMap is the normal map, _MetallicGlossMap and _EmissionMap are the metallic and glow maps.

Textures are only ever applied to a copy of the material, so repainting an item you added never changes the vanilla item it was cloned from.

This works for action: Modify too, where <prefab> is the existing item you are changing. Retexturing an item that already exists does change how that item looks everywhere, and unlike its stats it is not undone by RM_Items_Reload - remove the folder and restart to get the original artwork back.

On a server, item definitions are synced to clients but the PNGs are not. A client that does not have the image files still gets the item with the correct stats and recipe, it just shows the original artwork.

Status effects

\BepInEx\config\RecipeManager\StatusEffects.yaml adds new status effects and changes the ones that exist. Items use them by their prefab name, like any other status effect.

  • action: Add makes a new effect. With clonedFrom it is a copy of that effect, without it the effect starts with no stats at all.
  • action: Modify changes an effect that already exists. Everything it leaves out keeps the effect's own value.

A change reaches an effect the next time it is given: a set bonus the next time the set is put on, a food effect the next time it is eaten. An effect a player already has keeps its old values until it runs out.

maxHealth, maxStamina and maxEitr add to the player's maximum while the effect lasts, and are listed under the effect's tooltip. They use a game patch.

Only the stats the game gives its ordinary effects can be set. Shield, poison and frost effects keep their own settings, though an entry can still change their name, texts, timings and icon. An icon at \BepInEx\config\RecipeManager\Textures\<prefab>\icon.png replaces the effect's icon.

Status effect commands

RM_StatusEffects_PrintAll - Writes every status effect in the game, with the stats it uses, to ObjectDBStatusEffects.yaml. RM_StatusEffects_PrintAll troll only writes the effects whose name contains "troll".

RM_StatusEffects_Reload - Reads the status effect files again and applies them, then brings the items that use them in line. The result is sent to connected players.

Yaml example
statusEffects:
  TrollSetStrength:
    action: Add
    prefab: SetEffect_TrollStrength        # <- The new effect's name, which has to be unique
    clonedFrom: SetEffect_TrollArmor
    name: Troll strength
    tooltip: Hits harder and carries more.
    carryWeight: 50
    maxHealth: 25                          # <- A game patch
    damage:
      skill: All                           # <- The weapon skill whose attacks it boosts, All for every attack
      multiplier: 1.1
    resistances:
    - type: Frost
      modifier: Resistant
  LongerRested:
    action: Modify
    prefab: Rested
    health:
      regenMultiplier: 1.6

To give the troll armor set the new effect, point the set bonus at it in Items.yaml:

itemAdditions:
  TrollChest:
    action: Modify
    prefab: ArmorTrollLeatherChest
    setBonus:
      statusEffect: SetEffect_TrollStrength
Every field

Most numbers are fractions, where 0.1 is 10% more and -0.1 is 10% less. The multipliers are the exception, where 1 is normal.

    name: Troll strength                   # <- Start it with '$' to use your own localization token
    tooltip: Hits harder.
    category: strength                     # <- Effects with the same category replace each other
    duration: 300                          # <- Seconds, 0 lasts for as long as something keeps it on
    cooldown: 0                            # <- Guardian powers, seconds before it can be used again
    hidden: false                          # <- Kept off the list of effects on screen
    flashIcon: false
    cooldownIcon: false                    # <- Shows the time left on the icon
    attributes: ColdResistance             # <- ColdResistance, DoubleImpactDamage, SailingPower or TamingBoost
    activationAnimation: gpower            # <- Guardian powers, the animation played
    messages:
      start: You feel strong
      startType: Center                    # <- TopLeft or Center, also stopType and repeatType
      stop: ''
      repeat: ''
      repeatInterval: 0
    health: {upFront: 0, perTick: 0, tickInterval: 0, minHealthPercentage: 0, overTime: 0, overTimeDuration: 0, overTimeInterval: 5, regenMultiplier: 1}
    stamina: {upFront: 0, overTime: 0, overTimeDuration: 0, overTimeIsFraction: false, drainPerSecond: 0, regenMultiplier: 1, runDrain: 0}
    staminaUse: {homeItems: 0, jump: 0, attack: 0, block: 0, blockFlat: 0, dodge: 0, swim: 0, sneak: 0, run: 0}
    eitr: {upFront: 0, overTime: 0, overTimeDuration: 0, regenMultiplier: 1}
    adrenaline: {upFront: 0, modifier: 0}
    armor: {add: 0, multiplier: 0}
    stagger: {modifier: 0, timedBlockBonus: 0}
    damage: {skill: All, multiplier: 1, percentByType: {fire: 0.1}}
    resistances: []
    skills: {raise: Swords, raiseModifier: 0, level: Swords, levelModifier: 0, level2: Bows, level2Modifier: 0}
    movement: {speed: 0, swimSpeed: 0, jump: {x: 0, y: 0, z: 0}, maxFallSpeed: 0, fallDamage: 0, wind: 0, windRunStamina: 0}
    noise: 0
    stealth: 0
    carryWeight: 0
    maxHealth: 0
    maxStamina: 0
    maxEitr: 0

Importing from WackysDatabase

RM_Import_WackyDB converts WackysDatabase's recipe, item, piece and status effect files into RecipeManager files. Run it in a world, since it looks stations and items up in the game:

  1. Load into a world with RecipeManager installed. Disabling WackysDatabase first gives the most accurate report, since its own changes are otherwise part of what the import compares against.
  2. Run RM_Import_WackyDB. It reads \BepInEx\config\wackysDatabase\ and every folder in it. To read somewhere else, give the folder: RM_Import_WackyDB wackyDatabase-BulkYML, relative to \BepInEx\config\, or a full path.
  3. Everything is written to \BepInEx\config\RecipeManager\WackyImport\, which is not loaded: Wacky_Recipes.yaml, Wacky_Items.yaml, Wacky_Pieces.yaml, Wacky_Conversions.yaml, Wacky_StatusEffects.yaml, a Textures folder for icons, and ImportReport.txt.
  4. Read ImportReport.txt. For every WackysDatabase file it lists what the file became, every setting that was carried across, every setting that was left out and why, and anything to check, such as an item that does not exist in this game.
  5. When it looks right, move the Wacky_*.yaml files into \BepInEx\config\RecipeManager\, and the contents of its Textures folder into \BepInEx\config\RecipeManager\Textures\. Remove WackysDatabase's files, or WackysDatabase itself, so both mods do not change the same things.

What carries across today:

  • Recipes: station, repair station, station level, amount, sort order, upgrade-only, any-one ingredient, disabling, ingredients, WackysDatabase's separate upgrade costs, including costs for single quality levels, and station level caps. Extra recipes WackysDatabase adds for an item become an Add, and switching off upgrades sets the item's highest upgrade level to 1.
  • Items: added (cloned) items, name, description, weight, stack size, value, teleporting, equip time, quest items, upgrade levels and the Forge of Potential, durability, damage, skill, ammo, armor, shield and parry stats, stamina and other stat modifiers, adrenaline, food, status effects, set bonus, resistances, icons, and the numbers of both attacks, including their projectiles, reload and draw.
  • Pieces: added (copied) pieces, moving pieces between tools, cost, station, station level, build tab and tags, comfort, name, description, disabling, the placement rules, blocking pieces, icons, health and resistances, and crafting station, station upgrade, container and fire settings. Smelter, cooking station, fermenter and obliterator settings become conversion entries.
  • Status effects: added (copied) and changed effects, their name, texts, timings, icon and stats, and the health, stamina and eitr they add.

What does not: attack speed, a status effect for one attack, extra set bonuses, the Water damage type, status effect reapply cooldowns and effects that start another when they end need game patches RecipeManager does not have. Shield, poison and frost effect settings, an attack's type, animations and effects, parts a piece does not have (such as turning a piece into a crafting station), and beehives, sap collectors, plants, portals, ships, shield generators and battering rams are left alone. Creatures, pickables, trees, projectiles, area effects, materials and 3D model items are not part of RecipeManager. The report names every one of these settings in every file, so nothing is dropped silently.

FAQ

  • Q: Why is my recipe not showing up? A. Ensure that the recipe uses the action 'Modify' or 'Add'. An entry with 'Enable' only switches a recipe on, and does nothing to one that is already on.

  • Q: Since updating to 0.11 my modified recipe is crafted at a station, or my modified piece costs something A. A Modify now keeps everything it leaves out. Write craftedAt: none for a handcrafted recipe, and requirements: [] for a free piece. See Upgrading to 0.11.

  • Q: I edited an armor or weapon recipe and the idol became part of the crafting cost, or the item disappeared from the Forge of Potential A. Update to 0.6.5 or later. The idol (Upgrader1Armor and the like) is an upgrader resource, which only the Forge of Potential charges and which is what puts the item on the Forge. Entries written by older versions are recognised automatically, and a fresh RM_Recipes_PrintAll marks the idol with upgraderResource: true. The same update keeps the Deep North gold gear upgrade-only and keeps fishing bait in its place in the crafting list.

  • Q: My yaml has an error about the refund key A. The refund key was removed in 0.4.1. If you need to remove the key from an existing yaml you can use the following regex ( +refund: \w+\n?) and replace with nothing. This can be done from most text editors find and replace.

  • Q: My new item has the same food bar as the item I cloned it from A. Set name on the item addition. The display name is what the game uses to tell foods apart, so without one your item shares a food slot with its original.

  • Q: Why does adding an item need a restart? A. An item's prefab name is its network identity, and Valheim builds that lookup once when the world loads. Items therefore have to exist before then. Editing an item you already have does not need a restart, only adding or removing one does.

  • Q: I changed a vanilla item and now I want it back to normal A. Delete the modification and run RM_Items_Reload. The mod keeps the original values of anything it touches and puts them back. Custom icons and textures are the exception, those need a restart.

  • Q: My status effect is not being applied A. Check the log, an effect that could not be found is reported by name. Names are case sensitive, and RM_StatusEffects_PrintAll lists the ones that exist. An effect added in StatusEffects.yaml can be used like any other.

  • Q: I changed a status effect and nothing happened A. A change reaches an effect the next time it is given. Take the item off and put it on again, or wait for the effect to run out.

  • Q: I set a resistance and the item lost the resistances it already had A. resistances replaces the whole list rather than adding to it. List every resistance you want the item to end up with.

Planned Features

  • More recipe validation
  • Conversion modifications (like ores for ingots) (added in 0.5.0)
  • Stat editing for weapons, armor and tools (added in 0.6.0)
  • Import from WackysDatabase (added in 0.11.0)
  • More item stats: durability, max quality, attack costs and the like (added in 0.11.0)
  • Upgrade costs for each quality level, and capping the station level a recipe needs (added in 0.11.0)
  • Custom status effects (added in 0.11.0)
  • Adding pieces, moving them between tools, and changing their health, containers, fires and stations (added in 0.11.0)

Installation (manual)

Ensure the downloaded .dll is placed inside your /bepinex/plugins folder.

Please note this mod does nothing until configured.

CHANGELOG

0.11.0

- Pieces can now be added by copying another piece, and moved to another tool or to a build tab of their own.
- Pieces can change their placement rules, how sturdy they are, and how they work as a crafting station, station upgrade, container or fire.
- Pieces can require an upgraded crafting station before they can be placed.
- The obliterator's conversions can now be changed, and smelters and cooking stations can choose whether they need a roof or a fire.
- Status effects can now be added, by copying one or from scratch, and existing ones can be changed.
- Status effects can raise maximum health, stamina and eitr while they last.
- Added console commands that list status effects and reload their files.
- Added a console command that converts WackysDatabase recipe, item and piece files, with a report of what could not be carried across.
	- Convert piece changes
	- Convert status effect changes
	- Convert recipe changes with single level ingrediants
- Recipes can set a different upgrade cost for each level, and cap the station level that upgrading needs.
- The mod now only patches the game while a config uses a setting that needs it, and a console command lists those patches.
- Items can now change their durability, upgrade levels, skill, parrying and stamina costs, and the numbers behind their attacks and projectiles.
- The item dump lists these stats, and the WackysDatabase import now carries them across.
- Changing a recipe or piece now only changes what you set, and everything left out keeps its current value.
- Fixed clients using their own piece settings instead of the server's, and using the server's settings after leaving it.
- A config file with a duplicate or empty entry no longer stops the mod from loading, and new config files are picked up without a restart.
- Adding a conversion a station already has now updates it, and changing a station no longer changes others with a similar name.
- Cooking stations can set what burnt food turns into, and crafting stations can be named the way the game shows them.

0.6.5

- Fixes modifying an armor or weapon recipe taking the item off the Forge of Potential and adding its idol to the
  crafting cost. The idol is now marked upgraderResource: true, and RM_Recipes_PrintAll writes it that way.
  A Modify that leaves the idol out keeps the one the recipe had, and older configs that list it as a plain
  ingredient are recognised from the recipe they modify.
- Fixes modifying a Deep North gold item making it craftable at its station. Recipes can now set upgradeOnly,
  and a Modify keeps the recipe's own value when it is left out.
- Fixes a modified recipe losing its place in the crafting list (fishing bait). Recipes can now set listSortWeight.
- Recipes can now set qualityResultAmountMultiplier, and ingredients recover and anyOneExtraAmount. A Modify keeps
  the recipe's own values when they are left out, so a modified item that breaks at the Forge of Potential refunds
  its ingredients like the game's own recipes do.
- Item recipes in Items.yaml take the same ingredient fields, so a cloned weapon or armor can be given an idol and
  be upgraded at the Forge of Potential
- RM_Recipes_PrintAll writes recipes the game ships switched off with action: Disable and enabled: false, so a
  copied entry stays off. Every entry now has its action written out, Disable was previously left out.
- Fixes undoing an Enable or Disable (RM_Recipes_Unapply, RM_Recipes_Reload, editing the file) leaving the recipe
  in the wrong state. Undoing an Enable switched the recipe off, it now goes back to how it started.
- RM_Conversion_Reload now sends the reloaded conversions to connected players, like the other reload commands

0.6.4

- Fixes editing the battering ram and frost kiln. Smelter conversions can now leave out toPrefab (the item is
  used up, like the ram burning wood) or fromPrefab (made from fuel alone, like the frost kiln). A conversion
  missing either one previously stopped every conversion modification after it from loading.
- Fixes the battering ram never being modified, its smelter sits on a child object that was not searched
- Fixes RM_Conversion_PrintAll printing the battering ram as "kiln engine" instead of BatteringRam
- Fixes action: Remove never removing a conversion. Conversions are now matched on their fromPrefab and toPrefab.
- Fixes a Modify with no conversions list removing every conversion from the station, it now keeps them
- Warns when a smelter is set up so it can never produce

0.6.3

- The RM_ console commands are now gated behind `devcommands` instead of the world's admin list.
  Enable the console, run `devcommands`, then use them on the instance hosting the world.
- Jotunn version bumped

0.6.2

- Conversion maxOres, maxFuel and fuelPerProduct can now be set to 0. maxFuel 0 makes a smelter need no fuel,
  fuelPerProduct 0 stops loaded fuel from being used up. An explicit 0 in a config was previously ignored.
- Smelter conversionTime below 1 second is now raised to 1 with a warning. Smelters cannot produce faster than
  one item per second, and a shorter time only burned more fuel per item. A conversionTime of 0 now logs a warning.
- Fixes fuelItem never being applied to smelters and cooking stations
- Fixes maxFuel and secPerFuel never being applied to cooking stations
- Fixes modifying a cooking station turning off its fuel and fire requirements
- Fixes config changes not being sent to connected players when the world is hosted from a game client

0.6.1

- Deep North update

0.6.0

- Adds item additions, a new Items.yaml config which creates brand new items by cloning an existing one.
  Supports a custom name, description, weight, stack size, value, teleportability, food stats and recipe.
  Adding or removing an item requires a restart, editing one does not.
- Adds item modifications, 'action: Modify' in Items.yaml, which changes items that already exist
  including vanilla weapons and armor. Original values are restored when a modification is removed.
- Adds weapon, armor, resistance, status effect and set bonus stats, usable on both added and modified
  items. Covers per damage type damage and damage per level, attack force, backstab bonus, tool tier,
  armor, block power, deflection force, movement and eitr modifiers, damage resistances, equipped and
  on hit status effects, and the set name, size and bonus effect.
- Adds custom icons and textures for added items, loaded from BepInEx\config\RecipeManager\Textures\<prefab>\
- Adds RM_Textures_Dump <prefabName> which dumps a prefab's icons and material textures to disk as PNGs
- Adds RM_Items_Reload and RM_Items_PrintAll
- Fixes conversion configs being read from the piece config files instead of the conversion config files
- Fixes piece and conversion updates being sent to clients over the wrong RPC
- Fixes conversion configs never being sent to clients when they join

0.5.5

- Adds late running synchronization for Pieces, fixes modification consistency issues with late updating pieces (thanks JacoboNeuro!)

0.5.4

- Improves recipe validation for invalid prefabs
- Reducing client/server requirements to version check only if both contain the mod.
  This allows clients or servers to support people who can't run mods, or choose not to playe with mods.
  While still allowing users to run the mod if they desire.
  Warning: Recipes are still server synced. Which means if a server synchronization occurs, you will use the servers configs.

0.5.3

- Fixed possible path NPE

0.5.2

WARNING: This Thunderstore version was incorrect, please use 5.3 or 5.1
- Adds recovery option (deconstruct returns resources) for piece configurations

0.5.1

- Fixes default to level key generation for conversion pieces

0.5.0

- Adds support for conversions
	- Modify conversions for the smelter, kiln, spinning wheel, fermenter, oven, smelter and blast furnace
	- Add conversions (smelter accepts all ores)
	- Modify conversions (faster, longer, more resources/less produced)
	- Remove conversions
	- Examples in the Readme/mod page!
- Updated dependency requirements

0.4.5

- Ensures RPC synchronization when an admin reloads pieces/recipes
- Fixes piece categories not being mutated correctly

0.4.4

- Fixes filepath detection not working on linux
- Removes embedded yaml.net, now requires yaml.net to be installed via the mod loader
- Fixes server synced piece modifications not being applied in some cases
- Defaults 'GroundPlacement' for piece modifications to false

0.4.3

- Fixes recipe requires any ingredient not being set correctly

0.4.2

- Fixes duplicate recipes when recipes are modified, and modified again. Primarily during multiple world initializations or character swapping worlds.
- Fixes items with no crafting station being unrepairable in specific cases

0.4.1

- Adds support for nocost recipes
- Adds separate repair station configuration for recipes, if unset defaults to the crafting station
- Removed recipe refund setting as it was not working as intended

0.4.0

- Add support for piece modifications
	- Details about pieces can now be modified
	- Piece modifications are separated from item modifications
- Added support for multiple config files of each type
- Unified synchronization for multiple files & piece or recipe types
- Virtualized piece and recipe synchronization, files are no longer created or mirrored from the host/server
- Some improvements to recipe modification synchronization

0.3.4

- Added guards to do nothing if recipe reload is called when you have no recipes set to modify

0.3.3

- Simplified item add during server handshake post config received

0.3.2

- More eventual consistency checks
- Add ensures that the recipe does not already exist

0.3.1

- Modify ensures the target recipe does not already exist

0.3.0

- Added more error reporting for common recipe issues
- Updated example docs
- Server sync'd recipes are now virtual

0.2.0

- Improves ways to reference a recipe as handcrafted
- Added recipe state sychronization on config file server sync

0.1.3

- Fixed server sync'd configurations trying to write out to a temp address

0.1.2

- Fixed customRPC naming to not collide with ValheimFortress

0.1.1

- Added support for targeting recipe names. Allows mutation of multiple recipes that target the same prefab (eg craft x5)
- Added recipe reversion which is applied right before reloading recipes to ensure previous recipe modifications are removed before reapplying

0.1.0

- Initial release, I'm sure I forgot something