RunicInventoryFix
[AI-generated] NOT a bug in either mod: RunicInventory and Stackmaster simply both use LeftAlt. Stops RunicInventory's mouse lock gesture from swallowing InventoryGrid.OnRightDown, which silently kill
模組介紹 作者原文
RunicInventoryFix
⚠️ 請先讀:這不是 bug / Applicability Notice
中文:
這不是 bug。 Chazman-RunicInventory 和 JStack424-Stackmaster 兩個模組本身都沒有問題,
它們各自都完全按自己的設計正常工作。這只是兩個獨立開發的模組恰好都把 LeftAlt 選作了自己的
修飾鍵,屬於「按鍵撞車」這種純粹的巧合,不是任何一方的編碼錯誤。
- 原模組作者不應被追責。 本補丁與 Chazman、JStack424 兩位作者沒有任何關係,
也沒有經過他們的同意或審查。有問題請找我,不要去打擾原作者。
- 本補丁只在同時裝了這兩個模組、並且你在意 Stackmaster 那套 Alt+鼠標 手勢時纔有意義。
只裝其中一個模組 ⇒ 根本不存在衝突,裝本補丁純屬多餘。
- 本補丁只做一件事:讓 RunicInventory 的鼠標鎖格手勢不再攔截輸入。
不改任何數值、不加任何功能、不碰存檔格式。
- 這是一個取捨,不是「誰對誰錯」:本補丁選擇保留 Stackmaster 的手勢、關掉 RunicInventory 的。
如果你的偏好相反,不要裝本補丁,改成把 Stackmaster 的 Storage-action keybind
修飾鍵從 LeftAlt 換成別的鍵即可(兩個模組的功能都能保住,見文末)。
- 上游任意一方之後若自行解決了這個撞車,請優先升級上游並停用本補丁。
English:
This is not a bug. Neither Chazman-RunicInventory nor JStack424-Stackmaster is defective —
both work exactly as designed. Two independently developed mods simply happened to pick LeftAlt
as their modifier key. It is a plain hotkey collision, not a coding error on anyone's part.
- The original authors should not be blamed. This patch is unaffiliated with and
not endorsed by Chazman or JStack424. Report anything to me, not to them.
- It only matters if you run both mods and care about Stackmaster's Alt+mouse gestures.
With only one of them installed there is no collision at all, and this patch is pointless.
- It does exactly one thing: stop RunicInventory's mouse lock gesture from intercepting input.
No values changed, no features added, no save format touched.
- This is a trade-off, not a verdict: it keeps Stackmaster's gestures and disables
RunicInventory's. If you prefer the opposite, do not install this — instead change
Stackmaster's Storage-action keybind modifier away from LeftAlt (see the end of this page).
🤖 本模組的代碼由 AI 生成(AI Generated),需求、驗證與發佈由人類完成。
它解決的是什麼
兩個模組都拿 LeftAlt 當修飾鍵,而 RunicInventory 的手勢補丁點更靠上游:
InventoryGrid.OnRightDown ← RunicInventory 補丁在這裏(上游)
└─ m_onRightClick 委託
└─ InventoryGui.OnRightClickItem ← Stackmaster 的 Alt+右鍵 掛在這裏(下游)
RunicInventory 的補丁邏輯是:
// InventoryGridRightClickLockPatch.Prefix —— 補丁 InventoryGrid.OnRightDown
return!InventoryRuntime.TryTogglePointerLock(grid, handler);
只要 TryTogglePointerLock 返回 true,Prefix 就 return false
⇒ 原版 OnRightDown 整條不執行 ⇒ 它內部的 m_onRightClick 委託不會被調用
⇒ 掛在下游的 Stackmaster 右鍵功能永遠收不到調用(症狀就是「靜默失效」,連報錯都沒有)。
而 TryTogglePointerLock 在下列情況下都會返回 true:
| 情況 | 結果 |
|---|---|
| RequireLockState() 爲假(鎖功能不可用:尺寸不匹配 / 持久化狀態對不上) | 返回 true ⇒ 掐斷 |
| Alt+右鍵沒落在有效的背包格子上 | 返回 true ⇒ 掐斷 |
| 成功切換了鎖定 | 返回 true ⇒ 掐斷 |
⇒ 實際上「按住 Alt 在玩家背包上點右鍵」幾乎必然掐斷整條鏈路。
順帶澄清一個容易誤判的點:RunicInventory 也補丁了 InventoryGui.OnSelectedItem
(Stackmaster 的 Alt+左鍵落點),但它的 InventoryRuntime.AllowSelectedAction
是恆返回 true(IL 全文只有 ldc.i4.1; ret)⇒ 對左鍵不構成攔截。
也就是說按代碼推演,被真正掐斷的是 Alt + 右鍵,不是左鍵。
它是怎麼修的
TryTogglePointerLock 在 RunicInventory 1.1.9 裏只有一個調用點
(已用 member_refs_dll.py 反查確認),所以補這一個方法就夠:
[HarmonyPatch(typeof(InventoryRuntime), "TryTogglePointerLock",...)] // 實際用反射定位
static bool Prefix(ref bool __result)
{
__result = false;
return false; // false = 不執行原方法
}
⇒ 該方法恆返回 false ⇒ RunicInventory 自己的 Prefix 算出!false = true ⇒ 放行原版
⇒ Stackmaster 的 OnRightClickItem / OnSelectedItem 都能正常收到調用。
爲什麼用 Prefix 跳過,而不是 Postfix 只改返回值(重要)
TryTogglePointerLock 在命中格子時會內部真的調用 ToggleLockAt 去切換鎖定。
若只用 Postfix 改返回值,鎖定依然會被切換(副作用已經發生)—— 而我們要的是「手勢徹底關掉」。
Prefix 跳過原方法還順帶避免了它在「鎖不可用 / 沒點到格子」時彈出的 Notify 提示。
刻意保留、絕不觸碰的部分
| 保留項 | 原因 |
|---|---|
| RunicInventory 鍵盤鎖格鍵(默認 L + LeftAlt) | 它走 Plugin.Update → InventoryRuntime.Tick → KeyboardInput.ShortcutDown(ToggleLock) → ToggleFocusedLock,與本補丁的目標方法無關 |
| RunicInventory 的額外裝備行 / 整理 / 拾取過濾 / UI / 拓撲 | 全部不涉及本補丁的目標方法 |
| Stackmaster 的 Alt+左鍵 / Alt+右鍵 | 這正是要救回來的 |
| Stackmaster 的 Alt+E 存料、合成/建造取料 | 不受影響 |
配置
BepInEx/config/s6652289.RunicInventoryFix.cfg
| 項 | 默認 | 說明 |
|---|---|---|
| SuppressMouseLockGesture | true | 關掉 RunicInventory 的鼠標鎖格手勢。設 false = 本補丁什麼都不做,衝突照舊 |
| Verbose | true | 打印補丁安裝與目標籤名確認細節 |
⚠️ 開關不支持熱切換:Awake 時讀取一次,改了要重啓遊戲。
怎麼看它生效了
日誌(BepInEx/LogOutput.log)裏搜 [Fix]:
[Fix] 已打補丁:RunicInventory.Integration.InventoryRuntime.TryTogglePointerLock → Pr
安裝與使用 安裝:BepInEx 外掛
- 本站下載的壓縮包就是模組本體,通常是 BepInEx 外掛(解壓後得到 .dll 或外掛資料夾)。
- 建議流程:用社群模組管理器(如 r2modman)選中本遊戲後匯入該模組,管理器會自動裝好 BepInEx 前置並處理依賴。
- 手動流程:先在遊戲目錄裝好 BepInEx 載入器,再把解壓出的 .dll 或外掛資料夾放進 BepInEx/plugins/。
- 啟動遊戲,BepInEx 控制台會列印載入日誌;確認這個模組出現在日誌裡即為安裝成功。
帶「前置依賴」的模組需要一併安裝,否則不會載入。功能開關通常在遊戲內或外掛自帶的設定檔裡調整。 多人連線時,主機與所有用戶端需要安裝一致的模組。
下面這些內容需要先安裝,否則該模組不會生效: