Mods / Improved Handbook Recipe Helper
- Tags:
- Author:
- Bannta
- Side:
- Both
- Created:
- Apr 23rd at 2:33 AM
- Last modified:
- 5 days ago
- Downloads:
- 5755
-
Recommended download (for Vintage Story 1.22.0 - 1.22.7):
improvedhandbookrecipesfork-1227.0.5.zip 1-click install
This mod streamlines the handbook by allowing you to scroll freely through recipe variants using the mouse wheel. It adds convenient auto-fill buttons and a recipe conflict selector, designed to work across multiple recipe group grids. Additionally, it highlights any missing items when a specific recipe button is selected.
Compatibility:
Buttons added:
= Fill best match
* Max add
+ Add one more
NEXT to cycle between conflicting recipes. T
!IMPORTANT!
-
- Version 1227.0.1 Installs on both client and server to enable recipe cycling.
- Version 1222.0.2: Stays in use if your mod list has no recipe conflicts.
- If you have mod conflicts and need to stay client-side only, then approach the two mod owner and see if they can alter their recipe pattern a little bit in the next release.
-
- Recipe Conflicts: Vintage Story picks the first recipe it loads when mods conflict with vanilla items.
- Error Prevention: Duplicate recipes cause game errors or craft the wrong item.
- Fixing the Issue: The new version lets you cycle choices, or you can ask the mod creator to change the recipe.
Note: The NEXT Button should only become usable when there is a conflict is detected and works in Version 1227.0.1 and above (requires the server to be loaded as well)
The Code is originally forked from the original mods from Kathanon 1.20(https://mods.vintagestory.at/improvedhandbookrecipes) and DArkHekRoMaNT 1.20(https://mods.vintagestory.at/recipeselector)
Also, with inspiration from Gabone 1.21(https://mods.vintagestory.at/improvedhandbookrecipescontinued), adding a neat feature of showing missing ingredients. This was a huge rewrite, as a lot of the code was obsolete for net 10 and 1.22.
Let me know if this breaks anything by wrapping the crash log in a spoiler.
Mods the Complement: The Handbook I enjoy using:
- Tab inventory fix - https://mods.vintagestory.at/show/mod/26291 - Great For Creative Inventory viewing, so you can see all the tabs of the different mods
- Storage Tweaks - https://mods.vintagestory.at/show/mod/45042 - Inventory Sorter
- Survival handbook bookmarks - https://mods.vintagestory.at/show/mod/24989 - Bookmark For recipes
- Handbook Declutterer - https://mods.vintagestory.at/show/mod/35195 - Clean up some commonly used mods and vanilla items not properly grouped
- Simple Handbook Tabs - https://mods.vintagestory.at/show/mod/56714 -- Creates 6 Commonly group tabs (Enhanced Handbook you would need to create and add them yourself, this does) (doesn't conflict with Enhanced Handbook )
- Enhanced Handbook - https://mods.vintagestory.at/show/mod/31745 - You can create groups and drag and drop recipe pages for bookmarking (doesn't conflict with Survival handbook bookmarks ). Note: this will combine the Guids tab. I would use this more for RPG and use it to make a profession tab and such
| Mod Version | Mod Identifier | For Game version | Downloads | Released | Changelog | Download | 1-click mod install* |
|---|---|---|---|---|---|---|---|
| 1227.0.5 | improvedhandbookrecipesfork | 584 | 5 days ago | improvedhandbookrecipesfork-1227.0.5.zip | 1-click install | ||
|
improvedhandbookrecipesfork-1227.0.5
| |||||||
| 1227.0.3 | improvedhandbookrecipesfork | 439 | Aug 27th at 3:37 AM | improvedhandbookrecipesfork-1227.0.3.zip | 1-click install | ||
| |||||||
| 1227.0.2 | improvedhandbookrecipesfork | 471 | Aug 22nd at 6:05 PM | improvedhandbookrecipesfork-1227.0.2.zip | 1-click install | ||
|
improvedhandbookrecipesfork-1227.0.2
| |||||||
| 1227.0.1 | improvedhandbookrecipesfork | 390 | Aug 18th at 3:49 PM | improvedhandbookrecipesfork-1227.0.1.zip | 1-click install | ||
| |||||||
| 1222.0.2 | improvedhandbookrecipesfork | 2786 | May 22nd at 11:45 PM | improvedhandbookrecipesfork-1222.0.2.zip | 1-click install | ||
|
1222.0.2
| |||||||
| 1222.0.1 | improvedhandbookrecipesfork | 145 | May 21st at 11:16 PM | improvedhandbookrecipesfork1222.0.1.zip | 1-click install | ||
| |||||||
| 1.0.0 | improvedhandbookrecipesfork | 940 | Apr 23rd at 2:45 AM | Empty | improvedhandbookrecipesfork-1.22.01.zip | 1-click install | |





improvedhandbookrecipesfork-1227.0.5
Thanks, everyone, for providing the information needed to really dig into the various problems
Oh thank you for this, ill try it later :DD
Thanks a lot!
Update: HoR Performance Optimizer requires a different way to resolve conflicts
Conflicts in general will be resolved directly from the handbook recipe page. What you want to build will be your output in the crafting grid. The Next button will allow you to cycle to the next conflict, only on non-HoR game plays. HoR is too aggressive with its harmony usage, so I can't overlap it without a possible crash (which can happen if a lot of material is being dragged directly on the crafting grid. So, on a HoR system, I'm working on reusing the Next" button to notify of a conflict, and if you click will open up your handbook so if the output is not what you want(because of a conflict), you can be directed to the handbook GUI to find the specific item you really want to build.
-✅Handbook specifying conflicts is working
Thank you so much for the hor compat!!
Just got to playing with it again
It happened again- but it's probably just the other mod's fault-
Running on 64 bit Windows 10.0.22631.0 with 32125 MB RAM
Game Version: v1.22.6 (Stable)
8/27/2026 2:21:02 PM: Critical error occurred in the following mod: horperfopt@1.0.5
Loaded Mods: walkingstick@3.0.10, bearbones@1.0.0, biggerpockets@1.0.6, birdseye@0.1.4, bulkknap@1.1.0, catchledge@0.7.1, clearview@0.1.1, blocklayeroverhaul@1.0.2, deciduoustrees@1.8.2, dodgemaster@1.2.4, dryablegroundstorage@1.0.1, elderscrollscalendar@1.0.0, fastpackeddirtpaths@1.22.3, foodcrate@2.2.1, fragilecharcoal@0.0.1, freelook@1.0.5, fbr@1.0.0, horperfopt@1.0.5, immersivefoliage@0.1.1, JacksFirewood@1.1.0, jsonpatcheslib@1.5.9, millwright@1.3.4, molds@0.3.6, overhaulliblegacycompat@1.2.9, overhaullib@2.0.10, propersticks@0.2.0, prospecttogether@2.2.1, sourceify@1.2.5, stonequarryrepckfipil@3.6.3, temporalwarden@0.1.1, temporalsymphony@2.3.2, temporal_gears_stack@1.0.0, vaultandroll@0.1.2, game@1.22.6, vsimgui@1.2.7, zoombuttonreborn@2.0.4, aculinaryartillery@2.0.0-dev.22, animalcages@5.0.1, animationslib@0.0.2, attributerenderinglibrary@3.2.0, egocaribautomapmarkers@5.0.3, bedspawnv2@1.7.1, bettererprospecting@3.4.5, betterruins@0.6.3, blocksoverlay@4.11.6, bloodtrail@1.2.5, bulkquicklime@1.0.0, butchering@1.14.3, buzzwords@1.8.2, calendarhandbook@1.1.0, carryonlib@1.0.0-pre.8, climbmountain@0.2.4, configlib@1.12.0, containerlessliquidcrafting@1.2.0, customlatitude@1.1.1, danatweaks@4.1.0, desirepaths@0.5.1, enhancedlightningvisuals@0.1.0, extrainfo@2.2.1, farmlanddropswithnutrients@1.2.2, fastmap@122.5.1, fillmybloomery@1.0.3, firearmsfork@1.10.2, fixperishrate@1.0.1, foodshelves@3.0.5, footprints@1.2.5, helvehammerextcontinued@1.9.1, hitfork@2.4.5, hudclockpatch@4.4.1, immersivetpscamera@1.0.8, immersivewoodworking@1.2.0, improvedhandbookrecipesfork@1227.0.3, infinitumcore@1.0.0, jaunt@3.1.0, juicyores@1.0.2, knapster@4.0.0, millwrightvawtaddon@1.0.3, mobsradar@3.0.0, bitzartnickelback@1.2.0, orekiwoofsbeehives@2.0.0, pemmican@0.4.0, placeonslabs@1.2.0, playermodellib@1.23.8, purposefulstorage@2.1.1, ramascurerncy@1.0.0, recyclesails@1.0.0, rivers@5.0.3, roamingbees@2.0.0, ropeandspear@1.1.7, smithingplus@1.9.0-rc.1, statushudcont@4.4.0, tpnetpatched@1.15.1, thirdperson_crosshair@1.0.0, toolsmith@1.2.19, creative@1.22.6, vsecomachina@0.6.1, vsroofing@1.7.2, survival@1.22.6, wallkickswillwork@1.1.0, watersheds@7.0.4, xlibfork@1.0.36, zinkmodautoclayupdate@1.0.4, bloomeryquicklime@1.1.0, butcheringtooldurability@1.0.0, carryon@2.0.0-pre.8, castaway@1.0.6, clicktoggle@1.1.3, combatoverhaulfork@0.18.7, draconis@1.5.0, expandedfoods@2.0.0-dev.14, expieplayermodel@1.2.0, mannyextrafirearms@1.1.3, customplayermodelsaw@0.0.5, infinitumpickuphud@1.3.0, lesslifelessstoraged@0.0.2, purposefulstoragebits@1.0.0, safehouse@1.0.1, smithingplusbugfix@2.0.1, storagetweaks@1.4.1-rc.3, terrainslabs@1.0.17, xinvtweaksfork@1.9.1, xskillsfork@1.0.95, zombpspatch@2.5.1, armoryfork@1.11.1, efmealsmodule@1.0.0-dev.6, mannyhallrifle@1.0.1, mannyjezail@1.0.1, mannyrevolvermusket@1.0.1, xskillsgilded@1.3.50, exoskeletonsfork@0.4.6
Involved Harmony IDs: hor.performanceoptimizer, OverhaulLib:Transpilers, improvedhandbookrecipes, com.freelook.mod
System.InvalidOperationException: Operations that change non-concurrent collections must have exclusive access. A concurrent update was performed on this collection and corrupted its state. The collection's state is no longer correct.
at System.Collections.Generic.HashSet`1.AddIfNotPresent(T value, Int32& location)
at HoRPerformanceOptimizer.CraftingGridPatch.Prefix(GridRecipe __instance, IPlayer forPlayer, IWorldAccessor world, ItemSlot[] ingredients, Int32 gridWidth, Boolean& __result)
at Vintagestory.API.Common.GridRecipe.Matches_Patch3(GridRecipe this, IPlayer forPlayer, IWorldAccessor world, ItemSlot[] ingredients, Int32 gridWidth)
at Vintagestory.Common.InventoryCraftingGrid.FindMatchingRecipe_Patch3(InventoryCraftingGrid this)
at Vintagestory.Common.InventoryCraftingGrid.OnItemSlotModified(ItemSlot slot) in VintagestoryLib\Common\GameContent\Inventory\InventoryCraftingGrid.cs:line 142
at Vintagestory.API.Common.InventoryBase.DidModifyItemSlot_Patch1(InventoryBase this, ItemSlot slot, ItemStack extractedStack)
at Vintagestory.API.Common.ItemSlot.OnItemSlotModified(ItemStack sinkStack) in VintagestoryApi\Common\Inventory\ItemSlot.cs:line 459
at Vintagestory.API.Common.ItemSlot.TryPutInto(ItemSlot sinkSlot, ItemStackMoveOperation& op) in VintagestoryApi\Common\Inventory\ItemSlot.cs:line 222
at Vintagestory.Common.PlayerInventoryManager.TryTransferTo(ItemSlot sourceSlot, ItemSlot targetSlot, ItemStackMoveOperation& op) in VintagestoryLib\Common\GameContent\Inventory\PlayerInventoryManager.cs:line 446
at Vintagestory.API.Client.GuiElementItemSlotGridBase.RedistributeStacks(Int32 intoSlotId) in VintagestoryApi\Client\UI\Elements\Impl\Interactive\Inventory\GuiElementItemSlotGridBase.cs:line 957
at Vintagestory.API.Client.GuiElementItemSlotGridBase.OnMouseMove(ICoreClientAPI api, MouseEvent args) in VintagestoryApi\Client\UI\Elements\Impl\Interactive\Inventory\GuiElementItemSlotGridBase.cs:line 895
at Vintagestory.API.Client.GuiComposer.OnMouseMove(MouseEvent mouse) in VintagestoryApi\Client\UI\GuiComposer.cs:line 505
at Vintagestory.API.Client.GuiDialog.OnMouseMove_Patch1(GuiDialog this, MouseEvent args)
at Vintagestory.Client.NoObf.GuiManager.OnMouseMove(MouseEvent args) in VintagestoryLib\Client\Systems\Gui\GuiManager.cs:line 447
at Vintagestory.Client.NoObf.ClientMain.OnMouseMove_Patch1(ClientMain this, MouseEvent args)
at Vintagestory.Client.NoObf.ClientPlatformWindows.UpdateMousePosition() in VintagestoryLib\Client\ClientPlatform\Input.cs:line 115
at Vintagestory.Client.NoObf.ClientPlatformWindows.window_RenderFrame(FrameEventArgs e) in VintagestoryLib\Client\ClientPlatform\GameWindow.cs:line 102
at OpenTK.Windowing.Desktop.GameWindow.Run()
at Vintagestory.Client.ClientProgram.Start(ClientProgramArgs args, String[] rawArgs) in VintagestoryLib\Client\ClientProgram.cs:line 354
at Vintagestory.Client.ClientProgram.<>c__DisplayClass10_0.<.ctor>b__1() in VintagestoryLib\Client\ClientProgram.cs:line 131
at Vintagestory.ClientNative.CrashReporter.Start(ThreadStart start) in VintagestoryLib\Client\ClientPlatform\ClientNative\CrashReporter.cs:line 95
Event Log entries for Vintagestory.exe, the latest 1
==================================
{ TimeGenerated = 8/6/2026 5:40:40 PM, Site = , Source = Application Error, Message = Faulting application name: Vintagestory.exe, version: 1.22.6.0, time stamp: 0x691d0000
Faulting module name: openal32.dll, version: 1.23.0.0, time stamp: 0x63dd31ad
Exception code: 0x40000015
Fault offset: 0x00000000000df046
Faulting process id: 0x0x4140
Faulting application start time: 0x0x1dd258469edb659
Faulting application path: D:\The Pubs\Vintagestory\Vintagestory.exe
Faulting module path: D:\The Pubs\Vintagestory\Lib\openal32.dll
Report Id: ba4d8a32-5d73-42a1-b15b-1a5790a503e1
Faulting package full name:
Faulting package-relative application ID: }
"The crash is caused by the mod HoR Performance Optimizer failing to handle rapid crafting grid updates safely. When you moved your mouse across the inventory, it triggered a multithreaded conflict in a shared collection while checking recipes."
Because it's not directly pointing at me(to make it easy on me), I need to isolate exactly which recipes(and mods) were being looked at, what gui was your mouse on when the crash happens on, as many details as you can supply
Draging it like this:

Like an L shape
Hmmm, it is my code that is throwing it. I have a version that will turn off the "NEXT" Button if it detects HoR... but that still doesn't resolve conflicts.... So, based on the handbook, what we are you selecting to build, is a known/want, so forcing the conflicting recipe to be what we are looking at might be a better approach and bring this back to a client-only mod.
Current mitigation until I can get this to work...make slower Ls ....lol.
InvalidOperationException) and drops you to the desktop. Explains the L shape drag and dropRedistributeStacks), the mod tried to read or modify a list of recipes (HashSet.AddIfNotPresent) across multiple threads simultaneously. Because the mod's code isn't perfectly thread-safe for this specific action, the collection corrupted itself and crashed your game.hor.performanceoptimizer,OverhaulLib:Transpilers,improvedhandbookrecipe, andcom.freelook.modare all hooking into this same crafting code, which likely aggregated the conflict.Odd, why is free
com.freelook.modrunning in a paused menu? , Had the same issue with AutoWalkExtended, running a loop in a technically paused screen, which means the mod is sloppy(granted, if your on a server, you will continue to walk while in your crafting menu) .. however, it would crash while moving inside the handbook. So we have a loop infreelooklooking for the hook all the time.improvedhandbookrecipesfire a peek to see if the "NEXT" Button generated, to overcomeOverhaulLibis to fire it again to run after. WithHoRit is brute force because it is aggressive and is actively trying to replace its list with the vanilla list, which is still present... so to me it's doing extra work, just not on the GPU---> Try removing this
com.freelook.modmod and repeat the "L" crash. not Freelook - can reproduce without it installedWhy HoR?
Vanilla behavior is a linear scan: call
GridRecipe.Matches()against every single registered grid recipe until one hits, and per their own log, that's 65,561 recipes on a heavily modded server. Doing that dozens of times a second while dragging an item is exactly the kind of per-frame CPU spike that shows up as stutter. HoR method should be in the game. SharedRecipeIndex builds a reverse index once at startup: for every ingredient item ID, which recipes actually use it. So instead of testing all 65,561 recipes against "knife + firewood," GetCraftingCandidates looks up "recipes that mention knife" intersection "recipes that mention firewood" (plus a small wildcard/generic fallback list); their own log showed this cutting it to 10–50 checks for a typical grid. That's roughly a 1000x reduction in.Matches() calls per drag event. So the overall goal is to make sure it (improvedhandbookrecipes) works with HoR, because HoR is definitely an improvement and should be how Vintage Story does the crafting system.I'll take a look at it as soon as I get this hotfix for another mod completed
Yeah I'll revert to the pre HoR version, which is totally fine, mod is incredible even without that.
Been experiencing crashes in the following scenario's, none of which happened before HoR.
I have a 200+ modlist so not cloggin the message up with that, but I've experienced maybe 1 crash in 250 hours of playtime before this update.
Still, nothing but <3 for this mod
System.InvalidOperationException: Operations that change non-concurrent collections must have exclusive access. A concurrent update was performed on this collection and corrupted its state. The collection's state is no longer correct.
at HoRPerformanceOptimizer.CraftingGridPatch.Prefix(GridRecipe __instance, IPlayer forPlayer, IWorldAccessor world, ItemSlot[] ingredients, Int32 gridWidth, Boolean& __result)
at Vintagestory.API.Common.GridRecipe.Matches_Patch2(GridRecipe this, IPlayer forPlayer, IWorldAccessor world, ItemSlot[] ingredients, Int32 gridWidth)
at Vintagestory.Common.InventoryCraftingGrid.FindMatchingRecipe_Patch3(InventoryCraftingGrid this)
at Vintagestory.Common.InventoryCraftingGrid.OnItemSlotModified(ItemSlot slot) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryLib\Common\GameContent\Inventory\InventoryCraftingGrid.cs:line 142
at Vintagestory.Common.InventoryCraftingGrid.DidModifyItemSlot(ItemSlot slot, ItemStack extractedStack) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryLib\Common\GameContent\Inventory\InventoryCraftingGrid.cs:line 147
at Vintagestory.API.Common.ItemSlot.OnItemSlotModified(ItemStack sinkStack) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryApi\Common\Inventory\ItemSlot.cs:line 459
at Vintagestory.API.Common.ItemSlot.TryPutInto(ItemSlot sinkSlot, ItemStackMoveOperation& op) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryApi\Common\Inventory\ItemSlot.cs:line 222
at Vintagestory.Common.PlayerInventoryManager.TryTransferTo(ItemSlot sourceSlot, ItemSlot targetSlot, ItemStackMoveOperation& op) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryLib\Common\GameContent\Inventory\PlayerInventoryManager.cs:line 446
at ImprovedHandbookRecipes.FillGridButton.AddIngredients(ItemSlot[] input, GridRecipe recipe, List`1 available, Boolean max)
at ImprovedHandbookRecipes.FillGridButton.TryFillGrid()
at ImprovedHandbookRecipes.MatchVariantButton.OnClick()
at ImprovedHandbookRecipes.ButtonRTC.Click()
at Vintagestory.API.Client.GuiElementTextButton.OnMouseUpOnElement(ICoreClientAPI api, MouseEvent args) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryApi\Client\UI\Elements\Impl\Interactive\Controls\GuiElementTextButton.cs:line 320
at Vintagestory.API.Client.GuiElementTextButton.OnMouseUp(ICoreClientAPI api, MouseEvent args) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryApi\Client\UI\Elements\Impl\Interactive\Controls\GuiElementTextButton.cs:line 310
at ImprovedHandbookRecipes.ButtonRTC.OnMouseUp(MouseEvent args)
at Vintagestory.API.Client.GuiElementRichtext.OnMouseUp(ICoreClientAPI api, MouseEvent args) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryApi\Client\UI\Elements\Impl\Interactive\Text\GuiElementRichtext.cs:line 532
at Vintagestory.API.Client.GuiDialog.OnMouseUp(MouseEvent args) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryApi\Client\UI\Dialog\GuiDialog.cs:line 593
at Vintagestory.Client.NoObf.GuiManager.OnMouseUp(MouseEvent args)
at Vintagestory.Client.NoObf.ClientMain.UpdateMouseButtonState(EnumMouseButton button, Boolean down) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryLib\Client\ClientMain.cs:line 2031
at Vintagestory.Client.NoObf.ClientPlatformWindows.Mouse_ButtonUp(MouseButtonEventArgs e) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryLib\Client\ClientPlatform\Input.cs:line 214
at OpenTK.Windowing.Desktop.NativeWindow.MouseButtonCallback(Window* window, MouseButton button, InputAction action, KeyModifiers mods)
--- End of stack trace from previous location ---
at OpenTK.Windowing.Desktop.NativeWindow.RethrowCallbackExceptionsIfNeeded()
at OpenTK.Windowing.Desktop.GameWindow.Run()
at Vintagestory.Client.ClientProgram.Start(ClientProgramArgs args, String[] rawArgs)
at Vintagestory.Client.ClientProgram.<>c__DisplayClass10_0.<.ctor>b__1() in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryLib\Client\ClientProgram.cs:line 131
at Vintagestory.ClientNative.CrashReporter.Start(ThreadStart start) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryLib\Client\ClientPlatform\ClientNative\CrashReporter.cs:line 95
System.InvalidOperationException: Operations that change non-concurrent collections must have exclusive access. A concurrent update was performed on this collection and corrupted its state. The collection's state is no longer correct.
at System.Collections.Generic.HashSet`1.FindItemIndex(T item)
at HoRPerformanceOptimizer.CraftingGridPatch.Prefix(GridRecipe __instance, IPlayer forPlayer, IWorldAccessor world, ItemSlot[] ingredients, Int32 gridWidth, Boolean& __result)
at Vintagestory.API.Common.GridRecipe.Matches_Patch2(GridRecipe this, IPlayer forPlayer, IWorldAccessor world, ItemSlot[] ingredients, Int32 gridWidth)
at Vintagestory.Common.InventoryCraftingGrid.FindMatchingRecipe_Patch3(InventoryCraftingGrid this)
at Vintagestory.Common.InventoryCraftingGrid.DidModifyItemSlot(ItemSlot slot, ItemStack extractedStack) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryLib\Common\GameContent\Inventory\InventoryCraftingGrid.cs:line 147
at Vintagestory.API.Common.ItemSlot.OnItemSlotModified(ItemStack sinkStack) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryApi\Common\Inventory\ItemSlot.cs:line 459
at Vintagestory.API.Common.ItemSlot.TryPutInto(ItemSlot sinkSlot, ItemStackMoveOperation& op) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryApi\Common\Inventory\ItemSlot.cs:line 243
at Vintagestory.Common.PlayerInventoryManager.TryTransferTo(ItemSlot sourceSlot, ItemSlot targetSlot, ItemStackMoveOperation& op) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryLib\Common\GameContent\Inventory\PlayerInventoryManager.cs:line 446
at ImprovedHandbookRecipes.FillGridButton.AddIngredients(ItemSlot[] input, GridRecipe recipe, List`1 available, Boolean max)
at ImprovedHandbookRecipes.FillGridButton.TryFillGrid()
at ImprovedHandbookRecipes.MatchVariantButton.OnClick()
at ImprovedHandbookRecipes.ButtonRTC.Click()
at Vintagestory.API.Client.GuiElementTextButton.OnMouseUpOnElement(ICoreClientAPI api, MouseEvent args) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryApi\Client\UI\Elements\Impl\Interactive\Controls\GuiElementTextButton.cs:line 320
at Vintagestory.API.Client.GuiElementTextButton.OnMouseUp(ICoreClientAPI api, MouseEvent args) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryApi\Client\UI\Elements\Impl\Interactive\Controls\GuiElementTextButton.cs:line 310
at ImprovedHandbookRecipes.ButtonRTC.OnMouseUp(MouseEvent args)
at Vintagestory.API.Client.GuiElementRichtext.OnMouseUp(ICoreClientAPI api, MouseEvent args) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryApi\Client\UI\Elements\Impl\Interactive\Text\GuiElementRichtext.cs:line 532
at Vintagestory.API.Client.GuiDialog.OnMouseUp(MouseEvent args) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryApi\Client\UI\Dialog\GuiDialog.cs:line 593
at Vintagestory.Client.NoObf.GuiManager.OnMouseUp(MouseEvent args)
at Vintagestory.Client.NoObf.ClientMain.UpdateMouseButtonState(EnumMouseButton button, Boolean down) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryLib\Client\ClientMain.cs:line 2031
at Vintagestory.Client.NoObf.ClientPlatformWindows.Mouse_ButtonUp(MouseButtonEventArgs e) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryLib\Client\ClientPlatform\Input.cs:line 214
at OpenTK.Windowing.Desktop.NativeWindow.MouseButtonCallback(Window* window, MouseButton button, InputAction action, KeyModifiers mods)
--- End of stack trace from previous location ---
at OpenTK.Windowing.Desktop.NativeWindow.RethrowCallbackExceptionsIfNeeded()
at OpenTK.Windowing.Desktop.GameWindow.Run()
at Vintagestory.Client.ClientProgram.Start(ClientProgramArgs args, String[] rawArgs)
at Vintagestory.Client.ClientProgram.<>c__DisplayClass10_0.<.ctor>b__1() in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryLib\Client\ClientProgram.cs:line 131
at Vintagestory.ClientNative.CrashReporter.Start(ThreadStart start) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryLib\Client\ClientPlatform\ClientNative\CrashReporter.cs:line 95
System.InvalidOperationException: Operations that change non-concurrent collections must have exclusive access. A concurrent update was performed on this collection and corrupted its state. The collection's state is no longer correct.
at System.Collections.Generic.HashSet`1.AddIfNotPresent(T value, Int32& location)
at HoRPerformanceOptimizer.CraftingGridPatch.Prefix(GridRecipe __instance, IPlayer forPlayer, IWorldAccessor world, ItemSlot[] ingredients, Int32 gridWidth, Boolean& __result)
at Vintagestory.API.Common.GridRecipe.Matches_Patch2(GridRecipe this, IPlayer forPlayer, IWorldAccessor world, ItemSlot[] ingredients, Int32 gridWidth)
at Vintagestory.Common.InventoryCraftingGrid.FindMatchingRecipe_Patch3(InventoryCraftingGrid this)
at Vintagestory.API.Common.ItemSlot.OnItemSlotModified(ItemStack sinkStack) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryApi\Common\Inventory\ItemSlot.cs:line 459
at Vintagestory.API.Common.ItemSlot.TryPutInto(ItemSlot sinkSlot, ItemStackMoveOperation& op) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryApi\Common\Inventory\ItemSlot.cs:line 260
at Vintagestory.Common.PlayerInventoryManager.TryTransferTo(ItemSlot sourceSlot, ItemSlot targetSlot, ItemStackMoveOperation& op) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryLib\Common\GameContent\Inventory\PlayerInventoryManager.cs:line 446
at Vintagestory.API.Client.GuiElementItemSlotGridBase.RedistributeStacks(Int32 intoSlotId) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryApi\Client\UI\Elements\Impl\Interactive\Inventory\GuiElementItemSlotGridBase.cs:line 957
at Vintagestory.API.Client.GuiElementItemSlotGridBase.OnMouseMove(ICoreClientAPI api, MouseEvent args) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryApi\Client\UI\Elements\Impl\Interactive\Inventory\GuiElementItemSlotGridBase.cs:line 895
at Vintagestory.API.Client.GuiComposer.OnMouseMove(MouseEvent mouse) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryApi\Client\UI\GuiComposer.cs:line 505
at Vintagestory.API.Client.GuiDialog.OnMouseMove_Patch1(GuiDialog this, MouseEvent args)
at Vintagestory.Client.NoObf.GuiManager.OnMouseMove(MouseEvent args)
at Vintagestory.Client.NoObf.ClientMain.OnMouseMove(MouseEvent args) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryLib\Client\ClientMain.cs:line 2118
at Vintagestory.Client.NoObf.ClientPlatformWindows.UpdateMousePosition() in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryLib\Client\ClientPlatform\Input.cs:line 115
at Vintagestory.Client.NoObf.ClientPlatformWindows.window_RenderFrame(FrameEventArgs e)
at OpenTK.Windowing.Desktop.GameWindow.Run()
at Vintagestory.Client.ClientProgram.Start(ClientProgramArgs args, String[] rawArgs)
at Vintagestory.Client.ClientProgram.<>c__DisplayClass10_0.<.ctor>b__1() in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryLib\Client\ClientProgram.cs:line 131
at Vintagestory.ClientNative.CrashReporter.Start(ThreadStart start) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryLib\Client\ClientPlatform\ClientNative\CrashReporter.cs:line 95
System.InvalidOperationException: Operations that change non-concurrent collections must have exclusive access. A concurrent update was performed on this collection and corrupted its state. The collection's state is no longer correct.
at System.Collections.Generic.HashSet`1.AddIfNotPresent(T value, Int32& location)
at HoRPerformanceOptimizer.CraftingGridPatch.Prefix(GridRecipe __instance, IPlayer forPlayer, IWorldAccessor world, ItemSlot[] ingredients, Int32 gridWidth, Boolean& __result)
at Vintagestory.API.Common.GridRecipe.Matches_Patch2(GridRecipe this, IPlayer forPlayer, IWorldAccessor world, ItemSlot[] ingredients, Int32 gridWidth)
at Vintagestory.Common.InventoryCraftingGrid.FindMatchingRecipe_Patch3(InventoryCraftingGrid this)
at Vintagestory.Common.InventoryNetworkUtil.UpdateFromPacket(IWorldAccessor resolver, Packet_InventoryUpdate packet) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryLib\Common\GameContent\Inventory\InventoryNetworkUtil.cs:line 544
at Vintagestory.Common.InventoryNetworkUtil.set_PauseInventoryUpdates(Boolean value) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryLib\Common\GameContent\Inventory\InventoryNetworkUtil.cs:line 60
at Vintagestory.API.Client.GuiElementItemSlotGridBase.OnMouseUp(ICoreClientAPI api, MouseEvent args) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryApi\Client\UI\Elements\Impl\Interactive\Inventory\GuiElementItemSlotGridBase.cs:line 824
at Vintagestory.API.Client.GuiDialog.OnMouseUp(MouseEvent args) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryApi\Client\UI\Dialog\GuiDialog.cs:line 593
at Vintagestory.Client.NoObf.GuiManager.OnMouseUp(MouseEvent args)
at Vintagestory.Client.NoObf.ClientMain.UpdateMouseButtonState(EnumMouseButton button, Boolean down) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryLib\Client\ClientMain.cs:line 2031
at Vintagestory.Client.NoObf.ClientPlatformWindows.Mouse_ButtonUp(MouseButtonEventArgs e) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryLib\Client\ClientPlatform\Input.cs:line 214
at OpenTK.Windowing.Desktop.NativeWindow.MouseButtonCallback(Window* window, MouseButton button, InputAction action, KeyModifiers mods)
--- End of stack trace from previous location ---
at OpenTK.Windowing.Desktop.NativeWindow.RethrowCallbackExceptionsIfNeeded()
at OpenTK.Windowing.Desktop.GameWindow.Run()
at Vintagestory.Client.ClientProgram.Start(ClientProgramArgs args, String[] rawArgs)
at Vintagestory.Client.ClientProgram.<>c__DisplayClass10_0.<.ctor>b__1() in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryLib\Client\ClientProgram.cs:line 131
at Vintagestory.ClientNative.CrashReporter.Start(ThreadStart start) in C:\Users\Tyron\Documents\vintagestory\game\VintagestoryLib\Client\ClientPlatform\ClientNative\CrashReporter.cs:line 95
Thanks,
Yeah, I've been working on this for a few days HoR is a pain in the butt because of the aggressive memory patching...it provides no wiggle room. So I'm trying to make the Next in the HoR as a indicate and handbook launching button for the conflicted recipe. I did make it auto-fill correctly from the handbook to the grid what you want to make if the item is a conflicting recipe. Hopefully I will have something soon to upload
Massive update, incredible mod.
Much <3
Thanks... I brought it back to life out of necessity; it makes testing a ton of recipes in my other mods so much easier.
improvedhandbookrecipesfork-1227.0.3 - Feature requested by ItzZackyBoi,
omg ty :D
it crashes when I drag items in the grid, can it be am using the wrong version? I lost a chunk of my resources cause of this Unexpected crash
Singleplayer world
Edit: My apologize, It's a conflict with the other mod named
HoR Performance Optimizer
I guess ill just have to wait for a compatibility for this 2 mods
Logs:
Running on 64 bit Windows 10.0.22631.0 with 32125 MB RAM
Game Version: v1.22.6 (Stable)
8/26/2026 12:29:09 PM: Critical error occurred in the following mods: horperfopt@1.0.5, improvedhandbookrecipesfork@1227.0.2
Loaded Mods: walkingstick@3.0.10, bearbones@1.0.0, biggerpockets@1.0.6, birdseye@0.1.4, bulkknap@1.1.0, catchledge@0.7.1, clearview@0.1.1, blocklayeroverhaul@1.0.2, deciduoustrees@1.8.2, dodgemaster@1.2.4, dryablegroundstorage@1.0.1, elderscrollscalendar@1.0.0, fastpackeddirtpaths@1.22.3, foodcrate@2.2.1, fragilecharcoal@0.0.1, freelook@1.0.5, fbr@1.0.0, horperfopt@1.0.5, immersivefoliage@0.1.1, JacksFirewood@1.1.0, jsonpatcheslib@1.5.9, millwright@1.3.4, molds@0.3.6, overhaulliblegacycompat@1.2.9, overhaullib@2.0.10, propersticks@0.2.0, prospecttogether@2.2.1, sourceify@1.2.5, stonequarryrepckfipil@3.6.3, temporalwarden@0.1.1, temporalsymphony@2.3.2, temporal_gears_stack@1.0.0, vaultandroll@0.1.2, game@1.22.6, vsimgui@1.2.7, zoombuttonreborn@2.0.4, aculinaryartillery@2.0.0-dev.22, animalcages@5.0.1, animationslib@0.0.2, attributerenderinglibrary@3.2.0, egocaribautomapmarkers@5.0.3, bedspawnv2@1.7.1, bettererprospecting@3.4.5, betterruins@0.6.3, blocksoverlay@4.11.6, bloodtrail@1.2.5, bulkquicklime@1.0.0, butchering@1.14.3, buzzwords@1.8.2, calendarhandbook@1.1.0, carryonlib@1.0.0-pre.8, climbmountain@0.2.4, configlib@1.12.0, containerlessliquidcrafting@1.2.0, customlatitude@1.1.1, danatweaks@4.1.0, desirepaths@0.5.1, enhancedlightningvisuals@0.1.0, extrainfo@2.2.1, farmlanddropswithnutrients@1.2.2, fastmap@122.5.1, fillmybloomery@1.0.3, firearmsfork@1.10.2, fixperishrate@1.0.1, foodshelves@3.0.5, footprints@1.2.5, helvehammerextcontinued@1.9.1, hitfork@2.4.5, hudclockpatch@4.4.1, immersivetpscamera@1.0.8, immersivewoodworking@1.2.0, improvedhandbookrecipesfork@1227.0.2, infinitumcore@1.0.0, jaunt@3.1.0, juicyores@1.0.2, knapster@4.0.0, millwrightvawtaddon@1.0.3, mobsradar@3.0.0, bitzartnickelback@1.2.0, orekiwoofsbeehives@2.0.0, pemmican@0.4.0, placeonslabs@1.2.0, playermodellib@1.23.8, purposefulstorage@2.1.1, ramascurerncy@1.0.0, recyclesails@1.0.0, rivers@5.0.3, roamingbees@2.0.0, ropeandspear@1.1.7, smithingplus@1.9.0-rc.1, statushudcont@4.4.0, tpnetpatched@1.15.1, thirdperson_crosshair@1.0.0, toolsmith@1.2.19, creative@1.22.6, vsecomachina@0.6.1, vsroofing@1.7.2, survival@1.22.6, wallkickswillwork@1.1.0, watersheds@7.0.4, xlibfork@1.0.36, zinkmodautoclayupdate@1.0.4, bloomeryquicklime@1.1.0, butcheringtooldurability@1.0.0, carryon@2.0.0-pre.8, castaway@1.0.6, clicktoggle@1.1.3, combatoverhaulfork@0.18.7, draconis@1.5.0, expandedfoods@2.0.0-dev.14, expieplayermodel@1.2.0, mannyextrafirearms@1.1.3, customplayermodelsaw@0.0.5, infinitumpickuphud@1.3.0, lesslifelessstoraged@0.0.2, purposefulstoragebits@1.0.0, safehouse@1.0.1, smithingplusbugfix@2.0.1, storagetweaks@1.4.1-rc.3, terrainslabs@1.0.17, xinvtweaksfork@1.9.1, xskillsfork@1.0.95, zombpspatch@2.5.1, armoryfork@1.11.1, efmealsmodule@1.0.0-dev.6, mannyhallrifle@1.0.1, mannyjezail@1.0.1, mannyrevolvermusket@1.0.1, xskillsgilded@1.3.50, exoskeletonsfork@0.4.6
Involved Harmony IDs: hor.performanceoptimizer, OverhaulLib:Transpilers, improvedhandbookrecipes, com.freelook.mod
System.InvalidOperationException: Operations that change non-concurrent collections must have exclusive access. A concurrent update was performed on this collection and corrupted its state. The collection's state is no longer correct.
at System.Collections.Generic.HashSet`1.Contains(T item)
at HoRPerformanceOptimizer.CraftingGridPatch.Prefix(GridRecipe __instance, IPlayer forPlayer, IWorldAccessor world, ItemSlot[] ingredients, Int32 gridWidth, Boolean& __result)
at Vintagestory.API.Common.GridRecipe.Matches_Patch3(GridRecipe this, IPlayer forPlayer, IWorldAccessor world, ItemSlot[] ingredients, Int32 gridWidth)
at ImprovedHandbookRecipes.Patch_GuiDialogInventory_ComposeSurvivalInvDialog.<>c__DisplayClass11_0.<HasMultipleMatchingRecipes>b__0(GridRecipe r)
at System.Linq.Enumerable.ListWhereIterator`1.ToList()
at ImprovedHandbookRecipes.Patch_GuiDialogInventory_ComposeSurvivalInvDialog.HasMultipleMatchingRecipes(IInventory craftingInv, IPlayer player)
at ImprovedHandbookRecipes.Patch_GuiDialogInventory_ComposeSurvivalInvDialog.UpdateButtonVisibility(GuiComposer composer, IInventory inv)
at ImprovedHandbookRecipes.Patch_GuiDialogInventory_ComposeSurvivalInvDialog.RefreshButtonFor(IInventory inv)
at ImprovedHandbookRecipes.Patch_InventoryCraftingGrid_FindMatchingRecipe.RefreshNextButtonPostfix(InventoryCraftingGrid __instance)
at Vintagestory.Common.InventoryCraftingGrid.FindMatchingRecipe_Patch3(InventoryCraftingGrid this)
at Vintagestory.Common.InventoryCraftingGrid.OnItemSlotModified(ItemSlot slot) in VintagestoryLib\Common\GameContent\Inventory\InventoryCraftingGrid.cs:line 142
at Vintagestory.API.Common.InventoryBase.DidModifyItemSlot_Patch1(InventoryBase this, ItemSlot slot, ItemStack extractedStack)
at Vintagestory.Common.InventoryCraftingGrid.DidModifyItemSlot(ItemSlot slot, ItemStack extractedStack) in VintagestoryLib\Common\GameContent\Inventory\InventoryCraftingGrid.cs:line 147
at Vintagestory.API.Common.ItemSlot.OnItemSlotModified(ItemStack sinkStack) in VintagestoryApi\Common\Inventory\ItemSlot.cs:line 459
at Vintagestory.API.Common.ItemSlot.TryPutInto(ItemSlot sinkSlot, ItemStackMoveOperation& op) in VintagestoryApi\Common\Inventory\ItemSlot.cs:line 260
at Vintagestory.Common.PlayerInventoryManager.TryTransferTo(ItemSlot sourceSlot, ItemSlot targetSlot, ItemStackMoveOperation& op) in VintagestoryLib\Common\GameContent\Inventory\PlayerInventoryManager.cs:line 446
at Vintagestory.API.Client.GuiElementItemSlotGridBase.RedistributeStacks(Int32 intoSlotId) in VintagestoryApi\Client\UI\Elements\Impl\Interactive\Inventory\GuiElementItemSlotGridBase.cs:line 957
at Vintagestory.API.Client.GuiElementItemSlotGridBase.OnMouseMove(ICoreClientAPI api, MouseEvent args) in VintagestoryApi\Client\UI\Elements\Impl\Interactive\Inventory\GuiElementItemSlotGridBase.cs:line 895
at Vintagestory.API.Client.GuiComposer.OnMouseMove(MouseEvent mouse) in VintagestoryApi\Client\UI\GuiComposer.cs:line 505
at Vintagestory.API.Client.GuiDialog.OnMouseMove_Patch1(GuiDialog this, MouseEvent args)
at Vintagestory.Client.NoObf.GuiManager.OnMouseMove(MouseEvent args) in VintagestoryLib\Client\Systems\Gui\GuiManager.cs:line 447
at Vintagestory.Client.NoObf.ClientMain.OnMouseMove_Patch1(ClientMain this, MouseEvent args)
at Vintagestory.Client.GuiScreenRunningGame.OnMouseMove(MouseEvent args) in VintagestoryLib\Client\MainMenu\Screens\GuiScreenRunningGame.cs:line 354
at Vintagestory.Client.NoObf.ClientPlatformWindows.UpdateMousePosition() in VintagestoryLib\Client\ClientPlatform\Input.cs:line 115
at Vintagestory.Client.NoObf.ClientPlatformWindows.window_RenderFrame(FrameEventArgs e) in VintagestoryLib\Client\ClientPlatform\GameWindow.cs:line 102
at OpenTK.Windowing.Desktop.GameWindow.Run()
at Vintagestory.Client.ClientProgram.Start(ClientProgramArgs args, String[] rawArgs) in VintagestoryLib\Client\ClientProgram.cs:line 354
at Vintagestory.Client.ClientProgram.<>c__DisplayClass10_0.<.ctor>b__1() in VintagestoryLib\Client\ClientProgram.cs:line 131
at Vintagestory.ClientNative.CrashReporter.Start(ThreadStart start) in VintagestoryLib\Client\ClientPlatform\ClientNative\CrashReporter.cs:line 95
Event Log entries for Vintagestory.exe, the latest 1
==================================
{ TimeGenerated = 8/6/2026 5:40:40 PM, Site = , Source = Application Error, Message = Faulting application name: Vintagestory.exe, version: 1.22.6.0, time stamp: 0x691d0000
Faulting module name: openal32.dll, version: 1.23.0.0, time stamp: 0x63dd31ad
Exception code: 0x40000015
Fault offset: 0x00000000000df046
Faulting process id: 0x0x4140
Faulting application start time: 0x0x1dd258469edb659
Faulting application path: D:\The Pubs\Vintagestory\Vintagestory.exe
Faulting module path: D:\The Pubs\Vintagestory\Lib\openal32.dll
Report Id: ba4d8a32-5d73-42a1-b15b-1a5790a503e1
Faulting package full name:
Faulting package-relative application ID: }
Same, been having crashes left and right on the two 1227 versions.
1222.0.2 works fine with HoR (but the Fill best match feature sometimes doesn't work in this version)
Nice... I see if I can squeeze out compatibility for this
can't seem to get this working on my server
Provide your mod list, you can find a quick list in your server-mainlog, might help me find where it is broken or conflicting at
We have a huge modlist sadly. I can send it but I doubt it would help as it would take you awhile, I'll try and go throught myself and save you the time though! Once/if I find the conflict I'll message here again.
BUT it should be noted it works fine in singleplayer when I'm using the exact same mods.
Multiplayer server or multiplayer from LAN? Do you have HoR running? I'm working on that currently
Multiplayer server, what's HoR?
It started working and then stopped working.. I have no idea why.
I think I know what might be happening; is that the static state is not resetting between world sessions within the same game process. I noticed that if the game is not shut down(all the way to the desktop), starting/relaunching the game back up from the main menu made it seem like the mod was not there (no buttons). Which is a classic stale symptom. I will check that in a few hours...I need some sleep.
But good news: I did solve the crashing problem that HoR was manifesting and resolved conflicts more intuitively. I will release after I double-check the dispose calls, hoplefully the next release will resolve your problem
Interesting interesting.. I too need to sleep lol. Shall check back later.
Can you please add compatability with Overhaul lib legacy compatibility ? It uses its own GUI which overwrites the Vanilla GUI overwriting your NEXT button.
GuiDialogPatches.Patchinstalls a Harmony Prefix onGuiDialogInventory.ComposeSurvivalInvDialog- Thus, strip it.investigating how I can truncate and "win" the Harmony Prefix battle and inject my NEXT into the GUI
Improvedhandbookrecipesfork-1227.0.0
The buttons sometimes appear, sometimes don't. I have to restart the game for them to reappear
For that, I will need your mod list. When it goes missing, look in your client-main. Logs, pull out the mod list, and look for any errors that deal with the handbook
doesnt work for me in Coop
Co-op mode will require the person sharing the world (the server host/ or multiplayer LAN) to have mod version 1227.0.1. However, if you don't have any conflicting recipes and you never use the NEXT button, then downgrade to 1222.0.2
Bug report: it has now stopped working on severs, the buttons are now gone and I cannot auto click the recipes
It needs to be loaded on the server now as well. Did you do that yet? I forgot to update the it is now a client and server mod. It's the only way to allow the "NEXT" button to function properly. If you want Client only functionality then you need to roll back; however, the recipe conflict will not be resolved if you do,
I added this to the description page
!IMPORTANT!
Note: The NEXT Button should only become usable when there is a conflict is detected and works in Version 1227.0.1 and above (requires the server to be loaded as well)
mine is a client only, so that is probably why
For VS Game versions 1.22.x, compiled under 1.22,7, release 1227.01
https://github.com/Bannta/VintageStory-ImprovedHandbookRecipes
So i found the limitation of the "Next" Button: in order to make it work correctly, the mod must become "side": "Universal"... meaning it can not be just client-side. It's currently the only way to enforce correct conflict cycling. There must be a pass on the server side(peek), if not, the cycling will just populate the first choice over and over again. Granted to pro is that this will resolve conflicting recipes globally
Basically, accept the server-side requirement for the live-grid cycling feature only (keep the handbook browsing/fill-grid stuff client-only-safe, which it already effectively is), and let it gracefully no-op on servers without the mod
Added a highlight to indicate a conflict so it's noticeable when it happens.
--------------
Example Conflict: "The recipes in conflict are the Crude Tool Handle recipe from Toolsmith, and the knife variant of the Firewood into Sticks recipe from Sticks from Firewood.
Both are simply a knife above firewood in the crafting grid."
I'll let this linger for a day or two before releasing the update.
The crash is explicitly triggered when clicking a button inside your inventory interface (
OnNextClicked).somewhere here.
OnNextClicked{
_nextPressedPlayers.Add(player.PlayerUID);
_clientChannel?.SendPacket(new NextRecipePacket());
}
So what i need now is what I need now is what item the "Next" Button became active on that cause the fault. I've been trying to find a good items that wakes up the button, but it hard because vintage story usually demands unquie ricepes. I found one once, but there was something shiny on my desk....so i forgot what it was.
Can you provide exactly what item you were trying to craft (modname)?
Thanks!
I was trying to craft the reed skirt from dressed to kill redux
ok, this should prevent any crashing - this will be part of the next release.
public void OnNextClicked(IClientPlayer player)
{
if (_clientChannel == null || !_clientChannel.Connected)
{
// Channel handshake not finished yet (example. clicked just after joining/loading).
// Bail out quietly instead of crashing, the player can just click Next again.
return;
}
_nextPressedPlayers.Add(player.PlayerUID);
_clientChannel.SendPacket(new NextRecipePacket());
}
Any news on that new release?
The next button does even exist in my HUD for some reason. Or does it only appear when there is conflict?
Also, I can't scollwheel to look through variants at all either.
Paste your mod list and any ImprovedHandbookRecipes faults you see in the post
I've got two mods with conflicting recipes, yet the "next" button is greyed out, like there is no such conflict.
Does it only recognize base game recipes?
How can I get it to recognise the conflict?
I need to know exactly which two items and mods they belong to. One of the features of 1.22 is unique recipes, so the conflicting mechanics are rarely ever used or tested. I believe I saw it once but forgot what made it activate, so this would be a good exercise to see if it is still working.
Sorry for being so late:
The recipes in conflict are the Crude Tool Handle recipe from Toolsmith, and the knife variant of the Firewood into Sticks recipe from Sticks from Firewood.
Both are simply a knife above firewood in the crafting grid.
ok, good news: I fixed it thanks to your input. Perfect example of conflict. Bad news: the mod must become "side": "Universal"... meaning it can not be just client-side.
Basically, accept the server-side requirement for the live-grid cycling feature only (keep the handbook browsing/fill-grid stuff client-only-safe, which it already effectively is), and let it gracefully no-op on servers without the mod
Hi, I'm having a problem when I play my game. When I create objects using the guide buttons (=,*;+), the created objects disappear and then only the materials used appear, as if they are disassembled. After that, it no longer lets me create anything manually in the crafting grid and I have to restart the world.
Odd, do this. Go into your logs client, search for anything throwing an error on "improvedhandbook", and while you're in there, copy your mod list
I have this same problem, but it's not this mod that is causing it. At a complete loss as to what mod it *is* because I've got a lot of them, but it drives me crazy lol. If you ever figure out what it is that's causing it please share!!
A mod might help me find it
This mod conflicts with Optitime's "Recipe Lookup" feature, which is a shame because that's a very good fix for games running a lot of mods.
Optitime's BetterHandbook, right?
if so i can dig into the conflicts issue and see if it is something I can fix
While that may also possibly be a conflict, I'm specifically referring to the Recipe Lookup
"Recipe Lookup - Safer crafting-grid lookup with previous-match reuse, positive-result revalidation, and candidate narrowing (default on, opt-out)"
I'm running an extremely heavy pack (250+ mods) and removing your mod allowed me to enable Recipe Lookup which has vastly improved the crafting speed and general handbook use. I haven't enabled Optitime's BetterHandbook, and cannot because it conflicts with A Culinary Artillery. It's a shame, because your mod is really nice (especially scrolling variants. I find the auto-fill too temperamental to work a lot of the time, it'll complain that I lack boards when I very clearly have boards).
There is no "recipe lookup" mod I can find that has that name(a link, please); however, I saw a reference to Optitime . I added to my game, and I'm not seeing a conflict. Does it kill the buttons on my mod? Does it mess up his? a gif pic or throw errors?
One of Optitime's features is the Recipe Lookup which is viewable with the "
.optitime recipe" command. This is not an independent mod, but is part of Optitime's package.When your mod is added, Optitime detects a conflict with your mod and disables Recipe Lookup to prevent issues. This means that your mod runs as expected, but Optitime's Recipe Lookup is disabled.
To see this in action, launch with both your mod and Optitime and run "
.optitime recipe on" which will fail. When your mod is removed, it succeeds.Optitime is an optimization mod, and Recipe Lookup is a good optimization that cannot run along with your mod.
Thanks, that explains it... I keep forgetting that reading is fundamental. I need to review the basic syntax to determine if we can add compatibility to his code.
Would you be opposed to open-sourcing your mod for potential outside help for this?
yes, as it was open source to me, it is the right thing to do
https://github.com/Bannta/VintageStory-ImprovedHandbookRecipes as listed above now. That is the most up-to-date source of magic
"Many Bothans died to bring us this information." ~ Star Wars: Episode VI – Return of the Jedi
Mods the Compilment The Handbook I enjoy using:
working on adding "durability used" to the hoverable tool tip. It was there at one point because I see it in the language file; it must have been broken or overlooked.
Durability cost text intentionally omitted. Here is the problem: ToolDurabilityCost value from recipe JSON (e.g. durability used 13 in my portcullis door 1.5 for the hammer and chisel) does not survive client-side ingredient resolution in 1.22, it always reads back as the default (1), making the displayed number misleading. I can add back the wrench icon in OnHandbookRecipeRender, which still indicates "this ingredient is a tool and will be used/consumed". Unfortunately, that is the best I can do for now
stargazer_andi
Gotcha. Thanks for looking into it!
Any chance we can get the "Recipe will use X durability." tooltip on tools in crafting recipes? https://www.reddit.com/r/VintageStory/comments/1ubfh5i/is_there_a_mod_for_tracking_durability_on_tools/
I believe I track that, so it shouldn't be too hard.
Does this have any impact on the crafting lag that seems to plague vintage story?
The heavier side of the script is the validation, where we pick the best possible build as a secondary. I started a new run, so I'm still looking for food more than building anything yet. However, I've used this to verify all my mods for crafting.
So on my heavily modded main file, item group scrolling is broken (same as https://mods.vintagestory.at/show/mod/47215#cmt-174028) and the button to cycle through conflicting recipes doesn't show up.
Does anyone else have this issue to compare mod lists with me to try to work out where the incompatability is?
strange issue, sometimes i'm unable to craft an item after putting everything in the crafting table, and going into the handbook.
(the item will flash, then disappear making it impossible to craft anything. (seems to happen randomly, or atleast i've not been able to pin down what's causing it exactly; once i'm sure the method to reproduce it, i'll let you know))
the effect persists for any craftable item, the only fix is to exit the world and re-enter it. haven't checked my logs but i don't think anything will be in there.
Just for understanding -The order is;
I'll try to take a look today to see if I can reproduce. Any clarification, error logs, and mod list may help narrow in on this issue. And of course anyone else that can second this issue would be helpful
the issue has happened with flint knives, baskets, rope crafting (specifically from vines)
the items in the crafting grid are there, but they do not appear to be there; if the item is crafted, it is removed from the player's inventory, and the original components given back instead.
i'll try to cause the issue in a bit and see what i can figure out.
i can't seem to make it happen again, it was likely a conflict with
better handbook
https://mods.vintagestory.at/show/mod/50652
or
https://mods.vintagestory.at/show/mod/31745
enhanced handbook
(i was using all 3 together, and its really not needed to..)
after more testing, i don't think its from this mod at all...
unless its a conflict, but i doubt it. ( definitely occured with this mod and enhanced handbook working both enabled)
Cool, which one of these two did you settle on?
Same mystery here, could be a conflict with another one of my hundreds of mods, but I don't use the enhanced handbook mod so whatever it is isn't that.
Some further information
It works fine on a less modded multiplayer server, so it's either a compatibility issue, or its just getting overwhelmed by the sheer amount of extra blocks and recipes added by my modlist.
Also, the button to cycle through conflicting recipes is gone. Didn't notice until I saw it present when in the server it works in. Might be connected to that function?
I have the exact same issue.
it's not from this mod, it seems to be a vanilla issue.
more mods can make it more common, from my testing, but some seem to make it very likely.
Heya, do you know if this mod is incompatible with BetterHandbook (https://mods.vintagestory.at/show/mod/50652)? I see it does do some of the same things, but the feature from your mod that I'm mostly interested in is the conflicting recipe cycling. If so, would you maybe consider making a separate mod that adds only the recipe cycling that would be compatible with other handbook mods? Appreciate your effort xx
not sure, go ahead and try it. I'll give it a go in a few days
A vanilla small lantern does not crash the vanilla handbook on its own. This error occurs because another mod in your list modified or removed the textures/variants of the small lantern. It asked the game to render a small lantern inside the handbook, and the vanilla engine choked on the lantern's texture. The improvedhandbookrecipesfork has button and other item to valid at the same time as the the small lantern texture or variants is found to be null, causing the crash.
There is a possible chance that simple wallpaper, by use obsolete exclude false, however I have loaded this and can not reproduce. The patches are not applying tso it is not working. Suggest removing the 1.20-rc.6, mod: simple wallpaper.
26.5.2026 00:26:52 [Error] Patch 0 (target: game:blocktypes/cloth/wallpaper.json) in game:patches/wallpaper.json failed because supplied path /attributes/handbook/exclude is invalid: The json path /attributes/handbook/exclude was not found. Could traverse until /attributes, but then 'handbook' does not exist. Full json at this path: {
"ignoreSounds": true
}
The other issue could be these mod, however I have loaded these and can not reproduce.
electricalprogressivecore / electricalprogressivebasics / electricalprogressiveqol: These mods heavily overhaul game mechanics and items. If they try to alter lanterns or add electrical variants, they may have broken the base texture mapping
Actually, I'm using a lantern as a crafting ingredient. If I don't include the parameters, the lantern displayed as a material will have the wrong texture.
Which mod is doing " lantern as a crafting ingredient"? I'll load it up and check out what's happening
Upon loading up any saves/create a new world with this mod installed on VS 1.22.2, the game immediately crash without giving out the usual crash log pop up screen. i'll send you the client crash log from the VS file directory since it seems like it's the most important, I can also send you all the client and server logs as well if it helps you troubleshoot the problem :)
FYI - I do use AI to translate crash reports; it's quicker than my eyes, and I always miss something. Plus it's already got all the syntax for debugging, as everything changes 3-6 months every now.
There is a bunch of stumbbling happening in the logs.
Crash 1 knapster@3.1.0: LayeredVoxelRecipe type not found =Knapster using an API type removed in 1.22. Knapster's bug. -> Update to 4.0.0 Knapster,. 3.1. is for 1.21... which is for 1.22 (it why i created the AutoSmith as knapper wasn't updated yet)
So update this first(crash 1) and re-run the game and see if it crashes again.
Crash 2 recipeselectorfork@2.0.0: GridRecipe.Output field not found =this IS relevant.
Also check the rest for updates
Crash 3 vsroofing@1.5.1: NullRef in RoofBlock.RoofVariant during map rendering. VSRoofing's bug.
Crashes 4, 5, 6 smithingplus@1.9.0-rc.1: NullRef in CollectibleBehaviorRepairableTool.GetHeldItemInfo. SmithingPlus's bug.
Crash 7 NaN position: Physics/movement issue, no mod culprit listed. Likely a teleport/translocator interaction.
Crash 8 configlib@1.12.0: NullRef in VSImGui. ConfigLib/VSImGui bug.
The one that affects me is crash 2.
Hi, since the latest update I can no longer use the scroll wheel to scroll through recipe or item variants. There are no errors in the logs that I've found.
huh?, I didn't even know there was a scroll wheel function. I'll take a look, thanks!
I'm not able to reproduce. I'm able to scroll. It appears to be a recipe behind(not lining up when you freeze the variant)
Hi, I was finally able to do some testing. I apparently jumped from mod version 1.0.0 (zip named 1.22.01) to 1222.0.2 (the latest zip). My process:
No other mods were changed when swapping between these 2.
In both versions, I can use the mouse wheel to scroll through variants in the "recipe" section, it's just the "ingredient for" and "can be placed into/onto" sections that broke, for every page in the handbook. Interestingly, the mouse wheel has the "bugged" behavior no matter the mod version if the "ingredient for" section is not at the bottom of the handbook page (i.e. the pies under raw redmeat won't scroll, but the various cabinets will for mod version 1.0.0).
What's the best way to send you log files? Granted, there is no error from this mod, only some unrelated errors from other mods (and a shocking number of grid recipe errors from Geodes and Gemstones lol).
Same here
I've found an issue, the recipe for the Iron Trapdoor doesn't work with this mod, the metal plaque recipe overrides. I've deactivated the mod and I could create an Iron Trapdoor with the recipe, so it's definitely an issue with this mod
1222.0.2
Thanks, Timbrage, for bringing that issue up!
release 1222.0.1
Double-checking my portcullis mods new lamp post recipes, and I noticed it wasn't scanning the open chest. I'm too lazy to hand-place 30 block item variations
Hey there! I'm getting a crash mentioning this mod whenever I try to get recipes with 'H' over a blister steel ingot, I'm not sure if it's due to other mods but here's my log for it:
vintageengineering@0.5.4<!--TgQPHd|[]--><!--TgQPHd|[]-->: Retained from your last list, its complex blueprints heavily interact with handbook recipes.vintageengineering@0.5.4. This is 100% a Vintage Engineering bug. It has nothing to do with your mod at all.This has been fixed in the latest build and will be publicly available at the end of the month.
Ah I see, thank you kindly!
Does this only work for recipes that conflict with vanilla item crafting? I'm attempting to use this mod with Shadehouse and Purposeful Storage installed and the mod isn't able to see the recipe conflict between Gear Rack and Shade Door.
I'll check it out
a conflict would be as an Example: axe + firewood = titan class nuclear missile(example mod) & axe + firewood = 2 Sticks(firewood to stick mod), at that point the "Next" Button should be selectable
Yee. The two items I'm referring to have the same recipe (1 plank in the top left & middle slots, 1 stick in the middle left & middle-middle slots, and 1 plank in the bottom left & bottom middle slots.)
The developer of Shadehouse has updated their mod so that Shadedoors no longer conflict with Purposeful Storage. If you're still interested in checking out what I commented earlier though that'd be appreciated. (Shadehouse v.1.1.1 is the version I was using.)
Thanks, I'll check it out.
What is the difference between "=" and "+"? They both add ingredients for one more item to the crafting grid.
= Fill best match. Just tries to fill it with whatever you have in the inventory that are open near you
+ technically should fill what you stop the ingredients on during its cycling
I am using toolsmith and a firewood to stick mod, and both of them have a recipie of knife over firewood, one for sticks, and one for a crude handle. The cycle next button does not appear despite this being a clear conflict of recipes.
checking
All the recipes are unique
knife + handle = Stick (toolsmith)
knife + firewood = crude handle (toolsmith)
axe + firewood = Sticks (firewood to stick mod)
All the recipes are unique, a conflict would be Example: axe + firewood = crude handle(toolsmith) & axe + firewood = (firewood to stick mod)Sticks, at that point the "Next" Button should be selectable
Tasks to do:
Bannta I'm the author of Storage Tweaks. I just tested with the latest version of my mod and it seams to work now. I've made some changes to get player inventory lib to work which seams to also have fixed compatibility with this mod. I'll upload the version soon. It'll be in 1.2.3 of my mod.
Thank you! I've been knee deep in my Portcullis mod all week.
Actually that might've been a fluke. It seams with your mod enabled my AddDialogTitleBar sometimes doesn't get executed.
So I actually found a fix. For some reason my AddDialogTitleBar function/patch never got run for the inventory gui with your mod. But if I also added a postfix patch for ComposeSurvivalInvDialog then AddDialogTitleBar got run. So now I'm just patching both, ComposeSurvivalInvDialog being the fallback but I'm never adding my buttons in ComposeSurvivalInvDialog because AddDialogTitleBar runs first and works. It's weird.
sometimes the next button doesnt work
Example: im trying to copnvert plain cloth into linen (normal) and its conflicting with the item linen headband
wont let me cycle 🥹
will check
I'm not seeing a convert plain cloth into linen (normal)
I see plain cloth in the item linen headband
----
There should be a plain cloth + shears to cut it back into linen, that would be nice.
Tasks to do:
Sadly this mod is incompatible with Storage Tweaks mod, the inventory shortcuts from Storage Tweaks disappear
I'll check, here soon
When player inventory lib is installed the buttons don't show up in my handbook, or there's a weird overlay issue of some kind. Definitely seems to have some issues
I'll check, here soon
i found another issue it seems that the mod struggles with recipes that have multiple variants of the same material like plates in lantern or wood logs in axle recipes
Can you provide a few exact names of lanterns and wood logs in axle recipes to look at.
Thanks
what do you mean exactly ?
gold lantern, etc... however, I went through everything, so I need you to help me find the conflict or provide your mod list.
Can you do a find for "improvedhandbookrecipesfork" errors in your client and or server logs. If you can't find any errors than copy and paste your mod list... You can get that in your logs as well, check both client-main and server-main.log.
I can match what you have and check for any conflicts or try to reproduce.
Thanks
@ElTioGaara
In my case it works in a way :
When I press H ( when inventory is closed ) i have original handbook
When I press H ( when inventory is opened ) i have improved handbook
So maybe this the issue....
When I press H ( when inventory is closed ), I have the original handbook - yes, this is the normal reaction. The improved needs that the crafting window be open. It's using that as a reference to determine some of the functions.
When I press H ( when inventory is opened ), I have the improved handbook - Yes, this is the only state the improved handbook should appear. The inventory crafting GUI must be open.
Thank you for responding quickly.
Makes sense! I think all these kinds of mods require the player inventory (and crafting grid) to be open to work - but it might make for a better user experience if pressing H when player inventory is closed, opens the inventory then the improved handbook! If people are using your improved handbook mod, it's because they want YOURS, not the vanilla.🏆
Needing to pop open the player inventory first is an accepted part of any of these handbook->craft mods, automating it makes for a cleaner UX.
It doesn't seem to work on version 1.22.1. I downloaded it today and when I opened the game, it showed nothing, just the normal handbook, without any of the features your mod adds.
not able to reproduce. Can you do a find for "improvedhandbookrecipesfork" errors in your client and or server logs. If you can't find any errors than copy and paste your mod list... you can get that in your logs as well. I can match what you have and check for any conflicts.
Reason why the helper will not work:
Example of a mods list: This is what I'm currently running at the moment:
my mod list:
AWearableLight-v1.1.7.zip, improvedhandbookrecipesfork-1.22.01.zip, configlib_1.12.0.zip, HudClock_4.2.3_VS1.22.1.zip, FlexibleTools-3.6.1.zip, th3dungeon_0.5.0.zip, XLib Fork v1.0.2.zip, xSkills Fork v1.0.11.zip, bettererprospecting_3.2.3.zip, foodshelves_3.0.1.zip, animalcages_v5.0.0.zip, StoneQuarryRepacked.3.6.2.zip, TallowCandle_1.0.1.zip, HelveHammerExtentsions.zip, TrashBinned_0.4.2.zip, farseer_1.4.0.zip, lunchbox_1.3.2.zip, vsimgui_1.2.2.zip, EternalS-Backpacks-3.0.1.zip, justthepepper-2.0.0.zip, CarryOn-1.22.0_v1.14.0.zip, coralcarbonate.zip, particlesplus-2.5.8.zip, CommonLibForked_VS1.22.0_net10_v2.8.1.zip, jsonpatcheslib_1.5.1.zip, stonebakeoven_1.2.2.zip, autoconfiglib_2.0.10.zip, unhallowedpatches_v2.0.1.zip, storagecontroller 1.2.2.zip, FullDrop_1.0.4.zip, ExtraInfo-v2.0.0.zip, primitivesurvival_5.0.5.zip, overhaullib_2.0.3.zip, projectiletracker_1.0.7.zip, infinitumpickupmod_1.2.9.zip, BetterSmelting_0.3.0.zip, buzzwords_1.8.2.zip, draconis_1.4.0-pre.2.zip, zoombuttonreborn_2.0.2.zip, Plainsandvalleys-v1.0.13.zip, jaunt_3.0.0-rc.3.zip, FotSA-Machairodontinae-v1.1.9.zip, FotSA-Caninae-v1.1.5.zip, FotSA-Capreolinae-v2.0.12.zip, AttributeRenderingLibrary-v3.0.0.zip, rivers_5.0.0.zip, sortablestorage_3.0.0.zip, BetterRuinsv0.6.0.zip, Toolsmith Fork v1.2.20.zip, lakulsenhancedvanillatrees.zip, biggerpocketsv1.0.6.zip, betterentitytooltip_1.1.0.zip, CrimsonsUpgradableStorage_v1.1.7.zip, Th3DungonTopEntrance_0.4.2.zip
that's al mods i have intslled, hope it helps :D
OS: Kubuntu 26.04 LTS
KDE Plasma: 6.6.4
KDE Frameworks: 6.24.0
Qt: 6.10.2
kernel: 7.0.0-14-generic (64 bits)
Gaphic Platform: Wayland
AMD Ryzen 5 5600X
32 GiB of RAM
AMD Radeon RX 6650 XT
@bannta it is really random and sometimes the same item would return to normal after closing and opening the handbook so it isn't specific to one item
"Issue that the buttons are sometimes blacked out, but they still work?" - Anyone else seeing this issue? may help me narrow in on the issue that darklord1622
Thanks!
my game crashed when i tried openning the handbook on a stick
edit: nevermind i fixed it but there is still the issue that the buttons are sometimes blacked out but they still work
does this work for 21.6? if not can u make an update for it
use please use Gabone https://mods.vintagestory.at/improvedhandbookrecipescontinued
BLESS
thanks
lol, I left this in Draft... Enjoy, it's one of the mods I can't live without.