战利品表简介

战利品表是 JSON 格式的文件,用于定义游戏中物品的生成方式。 它们可用于生成箱子的内容,定义实体死亡时掉落的物品,甚至实体装备的物品。 在某些情况下,它甚至用于游戏机制,例如哞菇挤奶或钓鱼。

显示艾莉克斯打开箱子展示战利品的图像。

战利品表文件位于行为包的根目录中,它们通常由三个主要部分组成,称为“池”。

  • Rolls(滚动次数)
    • 此池将滚动多少次以选择条目。 这可以是一个整数,使其成为设定的滚动量,也可以是一个从中选择滚动量的最小/最大范围。
  • Conditions(条件)(可选)更多信息
    • 这些是要滚动此池必须满足的条件。
  • Entries(条目)
    • 这是游戏将在此池中选择的对象列表。 它可以是一个 item、一个 loot_tableempty(如果您希望这次滚动什么也没有发生)。

在本教程中,您将学习以下内容:

  • 如何使用 JSON 定义战利品表。
  • 如何将函数应用于条目以修改所选物品。
  • 如何使用条件进一步限制何时选择池或条目。

要求

在开始本教程之前,建议完成以下内容。

基本用法

首先,我们创建一个战利品表,在调用时返回一颗钻石。

{
    "pools": [
        {
            "rolls": 1,
            "entries": [
                {
                    "type": "item",
                    "name": "minecraft:diamond"
                }
            ]
        }
    ]
}

如您所见,我们定义了一个仅滚动一次的池,并且每次滚动时都将包含一颗钻石。 如果将其与实体行为文件中的 minecraft:loot 组件结合使用,它会在死亡时掉落该钻石。

现在,如果您想从两个物品中进行选择该怎么做? 如果我们想归还一颗钻石或一块煤炭该怎么做? 这可以通过向 entries 对象添加第二个值来实现。

{
    "pools": [
        {
            "rolls": 1,
            "entries": [
                {
                    "type": "item",
                    "name": "minecraft:diamond"
                },
                {
                    "type": "item",
                    "name": "minecraft:coal"
                }
            ]
        }
    ]
}

您会注意到,现在钻石和煤炭都有可能掉落。 所有 entries 都有一个分配给它们的 weight。 如果您未指定,它会默认为 1,给所有 entries 平等的滚动机会。 为进行调整,我们需要自己定义 weight 值。

{
    "pools": [
        {
            "rolls": 1,
            "entries": [
                {
                    "type": "item",
                    "name": "minecraft:diamond",
                    "weight": 1
                },
                {
                    "type": "item",
                    "name": "minecraft:coal",
                    "weight": 7
                }
            ]
        }
    ]
}

理解 weight 如何影响滚动的最好方法是假设上面的示例中不是两个条目而是八个条目:七次煤炭机会和一次钻石机会。 这意味滚动产生一块煤炭而不是钻石的可能性要高七倍。

尽管基岩版的原版文件中存在 Java 版的 quality 修饰符(根据玩家的 Luck 属性调整 weight),但基岩版目前不支持 Luck 属性,这使得该功能无法生效。

您还可以随机化一组 entries 的滚动次数。 rolls 键可使用 minmax 值设置,游戏可从该范围随机选择。

{
    "pools": [
        {
            "rolls": {
                "min": 1,
                "max": 3
            },
            "entries": [
                {
                    "type": "item",
                    "name": "minecraft:diamond",
                    "weight": 1
                },
                {
                    "type": "item",
                    "name": "minecraft:coal",
                    "weight": 7
                }
            ]
        }
    ]
}

以上设置将导致游戏滚动条目一到三次。 这导致每次调用此战利品表时返回最少有一件物品,最多有三件物品。

这是使用战利品表作为条目之一的另一个示例。 这将导致游戏调用另一个战利品表并返回结果。

{
    "pools": [
        {
            "rolls": {
                "min": 1,
                "max": 3
            },
            "entries": [
                {
                    "type": "item",
                    "name": "minecraft:diamond",
                    "weight": 1
                },
                {
                    "type": "item",
                    "name": "minecraft:coal",
                    "weight": 7
                },
                {
                    "type": "loot_table",
                    "name": "loot_tables/custom/some_loot_table",
                    "weight": 1
                }
            ]
        }
    ]
}

请注意,战利品表不能以任何方式引用自身。 如果滚动的结果是递归战利品表,则不会返回任何内容。

函数及修改物品

函数是可选操作,可以添加到修改物品的条目中。 它可以允许您定义返回的物品数量、修改该物品的属性或任意数量的其他操作。 在本文中,我们将介绍一些较为常见的函数使用,您可以通过战利品和交易表函数教程中深入了解所有可用函数。

set_count

允许您设置此条目返回的最小和最大数量的物品:

                {
                    "type": "item",
                    "name": "minecraft:diamond",
                    "weight": 1,
                    "functions": [
                        {
                          "function": "set_count",
                          "count": {
                            "min": 1,
                            "max": 6
                          }
                        }
                    ]
                }

每当该条目滚动时,上面的示例将返回一到六颗钻石。

set_data

设置物品的数据值。 它对于返回特定药水或特定颜色的染料之类的事情很有用。 它还允许您返回不同的方块值,例如特定颜色的羊毛或某些原木类型。

                {
                    "type": "item",
                    "name": "minecraft:potion",
                    "weight": 1,
                    "functions": [
                      {
                        "function": "set_data",
                        "data": 21
                      }
                    ]
                }

上面的示例将返回一个治疗药水。

                {
                    "type": "item",
                    "name": "minecraft:wool",
                    "weight": 1,
                    "functions": [
                      {
                        "function": "set_data",
                        "data": 1
                      }
                    ]
                }

此示例将返回橙色羊毛。

specific_enchants

此函数允许您对一个物品设置特定附魔的列表。 这允许您对通常不会在游戏中附魔的物品应用附魔。

                {
                    "type": "item",
                    "name": "minecraft:stick",
                    "weight": 1,
                    "functions": [
                        {
                          "function": "specific_enchants",
                          "enchants": [
                             "knockback",
                             "fire_aspect"
                          ]
                        }
                    ]
                }

您可以通过将附魔定义为对象来定义附魔级别。 最大附魔等级是硬编码的,不能被覆盖。

                {
                    "type": "item",
                    "name": "minecraft:stick",
                    "weight": 1,
                    "functions": [
                        {
                          "function": "specific_enchants",
                          "enchants": [
                             {
                                "id": "knockback",
                                "level": 1
                             },
                             {
                                "id": "unbreaking",
                                "level": 3
                             }
                          ]
                        }
                    ]
                }

多重函数

可以定义多重函数。 这是将两个函数组合在一起的示例。 在此示例中,这个条目将返回一到三个治疗药水。

                {
                    "type": "item",
                    "name": "minecraft:potion",
                    "weight": 1,
                    "functions": [
                        {
                            "function": "set_count",
                            "count": {
                              "min": 1,
                              "max": 3
                            }
                        },
                        {
                            "function": "set_data",
                            "data": 21
                        }
                    ]
                }

多重函数甚至可以是由同一函数组成,但如果这些函数之间存在冲突,最后定义的函数生效。

例如,使用多个 set_count 函数,如下例所示,将导致只使用最后一个重复的函数,从而使物品的计数在 5 到 7 之间,而不是在 1 到 3 之间。

                {
                    "type": "item",
                    "name": "minecraft:potion",
                    "weight": 1,
                    "functions": [
                        {
                            "function": "set_count",
                            "count": {
                              "min": 1,
                              "max": 3
                            }
                        },
                        {
                            "function": "set_count",
                            "count": {
                              "min": 5,
                              "max": 7
                            }
                        }
                    ]
                }

条件

条件是一个要求列表,必须满足其中的要求才能使用池或选择单个条目。 所有条件都存储在条件列表中。 每个条件一次运行一个。 如果列表中的任何一个条件失败,则同一列表中的其余条件将被忽略。

匹配工具条件

match_tool match_tool 是检查用于制作战利品掉落的工具(或武器或玩家正在使用的任何物品)是否与提供的修改器条件集匹配的条件。 使用的谓词是:count、durability、enchantments 和 item。

  • count:物品数量
    • range_max:最大值
    • range_min:最小值
  • durability::物品的耐久度
    • range_max:最大值
    • range_min:最小值
  • enchantments::附魔列表
    • enchantment:附魔 ID
    • levels:附魔的等级
    • range_max:最大值
    • range_min:最小值
  • item::物品 iID

示例:


"conditions": [  
            {  
              "condition": "match_tool",  
              "enchantments": [  
                {  
                  "enchantment": "sharpness",  
                  "levels": {  
                    "range_max": 6  
                  }  
                }  
              ],  
              "item": "minecraft:diamond_sword",  
              "count": 1,  
              "durability": {  
                "range_min": 1  
              }  
            }  
          ]  

池条件

将条件应用于池,允许您根据定义的条件执行整个池。

下面的示例只有在调用它的实体被骷髅杀死时才会触发,导致产生一颗钻石或一个煤块。

{
    "pools": [
        {
            "conditions": [
                {
                    "condition": "killed_by_entity",
                    "entity_type": "minecraft:skeleton"
                }
            ],
            "rolls": 1,
            "entries": [
                {
                    "type": "item",
                    "name": "minecraft:diamond",
                    "weight": 1
                },
                {
                    "type": "item",
                    "name": "minecraft:coal",
                    "weight": 1
                }
            ]
        }
    ]
}

条目条件

您还可以将条件应用于滚动中的特定 entries。 对于下面的示例,如果调用它的实体被玩家杀死,将仅在 50% 的时间内返回钻石。 所有其他时间被调用时,它会返回煤炭。

{
    "pools": [
        {
            "rolls": 1,
            "entries": [
                {
                    "type": "item",
                    "name": "minecraft:diamond",
                    "weight": 1,
                    "conditions": [
                        {
                            "condition": "killed_by_player"
                        }
                    ]
                },
                {
                    "type": "item",
                    "name": "minecraft:coal",
                    "weight": 1
                }
            ]
        }
    ]
}

探索不同的函数条件可以让您真正自定义您的玩家体验。 您可以为物品命名并为其提供知识,掉落装满补给的资源箱,甚至可以制作提供说明或信息的成书。

下一步内容?

还有很多其他函数可以修改所选项目。 下一个教程将具体介绍。