Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
DataForge
Easy way to configure recipes, items, pieces and effects by organized reference system. Item cloning with visual tweaks and localization. Weight, stack, amount multiplier for items. Shows comfort group and value in hammer tab.
| Date uploaded | 2 weeks ago |
| Version | 1.3.6 |
| Download link | sighsorry-DataForge-1.3.6.zip |
| Downloads | 34 |
| Dependency string | sighsorry-DataForge-1.3.6 |
This mod requires the following mods to function
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.2351README
DataForge
Edit Valheim recipes, items, build pieces, and status effects with YAML files. Find an entry in the generated references, copy it, and change only what you need. DataForge reads vanilla content and content registered by your installed mods.
Small qol of showing comfort values and related comfort-group hints in the hammer menu.
Global settings
| Setting | Default | What it does |
|---|---|---|
Stackable Stack Multiplier |
1 |
Multiply stack sizes by 1–10. An item's explicit maxStackSize takes priority. |
Item Weight Multiplier |
1 |
Multiply item weights by 0–2. An item's explicit weight takes priority. |
Upgrade Material Scaling |
Vanilla |
For a base cost of 10, qualities 2/3/4 cost 10/20/30. Flat gives 10/10/10; Reduced gives 10/15/20. Exact-quality costs stay as written. |
Show Comfort In Hammer |
On |
Show comfort values and related comfort-group hints in the hammer menu. Client setting. |
Highlight Station Extensions In Hammer |
On |
Highlight related stations and extensions on hover. Client setting. |
Ignore Station Extension Spacing |
On |
Allow extensions to be placed close together. Other placement rules still apply. |
maxStoredFuel |
100 |
Allow extra fireplace fuel without changing the displayed vanilla maximum. Set 0 to disable. |
Start here
- Install DataForge and BepInExPack Valheim 5.4.2351. For multiplayer, install the same DataForge version on the server and every client.
- Start a world, or start your dedicated server and let its game data load.
- Open
BepInEx/config/DataForge/in that installation. If you use a mod manager, open the active profile's config folder. - Find the entry you want in a reference file. Copy it into the matching edit file below.
- Keep the entry name, set
override: true, and keep only the fields you want to change. Save the file. DataForge reloads supported changes automatically after a short delay.
In multiplayer, edit the host or dedicated server's files. Connected clients use the server's settings, not their own local YAML.
| I want to change… | Read this generated file | Edit this file | Guide |
|---|---|---|---|
| Ingredients, output, or crafting station | recipes.reference.yml |
recipes.yml |
Recipes |
| Weight, damage, armor, food, or item visuals | items.reference.yml |
items.yml |
Items |
| Build costs, health, comfort, or production | pieces.reference.yml |
pieces.yml |
Pieces |
| Buffs, debuffs, or effect visuals | effects.reference.yml |
effects.yml |
Effects |
| Build-tool categories | pieceCategory.reference.yml |
pieceCategory.yml |
Categories |
For a first edit, put this in items.yml to make Wood lighter and stack to 100:
- item: Wood
override: true
weight: 1
maxStackSize: 100
A few YAML rules
- Use spaces, not tabs. Each entry starts with
- item:,- recipe:,- piece:, or- effect:. - Dots in tables mean nested keys:
visual.iconmeansiconinside avisualblock, not a literal field name. - Use the internal names from the references, such as
SwordIron, not the translated in-game name. - Omit fields you do not want to override.
override: falsedisables that entry. - A list such as
resourcesorconversionsreplaces the whole list. Include every entry you want to keep.[]clears a list where supported. - Comma-separated values have different meanings for different fields. Follow the examples below; do not assume that leaving out a number always preserves it.
- Use
Noneonly for fields that support it. A blank value is not a general reset command.
You can split your edits into files such as items_balance.yml, recipes_food.yml, or effects_magic.yml. Keep these files directly inside DataForge/, not in subfolders. Files load in alphabetical order; keeping each target in one file makes edits easier to track.
Find a field that is missing from a reference
References hide many default values. Generate a full file to see the supported fields and their baseline values. Enter these commands in the game's console. If needed, enable it with the -console launch option.
dataforge:full item
dataforge:full recipe
dataforge:full piece
dataforge:full effect
dataforge:full all
For example, dataforge:full item writes items.full.yml. Copy the fields you need into items.yml; reference and full files are generated guides, not active edit files. They can be overwritten when regenerated.
To refresh references after loading or changing your modpack:
dataforge:refer all
You can also use item, recipe, piece, effect, pieceCategory, or material instead of all. Run commands after game data is ready. A remote player must be in the server's adminlist.txt; commands write files on the server, and detailed results appear in its console.
Recipes
Edit recipes.yml. Copy the exact recipe key from recipes.reference.yml. If an item has several recipes, their keys may end in ;1, ;2, and so on.
Change ingredients and station level
- recipe: SwordIron
override: true
craftingStation: forge, 2
resources:
- Iron: 20, 10
- Wood: 5, 0
- SurtlingCore: 0, 5, 2
| Field | Meaning |
|---|---|
craftingStation: forge, 2 |
Require a level-2 forge for the base recipe. |
Iron: 20, 10 |
Use 20 to craft. Base upgrade cost is 10. With vanilla scaling, qualities 2, 3, and 4 cost 10, 20, and 30. |
Wood: 5, 0 |
Use 5 to craft and none to upgrade. |
SurtlingCore: 0, 5, 2 |
Use none to craft and exactly 5 when upgrading to quality 2. |
Resource values are craft amount, upgrade amount, optional exact target quality. craftingStation: None removes the station requirement. Omitting resources keeps the current ingredients; resources: [] removes all ingredient requirements.
Change output or remove a recipe
The output count goes after the recipe key, not in an amount field:
- recipe: Sausages, 4
override: true
To disable a recipe:
- recipe: SwordIron
override: true
remove: true
To add a recipe for an existing item or a DataForge item clone, use its prefab name and supply resources. Use a unique suffix, such as Sausages;custom, to add another recipe for an item that already has one. A recipe does not create the item itself; see Clone an item.
Upgrader materials
For a recipe that uses an Upgrader station, put its special one-item requirement in the same resources list:
- recipe: StaffThunderBlood
override: true
noCraftOnlyUpgrade: true
resources:
- Gold: 10, 5
- NornThread: 5, 2
- OrbThunderBlood: 1, 1
- upgrade: Upgrader7Weapon
This example needs the mod that registers StaffThunderBlood and its materials. Copy its actual recipe key from your reference.
upgrade: ItemPrefab means one item checked and consumed only by an Upgrader station. It also accepts custom idol prefabs. Do not add amounts or quality values after it. There is no separate upgradeResources block. noCraftOnlyUpgrade marks the recipe as upgrade-only; it does not turn an ordinary crafting station into an Upgrader.
Two optional recipe fields control ingredient choice and output bonuses:
| Setting | Meaning |
|---|---|
requireOnlyOneIngredient: true, 1 |
Require only one listed ingredient. The second value controls the game's output bonus from that ingredient's quality. |
qualityBonus: [{Fish1: 1}] |
Add output based on the consumed Fish1's quality. Quality 3 adds ceil((3 - 1) × 1) = 2 items. |
These bonuses are separate. If you enable both, both apply.
Items
Edit items.yml. Item settings change the item itself; recipe settings change how it is made.
Get more of one item
Add a multiplier after the item name in items.yml:
- item: Wood, 2
override: true
- item: Copper, 3
override: true
This doubles newly generated Wood and triples newly generated Copper, including Copper produced by a smelter. Each item has its own multiplier; 1 keeps the normal amount.
- Applies to supported loot, creature drops, gathering, crafting, cooking, and smelting paths. Mods with their own item-spawning code may bypass these paths.
- Multiplies crafting output without increasing ingredient costs. A recipe that produces 4 items produces 8 with a
2multiplier. Item upgrades are unaffected. - Changes new output, not stack limits or existing inventory stacks. Dropping and picking up the same stack does not multiply it again.
- Fractions are supported:
1.5gives an average of 50% more. Fractional results are rounded randomly; a normal one-item output becomes either one or two.
Change a weapon
- item: SwordIron
override: true
weight: 0.8
durability: 250, 50
damage:
slash: 55, 5
primaryAttack:
cost: 12, 0, 0, 0
| Field | Values, in order |
|---|---|
durability |
Base durability, added durability per quality level. Further options are shown in the full file. |
damage.slash |
Base damage, added damage per quality level. Other channels include blunt, pierce, fire, frost, lightning, poison, and spirit. |
primaryAttack.cost |
Stamina, eitr, health, health percentage (40 means 40%). |
equipment.armor |
Base armor, added armor per quality level. |
food |
Health, stamina, eitr, regeneration, duration in seconds. |
For example, slash: 55, 5 gives 55 base slash damage at quality 1 and 70 at quality 4, before skills and attack multipliers.
Other common fields include name, description, value, maxStackSize, maxQuality, teleportable, and floating. Use true or false for switches. equipment.iceSkates and equipment.iceShoes control the corresponding equipped movement flags.
Change food
- item: CookedMeat
override: true
food: 50, 25, 0, 2, 1200
This sets 50 health, 25 stamina, no eitr, 2 regeneration, and a 1,200-second duration.
Clone an item
Give the clone a unique prefab name in items.yml:
- item: DF_HeavyIronSword
override: true
cloneFrom: SwordIron
name: Heavy iron sword
description: A heavier iron sword with a stronger edge.
weight: 3
damage:
slash: 72, 5
visual:
scale: 1.1
icon: auto
Then give it a recipe in recipes.yml:
- recipe: DF_HeavyIronSword
override: true
craftingStation: forge, 2
resources:
- Iron: 25, 10
- Wood: 5, 0
Cloning copies the source item; it does not automatically copy its recipe. Keep clone names stable once players have made or saved those items.
Pieces
Edit pieces.yml for buildable objects such as walls, furniture, chests, and production stations.
Change a build cost and health
- piece: wood_wall
override: true
needStation: None
health: 250
resources:
- Wood: 4, true
Piece resource values are amount, recover on removal. They are different from recipe upgrade costs. Wood: 4, false costs four Wood without returning that resource on removal.
| Field | Use |
|---|---|
needStation |
Station required to build the piece. Use a station prefab name or None. |
pieceTable |
Build tool that contains the piece, such as Hammer. |
category |
Exact category name. An unknown name creates a category. |
sortOrder |
Position within its build category. |
comfort |
Comfort value, comfort group. Copy the group name from the full file. |
container |
Inventory width, height; for example 10, 4. Requires an existing container. |
remove: true |
Hide the piece from build lists; does not delete placed pieces. |
visual.scale |
Prefab scale for newly placed pieces. |
needStation and craftingStation do different jobs. needStation: forge requires a forge to build this piece. The craftingStation block edits or adds a crafting-station component on the piece itself. In recipes.yml, craftingStation: forge, 2 is the recipe's station requirement.
Change a production station
- piece: smelter
override: true
smelter:
input: Coal, 20, 10
output: 2, 30
conversions:
- CopperOre: Copper
- TinOre: Tin
input is fuel prefab, maximum fuel, maximum queued input. output is fuel per product, seconds per product. This example replaces the conversion list with only Copper and Tin. Copy all conversions you want to keep.
Fuel-only conversions, such as the Frost Kiln's Liquid Frost production, use None as the input:
- piece: piece_FrostKiln
override: true
smelter:
conversions:
- None: FrozenFuel
These conversions consume the station's configured fuel. Applying smelter settings does not reset its existing fuel or production queue.
The full file also covers cookingStation, fermenter, sapCollector, beehive, stationExtension, and craftingStation. Most component settings require that component to exist. stationExtension and craftingStation can also add their component. stationExtension: None disables an extension. A container cannot shrink along an axis while it holds items or is in use.
Categories
Edit pieceCategory.yml to order categories or move whole categories between build tools. Start with the exact tool and category names in pieceCategory.reference.yml:
Hammer:
- Misc
- Furniture
- Furniture: GB_Parchment_Tool
- Stone Building: GB_Parchment_Tool
GB_Parchment_Tool: []
This example requires GB_Parchment_Tool. It moves that tool's Furniture and Stone Building categories into the Hammer. An existing destination category with the same exact name is merged, so Furniture does not need a second tab.
- Names are case-sensitive. Copy them from the reference, not just the visible menu label.
- Listed categories come first. Unlisted categories keep their relative order afterward.
- Add a label with
Furniture, My furnitureorFurniture, $hud_furniture. Labels can also go before the colon in a move entry. GB_Parchment_Tool: []does not move anything by itself. The move entries do the work.- A
pieceTableassignment inpieces.ymltakes priority over a whole-category move. - Removing a move restores the original membership. The reference continues to describe the original tools and categories.
The visible Categories filters, including Flooring, Walls, and Roofing, are not all editable build-tool categories. Use the names listed in pieceCategory.reference.yml. DataForge handles matching duplicate filters during explicit category moves; a similar display label alone does not make two categories equivalent. Feasts, Food, and Meads are ignored by category configuration. Homestead's own category remains managed by Homestead.
Effects
Edit effects.yml. Use displayName for an effect's visible name; items and pieces use name.
Change Rested
- effect: Rested
override: true
rested:
baseTtl: 600
ttlPerComfortLevel: 60
stats:
maxStats: 25, 0, 50
regenMultiplier: 1, 1.5, 1
attackDamage: Swords, 1.25
damageTakenModifiers:
fire: Resistant
poison: Weak
| Field | Meaning |
|---|---|
rested.baseTtl |
Rested duration at comfort 1, in seconds. |
rested.ttlPerComfortLevel |
Extra seconds for each comfort level above 1. |
stats.maxStats |
Added maximum health, stamina, eitr. Different effects can stack these bonuses. |
stats.regenMultiplier |
Health, stamina, eitr regeneration multipliers. 1 is normal regeneration; 1.5 is 150%. |
stats.attackDamage |
Skill type, damage multiplier. |
damageTakenModifiers |
Resistance by damage type. Use game values such as Normal, Resistant, or Weak. |
Ordinary effect duration uses time: duration, cooldown, in seconds. Cooldown is used by abilities such as Forsaken powers; it is not a universal delay before any effect can be reapplied. Rested calculates its duration from comfort, so use the rested block above instead of time.
For MagicPlugin effects, an explicit maxStats replaces their native maximum-eitr bonus. Their eitr-regeneration bonus uses the third regenMultiplier value: 1.2 means +20%.
Keep or replace effect visuals
- effect: Burning
override: true
startEffects: vfx_Burning, vfx_Burning_blue, vfx_Burning_green
time: 5, 0
startEffects and stopEffects are comma-separated prefab lists. Existing matching entries keep their original attachment, tracking, colour variant, and scale settings. Repeated names match in their original order. New prefabs use default settings; DataForge does not automatically attach every new effect to the player.
Omit the field to keep its list. Use None or '' to clear it. An unknown prefab leaves that list unchanged and writes a warning to the log. To see changed visuals, let the active effect end and trigger it again.
You can clone an effect with a new effect name and cloneFrom: ExistingEffect. The clone keeps the source effect's type. To use it on an item, set an appropriate field under that item's effects block, such as equipStatusEffect or consumeStatusEffect. Creating a clone alone does not apply it to a character.
Type-specific blocks such as rested, poison, or shield only work on the matching effect type. Adding a block does not change the effect's type.
Reactive effects
For SE_React effects such as Staff_FrostOrbs:
- effect: Staff_FrostOrbs
override: true
react:
minSpawnDamage: 0
damagePerLevel:
frost: 8
damagePerLevel adds damage for each item level above one. It does not edit the shared projectile prefab. Reactive settings apply to newly created effect instances.
Names, icons, and materials
You can write names and descriptions directly, or use $ translation tokens. Put translations in DataForge/localization/English.yml and the matching language files:
$df_heavy_sword: "Heavy iron sword"
$df_heavy_sword_description: "A heavier iron sword with a stronger edge."
Then use name: $df_heavy_sword and description: $df_heavy_sword_description in the item entry. Use displayName and tooltip for effects. Localization is server-synced.
| Goal | Setting |
|---|---|
| Use a PNG for an item or piece | Put MyIcon.png in DataForge/icon/, then set visual.icon: MyIcon. |
| Render an item or piece icon | Set visual.icon: auto. Adjust visual.iconRotation with x, y, z angles if needed. |
| Use a PNG for an effect | Set icon: MyIcon. |
| Reuse an item icon for an effect | Set icon: item:SwordIron. |
| Reuse a material | Copy a name from z_materials.reference.txt into visual.material. |
Use 256×256 PNGs when possible. Store explicit PNGs on the server in multiplayer; clients download referenced icons automatically. Automatic item and piece icons are rendered by clients. Effects do not support automatic icon rendering: icon: auto looks for auto.png.
If a change does not work
| Symptom | Check |
|---|---|
| Nothing changes | Edit the host/server's active profile, use the correct plural filename, and check override plus the domain's enable switch. |
| A file stops reloading | Check indentation and field names in BepInEx/LogOutput.log. A YAML parse failure keeps the last successfully loaded configuration. |
| An item or effect is missing from references | Confirm the other mod actually registers it in that process. Some mods skip server prefab loading; enable their server-loading option if provided. DataForge cannot generate entries from an unloaded prefab just because its DLL is installed. |
| A field is missing | Generate the domain's full file. Some defaults are hidden in compact references, and some components or game fields are not supported. |
| A visual or effect looks unchanged | Existing instances may keep their state. Reapply the effect or place a new piece as appropriate. Restart the game after replacing a DLL. |
| A weapon's damage differs from the item values | Projectiles, area effects, ammunition, and spawned creatures may own additional behaviour. Read the generated attack comments; they are diagnostics, not editable YAML. |
| An icon is missing | Check the name, server PNG, and log. Icon sync has size and count limits; use small PNGs. |
References describe available baseline data, not every active override or every runtime damage calculation. Projectile/Aoe comments marked prefabDamage are not total attack damage. Shared projectile and area-effect prefabs are not directly editable through those comments.
z_resourcemap.txt controls reference and full-file sorting only. It does not change costs, unlocks, or stats. The default map includes Deep North after Ashlands. Existing customized maps are preserved on update; back up yours before merging entries from the default map. Section order defines tiers, and the first occurrence of a resource wins.
For mod authors
- Integration API: read-only change notifications and queries for other mods.
- Build and verification guide: developer checks and in-game test checklists.
- Source code
CHANGELOG
Changelog
1.4.0
- Reapply explicit cooking and fermentation conversion overrides after ValheimCuisine reloads, including unchanged synchronized settings. Existing facility contents, progress, fuel and saved state are not reset.
- Keep reference-only entries and omitted conversion lists out of this recovery. Explicit empty lists still clear conversions, and both integrations remain optional.
- Refresh VNEI search, recipe and recent-item views after reindexing while preserving navigation and filter settings. Resolve back/forward history entries against the current index.
- Validate affected conversion recipes before accepting a refreshed VNEI index, and add bounded recovery for known-state and UI refresh failures.
- Added original-DLL contract checks for ValheimCuisine 2.3.2 and VNEI 0.17.6, managed data and Harmony checks, and a manual game/server verification checklist. Actual Unity UI and multiplayer verification remains separate.
1.3.9
- Removed read-only attack-graph comments from item and effect references and full scaffolds. Editable fields, owner section headers, and gameplay settings are unchanged.
- Removed the linked-prefab diagnostic traversal from the plugin. Its original source and integration notes are preserved in the repository archive, outside the DLL and release packages.
- Regenerate existing references with
dataforge:refer itemanddataforge:refer effectto remove old comments. For existing full scaffolds, rerun the matchingdataforge:fullcommand. User override files are not rewritten.
1.3.8
- Replaced
maxStoredFuelwithFireplace Fuel Multiplier, defaulting to 10. Actual and displayed capacity now scale from each refillable fireplace's original capacity; 1 restores it. Old settings are not migrated. - Applied multiplier changes to loaded fireplaces without compounding the multiplier or changing starting fuel and burn speed. Lowering the multiplier preserves stored excess fuel until it is consumed.
- Added a safety guard for AzuCraftyBoxes 1.8.27 Shift+E fill-all calculations, preventing negative inventory or container quantities when stored fuel exceeds a reduced capacity. Its container selection and permission rules remain unchanged.
- Preserved refundable excess fuel when capacity is lowered and respected blocked drops or cancelled destruction. Documented DataForge's fuel refund separately from vanilla building-material returns.
- Added fireplace calculation and managed Harmony checks, an optional original-Azu-DLL IL check, and a manual gameplay checklist.
1.3.7
- Fixed compact recipe references losing Upgrader-only material classification. These requirements now retain
upgrade: ItemPrefabinstead of appearing as ordinary materials with amount 0. - Fixed ordinary recipe materials with amount 1 being written as 0. Resource order, upgrade amounts, and exact-quality conditions are preserved.
- Added checks that generate complete recipe reference entries, serialize them, and parse them back into editable recipes, including empty lists and baseline preservation.
- After updating, regenerate recipe references with
dataforge:refer recipe. Existing overrides are not rewritten; compare any entries copied from older references with the regenerated file.
1.3.6
- Fixed
startEffectsandstopEffectsoverrides losing existing prefab attachment, tracking, colour variant, and scale settings, including Burning effects remaining at their initial position. Repeated prefab entries retain their individual settings in order; new prefabs keep their default behaviour. - Rewrote the README with a quick-start workflow, copy-ready recipe, item, piece, and effect examples, and a guide to existing per-item acquisition multipliers. Corrected recipe output, resource tuple, and Rested duration examples.
- Added managed checks for effect-list metadata copying, independent copies, omitted fields, and explicit clearing, plus an in-game verification checklist.
- Updated the packaged BepInEx dependency to
denikson-BepInExPack_Valheim-5.4.2351.
1.3.5
- Added
equipment.iceSkatesandequipment.iceShoes, plus focusedSE_Reactoverrides forminSpawnDamageand per-level damage. - Added recipe
noCraftOnlyUpgradeand compactupgrade: ItemPrefabrequirements so Forge of Potential idols remain restricted to Upgrader stations while hidden game metadata is preserved. - Added source-free smelter conversions such as
None: FrozenFueland refreshed the derived no-source state without resetting fuel, queues, or RPC registration. - Fixed status-effect damage-struct overrides that were previously discarded, including percentage modifiers and reactive per-level damage.
- Added read-only generated-reference comments for linked attack, projectile, AOE, chain, and return prefabs without exposing those prefab fields as editable overrides.
1.3.4
- Reduced recurring allocations while synchronized icons wait, retry, expire, or retain per-peer rate-limit state, while preserving request order, transfer limits, and disconnect cleanup.
- Simplified shared domain change tracking by removing redundant pending-state bookkeeping while preserving full and scoped apply behavior.
- Added final-DLL checks that verify ServerSync and YamlDotNet remain merged and internalized in release artifacts.
1.3.3
- Removed the redundant top-level DataForge build-menu tab and kept configured pieces in Valheim's existing Categories view.
- Updated vanilla piece-category discovery to read the runtime enum metadata, including the categories added in Valheim 1.0.
- Merged same-name embedded PieceManager usage tags into the matching vanilla Categories filter for whole-category moves, preventing entries such as Furniture from appearing twice after external menu refreshes.
- Generated
pieceCategory.reference.ymlfrom the detected piece-table and category state before DataForge moves and ordering are applied.
1.3.2
- Updated DataForge for Valheim 1.0.7, including the bundled ServerSync constant access, crafting and cooking state propagation, PieceTable integration, Build UI integration, and compilation against the installed original game assemblies with build-time access generation.
- Added a dedicated DataForge category list to Valheim 1.0's build menu while preserving the four vanilla lists, category order and labels, search and favorites behavior, comfort badges, refreshes, and lifecycle cleanup.
- Added the Deep North resource tier and verified prefab mappings to the default resource map. Kept Writhan resources in Swamp, Hook in Mistlands, and the lava blob trophy in Ashlands, and documented safe merging for existing customized maps.
- Made generated-reference asset ownership deterministic by accepting only unique embedded-resource or complete-token matches, preserving ambiguous same-name owners, and refreshing mappings when bundle instances or resources change.
- Expanded compatibility, logic, API, and transpiler checks for original client and dedicated-server assemblies, Harmony targets, crafting and cooking signatures, asset ownership, and the final merged plugin.
- Updated the packaged BepInEx dependency to
denikson-BepInExPack_Valheim-5.4.2350.
1.3.1
- Removed temporary recipe-list allocations when checking for external recipe-object changes, preserving recipe identity, order, and null handling.
- Avoided duplicate prefab cleanup during VNEI refreshes when DataForge's cleanup is the only installed prefix. Keep the original early cleanup when other prefixes are present or patch inspection is unavailable.
- Simplified piece visual application so scale, material, and icon handling follow one explicit sequence while preserving warnings and failure behavior.
- Connected
DeployToGame=trueto Debug builds so the final merged plugin DLL is copied to the configured game folder after successful compilation and merging. - Included the public API check project in the solution and documented Debug validation, local deployment, and merged-DLL checks.
- Updated release-package validation to require the bundled API documentation alongside the existing package files.
1.3.0
- Added the public read-only
DataForgeApiv1 for items, recipes, pieces, status effects and localization: immutable local state/revisions, affected-key/full-refresh notifications, configured override queries, and actual item/effect clone-source queries. - Coalesce notifications after runtime application, isolate subscriber failures, distinguish applied/failed/reset states, and invalidate state at world boundaries. Preserve the synchronous status-effect ownership API and server authority.
- Added integration documentation and automated API/merged-assembly checks. No public mutation or YAML-writing API is introduced.
1.2.6
- Repaired clearly cross-wired labels on externally managed Hammer categories while preserving vanilla labels, localization tokens, and unknown third-party display names.
- Added a status-effect clone example using
icon: item:MeadHealthMinorto the generated override YAML header.
1.2.5
- Added the server-side
dataforge:refercommand for regenerating individual or all compact references and allowed authenticated dedicated-server administrators to run both reference and full-scaffold commands remotely. - Made generated references content-driven and deterministic, removed stale reference-state caches, refreshed material and mod-owner lookups, kept unchanged files untouched, and excluded stale item, piece, and status-effect baselines from later worlds.
- Fixed multiplied crafting outputs to validate inventory capacity for the full adjusted amount before crafting, preventing partial or lost output when only the vanilla amount would fit.
- Hardened configuration and domain file-watcher recovery with persistent five-second recreation retries, safe source-of-truth transitions, and cleanup that prevents failed watcher creation from leaking resources.
- Simplified piece override application around one consistent configuration snapshot, stabilized owner-managed category ordering, and isolated recipe or VNEI refresh failures so unrelated entries continue to apply.
- Expanded the built-in biome resource map with missing keys, trophies, crops, mushrooms, and boss resources, and classified pickaxes separately from axes in generated sorting.
1.2.4
- Added server-synced
fermenter.requiresRoofandfermenter.requiresCoverpiece overrides so the vanilla roof and 70% cover requirements can be controlled independently. - Applied requirement changes live to existing fermenters, kept new spawns consistent, and restored vanilla behavior when the fields or piece overrides are removed.
- Documented the fields in the default override comments and full scaffold while keeping them out of compact piece references.
1.2.3
- Coalesced DataForge-configured Hammer pieces into the existing tab with the same displayed name used by non-DataForge pieces, avoiding duplicate tabs created from independently allocated category IDs.
- Re-resolved configured Hammer category identity only after configuration, build-mode, availability, or category changes, while retaining the final post-framework reconciliation without periodic polling.
- Preserved ambiguous external categories instead of merging them arbitrarily and removed only empty category slots inserted by DataForge.
1.2.2
- Stabilized configured Hammer categories and tab ordering against later Jotunn and embedded PieceManager refreshes with a scoped, allocation-free final reconciliation pass.
- Preserved external category ownership and labels, repaired missing HUD tab slots, and avoided local custom-category ID collisions with categories already used by piece prefabs.
- Made piece startup and world-transition category restoration deterministic, with bounded availability refresh retries and failure isolation for unrelated configured pieces.
1.2.1
- Added server-authoritative PNG synchronization for explicit item, piece, and status-effect icons using content-hash manifests, missing-only transfers, persistent client caching, and live change or removal reapplication.
- Bounded and isolated icon transfer, validation, retry, disk, and texture-memory failures so one bad asset cannot block unrelated definitions or leave clients retrying indefinitely.
- Made fermenter, cooking-station, and smelter resources and conversions validate before commit, preventing unresolved references from leaving partially applied runtime state.
- Hardened file-watcher recovery, source-of-truth setup, world cleanup, recipe validation, acquisition multiplier patches, and generated artifact writes so failures remain scoped and recover live where possible.
- Changed compact item references to emit
toolTier, including tier0, only for axe and pickaxe skill items.
1.2.0
- Added stable numbered recipe identities so multiple recipes for the same result, including recipes with identical runtime names, are all written to references and can be overridden independently.
- Made recipe application transactional: unresolved crafting stations or resources keep the safe existing state, and newly added recipes are registered only after complete validation to prevent accidental free crafting.
- Made recipe removal and restoration fully live, refreshed connected clients' crafting UI correctly, isolated per-recipe failures, and reapplied overrides after external mods rebuild recipe objects.
1.1.11
- Added top-level item
toolTieroverrides with baseline restoration and live synchronization, while omitting the vanilla minimum tier0from compact references.
1.1.10
- Deferred server-synced
item:status-effect icon validation until both effect and item payloads are ready, avoiding transient missing-item warnings while preserving genuine unresolved-reference diagnostics.
1.1.9
- Stopped rebuilding ObjectDB item registers during shutdown restoration, avoiding cleanup warnings when Unity has already destroyed a registered prefab.
1.1.8
- Breaking: Removed item
visual.colorandvisual.emission. Existing item YAML must remove these keys and select an existing donor withvisual.materialinstead. - Hardened cloned-item and status-effect reloads by ordering clone dependencies, blocking cycles, rebinding dependent references, and deferring network-unsafe clone identity changes until the next world.
- Made startup, shutdown, and world transitions fault-isolated and ownership-safe across overrides, localization, icons, and VNEI refreshes.
- Improved piece reload cleanup and visual ownership so DataForge-managed components are removed only when unused and later visual changes made by other mods are preserved.
- Corrected generated reference defaults, ObjectDB cache invalidation, and station-extension spacing behavior.
- Avoided a HarmonyX type lookup warning when the optional MagicPlugin dependency is not installed.
- Reworked Thunderstore and Nexus packaging to synchronize the source manifest with the DLL version before staging, validating, and atomically promoting release archives.
1.1.7
- Replaced the rarely used
extraAmountOnlyOneIngredientrecipe resource value with an exact-quality upgrade field, allowing requirements such asSurtlingCore: 0, 5, 2. - Added automatic reference and full-scaffold detection for exact-quality requirements supplied by compatible recipe frameworks.
- Added the synced
Upgrade Material Scalingsetting with Vanilla, Flat, and Reduced modes while leaving exact-quality and custom-calculated requirements unchanged.
1.1.6
- Added
stats.maxStats: health, stamina, eitrfor stackable maximum-stat bonuses on any active status effect, with localized tooltip lines and zero-value reference pruning. - Added MagicPlugin compatibility that maps native maximum-Eitr and Eitr-regeneration bonuses into
stats.maxStatsandstats.regenMultiplier, while preserving native behavior until explicitly overridden. - Removed the specialized
healthUpgradestatus-effect schema in favor of the genericstats.maxStatsfield.
1.1.5
- Hardened server-synced localization across language changes, reconnects, world transitions, and live YAML reloads while preserving later token changes made by other mods.
- Added strict validation and size limits to the versioned localization payload so invalid or excessive data keeps the last-known-good configuration.
- Added source file and line numbers to server-side validation messages for item, recipe, piece, status-effect, and piece-category YAML.
1.1.4
- Added whole-category moves between build tools through
pieceCategory.yml, including optional localized labels and exact-name merging into existing destination tabs. - Made category moves reversible, hid emptied source tabs, and kept individual
pieces.ymlpieceTableassignments as the final priority. - Improved category YAML validation to support one order/label entry plus multiple source mappings, reject ambiguous conflicts, and document explicit empty sections such as
GB_Parchment_Tool: [].
1.1.3
- Added
pieceCategory.ymlandpieceCategory.reference.ymlfor per-hammer category ordering and localized display labels. - Improved exact, case-sensitive category discovery so categories added by PieceManager, Jotunn, and other mods keep stable names instead of shifting to numeric tabs.
- Added Homestead compatibility by leaving its category owner-managed, excluding it from DataForge category overrides, and keeping its tab last.
1.1.2
- Removed DataForge's built-in startup and lobby profiler now that loading diagnostics are available in the standalone LoadTimeProfiler patcher.
- Delayed reference and full-scaffold generation until the required game databases and piece tables are ready, avoiding premature or repeated generated-artifact work.
- Skipped full baseline scans when an unchanged reference-state cache can be reused.
- Reduced global item stack and weight multiplier overhead by keeping lightweight multiplier baselines separate from full item override baselines.
- Refreshed targeted item, recipe, status-effect, and piece baselines when game database prefab instances are replaced across world transitions.
1.1.1
- Improved incremental override reloads so only changed entries are reapplied while invalid YAML and localization payloads keep the last-known-good configuration.
- Restored item, recipe, status effect, piece, PieceTable category, visual, and localization state cleanly across world and dedicated-server transitions.
- Hardened DataForge-created item, recipe, and status-effect ownership so same-name objects supplied by other mods are not removed during cleanup.
- Improved auto-icon cache invalidation, config reload coalescing, component topology refreshes, and first-apply consistency after reconnecting.
1.1.0
- Added automatic custom hammer category creation for piece overrides, so entries like
category: Storagecan create usable hammer tabs. - Reduced effect reference noise by hiding no-op
healthOverTimeandattackDamage: Noneentries. - Optimized hammer category normalization and consolidated ZNetScene startup handling.
1.0.11
- Fixed global item stack and weight multipliers restoring full item baselines on unrelated items.
- Kept stack and weight multiplier application independent so each option only touches its own field.
- Improved compatibility with mods that patch item durability or other shared item fields at runtime.
1.0.10
- Fixed item attack health percentage costs being clamped to 1%, which could make BloodMagic weapons consume far less health than intended when applied through DataForge.
- Clarified item attack
costcomments so the fourth value is documented as a percent value, e.g.40means 40%.
1.0.9
- Added
visual.scalefor item attach/drop meshes while keepingicon: autosnapshots readable. - Added status-effect icon reuse with
icon: item:ItemPrefabName. - Removed item attack
projectileandspawnOnTriggerYAML fields to keep attack overrides focused.
1.0.8
- Added item attack projectile overrides for primary and secondary attacks.
- Added full scaffold and reference output for
projectile: prefab, velocity, velocityMin, count, accuracy, accuracyMin. - Kept default projectile tuples hidden from compact reference files.
1.0.7
- Added
spawnOnTriggersupport for primary and secondary item attacks. - Improved auto icon cache invalidation with renderer fingerprints and stale cache pruning.
- Fixed auto icon snapshots blending together when multiple icons are generated in the same startup pass.
- Clarified recipe YAML header examples for result amounts and suffixed recipe keys.
1.0.6
- Changed DataForge's VNEI compatibility lookup to resolve only the required VNEI types from the VNEI plugin assembly.
- Reduced HarmonyX reflection warnings caused by VNEI's optional EpicLoot compatibility type when EpicLoot is not installed.
1.0.5
- Delayed item, recipe, piece, and status-effect override application until the game data is fully ready.
- Improved status-effect VFX/SFX prefab resolution for effects referenced by other status effects.
- Suppressed missing custom icon warnings on headless dedicated servers.
- Improved status-effect clone cleanup and refresh across reloads and world transitions.
1.0.4
- Added tooltip lines for status-effect attack damage and skill experience modifiers.
- Added localization defaults and improved missing localization fallback for status-effect tooltips.
- Added piece scale and visual material overrides, plus
stationExtension: Nonesupport. - Added automatic VNEI reindexing after DataForge item, recipe, and piece changes.
- Improved piece crafting-station component overrides for adding and removing DataForge-managed stations.
1.0.3
- Added a client-side hammer highlight for crafting stations and their station extensions.
- Changed the weight multiplier option to apply to all item weights while preserving explicit item YAML
weightoverrides. - Kept stack multiplier behavior limited to stackable items.
1.0.2
- Changed the mod author/GUID to
sighsorry.DataForge.
1.0.1
- Removed dynamic loading of
UnityEngine.ImageConversionModulefrom item and status-effect icon loaders. - Added a static
UnityEngine.ImageConversionModulebuild reference so custom icon loading and auto-icon cache PNG export keep working without runtime module probing. - Improved package validation compatibility for Thunderstore by avoiding dynamic Unity module loading.
- Added status-effect ownership interop support so DataForge-owned status effects can be treated as exclusive by companion mods.
- Improved hammer comfort UI behavior, including same comfort-group highlighting and hidden-piece masking compatibility.
- Documented
stationExtensionadd/remove behavior for piece overrides.
1.0.0
- Initial public release of DataForge.