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 声明。
1. 效果一览
| 动作 | 原版行为 | 装了这个之后 |
|---|---|---|
| 放置需要工作台的部件(石墙、铁梁、熔炉件、传送门件…) | 工作台不在附近 → 点击无法放置,弹出提示 | 任意地点都能放置 |
| 修复建筑 / 船(维京长船等)/ 车 | 同上,判定失败就不给修 | 远航途中、野外都能修 |
| 拆除已建部件 | 同上 | 任意地点都能拆 |
| 锤子菜单里"需要你还没见过的工作台"的部件 | 灰掉 / 不出现 | 全部可见可选 |
不会变:材料照样消耗(不是免费建造)、地形/支撑/水深/阻挡判定照旧、禁建区照旧、守卫石(私人区域)保护照旧、工作台等级与配方系统照旧。
2. 原版的门槛到底在哪(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"那一行)。
所以只要把这个字段清掉,"需要工作台"这个概念就从这个部件上彻底消失了。
3. 实现方式(核心只有几行)
在 Piece.Awake 的 postfix 里把 m_craftingStation 置为 null:
- 建筑部件 prefab 一被激活就生效;
Instantiate出来的实例继承 null, 所以旧存档里已经盖好的建筑、船也自动适用。 ZNetScene.Awake兜底:场景加载后再把所有 prefab 扫一遍(防其它模组动态塞值)。
因为原版三处判定读的是同一个字段,这一个改动同时覆盖了建造、修复、拆除和菜单解锁。
4. 配置
文件:BepInEx/config/easybuild.client.only.cfg
| 分区 | 键 | 默认 | 说明 |
|---|---|---|---|
1 - 随处建造 |
Enabled |
true |
总开关。关掉即完全回到原版行为。 |
1 - 随处建造 |
SweepAllPrefabsOnSceneLoad |
true |
场景加载时兜底扫描所有部件 prefab。 |
2 - 日志 |
VerboseLog |
false |
每剥离一个部件打一行。平时建议关掉。 |
注意:建造 / 修复 / 拆除 三项是一体生效的,没法单独关其中一项 —— 因为原版这三条路径读的是同一个字段(见第 2 节)。
5. 联机说明(重要)
- 纯客户端:没有
NetworkCompatibility声明,不引 Jotunn,不嵌 ServerSync / ConditionalConfigSync → 放在BepInEx/plugins/里不会让你连不上任何主机,纯原版主机也能进。 - 只影响你自己:建造/修复的资格判定是在每个客户端本地算的。 所以 主机和队友不装这个模组也照样用;反过来,他们仍然受原版"要工作台"限制。
- 你放下去的部件、修好的耐久都是正常的 ZDO 变更,主机照常接受,不会掉线或回滚。
6. 安装与卸载
r2modman:Settings → Install from file,选 EasyBuild-1.0.0.zip。
手动:把 EasyBuild.dll 丢进 BepInEx/plugins/ 即可。
卸载:r2modman 里禁用/卸载,或删掉 DLL。纯运行时改动,不写存档、不留残留。
7. 怎么确认它生效了
日志(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 …
游戏内自测(建议走一遍):
- 跑到离家很远的地方,造石墙 / 铁梁(原版需要石匠台 / 熔炉)→ 应该能成功。
- 开新档、从没做过工作台 → 锤子菜单里应该能看到全部部件。
- 在海上用锤子修船 → 应该能修。
- 拆掉远处的部件 → 应该能拆。
- 反向验证:材料不足时仍然失败(说明不是免费建造); 在别人守卫石范围内仍然不能建造/拆除(说明保护没被顺带解除)。
8. 已知限制
- 本模组针对当前版本(Valheim 1.0 程序集,Unity 6000.0.75f1 / BepInEx 5.4.x)。 如果以后游戏改了字段名,插件会在日志里打印「找不到字段 Piece.m_craftingStation」而不是崩溃 —— 届时把日志发我即可。
- 与其它"改建造规则 / 改工作台范围"的模组同时使用时可能互相覆盖(例如放大工作台范围的模组会变得没意义)。
- 与"物品耐久 / 修复"类模组不冲突(本模组不碰
WearNTear)。
MIT 精神,自用为主。有问题带着 LogOutput.log 找我就行。


