PlantEasilyFix
[AI-generated] Compatibility patch for Advize-PlantEasily: keeps grid planting and auto-replant correct when other mods operate on the same placement piece, including large grids. Read the applicabili
模組介紹 作者原文
PlantEasily Fix
⚠️ APPLICABILITY NOTICE — please read this before installing.
This patch was written for my own, heavily modded setup (30+ mods loaded — BepInEx 5.4.2350,
Valheim 1.0.15, 30 enabled mods managed by r2modman). The symptom described below may be caused
by my particular mod combination rather than by a bug in the original mod.
- If you are not seeing exactly this symptom, please don't install this — it may do nothing for you.
- This patch may not apply to your setup at all — with a different mod list the symptom may never appear.
- Even with the same symptom, the root cause may be different — this is only a workaround derived from what I found on my machine.
- I do not claim the original mod is buggy, and no blame is directed at its author.
If you think the original mod misbehaves, please report it to its author first. This is just my
personal "works-on-my-machine" workaround, with no guarantee it works for anyone else.
⚠️ 適用性聲明 —— 請先讀這一段,再決定裝不裝。
本補丁是在我自己那套環境裏做出來的:當時本機同時裝着 30+ 個模組
(BepInEx 5.4.2350 / 遊戲 1.0.15 / r2modman 管理的 30 個啓用模組)。
下面描述的“症狀”有可能是我這套模組組合互相沖突造成的,並不一定是原模組本身的 bug。
- 如果你沒有遇到完全相同的症狀,請不要安裝本補丁 —— 它可能什麼都不做;
- 本補丁可能不適用於你的環境:換一套模組組合,症狀也許根本不會出現;
- 就算症狀一樣,成因也可能不同 —— 本補丁只是我按本機情況查出來的繞行方案;
- 我沒有、也不主張任何“原模組有 bug”的結論,原模組作者與此事無關。
如果你覺得原模組有問題,請先向原模組作者反饋。這只是我個人“能跑就行”的繞行方案,
不保證適用於任何人。
Advize-PlantEasily 的兼容性補丁(純客戶端,不改寫 PlantEasily 任何文件)。
它不針對任何具體模組 —— 只是把幾個模組共用的那幾處運行時狀態歸位,
使多方同時操作同一部件時不再互相干擾:
| # | 歸位什麼 | 一句話 |
|---|---|---|
| 1 | 網格幽靈的座標緩存 | 整片作物不再疊在同一個點(症狀只在多方共存時出現,單獨裝 PlantEasily 時不會發生) |
| 2 | 補種時用的「上次選中作物」 | 收什麼就補回什麼,不再一路沿用同一種 |
| 3 | 網格幽靈的全部格位座標 | 大網格下不再有零星幾株疊在一起(網格調大後纔會出現) |
| 項 | 值 |
|---|---|
| 適用模組 | Advize-PlantEasily 2.2.2(2.0.0+ 邏輯相同,理論通用) |
| 本補丁版本 | 1.2.2 |
| 前置 | BepInEx 5.4.2333+ |
| 類型 | 客戶端補丁(單人 / 聯機客戶端皆可,主機無需安裝) |
| 依賴 | 無(未安裝 PlantEasily 時靜默不做事) |
補丁 1 · 網格幽靈座標
症狀
用 PlantEasily 一次種一片時,整片作物全部疊在同一個點上。
實測:4×4 = 15 個額外幽靈,座標完全相同。
⚠️ 前提:這個症狀只在多方共存的環境裏出現過。
只裝 BepInExPack_Valheim 5.4.2350 + Advize-PlantEasily 2.2.0 時不復現。
例(探針日誌):
ghost[0..14] 全部 pos = (2062.731, 49.423, -4402.94)
不同座標數 = 1 / 15
落點 1..15 全部 pos = (2062.731, 49.423, -4402.94)
機制
放置幽靈的座標並不是每幀都重算的 —— 它帶一層版本號緩存。
把這條鏈拆開看(下面都是反編譯實測,不是推測):
① GhostGrid.InitializeGhosts 先把所有額外幽靈疊在一點
// 重建網格時,每個額外幽靈的位置被直接設成「主幽靈位置」
ExtraGhosts[i].transform.position = 主幽靈位置;
② 真正擺開座標靠 GhostGrid.Update,但它有髒檢查會早退
// GhostGrid.UpdateGhost
if (cache.lastUpdatedVersion == _gridVersion)
return; // ← 判定"已是最新",直接返回,不更新位置
③ 而 GhostCache.Init 不重置 lastUpdatedVersion
// GhostCache.Init —— 只設 piece / plant
this.piece = go.GetComponent();
this.plant = go.GetComponent();
// ★ 沒有重置 lastUpdatedVersion ★
④ 版本號只在「位置/朝向/格數變化」時才自增
// GhostGrid.UpdateGridVersion —— 只有這四種情況會 _gridVersion++
位移 > 0.0001(約 1cm) | BaseRotation 變化 > 1°
有效朝向變化 > 0.1° | Rows / Columns 被改
⇒ 於是當「複用了舊幽靈池 + 位置被重設 + 本幀版本號沒變」三件事撞在一起時
(放置流程尾部會經 Player.SetupPlacementGhost 重建網格,
而站在原處不動、不轉視角時版本號恰好不變),
被複用的幽靈就會帶着"已是最新版本"的緩存直接早退
⇒ 座標停在被重設的那一刻,再也不被修正。
這也解釋了爲什麼症狀看起來時有時無:移動超過 1cm 或轉視角超過 1° 就會讓版本號自增,下一次種植便自動恢復正常。
歸位方式
在 GhostGrid.BuildGrid 之後讓版本號 +1:
[HarmonyPostfix]
static void BuildGridPostfix()
{
int before = (int)_gridVersionField.GetValue(null);
_gridVersionField.SetValue(null, before + 1); // 讓所有幽靈緩存失效
}
緩存立即失效 ⇒ 下一幀 GhostGrid.Update 必定重算每個幽靈的網格座標
⇒ 玩家點擊種植時幽靈已經擺正。
_gridVersion 是 private static int,只有 UpdateGridVersion() 會寫它,
且該函數只會 +1 或保持不變、絕不回退,所以外部 +1 不破壞其單調性。
全程序集反查確認它只被模組內部使用,無跨模組引用。
效果(本機探針實測)
| | 之前 | 之後 |
|---|---|---|
| 幽靈不同座標數 | 1 / 15 | 15 / 15 |
| 落點座標 | 15 個完全相同 | 15 個各不相同 |
日誌(探針版):
[修復] BuildGrid 完成 → _gridVersion 340 → 341
[診斷] Update 後已恢復正常:15 個幽靈分佈到 15 種不同座標 —— 生效
連續 88 次網格重建(含多次種植)全部正常。
補丁 2 · 自動補種按「被收穫的那種作物」
默認行爲
開着 [Harvesting]ReplantOnHarvest 時,收任何作物都補種成"你最近用耕耘機選中的那一種"。
於是混種地塊越收越單一:今天最後種的是胡蘿蔔,明天收大麥、收蘿蔔,全給你補胡蘿蔔。
本補丁把它改成每種作物各補各的。
實現位置(InteractPatches.Prefix 第二重載的 IL 逐條實證)
| IL 偏移 | 邏輯 |
|---|---|
| 003D–0042 | 讀 PlacementState.LastSelectedPlantName 並 IsNullOrEmpty |
| 0049 | 非空 ⇒ 查表鍵 = LastSelectedPlantName ← ★統一補種走這條 |
| 0050 | 爲空 ⇒ 查表鍵 = Utils.GetPrefabName(被收穫物) ← 各補各的
安裝與使用 安裝:BepInEx 外掛
- 本站下載的壓縮包就是模組本體,通常是 BepInEx 外掛(解壓後得到 .dll 或外掛資料夾)。
- 建議流程:用社群模組管理器(如 r2modman)選中本遊戲後匯入該模組,管理器會自動裝好 BepInEx 前置並處理依賴。
- 手動流程:先在遊戲目錄裝好 BepInEx 載入器,再把解壓出的 .dll 或外掛資料夾放進 BepInEx/plugins/。
- 啟動遊戲,BepInEx 控制台會列印載入日誌;確認這個模組出現在日誌裡即為安裝成功。
帶「前置依賴」的模組需要一併安裝,否則不會載入。功能開關通常在遊戲內或外掛自帶的設定檔裡調整。 多人連線時,主機與所有用戶端需要安裝一致的模組。