Skip to main content

为整合包定义基础价值

这篇文档对应的使用场景是:

  • 你在做整合包,希望先给核心资源建立一套统一价目表
  • 你不希望所有物品都依赖配方自动推导
  • 你想“锁死”某些物品的价值,不受后续配方变化影响

什么是基础价值

基础价值是某个物品的固定价值。

只要一个物品有基础价值,配方生成值就不会覆盖它。

这件事非常关键,因为它决定了基础价值更适合做“锚点”。

典型锚点包括:

  • 原矿与金属锭
  • 宝石
  • 农作物
  • 核心材料
  • 你希望作为整套经济系统基准的物品

为什么整合包要先定义基础价值

因为完全依赖配方生成有两个问题:

  • 某些物品没有可靠配方来源,推不出值
  • 一旦配方链很长,前端价格波动会一路传导,可能偏离你想要的经济设计

所以实际做包时,更常见的方式是:

  1. 先给关键原材料定义基础价值。
  2. 再让其它中间产物和成品通过配方自动推导。

这样既省手写工作量,也能保住整体价格体系的稳定性。

脚本位置

把脚本写在 kubejs/server_scripts

One Enough Value 暴露的事件名是:

  • OEVEvents.addItemValue

最基础的写法

OEVEvents.addItemValue(event => {
event.addBaseItemValue('minecraft:iron_ingot', 256)
event.addBaseItemValue('minecraft:gold_ingot', 648)
event.addBaseItemValue('minecraft:diamond', 8192)
})

这段脚本的含义很直接:

  • 铁锭固定价值 256
  • 金锭固定价值 648
  • 钻石固定价值 8192

之后无论存在多少条能产出这些物品的配方,最终都以这里定义的基础值为准。

addBaseItemValue 能接受什么

源码里这个方法接受的是 Ingredient,因此你不仅可以传单物品,还可以传标签。

给单个物品设置价值

OEVEvents.addItemValue(event => {
event.addBaseItemValue('minecraft:emerald', 16384)
})

给一整个标签设置价值

OEVEvents.addItemValue(event => {
event.addBaseItemValue('#forge:ingots/copper', 64)
event.addBaseItemValue('#forge:gems/ruby', 2048)
})

这种写法很适合做跨模组统一定价。

例如:

  • 不同模组都往 #forge:ingots/copper 塞铜锭
  • 你只需要写一次,就能给整个标签里的物品都设定统一价值

覆盖默认预设

模组自带一批默认价值。

如果你在脚本里再次为同一个物品设置基础价值,最终以后写入的值为准。

因此你不需要先“关闭默认值”,直接覆盖即可:

OEVEvents.addItemValue(event => {
event.addBaseItemValue('minecraft:coal', 96)
})

这会覆盖模组原本给煤炭的默认值。

移除基础价值

如果你不想让某个物品继续使用固定值,可以移除它:

OEVEvents.addItemValue(event => {
event.removeBaseValue('minecraft:diamond')
})

但这里有一个经常让人误判的点:

移除基础价值,不等于该物品最终一定没有价值。

只要它仍有已处理的配方产出路径,模组仍可能重新为它计算出“配方生成价值”。

什么时候该把值设成 0,而不是移除

如果你的目标是:

  • 明确让某个物品没有可见价值
  • 同时不希望它再被配方系统重新推导出数值

那么更稳妥的办法是直接把它的基础价值设为 0:

OEVEvents.addItemValue(event => {
event.addBaseItemValue('minecraft:stone', 0)
})

这样做的效果是:

  • 该物品拥有一个明确的固定基础值
  • 配方生成逻辑不会再覆盖它
  • 默认 Tooltip 也不会显示,因为显示条件是最终价值大于 0

基础价值设计建议

如果你在做整合包,建议不要一上来就给所有物品手工定价。

更实用的策略是:

方案一:锚点法

只给最上游原材料定价,例如:

  • 木材
  • 石材
  • 基础矿物
  • 金属锭
  • 宝石
  • 农作物

然后让大部分中间物品和成品交给配方自动推导。

方案二:阶段法

按游戏阶段分批定义:

  • 前期资源一套价格
  • 中期科技材料一套价格
  • 后期稀有产物单独手调

方案三:统一标签法

能按标签统一的尽量按标签统一,减少脚本维护成本。

推荐组织方式

当脚本开始变多时,建议不要把所有内容都写在一个文件里。

例如可以这样拆:

  • kubejs/server_scripts/oev/base_materials.js
  • kubejs/server_scripts/oev/farming.js
  • kubejs/server_scripts/oev/magic.js
  • kubejs/server_scripts/oev/tech.js

这样后期维护会轻松很多。

常见误区

误区一:addBaseItemValue 是在当前值上加数

不是。

它是设置固定基础值,不是“在已有值基础上 +10”。

误区二:一个物品没显示价值,说明它的基础值是 0

不一定。

也可能是:

  • 根本没有基础值
  • 也没有配方推导结果
  • 或者最终价值不大于 0

误区三:移除基础值就等于彻底禁用这个物品的价值

不是。

如果存在可处理配方,它仍可能重新获得配方生成值。