Loot table

战利品表(Loot table),是一个对地图制作非常有用的功能。
它能够随机物品,作为生物掉落、箱子随机生成以及进度奖励。
最重要的地方在于Loot table拥有很多的函数(Function),可以随机一些NBT属性,如附魔、Attributes等。这些如果需要命令来给予的话会非常的繁复。

战利品表可以自定义,只需要根据下文指出的架构编写JSON文件并将JSON文件放于(地图)/data/loot_tables/(命名空间)/路径里,这方式和命令函数类似。

如果把战利品放在命名空间为minecraft,路径和原版相同名称的战利品表一样的地方,则会覆盖该原版战利品表。

这文件需要使用JSON格式

结构

  • (Loot table根标签)
    • pools: 随机池列表。使用此战利品表的时候每个随机池都会执行一次
      • 一个随机池(见下)

调用战利品表生成物品时,游戏会尝试逐个随机池执行。

随机池

  • (一个随机池)
    • conditions: 一堆使用此随机池的条件。必须全部符合才会执行本池。List。
      • 一个condition(见下)
    • rolls: 指定会在entries里随机抽取多少次。(每次只会抽取符合条件的entry。)整数。
    • rolls: 在下方范围内选择一个随机数,决定会在entries里随机抽取多少次。
      • min: 随机数的下限,也就是说随机数不会小于这个数(但可以等于)。整数。
      • max: 随机数的上限,也就是说随机数不会大于这个数(但可以等于)。整数。
    • bonus_rolls: 每点幸运值增加roll的次数,向下取整数。浮点数。默认为0。可以为负数。
    • bonus_rolls: 在下方范围内选择一个随机数,决定每点幸运值增加roll的次数,向下取整数。浮点数。可以为负数。
      • min: 随机数的下限。浮点数。
      • max: 随机数的上限。浮点数。
    • entries: 随机项目列表。
      • 一个entry。

逐个随机池执行时,游戏会首先看看是否符合此随机池指定的所有条件,如果符合则继续,不符合则继续下一个随机池(或完成执行,如果已经没有其他随机池)。

游戏会根据指定玩家的幸运值计算出额外的rolls(bonus_rolls*luck),然后随机执行roll + bonus_rolls*luck次选择合适的随机项目(不会选择到不符合条件的随机项目,可以重复选择)。

随机项目

  • (一个随机项目)
    • conditions: 一堆使用此随机项目的条件。必须全部符合才会选择本项目。List。
    • type: 指定此随机项目的类型。字串。可能数值有:
      • loot_table: 调用别的战利品表。(把该战利品表随机出来的物品当此项目的奖励)
      • item: 随机物品。最常用的类型。
      • empty: 就是抽到空箱子了,不给任何奖励。这个看似无用,实际上可以用此来做到加权的随机rolls数量。
    • name:
      • 如果typeitem,则填写给予的物品id,如minecraft:stone。默认物品数量为1。
      • 如果typeloot_table,则填写调用的战利品表名称。(命名空间):路径。请看战利品表名称部分,
    • functions: 如果typeitem,则对给予的物品执行特定函数,随机附魔、attributes、数量等等。注意函数的次序非常重要,游戏会顺序执行函数,所以一些修改物品数据的函数应该在如set_count函数后执行,否则便会出错。
      • 一个函数(见下)
    • weight: 此随机项目的权重。随机项目被选择的几率=此项目权重/整个随机池的所有随机项目权重的加总。整数。
    • quality: 每点幸运值对该项目的权重增值,加完后向下取整数。整数。

条件(Condition)

  • (一个条件)
    • condition: 条件的名称,如entity_properties
    • ...: 其他条件的标签。

比如有一个条件叫作entity_scores。其描述是这样的:

  • entity_scores - 检测一个实体的记分板分数。
    • entity: 需要检测的实体。this为这个死掉的实体(如果这是生物掉落的战利品表),killer为检测杀死该实体的实体,killer_player为检测杀死该实体的玩家。
      如果指定了killerkiller_player但不存在这实体,则此条件不满足。
    • scores: 需要检测的分数。所有分数都需要满足才算满足此条件。如果指定变量不存在的话则算作不满足。
      • <记分板变量名称>: 标签名称为记分板变量名称。指定实体的分数必须为此分数才算满足此条件。整数
      • <记分板变量名称>: 标签名称为记分板变量名称。指定实体的分数必须在此范围才算满足此条件。
        • min: 最小分数。
        • max: 最大分数。

里面的entity以及scores就是条件的其他标签。

假设我们要检测杀死生物的玩家的分数test为30-40,test2为1分,我们可以这么写:(只写出一个condition)

{
    "condition": "entity_scores",
    "entity": "killer_player",
    "scores": {
        "test": {
            "max": 40,
            "min": 30
        },
        "test2": 1
    }
}

那些条件的详细列表还请参照 https://minecraft.gamepedia.com/Loot_table#Conditions

函数(Function)

  • 一个函数
    • function: 函数名称。
    • conditions: 使用此函数的条件列表。
      • 一个condition。
    • ...其他的函数标签。

举个例子。

  • enchant_randomly: 随机选择一个附魔,如果该附魔拥有多个等级(玩家能够附魔的等级)则随机选择一个等级。
    • enchantments: 可供选择的附魔名称。如果被忽略,则从所有附魔中随机附魔。

其中的enchantments就是其他的函数标签。

假设我们需要随机附魔保护或火焰保护,我们可以这么写:(只写出一个函数)

{
    "function": "enchant_randomly",
    "enchantments": [
        "protection",
        "fire_protection"
    ]
}

那些函数的详细列表还请参照: https://minecraft.gamepedia.com/Loot_table#Functions

战利品表名称

战利品表的名称为(命名空间):路径,路径不包括文件扩展名。与命令函数类似。

比如路径在data/loot_tables/test/test1.json的战利品表,调用时其名称为test:test1

使用

生物掉落可以设置DeathLootTable,数值为战利品表名称。这样生物死亡时就会掉落指定战利品表的奖品。

箱子和箱子矿车可以设置LootTable,数值为战利品表名称。这样箱子打开时就会生成指定战利品表的物品(物品会被随机放置在不同格子内),取代原先的物品

注意: 箱子和箱子矿车被打开时,战利品表会被设置为无,如果这时候被重新设置战利品表的话就会马上刷新箱子内容。高频的话甚至会造成以下情况:

参见

本章不是一个详细讲解战利品表的章节,因为目前已经有很详细的教程覆盖了战利品表的各种使用。

请参见2b的教程: http://www.mcbbs.net/thread-619468-1-1.html

results matching ""

    No results matching ""