Ingredient(Ingredient)

预计阅读时间: 5 分钟

物品成分,配方中常见的输入组件。

本页面是针对 KubeJS 7.2(适用于 1.21.1)创建的。您看到的大多数信息也适用于您的版本,但代码语法可能会因版本而异。

我们正在努力为其他版本的 Minecraft 创建此页面的替代版本。

Ingredient 是对物品的过滤器,用于确定哪些物品堆叠是给定配方的有效输入。在最基本的形式中,它们可以匹配单个物品、物品标签,或者是前两者的任意组合(作为列表)。此外,还存在更复杂的成分,可以按创意标签或模组名称过滤,或者从一个成分中减去另一个成分,如下文所述。

成分默认是非堆叠的,尽管 NeoForge 提供了 SizedIngredient 来填补这一空白。SizedIngredients 使用与成分相同的语法,但在解析时额外支持堆叠大小(另请参见 ItemStack)。

创建成分

KubeJS 会自动尝试在需要成分的地方将任何输入包装成成分,但您也可以使用 Ingredient 包装器(源代码)来显式创建它们,特别是使用方法 Ingredient.of(input)

简单成分

大多数简单成分类型可以简单地写成字符串,例如:

  • '-' 将返回一个不匹配任何物品的成分,而 '*' 返回一个匹配任何物品的成分
  • 任何物品 ID(例如 'minecraft:apple')将创建一个匹配该特定物品的成分(忽略数据)
  • 任何以 # 开头的 ID 将匹配具有给定名称的标签,例如 '#c:ingots/iron' 将匹配所有铁锭
  • 物品 ID 后跟组件过滤器(使用与 /give 相同的语法)创建一个匹配具有给定数据的物品的成分
  • '@modid' 将匹配由具有给定模组 ID 的模组添加的所有物品
  • % 后跟 ID 将匹配创意标签中包含的任何物品
  • 正则表达式(使用 JavaScript 正则表达式语法或字符串)将匹配所有 ID 匹配该正则表达式的物品,例如 /minecraft:(gold|iron)_ingot/ 将匹配金锭和铁锭。

使用 /kubejs hand 获取手中物品的有用字符串表示!

复合成分

如上所述,成分也可以通过使用列表进行嵌套,这意味着例如:

[
	"minecraft:apple",      // 苹果
	"#c:ingots/copper",     // 或任何铜锭
	"@create",              // 或 Create 添加的任何物品
  "-"                     // 或无,这没有任何作用
]

是有效的语法,将匹配满足 ANY 这些条件的任何物品。

此外,如果您想创建一个需要匹配多个条件的 Ingredient,您可以在现有成分上使用方法 ingredient.and(other) 来创建所谓的 IntersectionIngredient:例如 Ingredient.of('#c:ingots').and('@create') 将匹配 Create 添加的任何锭。

类似地,可以在成分上使用 ingredient.except(other) 来创建 SubtractionIngredient,即匹配第一个成分中不在第二个成分中的所有物品的成分。在上面的示例中,将 and 替换为 except 将匹配任何不是 Create 添加的锭。

最后,您可以使用 Ingredient.of(ingredient, amount) 直接创建 SizedIngredient。

使用成分

成分是延迟解析的,一旦测试就会缓存其结果。因此,我们允许在需要 ItemStack 的上下文中使用 Ingredient!

有用的方法和属性

  • ingredient.and(other): 创建一个接受匹配此成分和 other 的物品的成分
  • ingredient.or(other): 创建一个接受匹配此成分或 other 的物品的成分
  • ingredient.except(other): 创建一个接受匹配此成分但不匹配 other 的物品的成分
  • ingredient.withCount(count): 返回此成分的 SizedIngredient,具有给定数量
    • ingredient.asStack() = ingredient.withCount(1)
  • ingredient.test(item): 测试提供的物品堆叠是否与此成分匹配。这会解析成分!
  • ingredient.items: 解析成分并返回所有匹配的物品堆叠列表
    • (ingredient.stacks, ingredient.stackArray, ingredient.displayStacks 是此的变体)
  • ingredient.first: 解析成分并返回匹配的第一个堆叠

延伸阅读