InventoryChangedCompat
Restores the Inventory.Changed() overload removed in Valheim 1.0. Fixes mods that silently stop consuming crafting materials.
模組介紹 作者原文
InventoryChangedCompat
발헤임 1.0에서 제거된 Inventory.Changed() 오버로드를 메모리상에서 복원하는 BepInEx 프리로더 패치입니다.
문제
발헤임 1.0에서 시그니처가 바뀌었습니다.
1.0 이전: void Inventory.Changed()
1.0.12: void Inventory.Changed(bool success, bool cheatedStateChanged)
무인자 버전이 삭제되면서, 이를 호출하는 구버전 모드들이 MissingMethodException을 던집니다.
Method not found: void.Inventory.Changed()
AzuCraftyBoxes에서는 이것이 재료 무한 복사로 이어집니다. 이 모드는 Player.ConsumeResources에
Prefix를 걸어 바닐라 차감을 막고 자체 로직으로 상자에서 재료를 빼는데, 그 과정에서 위 예외가 발생하면
catch 블록으로 빠진 뒤 false를 반환합니다. 결과적으로 바닐라 차감도 막히고 자체 차감도 실패해서
아이템만 생기고 재료는 그대로 남습니다.
동작
프리로더 단계에서 assembly_valheim의 Inventory 타입에 무인자 Changed()를 주입하고,
내부에서 Changed(false, false)를 호출하도록 연결합니다.
ldarg.0
ldc.i4.0 // success = false
ldc.i4.0 // cheatedStateChanged = false
call void Inventory::Changed(bool, bool)
ret
인자값은 바닐라의 아이템 제거 경로(Inventory.RemoveItem, RemoveOneItem, StackAll,
MoveAll, MoveItemToThis)가 모두 Changed(false, false)로 호출하는 것과 동일하게 맞췄습니다.
- DLL을 수정하지 않습니다. 메모리상에서만 동작하므로 모드 업데이트에 영향을 주지 않습니다.
- 이미 무인자 Changed()가 존재하면 아무것도 하지 않습니다. 제작자가 정식 대응하면 자동으로 비켜섭니다.
- AzuModsValheim1Compat과 함께 써도 됩니다. 서로 다른 멤버를 다룹니다.
영향받는 것으로 확인된 호출부 (AzuCraftyBoxes 1.8.15)
VanillaContainer.ProcessContainerInventory.Save, BackpackContainer ×2,
GemBagContainer ×3, FireplaceInteractPatch.Prefix, Turret_UseItem_Patch.Prefix — 총 9곳.
화로에 장작 넣기, 발리스타 탄약 장전도 같은 예외로 실패합니다.
주의
제작자(Azumatt)의 정식 대응이 나오면 그것을 쓰는 것이 좋습니다. GitHub master에는 1.8.19까지
커밋되어 있으나 아직 에 배포되지 않았습니다. 이 패치는 그때까지의 임시 대응입니다.
安裝與使用 安裝:BepInEx 外掛
- 本站下載的壓縮包就是模組本體,通常是 BepInEx 外掛(解壓後得到 .dll 或外掛資料夾)。
- 建議流程:用社群模組管理器(如 r2modman)選中本遊戲後匯入該模組,管理器會自動裝好 BepInEx 前置並處理依賴。
- 手動流程:先在遊戲目錄裝好 BepInEx 載入器,再把解壓出的 .dll 或外掛資料夾放進 BepInEx/plugins/。
- 啟動遊戲,BepInEx 控制台會列印載入日誌;確認這個模組出現在日誌裡即為安裝成功。
帶「前置依賴」的模組需要一併安裝,否則不會載入。功能開關通常在遊戲內或外掛自帶的設定檔裡調整。 多人連線時,主機與所有用戶端需要安裝一致的模組。
下面這些內容需要先安裝,否則該模組不會生效: