跳到主要内容

给特殊物品添加 NBT 附加价值

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

  • 同一种物品因为 NBT 不同,需要有不同价值
  • 你在做枪械、模块、强化、词条、品质、附魔、插件或自定义数据物品
  • 你希望“基础物品值一样,但附带数据不同就加价”

什么是附加价值

附加价值不是独立替代基础价值的另一套系统,它是在最终计算时额外加上去的值。

最终关系是:

最终价值 = 基础价值或配方生成价值 + 所有命中的 NBT 附加价值

这意味着附加价值最适合做“同类物品之间的差异化定价”。

基础用法

OEVEvents.addItemValue(event => {
event.addBaseItemValue('minecraft:crossbow', 512)
event.addExtraItemValue('{CustomModelData:1}', 2048)
})

这个例子表示:

  • 普通弩的基础价值是 512
  • 只要某个物品堆带有 CustomModelData:1 这段 NBT,就额外增加 2048

如果这个 NBT 正好出现在弩上,那么最终价值就是 2560。

最常见的使用方式

枪械类物品

OEVEvents.addItemValue(event => {
event.addBaseItemValue('tacz:modern_kinetic_gun', 10000)
event.addExtraItemValue('{GunId:"tacz:m700"}', 500000)
})

适合用于:

  • 同一物品 ID 下,通过 NBT 区分不同枪型
  • 不同配件、改装、型号的价值区分

附魔装备

OEVEvents.addItemValue(event => {
event.addExtraItemValue('{Enchantments:[{id:"minecraft:sharpness",lvl:5s}]}', 1024)
})

这类写法适合粗粒度加价。

但要注意,NBT 匹配是“命中就加”,不是自动帮你解析整个附魔体系的价值差。

自定义模块或品质系统

OEVEvents.addItemValue(event => {
event.addExtraItemValue('{Tier:"legendary"}', 100000)
event.addExtraItemValue('{Sockets:4}', 4096)
})

如果某个物品同时满足多个条件,这些附加值会叠加。

多规则叠加行为

这一点非常重要。

源码里的行为是遍历全部附加价值规则,只要命中就全部相加。

因此:

  • 不是“命中第一条就停止”
  • 不是“只取最高一条”
  • 而是“所有命中的规则一起累加”

例如:

OEVEvents.addItemValue(event => {
event.addExtraItemValue('{Tier:"legendary"}', 100000)
event.addExtraItemValue('{Sockets:4}', 4096)
})

如果某件物品同时具备这两个 NBT 条件,那么它会同时获得两部分附加价值。

设计时要注意的边界

NBT 规则越宽,命中范围越大

如果你写得过于宽泛,可能会让很多不想加价的物品一起命中。

所以在做高价值物品时,建议尽量匹配能唯一识别目标物品的数据字段。

附加价值不会阻止基础价值或配方价值生效

附加价值只是“往上加”。

如果你需要完全重写某类物品的价值逻辑,通常要先把基础值或配方链设计好,再考虑附加值。

显示层只看最终值

Tooltip 显示的是最终值,而不会帮你拆开显示:

  • 基础值是多少
  • 配方值是多少
  • 附加值是多少

如果你要做更详细的调试显示,通常需要自己在脚本层读取并输出。

适合与哪些系统联动

  • 枪械模组
  • 带品质系统的 RPG 装备
  • 带插槽、词条、升级数据的道具
  • 自定义卡片、芯片、模块、法术卷轴
  • 需要根据内部数据定价的任务物品

调整思路建议

实际整合时,常见做法不是给每一个 NBT 组合单独定价,而是拆成几层:

  1. 先给物品本体一个基础值。
  2. 再给高价值 NBT 特征追加附加值。
  3. 尽量让规则复用,而不是为每个具体成品写死一条。

这样脚本更容易维护。