EasyCraft
[AI-generated] Load 5 items per interaction into smelters/refineries with per-station limits (e.g. kiln = wood only). Auto-pull from chests, carts and dropped coal; refuel torches, hearths and the Fro
模組介紹 作者原文
EasyCraft
AI 生成聲明:本模組由 AI 智能體(WorkBuddy)在用戶的明確需求與逐項驗收下編寫;
功能設計、真機測試與發佈決定均由用戶主導。
煉製站點 / 火源的裝填增強。 由 EasyBatchFill 與 EasyNearbyFill 合併而成 ——
合併同時消掉了原先兩者之間那條「必須成對升級、單升一邊 BepInEx 直接加載失敗」的跨程序集硬依賴。
功能
- 批量裝填:一次交互裝入 BatchSize 個(默認 5),取代原版的一次 1 個。
站點:熔爐 / 高爐 / 炭窯 / 風車 / 紡車 / Eitr 精煉廠。
- 站點進料限制(1.0.2 新增):限定某個站點只允許自動裝填指定材料。
默認 = 炭窯只燒木材(不燒細木 / 圓木)。
- 火源加燃料:火炬 / 壁燈 / 篝火 / 火盆 / 竈 一次加 BatchSize 個;
營火(fire_pit)默認走「一次一個」名單:數量保持原版 1 個,
但仍然會從附近箱子自動取木頭 —— 做飯的基礎火一次燒 5 個木頭太快。
- 就近取料:背包料不夠時,從半徑 30 米內的箱子自動補足。
默認認 木箱 / 加固型寶箱 / 黑金寶箱 / 灰石箱 / 桶 / 衣櫃;
個人寶箱與珍寶箱有意排除。
- 板車也算料源(IncludeCarts,默認開):靜止停放的板車/雪橇與箱子同樣會被取料;
正在被拖行的板車會跳過(位置在變,且去接管所有權可能把車搶走)。
⚠️ 不需要把 Cart 加進 AllowedContainers —— 板車走的是獨立的識別通道,
與箱子白名單無關(判斷依據見下方「板車是怎麼被認出來的」)。
- 佔用保護:隊友站在箱子旁就跳過它,避免搶走所有權導致對方物品回彈。
- 霜鑄熔爐加燃料(1.0.7 新增):給霜鑄熔爐(piece_FrostFoundry,官方中文「霜鑄熔爐」)
加液態冰霜($item_frozenfuel)時,也能從附近箱子 / 板車自動取料。
一次 1 個(與原版一致,不做批量)。
爲什麼要單開一項:它掛的是 CookingStation 組件,不是熔爐用的 Smelter ——
原先兩套補丁都覆蓋不到它。詳見下方「霜鑄熔爐(1.0.7 起)」專節。
- 木炭窯聯動(1.0.8 新增):給一座炭窯加木材時,把周圍 10 米內的炭窯一起裝滿
(每座各裝 BatchSize 個)。詳見下方「木炭窯聯動(1.0.8 起)」。
- 地面掉落物(1.0.8 新增):熔爐 / 高爐加燃料時,背包不夠就先撿地上的木炭,
還不夠再找箱子。詳見下方「地面掉落物(1.0.8 起)」。
配置(5 節)
| 節 | 內容 |
| --- | --- |
| 1 - Batch Fill | Enabled / BatchSize / StationOreAllow / FrostFoundryPrefabs / KilnLinkPrefabs / KilnLinkRadius |
| 2 - Fire Sources | Enabled / Exclude / Sources(留空 = 全部火源生效)/ OneAtATime / HoldInterval / RespectToggle |
| 3 - Nearby Chests | Enabled / Radius / GroundPickup / AllowedContainers / IncludeCarts / RespectWards / ClaimOwnership |
| 4 - Safety | SkipInUse / SkipIfPlayerNear / PlayerNearDistance |
| 5 - Debug | DebugLogging |
BepInEx/config/easycraft.client.only.cfg ⚠️ 改完必須重啓遊戲。
板車是怎麼被認出來的(1.0.5 修正)
板車(Cart)與雪橇(Sled)用的都是遊戲的 Vagon 組件,內部各帶一個容器。
它們不在 AllowedContainers 白名單裏 —— 走的是獨立識別通道,兩條信號任一命中即算板車:
| 優先級 | 信號 | 原理 |
| --- | --- | --- |
| 主 | CartRegistry(本模組維護) | 用 Harmony 補丁復刻遊戲自己的 Vagon.m_instances 清單(Awake 里加、OnDestroy 裏刪),再用 Vagon.m_container 反查出對應的容器 |
| 兜底 | Container.m_wagon!= null | 遊戲字段,兩者互相引用 |
爲什麼不用 Container.m_wagon 當唯一依據(1.0.5 修的就是這個):
這個字段在整個遊戲代碼裏零處寫入(只靠預製體序列化),只有 3 處讀取,
且全部帶 null 判斷:
Container.RPC_RequestOpen / RPC_RequestStack / RPC_RequestTakeAll
if (IsInUse() || (m_wagon!= null && m_wagon.InUse())) { 拒絕本次開啓 }
⇒ 說明遊戲本身就預期它可能爲 null,爲 null 時一切正常、沒有任何可見症狀。
而舊版代碼只認它 ⇒ 一旦爲 null,板車就會被當成"名字不在白名單的普通箱子"靜默跳過。
反過來 Vagon.m_container 是必須連的:UpdateMass / UpdateLoadVisualization
都靠它算載重(往板車裏放東西會讓車變沉,這是核心可見行爲)。⇒ 以它爲主信號纔可靠。
什麼情況會跳過板車
| 情況 | 是否取料 | 日誌裏會說什麼 |
| --- | --- | --- |
| 靜止停放 | ✅ 取 | 正常取料日誌 |
| 正在被拖行 | ❌ 跳過 | [板車被跳過] … → 正在被拖行(停放後即可取) |
| IncludeCarts = false | ❌ 跳過 | [板車被跳過] … → IncludeCarts 開關是關的 |
| 有人正開着它的容器 | ❌ 跳過 | [有人正在用] …(受 SkipInUse 控制) |
| 守衛石無權限 | ❌ 跳過 | [守衛石無權限] …(受 RespectWards 控制) |
每條診斷都會帶 板車[是(哪條信號)/否],能直接看出識別有沒有生效。
木炭窯聯動(1.0.8 起)
給一座炭窯加木材,把周圍一圈炭窯一起裝滿。
| 配置 | 默認 | 說明 |
| --- | --- | --- |
| 1 - Batch Fill → KilnLinkPrefabs | charcoal_kiln | 名單裏的窯才聯動;留空 = 關閉 |
| 1 - Batch Fill → KilnLinkRadius | 10 米 | 搜索半徑;0 = 關閉 |
- 每座窯各裝一份(BatchSize 個),各自按剩餘容量封頂 —— 不是總量分攤。
4 座窯 = 各 5 個,共消耗 20 個木材。
- 料源共享(背包 → 附近箱子),按距離由近到遠先到先得。
- ⚠️ 炭窯加木材走的是進料口(OnAddOre)而不是燃料口 ——
炭窯的機制本來就是"把木材燒成木炭"(StationOreAllow 的默認值也印證了這點)。
- 找鄰居:Physics.OverlapSphere + GetComponentInParent()。
必須去重 —— 一個建築身上有多個 Collider,不去重會把同一座窯重複裝填好幾次。
- 你正在操作的那一座先按原邏輯裝(所以"已滿" / "沒料"的提示文案是準的);
它失敗且還沒動過料源時直接交回原版 ⇒ 不會出現"既扣了料、又被原版再扣一次"。
地面掉落物(1.0.8 起)
熔爐 / 高爐加燃料時,取料順序由 背包 → 箱子 變成 背包 → 地面 → 箱子。
| 配置 | 默認 | 說明 |
| --- | --- | --- |
| 3 - Nearby Chests → GroundPickup | $item_coal | 允許從地上撿的物品;留空 = 關閉 |
| (半徑) | 沿用 3 - Nearby Chests → Radius(30 米) | 圓心判據同箱子:機器 或 玩家,命中任一即可 |
⚠️ 生效範圍刻意收窄:只對 Smelter 的燃料口生效 ——
礦石口 / 火源 / 霜鑄熔爐(CookingStation)完全不碰。
名字三種寫法都認(忽略大小寫):$item_coal / item_coal / Coal。
數量爲什麼是準的
地面上一堆物品 = 一個 ItemDrop 對象,真實數量在 m_itemData.m_stack 裏(可能裝着十幾個),
絕不能按"一個對象 = 一個物品"來數。IL 實證:
// ItemDrop.RemoveOne()
if (!CanPickup(true)) { RequestOwn(); return false; } // 沒寫權 → 一個都不取
if (m_itemData.m_stack 💡 現在站點名與箱子名用的是同一套歸一化規則,不會再出現"這個要精確、那個能寬鬆"的混亂。
實現要點
- 站點裝填:Smelter.OnAddOre / OnAddFuel 的 prefix;火源:Fireplace
安裝與使用 安裝:BepInEx 外掛
- 本站下載的壓縮包就是模組本體,通常是 BepInEx 外掛(解壓後得到 .dll 或外掛資料夾)。
- 建議流程:用社群模組管理器(如 r2modman)選中本遊戲後匯入該模組,管理器會自動裝好 BepInEx 前置並處理依賴。
- 手動流程:先在遊戲目錄裝好 BepInEx 載入器,再把解壓出的 .dll 或外掛資料夾放進 BepInEx/plugins/。
- 啟動遊戲,BepInEx 控制台會列印載入日誌;確認這個模組出現在日誌裡即為安裝成功。
帶「前置依賴」的模組需要一併安裝,否則不會載入。功能開關通常在遊戲內或外掛自帶的設定檔裡調整。 多人連線時,主機與所有用戶端需要安裝一致的模組。
下面這些內容需要先安裝,否則該模組不會生效: