战利品表

战利品表

战利品表是逻辑文件,用于决定各种操作或场景发生时应做什么。尽管原版系统只处理物品生成,该系统可以扩展为执行任意数量的已定义操作。

战利品表执行概念图:表规则与场景参数共同用于生成,参数包括世界、幸运值及场景上下文;LootContext 可带随机信息;输出可返回物品、交给消费者或填充容器。

原创说明图,依据 Forge 1.21.x 官方文档 绘制。

数据驱动的表

大多数原版战利品表通过 JSON 数据驱动,因此创建新表不需要 Mod,只需要数据包。有关如何创建这些表并将其放入 Mod 的 resources 文件夹,参见 Minecraft Wiki。

使用战利品表

战利品表通过指向 data/<namespace>/loot_tables/<path>.json 的 ResourceLocation 引用。可使用 LootDataResolver#getLootTable 获取对应的 LootTable,而 LootDataResolver 可通过 MinecraftServer#getLootData 获取。

生成战利品表时始终需要参数。LootParams 包含生成所处的世界、用于改善生成结果的幸运值、定义场景上下文的 LootContextParam 以及激活时应发生的动态信息。使用 LootParams$Builder 构造函数创建构建器,向 LootParams$Builder#create 传入 LootContextParamSet 来构建。

战利品表还可以具有上下文。LootContext 接收构建好的 LootParams,并可设置带种子的随机实例。通过 LootContext$Builder 创建构建器,向其 #create 传入可空的 ResourceLocation,表示要使用的随机实例。

LootTable 可以使用下列接收 LootParams 或 LootContext 的方法生成 ItemStack:

方法 说明
getRandomItemsRaw 消费战利品表生成的物品。
getRandomItems 返回战利品表生成的物品。
fill 用生成的战利品表填充容器。

注意:战利品表是为生成物品而构建的,因此这些方法预期对 ItemStack 进行某种处理。

附加功能

Forge 为战利品表提供额外行为,以便更好地控制系统。

LootTableLoadEvent

每当战利品表加载时,Forge 事件总线都会触发 LootTableLoadEvent。取消事件会加载空战利品表。

重要:不要通过该事件修改战利品表掉落,应使用全局战利品修改器。

战利品池名称

可使用 name 键为战利品池命名。未命名的池使用前缀 custom# 加池的哈希码。

带注释和省略号的示例用于说明结构;实际 JSON 文件需移除注释并补全内容。

// 在某个战利品池中
{
  "name": "example_pool", // 池名为 'example_pool'
  "rolls": { /* ... */ },
  "entries": { /* ... */ }
}

抢夺修改器

除了抢夺附魔外,战利品表现在还受 Forge 事件总线上的 LootingLevelEvent 影响。

附加上下文参数

Forge 扩展某些参数集,以处理可能适用但原本缺失的上下文。LootContextParamSets#CHEST 现在允许 LootContextParams#KILLER_ENTITY,因为运输矿车是可以被破坏或“杀死”的实体。LootContextParamSets#FISHING 也允许该参数,因为鱼钩也是玩家收竿时收回或“杀死”的实体。

烧炼多个物品

使用 SmeltItemFunction 时,烧炼配方会返回结果的实际物品数量,而非单个烧炼物品。例如配方产出 3 个物品,且有 3 个掉落物时,结果是 9 个烧炼物品,而非 3 个。

战利品表 ID 条件

Forge 添加了 LootItemCondition,允许特定物品只为特定表生成,通常用于全局战利品修改器。

// 在某个战利品池或池条目中
{
  "conditions": [
    {
      "condition": "forge:loot_table_id",
      // 战利品表为泥土时应用
      "loot_table_id": "minecraft:blocks/dirt"
    }
  ]
}

工具能否执行操作条件

Forge 还添加了一个 LootItemCondition,检查给定的 LootContextParams#TOOL 能否执行指定的 ToolAction。

// 在某个战利品池或池条目中
{
  "conditions": [
    {
      "condition": "forge:can_tool_perform_action",
      // 工具能像斧头一样为原木去皮时应用
      "action": "axe_strip"
    }
  ]
}

原文:Loot Tables。