常见问题与排错
这篇文档对应的使用场景是:
- 你写了脚本但没有生效
- Tooltip 不显示
- 某个物品的价值和你预期不一致
- 自动配方推导没跑出来,或者跑出来的值不合理
先记住一个排错原则
One Enough Value 的结果不是“看到哪里坏了就只查哪里”。
它是一条完整链路:
- KubeJS 脚本加载
- 服务端读取标签与配方
- 模组计算基础值、配方值、附加值
- 服务端同步给客户端
- 客户端 Tooltip 显示最终值
任意一环出问题,最后都会表现成“看不到值”或“值不对”。
问题一:Tooltip 没显示
优先按下面顺序检查。
1. 是否开启了高级提示
默认 Tooltip 只有在 F3 + H 开启后才会显示。
2. 物品最终价值是否大于 0
源码中的显示条件是:
- 价值必须大于 0
所以这些情况都不会显示:
- 没有定义价值
- 最终价值是 0
- 最终价值是负数
3. 客户端配置是否关闭了 Tooltip
检查 addValueTooltip 是否仍为 true。
4. 是否完成了服务端同步
如果你刚改完脚本但没重载,客户端看到的仍可能是旧数据。
问题二:脚本改了但没效果
1. 脚本位置错了
One Enough Value 的主要事件是服务端事件,应写在 kubejs/server_scripts。
2. 没有执行 /reload
修改脚本后通常需要重载,让服务端重新计算并同步价值。
3. KubeJS 脚本本身报错
如果脚本加载失败,对应的价值注册自然不会生效。
4. 你改的是基础值,但配方结果或附加值让最终显示看起来没变
要先区分你关注的是:
- 基础值
- 生成值
- 最终值
问题三:移除了基础价值,物品还是有值
这是最常见误判之一。
原因通常是:
- 你移除了固定基础值
- 但这个物品 仍然存在已处理配方
- 所以模组重新生成了配方价值
如果你的目标是让它彻底不再显示价值,更稳妥的方法是直接设置基础值为 0。
问题四:某个物品应该能自动推导,但没有值
优先检查:
1. 上游原料有没有值
只要上游缺一环,整条链可能都推不出来。
2. 配方类型是否已注册处理器
默认只处理:
craftingsmeltingblastingsmoking
其它类型要你自己扩展。
3. 配方是否属于特殊输出结构
多输出、动态输出、特殊容器输出都可能不适配默认逻辑。
4. 是否存在循环依赖或复杂图结构
如果配方之间互相依赖,最终结果可能不会像你脑中手算得那么直接。
问题五:同一个物品的价值比预期低
优先考虑是不是命中了“更便宜的配方路径”。
因为模组默认采用最低成本方案。
这本身不是 bug,而是设计行为。
如果你不想让某条便宜配方影响价格,有几种做法:
- 给该物品设固定基础值
- 单独移除或改写相关配方处理逻辑
- 用自定义处理器覆盖默认行为
问题六:NBT 附加值结果不对
通常从这几个方向检查:
1. 你的 NBT 条件是不是写得太宽或太窄
太宽会误伤,太窄会匹配不 到。
2. 你是否忘了附加值会叠加
只要命中多条规则,它们会全部相加。
3. 你观察的是基础值,而不是最终值
附加值只会体现在最终值里。
推荐排错顺序
如果你现在碰到一个具体物品值不对,建议按这个顺序查:
- Tooltip 是否显示。
- F3 + H 是否开启。
- 该物品是否有固定基础值。
- 是否命中 NBT 附加值。
- 是否存在更便宜的配方路径。
- 该配方类型是否已处理。
/reload后是否重新同步。
实用调试技巧
最实用的做法是写一个临时脚本,直接输出手持物品的最终值。
ItemEvents.rightClicked(event => {
event.player.tell(`当前物品价值: ${OEV$ItemValueManager.getValue(event.item)}`)
})
这样你可以把“Tooltip 有没有显示”和“服务端实际算出来多少”这两件事分开看。
最后判断标准
如果你已经确认:
- 脚本加载正常
/reload正常执行- 原料有值
- 配方类型已处理
- NBT 条件没写错
但结果仍然不符合设计预期,那么问题往往不在“有没有算”,而在“默认规则不适合你的场景”。
这时应该回到 自定 义配方处理逻辑,把规则显式写出来,而不是继续和默认推导硬碰硬。