EasyBuild
[AI-generated] Build, repair (boats included) and remove with the hammer without needing a workbench nearby. Client-only, no server sync.
模組介紹 作者原文
EasyBuild —— 隨處建造(免工作臺)
AI 生成聲明:本模組由 AI 智能體(WorkBuddy)在用戶的明確需求與逐項驗收下編寫;
功能設計、真機測試與發佈決定均由用戶主導。
用建築錘 建造 / 修復(含船、車)/ 拆除 時,不再要求工作臺、熔爐、石匠臺等製造站在附近。
順手也解除了「你得先發現過該工作站,部件纔會出現在錘子菜單裏」這條門檻。
純客戶端模組:無 Jotunn 依賴、無 ServerSync、無 NetworkCompatibility 聲明。
- 效果一覽
| 動作 | 原版行爲 | 裝了這個之後 |
|---|---|---|
| 放置需要工作臺的部件(石牆、鐵梁、熔爐件、傳送門件…) | 工作臺不在附近 → 點擊無法放置,彈出提示 | 任意地點都能放置 |
| 修復建築 / 船(維京長船等)/ 車 | 同上,判定失敗就不給修 | 遠航途中、野外都能修 |
| 拆除已建部件 | 同上 | 任意地點都能拆 |
| 錘子菜單裏"需要你還沒見過的工作臺"的部件 | 灰掉 / 不出現 | 全部可見可選 |
不會變:材料照樣消耗(不是免費建造)、地形/支撐/水深/阻擋判定照舊、禁建區照舊、守衛石(私人區域)保護照舊、工作臺等級與配方系統照舊。
- 原版的門檻到底在哪(IL 反彙編實證)
| 動作 | 原版判定鏈 |
|---|---|
| 建造放置 | Player.UpdatePlacement() → Player.HaveRequirements(piece, RequirementMode.CanBuild),返回 false 就彈提示並中止 |
| 修復 | Player.Repair() → 先過 Player.CheckCanRemovePiece(piece) |
| 拆除 | Player.RemovePiece() → 同樣先過 Player.CheckCanRemovePiece(piece) |
兩處判定最終都落在同一個條件上:
if (piece.m_craftingStation!= null // 這個部件需要某個製造站
&&!CraftingStation.HaveBuildStationInRange(stationName, 玩家位置)) // 而附近沒有
{
// 建造:HaveRequirements 返回 false
// 修復/拆除:CheckCanRemovePiece 返回 false 並提示
}
關鍵事實:Piece.m_craftingStation 在整個 assembly_valheim.dll 裏只有 3 個讀取者、沒有任何寫入者——
就是上面這兩處判定,加上 Hud.SetupPieceInfo(部件信息面板裏"需要 工作臺 xxx"那一行)。
所以只要把這個字段清掉,"需要工作臺"這個概念就從這個部件上徹底消失了。
- 實現方式(核心只有幾行)
在 Piece.Awake 的 postfix 裏把 m_craftingStation 置爲 null:
- 建築部件 prefab 一被激活就生效;Instantiate 出來的實例繼承 null,
所以舊存檔裏已經蓋好的建築、船也自動適用。
- ZNetScene.Awake 兜底:場景加載後再把所有 prefab 掃一遍(防其它模組動態塞值)。
因爲原版三處判定讀的是同一個字段,這一個改動同時覆蓋了建造、修復、拆除和菜單解鎖。
- 配置
文件:BepInEx/config/easybuild.client.only.cfg
| 分區 | 鍵 | 默認 | 說明 |
|---|---|---|---|
| 1 - 隨處建造 | Enabled | true | 總開關。關掉即完全回到原版行爲。 |
| 1 - 隨處建造 | SweepAllPrefabsOnSceneLoad | true | 場景加載時兜底掃描所有部件 prefab。 |
| 2 - 日誌 | VerboseLog | false | 每剝離一個部件打一行。平時建議關掉。 |
注意:建造 / 修復 / 拆除 三項是一體生效的,沒法單獨關其中一項 ——
因爲原版這三條路徑讀的是同一個字段(見第 2 節)。
- 聯機說明(重要)
- 純客戶端:沒有 NetworkCompatibility 聲明,不引 Jotunn,不嵌 ServerSync / ConditionalConfigSync
→ 放在 BepInEx/plugins/ 裏不會讓你連不上任何主機,純原版主機也能進。
- 隻影響你自己:建造/修復的資格判定是在每個客戶端本地算的。
所以 主機和隊友不裝這個模組也照樣用;反過來,他們仍然受原版"要工作臺"限制。
- 你放下去的部件、修好的耐久都是正常的 ZDO 變更,主機照常接受,不會掉線或回滾。
- 安裝與卸載
r2modman:Settings → Install from file,選 EasyBuild-1.0.0.zip。
手動:把 EasyBuild.dll 丟進 BepInEx/plugins/ 即可。
卸載:r2modman 裏禁用/卸載,或刪掉 DLL。純運行時改動,不寫存檔、不留殘留。
- 怎麼確認它生效了
日誌(BepInEx/LogOutput.log)裏應該能看到:
[Info: EasyBuild] EasyBuild 1.0.0 開始掛載 Harmony 補丁……
[Info: EasyBuild] 已掛載補丁類:PieceAwakePatch
[Info: EasyBuild] 已掛載補丁類:ZNetSceneAwakePatch
[Info: EasyBuild] Harmony 補丁掛載完成:2/2 成功。
[Info: EasyBuild] ---- 補丁掛載自檢 ----
[Info: EasyBuild] Piece.Awake() prefix=0 postfix=1 OK
[Info: EasyBuild] ZNetScene.Awake() prefix=0 postfix=1 OK
[Info: EasyBuild] -----------------------
[Info: EasyBuild] 兜底掃描完成:檢查了 N 個部件 prefab。
[Info: EasyBuild] 已剝離工作臺需求:M 個部件(見過的部件共 K 個)。例:wood_wall / stone_wall / ship_karve …
遊戲內自測(建議走一遍):
- 跑到離家很遠的地方,造石牆 / 鐵梁(原版需要石匠臺 / 熔爐)→ 應該能成功。
- 開新檔、從沒做過工作臺 → 錘子菜單裏應該能看到全部部件。
- 在海上用錘子修船 → 應該能修。
- 拆掉遠處的部件 → 應該能拆。
- 反向驗證:材料不足時仍然失敗(說明不是免費建造);
在別人守衛石範圍內仍然不能建造/拆除(說明保護沒被順帶解除)。
- 已知限制
- 本模組針對當前版本(Valheim 1.0 程序集,Unity 6000.0.75f1 / BepInEx 5.4.x)。
如果以後遊戲改了字段名,插件會在日誌裏打印「找不到字段 Piece.m_craftingStation」而不是崩潰 —— 屆時把日誌發我即可。
- 與其它"改建造規則 / 改工作臺範圍"的模組同時使用時可能互相覆蓋(例如放大工作臺範圍的模組會變得沒意義)。
- 與"物品耐久 / 修復"類模組不衝突(本模組不碰 WearNTear)。
MIT 精神,自用爲主。有問題帶着 LogOutput.log 找我就行。
安裝與使用 安裝:BepInEx 外掛
- 本站下載的壓縮包就是模組本體,通常是 BepInEx 外掛(解壓後得到 .dll 或外掛資料夾)。
- 建議流程:用社群模組管理器(如 r2modman)選中本遊戲後匯入該模組,管理器會自動裝好 BepInEx 前置並處理依賴。
- 手動流程:先在遊戲目錄裝好 BepInEx 載入器,再把解壓出的 .dll 或外掛資料夾放進 BepInEx/plugins/。
- 啟動遊戲,BepInEx 控制台會列印載入日誌;確認這個模組出現在日誌裡即為安裝成功。
帶「前置依賴」的模組需要一併安裝,否則不會載入。功能開關通常在遊戲內或外掛自帶的設定檔裡調整。 多人連線時,主機與所有用戶端需要安裝一致的模組。
下面這些內容需要先安裝,否則該模組不會生效: