Source-checkedWeapons, items & crafting

EasyCraft

by s6652289 · for Valheim

[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 Frost Foundry; batch-fill charcoal kilns. Client-only.

568Downloads
38d agoLast updated
BepInExLoaders
ThunderstoreSource

About EasyCraft

From Thunderstore

[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 Frost Foundry; batch-fill charcoal kilns. Client-only.

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<Smelter>()。

必须去重 —— 一个建筑身上有多个 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 <= 1) { m_nview.Destroy(); return true; }
m_itemData.m_stack -= 1;  Save();  return true;

// ItemDrop.CanPickup(bool) 末尾:return m_nview.IsOwner();
// ItemDrop.SetStack(int)  首句:if (!IsOwner()) return;      // 静默失败,所以本模组不用它

⇒ 本模组的做法:

  1. 先 ZNetView.ClaimOwnership()(与箱子取料同一套模式)
  2. Load() 刷新 m_itemData,避免按旧 stack 决定取多少
  3. 只取 min(还需要的, 这堆有的),逐次 RemoveOne() 并按其返回值计数

—— 返回 false 就是没拿到写权,这一下不算数

  1. 遍历前给 ItemDrop.s_instances 做快照(取空会 Destroy,边遍历边改集合会漏项)

宁可少加(下次交互还能补),绝不虚报数量。

霜铸熔炉(1.0.7 起)

问题:给霜铸熔炉加液态冰霜时只能从自己背包拿 1 个,放在附近箱子里的取不过来。

根因:霜铸熔炉(piece_FrostFoundry)挂的是 CookingStation 组件, 不是熔炉 / 高炉用的 Smelter。上面的「批量装填」只接管 Smelter(OnAddOre / OnAddFuel) 与 Fireplace(火源),所以对霜铸熔炉完全没生效。

组件身份是实测的 —— 预制体脚本引用 path_id 交叉比对 (同一 bundle 内,同一个 C# 类只有一个 MonoScript 资产、只有一个固定 path_id, 所以两个预制体引用同一 path_id 即同一个组件):

| 预制体 | 组件脚本 path_id | | --- | --- | | piece_FrostFoundry 霜铸熔炉 | A, B, C, 4793016392223414848 | | piece_cookingstation 烹饪台 | A, B, C, 4793016392223414848 ← 完全一致 | | piece_FrostKiln 霜窑 | A, B, -1171893114429426784, C | | smelter / blastfurnace / charcoal_kiln / windmill / spinningwheel | 都带 -1171893114429426784 |

⇒ -1171893114429426784 = Smelter,4793016392223414848 = CookingStation。 运行日志也一致:Player.log 里 piece_FrostFoundry 零条 EasyCraft 记录, 而同族的 piece_FrostKiln(真·Smelter)有 10 条 [站点燃料口装填]。

Read the full description on Thunderstore →

Highlights

From source data

Loaders

Runs on BepInEx.

Footprint

Rated a light load on a server.

Last update

Its author last shipped an update 38d ago.

EasyCraft on Nxeon

From our catalogue
One-click install
Supported on Nxeon Valheim servers, for BepInEx servers. We download it from Thunderstore, place it, and restart the server.
Server type needed
BepInEx
Server load
light
Smallest plan we suggest
Valheim — 4 GB (4 GB RAM). This follows our own load rating above, not a benchmark.
Latest build
1.0.8, released 2026-09-27

Game versions by loader

LoaderGame versionsNewest
BepInEx

From 6 recorded builds of EasyCraft.

Recent builds

BuildReleasedGame versionsLoaders
1.0.82026-09-27n/aBepInEx
1.0.62026-09-19n/aBepInEx
1.0.42026-09-19n/aBepInEx
1.0.32026-09-17n/aBepInEx
1.0.22026-09-17n/aBepInEx
1.0.12026-09-17n/aBepInEx

Dependencies

Declared by the newest build that lists any. Required ones are installed with it on one-click installs.

Run EasyCraft on a Valheim server

Pick a server or deploy a new one above; it is installed in one click.

What kind of mod it is

From the catalog
Listed on Thunderstore as “Content”

Weapons, items & crafting

New weapons, gear, items and the recipes to make them.

Compatibility

Game
Valheim
Loaders
BepInEx
Requires
One-click install needs a BepInEx server.

Verified at the source

  • ✓ThunderstoreOfficial listing, checked 2026-10-01Open ↗
  • ✓Authors6652289, as published on Thunderstore
  • ✓LicenseNot published by the sourceFree

EasyCraft, answered

Generated from the mod’s own source data.

Which loaders does it support?

BepInEx.

Is it free?

Yes. EasyCraft is free to download from Thunderstore.

How do I add it to my Nxeon server?

Use “Add to a server” on this page, or open NxLabs from your dashboard. We install it, restart your server and switch it on.

NxLabs

Run EasyCraft on a Valheim server.

Deploy in about a minute from $9.99 a month, then add EasyCraft in one click.