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.
CookBook
A quality-of-life mod for Risk of Rain 2 that provides a structured, searchable, and expandable view of craftable items and their possible crafting paths.
CHANGELOG
Changelog
Dates are listed in MM/DD/YY format.
v1.3.1 - 4/2/26
Fixed
- Fixed single-ingredient recipes softlocking the crafting station due to incorrect ingredient count (CountA=1 instead of 2).
- Fixed NullReferenceException on game exit caused by accessing destroyed Unity objects during shutdown.
- Fixed non-host multiplayer softlock by replacing a fixed 200ms delay with SyncVar polling (3s timeout) for NetworkUIPromptController participant release.
- Removed stale
ConsolidatePhysLinqprofiling region.
Changed
- Reverted bundling-oriented abstractions in ColorFaderRuntime and CookBookUIComponents back to direct fields.
- Performance: Reduced worst-case CraftPlanner compute time by ~82% (400ms -> 70ms).
- Replaced O(D) linked-list walk in
GetNetSurplusForwith O(1) cumulative dictionary lookup, built once per chain at construction time. - Eliminated closure/delegate allocations in
IsRecipeAffordableandCalculateSplitCostsby inlining the 2-ingredient iteration.
- Replaced O(D) linked-list walk in
- PerfProfile: Added per-region min/max exclusive tick tracking for spotting outlier calls.
v1.3.0 - 1/17/26
Added
- Added a border around the adjustable repeat quantity and category filter buttons in the CookBook due to a certain individual's complaints.
- Implemented a reflection-based interop system for CleanerChef, automatically synchronizing "Prevent Corrupted Crafting" logic to ensure compatibility and prevent logic conflicts.
Changed
- Complete CraftPlanner Rewrite
- Now leverages an adjacency-based search algorithm that explores paths based on current inventory surplus rather than checking every recipe blindly.
- Performance & Memory: Reduced worst-case compute time by 74% (570ms -> 150ms).
- Pre-computed bi-directional "Consumer/Producer" indices to enable instant pathfinding.
- Flat Data Structures: Eliminated collection-based recipes in favor of fixed-field structs to maximize CPU cache efficiency.
- Replacing Dictionary-based inventory tracking with lightweight Delta-structs.
- Implementing Bitmask filtering for fast recipe validation.
- Eliminating LINQ overhead in the hot loop via reusable buffer arrays.
- Reduced RecipeChain overhead by only generating step-lists at execution time.
- Search Precision
- Introduced a Tiered Bucket Dominance system (Pareto optimization) to ensure the planner finds the absolute cheapest paths without wasting cycles on redundant chains.
- Unified ingredient permutations (A+B vs B+A) to further shrink the search space.
- User Levers
- Added configuration options to tune bridge-item precision.
- State Tracking
- Optimized stage-presence detection by caching Chef-station status, eliminating scene-wide object searches.
- Introduced an Epoch-based tracking system for throttled computations, ensuring the UI always displays the result of the most recent inventory state and preventing race conditions.
- Synchronized UI events to pass immutable inventory snapshots alongside craftable results, ensuring accuracy and eliminating visual desyncs.
Fixed
- Fixed a bug where the CraftPlanner would wrongly null out on stage end, causing an empty crafting menu.
- Mod settings (Drone Scrap/Pooling) now update the UI instantly when changed in the menu.
- Inventory Lifecycle Management
- Refactored state management to cleanly handle player joins, leaves, and deaths without stale data or "ghost" inventories.
- Drone Tracking
- Implemented a unique Owner-Scoped Key system to fix drones being double-counted or lost during combat.
v1.2.10 — 1/7/26
Fixed
- Fixed drone list not updating after drone death.
- Drone tier is now properly factored into its itemweight calculation.
- Added many safety guards in state controller.
- Fixed Mathematical Value Drift in the planner that caused deep-crafting paths to be culled as inefficient.
- Fixed Signature Collisions by switching to a non-canceling additive hash.
Changed
- Simplified InventoryTracker to only hook oninventorychangeglobal rather than both local and global
- Reduced the complexity of the efficiency culling logic minorly. Tested with all items + quality mod + 5 depth, 650 ms -> 570 ms.
- Hardened crafting logic to protect deeper chains, now properly respects intermediate item surpluses.
- Craftable rebuilds gated to only occur if the dirtied drone index actually contributed to chains.
- Completely rewrote the backend of the crafting handler, now follows vanilla semantics 1:1.
Added
- Added a toggle to visually display the voided item you will receive if you crafting an item you already own the void version of
- added a toggle for debug mode to add some extra prints at the crafting execution stage so you can see how a craft chain looks step-by-step.
- Added a simple integration with cleanerchef to turn off hiding corrupted recipes if cleanerchef is enabled.
v1.2.9 — 1/2/26
Fixed
- Hardened Stage transition logic as it was throwing exceptions due to abort trying to fire on a null craftingcontroller (oops).
Added
- Added cool little indicators for the category selection button (yippee!).
v1.2.8 — 1/1/26
Changed
- Stage entry logic now checks for an existing craftingcontroller (ie a chef) rather than relying on stage transitions.
v1.2.7 — 1/1/26 🎉
Changed (many optimizations)
- Now uses a commutative hash to cheaply cull permutations EARLY.
- Added final pass in recipeprovider to validate and cull all recipes that are permutations of one another, as well as remove all malformed recipes (those that use uncraftable items).
- Moved the logic from IsChainEfficient into IsCausallyLinked to cull chains early.
- Implemented Dominance Culling to kill chains early if a better path exists based on item weighting.
- Updated inventorytracker hook to only fire on real inventory changes (no longer fires from using equipment or gaining/losing temp items).
- Figured out how to change the active equipment slot in a client-safe fashion, automatically happens before the craft is attempted (MUL-T included!).
Added
- Added support for controlling where equipment recipe rows go in the tiermanager sorting.
- Added support for controlling the sort order by index.
- Added support for repeatedly executing a craft chain N times via a text box next to the final craft button.
- Added protection against crafting illegal items (if you own a voided item, blocks using the non-voided version in chains). Toggleable in settings.
v1.2.6 — 12/31/25
Added
- Added sorting support to craftUI to sort based on item type (visual only to avoid recomputation).
v1.2.5 — 12/29/25
Fixed
- Added inter-client confirmation via networked commands so that non-modded users can still participate. It sends the objective in raw text via chat!
- Muted command audio to not play the annoying chat blip on send.
- Further optimized craftplanner backend.
v1.2.4 — 12/29/25
Changed
- Err... I may have accidentally been attempting to call a networked event from the client, which explains why crafting wasnt working on non-host clients in multiplayer... Fixed now!
- Finalized chat-based networking! invisible to the player, and completely avoids the messy ror2 netcode!
v1.2.3 — 12/28/25
Changed
- Added tint for ingredient sources to differentiate self sourced items from traded items. Cleaned up ingredient icon templating to eliminate runtime costs, just instantiation now.
v1.2.2 — 12/28/25
Added
- Multiplayer pooling support, please provide feedback on this. it relies on the SPEX npc to transfer items between allied players.
- Added Risk_Of_Options integration for configuring crafting depth, multiplayer pooling, and other relevant features. Please suggest any other configurable settings that are missing.
Changed
- Further optimized the craftexecutionhandler to now only handle iterating through the steps generated by the craftplanner. The craftplanner now properly adds drone scrap and/or trading steps.
- To provide more choice for the user , item trades and Drone Scrap paths are now shown in parallel rather than exclusively preferring a specific route type.
v1.2.1 — 12/28/25
Fixed
- Refactored the craftplanner backend filtering to be more lenient on potentially useful crafting chains (ex:4x drones -> 4x green scrap -> 2x regen scrap -> red scrap), while still culling wasteful chains before ui time.
Changed
- RecipeProvider now consolidates bulked recipes (recipes with more than 1 of an ingredient), allowing cheaper chain traversal as we dont need to iterate over all individual ingredients.
v1.2.0 — 12/27/25
Added
- Added Drone scrap support.
- Added Objectives to make Crafting State more clear to the user.
- Added a hotkey for aborting a craft. Currently set to holding left alt. Will be configurable eventually once I get around to it.
Fixed
- Replaced usage of massive int arrays with sparse dictionaries to greatly reduce memory usage. (11 GB game usage -> ~3.6 with identical inventory).
- No longer fully rebuilds paths on inventory change, preserves unchanged paths from previous snapshot.
- Reduced menu rendering time by nearly a factor of 4 in typical scenarios via sparse reads.
- Fixed the pathrow buttons consuming scroll actions (no one mentioned this somehow :sob:)
Changed
- Reduced pressure on garbage collection from reinitializing a bunch of arrays for calculating chain costs,. Now uses a "scratchpad" that just repeatedly gets cleared (no repeated initialization calls).
- Reworked path planning to take a lazy approach to reduce passive mem usage.
v1.1.0 — 12/18/25
Fixed
- Updated README to include visuals (Why doesn't Thunderstore allow edits?)
v1.0.0 — 12/18/25
Release
- First stable public release
- Core UI, crafting logic, and backend systems finalized
v0.7.2 — 12/17/25
Changed
- Combined pickup logic refactor completed
- Crafting control logic finalized and stabilized
v0.7.1 — 12/16/25
Changed
- Fully working version prior to backend refactor for combined pickup logic
v0.7.0 — 12/15/25
Added
- Completed automated crafting system
- Crafting automation now relies on user pickup events rather than fixed delays
Changed
- Removed naive time-based polling for inventory checks
v0.6.1 — 12/15/25
Changed
- Hardened autocrafting logic
- Craft chains now wait for the user to collect produced items before continuing
v0.6.0 — 12/15/25
Added
- Fully implemented backend for sending craft chains to
CraftingController - Crafting logic now obeys all internal network constraints
- Imitates local user actions for reliability
Compatibility
- Reliable in multiplayer scenarios
- No host-based dependency
v0.5.3 — 12/14/25
Changed
- Optimized menu rendering to avoid reattaching modified UI on repeat renders
- Prevented UI duplication during craft chain execution
Added
- Crafting chain support directly in the UI (visual polish pending)
v0.5.2 — 12/13/25
Changed
- Major backend overhaul of
CraftPlanner - Clean indexing-based planning logic
- Proper aborts on circular, recursive, or redundant recipe paths
Performance
- Cached all major UI references at template creation
- ~20% UI rendering performance improvement
v0.5.1 — 12/11/25
Added
- Proper dropdown event handling
- Isolated CookBook UI via its own canvas
Changed
- Reduced menu stutter
- Implemented simple time slicing for row rendering to eliminate menu-open hitching
v0.4.0 — 12/11/25
Added
- Initial implementation of dropdown menus
Changed
- Frontend UI refactor
v0.4.2 — 12/08/25
Changed
- Updated UI icon prefab
v0.4.1 — 12/08/25
Added
RecipeCountfield to recipe chains- Recipes producing different quantities are now treated as distinct entries
Changed
- Partial
CraftUIupdate - Planned migration toward RoR2-native prefab styling
v0.4.0 — 12/07/25
Added
- Seamless insertion of CookBook into vanilla crafting UI
- Dynamic resizing based on vanilla UI dimensions
- Recipe list populated directly from
CurrentCraftablesevents
Performance
- Cached each built row for fast, render-only searching
- No row recomputation or culling required
v0.3.3 — 12/04/25
Changed
- Hardened UI positioning against resolution scaling
- All layout derived from base UI dimensions
v0.3.2 — 12/04/25
Changed
- Reduced debug and print verbosity for proven systems
v0.3.1 — 12/07/25
Fixed
- Edge case where Chef UI could fail to detach on stage transitions
v0.3.0 — 12/04/25
Added
- Began prototyping UI layout and injection for custom features
Changed
- Cleaned up Chef NPC dialogue hooks
v0.2.4 — 12/03/25
Removed
- Several external dependencies
- Removed R2API entirely
- Removed all reflection usage
Changed
- General codebase cleanup
v0.2.3 — 12/03/25
Changed
- Refactored overall architecture
Pluginnow handles initialization only- Introduced
StateControllerto manage events and UI interaction
v0.2.2 — 12/03/25
Fixed
- Minor bugs in
TierManager
Changed
- Proper initialization of tier manager
- Reduced verbosity in state controller (logic proven stable)
v0.2.1 — 12/03/25
Changed
- Hardened
CraftPlannerlogic
v0.2.0 — 12/02/25
Added
- Inventory tracking logic
- Complete recipe provider
- Tier manager for clean sorting and UI organization
v0.1.0 — 12/01/25
Added
- Initial DFS-based dictionary generation
- Fast-read backend foundations