本帖最后由 SPGoding 于 2020-8-3 12:34 编辑



本文标题:【CBL|SPG】[1.15] 战利品表 —— 数据包的组成文件之一
本文链接:http://www.mcbbs.net/thread-831542-1-1.html
作  者:@SPGoding(Command Block Logic)

本帖因受到 Minecraft 中文 Wiki 协议污染,以 CC BY-NC-SA 3.0 协议 发布。有关 JSON 文件结构的部分内容引自 Minecraft 中文 Wiki 的战利品表进度页面,并结合个人体验进行了部分修改。

简介

[ruby=loot table]战利品表[/ruby],数据包的组成部分,是设置各类战利品的机制。玩家破坏方块、击杀生物、钓鱼、达成进度获得的物品,地牢箱子中的奖励等,都是由战利品表设置的。通过 1.14 新加入的 loot 命令,更是可以直接根据战利品表在方块/实体中添加/修改物品、在世界中直接生成掉落物等。

所有的战利品表应该放置在数据包的 data/(命名空间)/loot_tables 下,每个 JSON 文件对应一个战利品表。

外国友人 Misode 制作了一个适用于 1.14.4 战利品表的编辑器,本人将其转载到了 MCBBS。建议先大体理解战利品表的工作方式后再使用生成器,能够避免一些奇怪的问题。

本节完。点击论坛界面右侧的粉色「书签」可以快速回到上方目录。


格式
工作流程概述

1.14 内战利品表的工作流程相比 1.13 没有过大改动,对于战利品表的结构已经熟悉的玩家可以略读本章。

战利品表有如下几个类型:
- minecraft:block:决定方块掉落物。
- minecraft:chest:决定箱子内的物品。
- minecraft:empty:空的。
- minecraft:entity:决定实体掉落物。
- minecraft:fishing:决定玩家钓鱼奖励。
- minecraft:generic:通用型战利品表。原版数据包中并没有使用该类型的战利品表。该类型的战利品表可以使用任何函数、条件等而不报错,效果类似于不指定战利品表类型。

在战利品表的 JSON 文件内的 type 字段中,可以定义该战利品表的类型为上述七种之一。通过定义该字段,在战利品表内使用了其不能使用的函数或条件时(比如,在 minecraft:block 类型的战利品表内检测了「被击杀者」。有关函数/条件的具体内容,会在后文进行讲解),游戏会进行报错;如果不指定该字段,则对函数/条件的使用没有限制,但是,游戏会在调用战利品表时根据调用它的情景来决定它的类型,你无法使用的函数/条件仍然无法使用(例如,一个叫 foo:bar 的战利品表没有指定类型,但是在 minecraft:gameplay/fishing 里调用了它,游戏则会认为它是 minecraft:fishing 类型的战利品表,无法使用该类型不支持的函数/进度),而且在加载时不会有任何报错,除非特殊需求,十分不建议省略该字段

战利品表内定义了许多的[ruby=pool]奖池[/ruby](或称随机池),这些奖池里面又定义了一些 [ruby=entry]项目[/ruby](具体的介绍见「项目」章节)。游戏会在每个奖池中,随机抽取一定数量的项目(这个数量即为[ruby=rolls]抽取次数[/ruby])。被抽出的项目会返回数个[ruby=item]物品[/ruby],最终呈现在玩家面前。

文件结构


以上所述只是战利品表工作流程的主要部分。在一个奖池内,[ruby=抽取次数]rolls[/ruby] 除了可以设置为一个确切的数字,还可以设置为一个随机数的范围。具体格式为 { "min": <最小值>, "max": <最大值> },包含最大值和最小值。例如 "rolls": { "min": 1, "max": 3 } 将会对该奖池抽取 1 次至 3 次。
此外,还可以通过设置 bonus_rolls 来指定每一级幸运属性增加的抽取次数(或随机范围),最终结果向下取整。例如 "bonus_rolls": 0.5 在玩家每有 2 级幸运属性时会增加 1 次抽取次数。"bonus_rolls": { "min": 0.1, "max": 0.5 } 这种随机范围的写法也是同样可行的。

完善一点的文件结构


在一个项目内,可以设置 weight 定义该项目被抽取到的基础权重,quality 定义每一级幸运属性增加的权重。一个奖池内,每个entry被抽到的几率为:该项目的权重 / 奖池内所有项目的权重之和

进一步完善的文件结构


此外,整个战利品表、每一个奖池、每一个项目内,都可以定义[ruby=function]函数[/ruby](这里所提到的函数与数据包内定义的命令函数无关)。我们可以将函数理解为对项目的操作,具体的介绍见「函数」章节。在每一个奖池、每一个项目、每一个函数内,又可以定义[ruby=condition]条件[/ruby],只有在某些信息满足该条件时,该条件所属的奖池/entry/函数才会被执行,具体的介绍见「条件」章节。

文件结构
-(字符串)type:该战利品表的类型。
-(数组)functions:对该表执行的所有函数。
    -(对象)一个函数。
        -(字符串)function:函数名。
        -(数组)conditions:执行该函数需满足的所有条件。
            -(对象)一个条件
                -(字符串)condition:条件名。
                -条件参数
        -函数参数

-(数组)pools:所有的奖池。
    -(对象)一个奖池。
        -(数组)functions:对该奖池执行的所有函数。
            -(对象)一个函数。
                -(字符串)function:函数名。
                -(数组)conditions:执行该函数需满足的所有条件。
                    -(对象)一个条件
                        -(字符串)condition:条件名。
                        -条件参数
                -函数参数
        -(数组)conditions:从该奖池抽取需满足的所有条件。
            -(对象)一个条件
                -(字符串)condition:条件名。
                -条件参数

        -(整型或对象)rolls:该奖池的抽取次数(或范围)。
        -(浮点型或对象)bonus_rolls:每一级幸运属性增加的抽取次数(或范围)。
        -(数组)entries:所有的项目。
            -(对象)一个项目。
                -(数组)functions:对该项目执行的所有函数。
                    -(对象)一个函数。
                        -(字符串)function:函数名。
                        -(数组)conditions:执行该函数需满足的所有条件。
                            -(对象)一个条件
                                -(字符串)condition:条件名。
                                -条件参数
                        -函数参数
                -(数组)conditions:抽取该项目的所有条件。
                    -(对象)一个条件
                        -(字符串)condition:条件名。
                        -条件参数

                -(字符串)type:该项目的类型。
                -(整型)weight:该项目的基础权重。
                -(整形)quality:每级幸运属性对权重的影响。

本节完。点击论坛界面右侧的粉色「书签」可以快速回到上方目录。


格式
项目 - entry
项目(Entry),即定义在 entries 下的对象。由上章结尾可知,其格式如下:

-(数组)functions:对该项目执行的所有函数。
    -(对象)一个函数。
        -(字符串)function:函数名。
        -(数组)conditions:执行该函数需满足的所有条件。
            -(对象)一个条件
                -(字符串)condition:条件名。
                -条件参数
        -函数参数
-(数组)conditions:抽取该项目的所有条件。
    -(对象)一个条件
        -(字符串)condition:条件名。
        -条件参数
-(字符串)type:该项目的类型。
-(整型)weight:该项目的基础权重。
-(整形)quality:每级幸运属性对权重的影响。

本节中,我们主要讲解 type,它定义了这个项目的类型,下面将分别介绍这 8 种类型。

minecraft:item

定义该项目直接是一个物品。需要再定义一个 name(字符串)字段,指出该物品的 ID。例如:
  1. {
  2.     "type": "minecraft:item",
  3.     "name": "minecraft:stone"
  4. }
复制代码
定义了一个石头物品。


minecraft:loot_table

引用另一个战利品表。需要再定义一个 name(字符串)字段,指出引用的战利品表的[ruby=resource location]资源路径[/ruby]。当抽取到该项目时,会从指定的战利品表中获得物品,将这些物品作为该项目的返回值。例如:
  1. {
  2.     "type": "minecraft:loot_table",
  3.     "name": "minecraft:gameplay/fishing"
  4. }
复制代码
会从战利品表 minecraft:gameplay/fishing 获取物品并返回。


minecraft:empty

空。该类型的项目不会返回任何物品。


minecraft:alternatives

从多个子项目中选择一个。需要再定义一个 children(数组)字段,内含多个子项目,游戏会返回第一个条件满足的子项目所返回的物品。例如:
  1. {
  2.     "type": "minecraft:alternatives",
  3.     "children": [
  4.         {
  5.             "type": "minecraft:item",
  6.             "name": "甲",
  7.             "conditions": [ A ]
  8.         },
  9.         {
  10.             "type": "minecraft:item",
  11.             "name": "乙",
  12.             "conditions": [ B ]
  13.         },
  14.         {
  15.             "type": "minecraft:item",
  16.             "name": "丙"
  17.         }
  18.     ]
  19. }
复制代码
对于这样写的一个项目,游戏的执行流程如下图:


可以发现,当返回了一个子项目后,alternatives 类型的项目直接结束,不会继续执行。如果学习过编程,你会发现这很像一系列的 if-else语句(伪代码):
  1. if A:
  2.     return 甲
  3. elif B:
  4.     return 乙
  5. else:
  6.     return 丙
复制代码



minecraft:dynamic

动态返回。其返回内容由执行它的方块所决定。需要再定义一个 name(字符串)字段,指出返回的内容类别,值为 minecraft:selfminecraft:contents:前者被玩家头颅、旗帜执行时,会返回与其样式相同的物品;后者被潜影盒执行时,会返回其内容物。该类型的项目在其他方块/生物上使用没有效果。

通过在潜影盒上使用,并配合一定的技巧,能够做到免穷举修改玩家物品栏内物品的信息,请查看 ruhuasiyu 的教程:https://www.mcbbs.net/thread-860954-1-1.html

minecraft:group

从所有满足条件的子项目中随机抽取,其表现和 pools 十分相似。需要再定义一个 children(数组)字段,内含多个子项目,游戏会从所有满足条件的子项目中随机抽取一个项目。例如:
  1. {
  2.     "type": "minecraft:group",
  3.     "children": [
  4.         {
  5.             "type": "minecraft:item",
  6.             "name": "甲",
  7.             "conditions": [ A ],
  8.             "weight": 8
  9.         },
  10.         {
  11.             "type": "minecraft:item",
  12.             "name": "乙",
  13.             "conditions": [ B ],
  14.             "weight": 4
  15.         },
  16.         {
  17.             "type": "minecraft:item",
  18.             "name": "丙",
  19.             "weight": 2
  20.         }
  21.     ]
  22. }
复制代码

满足的条件得到甲的几率得到乙的几率得到丙的几率
A&B8/144/142/14
A8/1002/10
B04/62/6
001



minecraft:sequence

从前半部分满足条件的子项目中随机抽取。需要再定义一个 children(数组)字段,内含多个子项目,游戏会从第一个条件不满足的子项目以前的所有子项目中随机抽取物品。例如:
  1. {
  2.     "type": "minecraft:sequence",
  3.     "children": [
  4.         {
  5.             "type": "minecraft:item",
  6.             "name": "甲",
  7.             "conditions": [ A ],
  8.             "weight": 8
  9.         },
  10.         {
  11.             "type": "minecraft:item",
  12.             "name": "乙",
  13.             "conditions": [ B ],
  14.             "weight": 4
  15.         },
  16.         {
  17.             "type": "minecraft:item",
  18.             "name": "丙",
  19.             "conditions": [ C ],
  20.             "weight": 2
  21.         }
  22.     ]
  23. }
复制代码

条件得到甲的几率得到乙的几率得到丙的几率
满足 A、B、C8/144/142/14
满足 A、B,不满足 C8/124/120
满足 A,不满足 B100
不满足 A000



minecraft:tag

返回指定物品标签的内容。需要再定义 name(字符串)字段,其中写物品标签的资源路径(不带开头 # 号);以及 expand(布尔)字段,如果该值为 true,将会从物品标签内随机抽取出一个物品返回,否则会将物品标签内的所有物品都返回。例如:
  1. data/spgoding/tags/items/foo.json
  2. {
  3.     "values": [
  4.         "minecraft:blue_wool",
  5.         "minecraft:yellow_wool",
  6.         "minecraft:red_wool"
  7.     ]
  8. }

  9. data/spgoding/loot_tables/bar.json
  10. {
  11.     "type": "minecraft:tag",
  12.     "name": "spgoding:foo",
  13.     "expand": false
  14. }
复制代码
当该项目被执行时,会返回一个蓝色羊毛、一个黄色羊毛和一个红色羊毛。如果把 expand 改为 true,将从这三种羊毛中随机返回一种。

本节完。点击论坛界面右侧的粉色「书签」可以快速回到上方目录。


格式
条件 - condition

战利品表中的条件与断言是完全相同的格式。有关断言的内容可以查看这篇文章:【CBL|SPG】[1.15] 新出的断言是什么东西

本节完。点击论坛界面右侧的粉色「书签」可以快速回到上方目录。


格式
函数 - function

函数,能够对该战利品表/奖池/项目返回的物品进行操作。

本节中,「数字或随机数」表示该字段的值可以是一个确切的数字,也可以是一个表示随机数范围的对象(即随机数生成器)。

随机数生成器有两种,「均匀分布型」和「二项分布型」。随机数生成器的格式如下:
-(字符串)type:随机数的生成方式。可选。可以为 minecraft:uniform(均匀分布)或 minecraft:binomial(二项分布)。默认为 minecraft:uniform(均匀分布)。

如果没有指定 type,或是指定的为 minecraft:uniform,你需要额外指定最小值与最大值:
-(数字)min:随机数的最小值(包含)。
-(数字)max:随机数的最大值(包含)。

如果 type 指定的为 minecraft:binomial,你需要额外指定参数 np
-(整型)n:伯努利试验的次数。
-(数字)p:伯努利试验成功的概率。

以下几个例子都是合法的:
  1. "xxx": 2

  2. "xxx": {
  3.     "min": 2,
  4.     "max": 2
  5. }

  6. "xxx": {
  7.     "type": "minecraft:uniform",
  8.     "min": 1,
  9.     "max": 5
  10. }

  11. "xxx": {
  12.     "type": "minecraft:binomial",
  13.     "n": 5,
  14.     "p": 0.5
  15. }
复制代码


下面将分别介绍所有的函数以及它们的参数。

minecraft:apply_bonus

本函数只能在 minecraft:block 类型的战利品表中使用。

根据游戏内置的公式,设置物品的奖励数量。最终物品的数量 = 原有数量 + 奖励数量。

-(字符串)enchantment:用于计算的魔咒 ID。游戏会获取玩家手中工具的该魔咒的等级(记为 level)。如果工具没有该魔咒,level 记为 0
-(字符串)formula:计算公式。
-(对象)parameters:公式的其他参数。根据不同 formula,需要指定的参数不同。

计算公式有以下三种:
- binomial_with_bonus_count:需要指定参数 extraRounds(整数)、probability(浮点数)。将按照二项分布,nlevel + extraRounds 带入,pprobabilty 带入,生成随机数。
- uniform_bonus_count:需要指定参数 bonusMultiplier(浮点数)。将按照均匀分布,生成从 0bonusMultiplier * level 的随机数。
- ore_drops:不需要指定参数。将按照公式 物品原始数量 * (max(0, random(0..1) - 1) + 1) 生成随机数。

例子:
  1. {
  2.     "function": "minecraft:apply_bonus",
  3.     "enchantment": "minecraft:fortune",
  4.     "formula": "minecraft:binomial_with_bonus_count",
  5.     "parameters": {
  6.         "extra": 3,
  7.         "probability": 0.5714286
  8.     }
  9. }
复制代码
(气氛逐渐数学起来)


minecraft:copy_name

本函数只能在 minecraft:block 类型的战利品表中使用。

将该方块实体的显示名 CustomName 复制到物品的 display.Name 中。

物品的显示名 display.Name 和方块实体的显示名 BlockEntityTag.CustomName 都可以决定放置出去的方块实体的显示名。当只指定了 display.Name 时,物品的显示名、放置出去的方块实体的显示名都是指定的值;当只指定了 BlockEntityTag.CustomName 时,物品的显示名为默认名称,放置出去的方块实体的显示名为指定的值;当两者都指定时,物品的显示名、放置出去的方块实体的显示名均为 display.Name 指定的值。

-(字符串)source:复制源。只能是 block_entity

例子:
  1. {
  2.     "function": "minecraft:copy_name",
  3.     "source": "block_entity"
  4. }
复制代码



minecraft:copy_nbt

本函数只能在 minecraft:blockminecraft:entity 类型的战利品表中使用。

将[ruby=source]复制源[/ruby]的指定 NBT 路径的值复制到物品的指定 NBT 路径下。

-(字符串)source:复制源。可选值:this(死亡实体)、killer(击杀者实体)、killer_player(击杀者玩家)和 block_entity(被破坏的方块实体)。前三者只能在 minecraft:entity 类型的战利品表中使用,后者只能在 minecraft:block 类型的战利品表中使用
-(数组)ops:所有要进行的复制操作。
    -(对象)一个复制操作。
        -(字符串)source:源 NBT 路径。如果值为 "",将会复制复制源的所有 NBT。如果该路径无法匹配到复制源的任何 NBT,将不会进行此项复制操作。
        -(字符串)target:目标 NBT 路径。
        -(字符串)op:复制方式。可选值:replace(直接替换物品的目标路径下原有的值)、append(将内容追加到物品目标路径下原有的值中。仅对数组和列表类型的值有效)和 merge(将内容和物品目标路径下原有的值合并。仅对 compound 类型的值有效)。

例子:
一、原版旗帜
  1. {
  2.     "function": "minecraft:copy_nbt",
  3.     "source": "block_entity",
  4.     "ops": [
  5.         {
  6.             "source": "Patterns",
  7.             "target": "BlockEntityTag.Patterns",
  8.             "op": "replace"
  9.         }
  10.     ]
  11. }
复制代码
二、minecraft:copy_name 函数的等效写法
  1. {
  2.     "function": "minecraft:copy_nbt",
  3.     "source": "block_entity",
  4.     "ops": [
  5.         {
  6.             "source": "CustomName",
  7.             "target": "display.Name",
  8.             "op": "replace"
  9.         }
  10.     ]
  11. }
复制代码
三、将死亡实体的所有信息存到刷怪蛋之中
  1. {
  2.     "function": "minecraft:copy_nbt",
  3.     "source": "this",
  4.     "ops": [
  5.         {
  6.             "source": "",
  7.             "target": "EntityTag",
  8.             "op": "replace"
  9.         }
  10.     ]
  11. }
复制代码



minecraft:copy_state

本函数只能在 minecraft:block 类型的战利品表中使用。

将该方块的方块状态复制到物品的 BlockStateTag 标签中。

-(字符串)block:一个方块 ID。将用于检测 properties 中所写的方块状态是否存在。
-(列表)properties:要复制的方块状态。
    -(字符串)一个方块状态的键。如果该方块状态并不存在于 block 中所指定的方块上,该方块状态并不会产生任何效果。

例子:
  1. {
  2.     "function": "minecraft:copy_state",
  3.     "block": "minecraft:cake",
  4.     "properties": [
  5.         "bites"
  6.     ]
  7. }
复制代码
将该函数放置在蛋糕的战利品表中,即可让掉落的物品的 BlockStateTag 标签中存有该蛋糕的 bites 方块状态和相应的值。


minecraft:enchant_randomly

从指定的魔咒中随机抽取并附给该物品。

-(数组)enchantments:随机魔咒的抽取范围。如果不指定,所有适用于该物品的魔咒都有可能被抽取。
    -(字符串)一个魔咒 ID。

例子:
  1. {
  2.     "function": "minecraft:enchant_randomly",
  3.     "enchantments": [
  4.         "minecraft:silk_touch",
  5.         "minecraft:fortune
  6.     ]
  7. }
复制代码
该物品会被随机附上精准采集或时运。


minecraft:enchant_with_levels

将等价于经验等级的魔咒附给该物品。

-(数字或随机数)levels:经验等级。和使用附魔台消耗的经验等级一样。
-(布尔)treasure:是否允许宝藏魔咒。

例子:
  1. {
  2.     "function": "minecraft:enchant_with_levels",
  3.     "levels": 30,
  4.     "treasure": true
  5. }
复制代码
将会给予该物品等价于 30 级经验等级的宝藏魔咒。


minecraft:exploration_map

将普通的地图物品变为一个指引到某个结构的探险地图。

-(字符串)destination:目标结构的 ID。和 /locate 命令中的参数一样,但应改为全小写。
-(字符串)decoration:该结构在地图中显示的图标。如果设置为 mansionmonument,地图物品的图标将会改变。可以是这些值,大小写敏感。
-(整数)zoom:地图缩放等级。默认为 2
-(整数)search_radius:搜寻的区块半径。搜寻的区域是方形,不是圆形。设置为 0 将只在当前区块搜寻,设置为 1 将会搜寻当前区块和周围的 8 个区块,以此类推。默认为 50
-(布尔)skip_existing_chunks:是否不在已经生成过的区块搜寻。默认为 true

例子:
  1. {
  2.     "function": "minecraft:exploration_map",
  3.     "destination": "buried_treasure",
  4.     "decoration": "red_x",
  5.     "zoom": 1,
  6.     "skip_existing_chunks": false
  7. }
复制代码



minecraft:explosion_decay

本函数只能在 minecraft:block 类型的战利品表中使用。

如果该方块是被爆炸破坏的,执行该函数的每个物品有 1/爆炸半径 的几率消失(一组物品会被分为多个单独的物品计算);如果该方块是被正常挖掘的,该函数不会对物品造成任何影响。

例子:
  1. {
  2.     "function": "minecraft:explosion_decay"
  3. }
复制代码



minecraft:fill_player_head

本函数只能在 minecraft:entity 类型的战利品表中使用。

将玩家头颅的皮肤信息设置为指定玩家。

-(字符串)entity:指定玩家。可选值:thiskillerkiller_player。如果指定的实体不是玩家,或者该物品不是玩家头颅,什么都不会发生。

例子:
  1. {
  2.     "function": "minecraft:fill_player_head",
  3.     "entity": "killer"
  4. }
复制代码
将会返回击杀该实体的玩家的头颅。


minecraft:furnace_smelt

得到该物品被熔炉熔炼后的结果。例如该物品是生鸡肉,执行该函数后会变为熟鸡肉。

例子:
  1. {
  2.     "function": "minecraft:furnace_smelt"
  3. }
复制代码



minecraft:limit_count

限制每一种物品的堆叠数量的范围。当物品的堆叠数量小于最小值时,会被设置为最小值;当大于最大值时,会被设置为最大值。该函数通常放在 functions 中所有会改变物品数量的函数之后

-(对象)limit:限制范围。
    -(整数)min:最小值。
    -(整数)max:最大值。

例子:
  1. {
  2.     "function": "minecraft:limit_count",
  3.     "limit": {
  4.         "min": 1,
  5.         "max": 5
  6.     }
  7. }
复制代码
每种物品的堆叠数量会被限制在 [1, 5]


minecraft:looting_enchant

本函数只能在 minecraft:entity 类型的战利品表中使用。

由击杀者的抢夺魔咒等级调整物品的数量。

-(整数或随机数)count:每一级抢夺魔咒增加的物品数量。
-(整数)limit:物品数量的最大限制。如果设置为 0,将没有任何限制。

例子:
  1. {
  2.     "function": "minecraft:looting_enchant",
  3.     "limit": 5
  4. }
复制代码



minecraft:set_attributes

向该物品添加属性修饰器。

-(数组)modifiers:所有属性修饰器。
    -(对象)一个属性修饰器
        -(字符串)name:属性修饰器名称。
        -(字符串)attribute:被修饰的属性。
        -(字符串)operation:修饰模式。可选值:additionmultiply_basemultiply_total
        -(数字或随机数)amount:修饰器修饰数量。
        -(字符串)id:修饰器的 UUID。如果不指定,将会自动生成。
        -(字符串)slot:能应用该修饰器的物品栏位。可选值:mainhandoffhandfeetlegschesthead
        -(数组)slot:能应用该修饰器的所有物品栏位。
            -(字符串)一个栏位。可选值:mainhandoffhandfeetlegschesthead

例子:
  1. {
  2.     "function": "minecraft:set_attributes",
  3.     "modifiers": [
  4.         {
  5.             "name": "foo",
  6.             "attribute": "generic.movementSpeed",
  7.             "operation": "addition",
  8.             "amount": 2,
  9.             "slot": ["mainhand", "feet"]
  10.         }
  11.     ]
  12. }
复制代码
将给予该物品对移速属性的属性修饰器。


minecraft:set_contents

本函数只能在 minecraft:block 类型的战利品表中使用。

将指定物品设置到物品的 BlockEntityTag.Items 这一 NBT 当中。

-(数组)entries:要添加的物品。格式同战利品表的 entries

例子:
  1. {
  2.     "function": "minecraft:set_contents",
  3.     "entries": [
  4.         {
  5.             "type": "minecraft:dynamic",
  6.             "name": "minecraft:contents"
  7.         }
  8.     ]
  9. }
复制代码
会将该方块的内容物设置到物品的 BlockEntityTag.Items 中。


minecraft:set_count

设置物品堆叠数量。

-(整数或随机数)count:堆叠数量。

例子:
  1. {
  2.     "function": "minecraft:set_count",
  3.     "count": {
  4.         "min": 0,
  5.         "max": 16
  6.     }
  7. }
复制代码
该物品会被随机设置为 0 至 16 之间的数量。


minecraft:set_damage

设置物品耐久度。

-(数字或随机数)damage:耐久度。值域为 [0.0, 1.0]。1.0 是未被损坏,0.0 是用尽耐久。

例子:
  1. {
  2.     "function": "minecraft:set_damage",
  3.     "damage": {
  4.         "min": 0.01,
  5.         "max": 0.5
  6.     }
  7. }
复制代码
该物品的耐久度会被随机设置在「只剩一点点」和「还剩一半」之间。


minecraft:set_lore

设置该物品的下标。

-(数组)lore :要添加的所有下标。
    -(字符串)一个下标。
    -(对象)一个下标。格式同 JSON 聊天文本。
-(字符串)entity:如果存在,将被用于解析 JSON 聊天文本的 selectorscore。可选值:thiskillerkiller_player本参数只能在 minecraft:entity 类型的战利品表中使用。物品下标中并不支持 score,但是该函数执行时会首先将指定实体的指定分数存储到 value,而下标能够识别出这个 value 并将其显示出来。
-(布尔)replace:是否清除原有的下标。

例子:
  1. {
  2.     "function": "minecraft:set_lore",
  3.     "lore": [
  4.         {
  5.             "text": "丢弃物品请按: ",
  6.             "color": "green",
  7.             "italic": false,
  8.             "extra": [
  9.                 {
  10.                     "keybind": "key.drop",
  11.                     "color": "gold"
  12.                 }
  13.             ]
  14.         }
  15.     ],
  16.     "replace": true
  17. }
复制代码



minecraft:set_name

设置该物品的显示名。

-(字符串)name:显示名。
-(对象)name:显示名。格式同 JSON 聊天文本。
-(字符串)entity:如果存在,将被用于解析 name 中的 score。可选值:thiskillerkiller_player本参数只能在 minecraft:entity 类型的战利品表中使用。物品显示名中并不支持 score,但是该函数执行时会首先将指定实体的指定分数存储到 value,而物品名能够识别出这个 value 并将其显示出来。

例子:
  1. {
  2.     "function": "minecraft:set_name",
  3.     "name": {
  4.         "score": {
  5.             "objective": "foo",
  6.             "name": "*"
  7.         },
  8.         "italic": false,
  9.         "color": "gold"
  10.     },
  11.     "entity": "killer_player"
  12. }
复制代码
假设击杀者的 foo 分数为 41,击杀者游戏名称为 SPGoding,得到的物品显示名 JSON 是 {"italic": false,"color":"gold","score":{"objective":"foo","name":"SPGoding","value":"41"}},其中 41 会被显示出来。


minecraft:set_nbt

给该物品设置 NBT。

-(字符串)tag:要添加的 NBT。和 /give 命令里面的类似。注意转义。

例子:{
    "function": "minecraft:set_nbt",
    "tag": "{foo:\"bar\"}"
}
该物品会被添加上 foo:"bar" 这一自定义 NBT。


minecraft:set_stew_effect

给迷之炖菜(minecraft:suspicious_stew)设置效果。

-(数组)effects:随机添加的效果,将从中随机抽出一个赋予迷之炖菜。
    -(对象)一个效果。
        -(字符串)type: 状态效果的 ID。
        -(数字或随机数)duration:该效果持续的时长。

例子:
  1. {
  2.     "function": "minecraft:set_stew_effect",
  3.     "effects": [
  4.         {
  5.             "type": "minecraft:poison",
  6.             "duration": {
  7.                 "min": 10.0,
  8.                 "max": 20.0
  9.             }
  10.         },
  11.         {
  12.             "type": "minecraft:weakness",
  13.             "duration": {
  14.                 "min": 6.0,
  15.                 "max": 8.0
  16.             }
  17.         },
  18.         {
  19.             "type": "minecraft:blindness",
  20.             "duration": {
  21.                 "min": 5.0,
  22.                 "max": 7.0
  23.             }
  24.         },
  25.         {
  26.             "type": "minecraft:speed",
  27.             "duration": {
  28.                 "min": 7.0,
  29.                 "max": 10.0
  30.             }
  31.         },
  32.         {
  33.             "type": "minecraft:jump_boost",
  34.             "duration": {
  35.                 "min": 7.0,
  36.                 "max": 10.0
  37.             }
  38.         },
  39.         {
  40.             "type": "minecraft:saturation",
  41.             "duration": {
  42.                 "min": 7.0,
  43.                 "max": 10.0
  44.             }
  45.         }
  46.     ]
  47. }
复制代码
该物品会被添加上众多随机效果。


minecraft:set_loot_table

本函数只能在 minecraft:block 类型的战利品表中使用。

设置物品的 BlockEntityTag.LootTableBlockEntityTag.LootPoolSeed 这两个 NBT。

-(字符串)name:战利品表 ID。
-(数字)seed:随机种子。如果为 0 或不指定,将不会设置 LootPoolSeed

例子:
  1. {
  2.     "function": "minecraft:set_loot_table",
  3.     "name": "spgoding:foobar"
  4. }
复制代码



本节完。点击论坛界面右侧的粉色「书签」可以快速回到上方目录。


例子

战利品表的所有内容已经讲完了。下面将以两个原版的战利品表为例。

本节完。点击论坛界面右侧的粉色「书签」可以快速回到上方目录。


例子
僵尸

内容
  1. {
  2.     "type": "minecraft:entity",
  3.     "pools": [
  4.         {
  5.             "rolls": 1,
  6.             "entries": [
  7.                 {
  8.                     "type": "minecraft:item",
  9.                     "functions": [
  10.                         {
  11.                             "function": "minecraft:set_count",
  12.                             "count": {
  13.                                 "min": 0.0,
  14.                                 "max": 2.0,
  15.                                 "type": "minecraft:uniform"
  16.                             }
  17.                         },
  18.                         {
  19.                             "function": "minecraft:looting_enchant",
  20.                             "count": {
  21.                                 "min": 0.0,
  22.                                 "max": 1.0
  23.                             }
  24.                         }
  25.                     ],
  26.                     "name": "minecraft:rotten_flesh"
  27.                 }
  28.             ]
  29.         },
  30.         {
  31.             "rolls": 1,
  32.             "entries": [
  33.                 {
  34.                     "type": "minecraft:item",
  35.                     "name": "minecraft:iron_ingot"
  36.                 },
  37.                 {
  38.                     "type": "minecraft:item",
  39.                     "name": "minecraft:carrot"
  40.                 },
  41.                 {
  42.                     "type": "minecraft:item",
  43.                     "name": "minecraft:potato"
  44.                 }
  45.             ],
  46.             "conditions": [
  47.                 {
  48.                     "condition": "minecraft:killed_by_player"
  49.                 },
  50.                 {
  51.                     "condition": "minecraft:random_chance_with_looting",
  52.                     "chance": 0.025,
  53.                     "looting_multiplier": 0.01
  54.                 }
  55.             ]
  56.         }
  57.     ]
  58. }
复制代码
僵尸的战利品表分为两个奖池。第一个奖池将会随机返回 0 至 2 个腐肉,玩家每有一级抢夺附魔则随机增加 0 到 1 个腐肉。第二个奖池会在玩家击杀僵尸时,有 2.5% 的几率返回铁锭/胡萝卜/土豆中的一种物品,玩家每有一级抢夺附魔则增加 1% 获得上述物品的几率。

本节完。点击论坛界面右侧的粉色「书签」可以快速回到上方目录。


例子
沙砾

内容
  1. {
  2.     "type": "minecraft:block",
  3.     "pools": [
  4.         {
  5.             "rolls": 1,
  6.             "entries": [
  7.                 {
  8.                     "type": "minecraft:alternatives",
  9.                     "children": [
  10.                         {
  11.                             "type": "minecraft:item",
  12.                             "conditions": [
  13.                                 {
  14.                                     "condition": "minecraft:match_tool",
  15.                                     "predicate": {
  16.                                         "enchantments": [
  17.                                             {
  18.                                                 "enchantment": "minecraft:silk_touch",
  19.                                                 "levels": {
  20.                                                     "min": 1
  21.                                                 }
  22.                                             }
  23.                                         ]
  24.                                     }
  25.                                 }
  26.                             ],
  27.                             "name": "minecraft:gravel"
  28.                         },
  29.                         {
  30.                             "type": "minecraft:alternatives",
  31.                             "conditions": [
  32.                                 {
  33.                                     "condition": "minecraft:survives_explosion"
  34.                                 }
  35.                             ],
  36.                             "children": [
  37.                                 {
  38.                                     "type": "minecraft:item",
  39.                                     "conditions": [
  40.                                         {
  41.                                             "condition": "minecraft:table_bonus",
  42.                                             "enchantment": "minecraft:fortune",
  43.                                             "chances": [
  44.                                                 0.1,
  45.                                                 0.14285715,
  46.                                                 0.25,
  47.                                                 1.0
  48.                                             ]
  49.                                         }
  50.                                     ],
  51.                                     "name": "minecraft:flint"
  52.                                 },
  53.                                 {
  54.                                     "type": "minecraft:item",
  55.                                     "name": "minecraft:gravel"
  56.                                 }
  57.                             ]
  58.                         }
  59.                     ]
  60.                 }
  61.             ]
  62.         }
  63.     ]
  64. }
复制代码
当玩家使用带有精准采集的工具挖掘沙砾时,返回沙砾;否则,在未被爆炸摧毁的前提下,根据玩家不同幸运等级,有不同的几率获得燧石,如果没有得到燧石则得到沙砾。

本节完。点击论坛界面右侧的粉色「书签」可以快速回到上方目录。


LootTable 与 DeathLootTable 标签

箱子等容器的 NBT 中有 LootTable 字段,在其中填写某个战利品表(需要为 minecraft:chest 类型)的资源路径,该战利品表将在容器打开时决定其中的物品,之后该 NBT 会被设置为空。
生物的 NBT 中有 DeathLootTable 字段,在其中填写某个战利品表(需要为 minecraft:entity 类型)的资源路径,该战利品表将决定生物死亡时的掉落物。

本节完。点击论坛界面右侧的粉色「书签」可以快速回到上方目录。


loot 命令

通过 loot 命令,可以直接让玩家执行某个战利品表。其基础语法为:
  1. /loot <物品产生的位置> <物品源>
复制代码


下面将分别讲述这两部分参数。

物品产生的位置

给予玩家

语法:give <实体选择器>

战利品表产生的物品会被给予 <实体选择器> 中指定的玩家。其效果与 /give 命令类似,即当物品栏里已有相同的物品且没有达到堆叠上限时,产生的物品会被并入已有的物品组;当物品栏中没有相同物品,或物品栏中相同物品的组已经达到堆叠上限时,产生的物品会按照栏位 Slot 值大小的顺序填入。与 /give 命令不同的是,当玩家背包已满时,战利品表产生的物品会被直接舍弃。

填入方块

语法:insert <方块 X Y Z 坐标>

战利品表产生的物品会被填入 <方块 X Y Z 坐标> 中指定的方块。当方块里已有相同的物品且没有达到堆叠上限时,产生的物品会被并入已有的物品组;当方块中没有相同物品,或方块中相同物品的组已经达到堆叠上限时,产生的物品会按照 Slot 值大小的顺序填入方块。

替换栏位

语法:
- replace entity <实体选择器> <栏位>
- replace block <方块 X Y Z 坐标> <栏位>

战利品表产生的物品会被填入 <实体选择器> 中指定玩家的指定栏位,或是 <方块 X Y Z 坐标> 中指定方块的指定栏位。其语法与效果均与 /replaceitem 命令相同。如果战利品表返回了多个不同种类的物品,第一种物品会被替换进指定的栏位,第二种物品会被替换进指定栏位的下一个栏位,……,第 n 种物品会被替换进指定栏位的下 (n-1) 个栏,若不再有下一个栏位,但是仍有不同种类的物品没有填入,这些物品会被直接舍弃。
注意:上文中所述的「下一个栏位」可能与通常意义上理解的有所不同,例如对于玩家而言,主手的下一个栏位为副手,再下一个栏位为靴子栏。有关这部分的详细研究,请参看 ruhuasiyuliach 共同完成的量子力学教程:http://www.mcbbs.net/thread-874755-1-1.html

以掉落物形式生成在世界

语法:
- spawn <生成 X Y Z 坐标>

战利品表产生的物品会在世界中 <生成 X Y Z 坐标> 这一位置以物品实体形式生成。其效果与 /summon minecraft:item ~ ~ ~ {Item:{id:"xxx"}} 命令类似。


物品源

来自钓鱼

语法:fish <战利品表 ID> <方块 X Y Z 坐标> <mainhand|offhand|<物品>>

假设:执行这条命令的实体,使用指定工具(mainhand 为使用实体主手的工具;offhand 为使用实体副手内的工具;<物品> 的语法与 /give 命令一致,为使用指定的物品。这一工具可以被 minecraft:match_tool 条件匹配到),将钓鱼竿浮标抛到了 <方块 X Y Z 坐标>,并钓到了 <战利品表 ID>。

由于该假设,当指定了 mainhandoffhand 时,这条命令必须由拥有 HandItems 标签的实体执行,不能被数据包命令函数、命令方块、告示牌等执行(可以使用 /execute as 更改命令执行者)。

在该假设下,战利品表所返回的物品即为该命令返回的物品。

来自击杀实体

语法:kill <实体选择器>

假设:执行这条命令的实体杀死了 <实体选择器> 所选择到的实体。

由于该假设,这条命令必须由实体执行,不能被数据包命令函数、命令方块、告示牌等执行(可以使用 /execute as 更改命令执行者);<实体选择器> 必须只能选择到一个实体,需要显式指定 limit=1

在该假设下,战利品表所返回的物品即为该命令返回的物品。

来自挖掘方块

语法:mine <方块 X Y Z 坐标> <mainhand|offhand|<物品>>

假设:执行这条命令的实体,使用指定工具(mainhand 为使用实体主手的工具;offhand 为使用实体副手内的工具;<物品> 的语法与 /give 命令一致,为使用指定的物品。这一工具可以被 minecraft:match_tool 条件匹配到),挖掘了 <方块 X Y Z 坐标> 这一位置的方块。

由于该假设,当指定了 mainhandoffhand 时,这条命令必须由拥有 HandItems 标签的实体执行,不能被数据包命令函数、命令方块、告示牌等执行(可以使用 /execute as 更改命令执行者)。

在该假设下,战利品表所返回的物品近似为该命令返回的物品。需要注意的是,该命令并不会检测工具的挖掘等级是否足够。也就是说,如果你在空手的状态下,假设 0 0 0 位置所放置的方块是铁块,在默认战利品表下,使用命令 /loot give @s mine 0 0 0 mainhand 能够成功获得一个铁块。但是,对于基岩、命令方块这类本身就不存在战利品表的不可破坏的方块,使用该命令并不能获得物品。

指定战利品表

语法:loot <战利品表 ID>

直接指定物品来自某个战利品表。将不会传递任何信息给战利品表,因此战利品表内的 minecraft:entity_propertiesminecraft:match_tool 等与特定实体/方块有关的函数/条件都不能使用。

例子

下面所有例子均能在数据包命令函数中执行。

/execute as @p run loot give @s fish minecraft:gameplay/fishing/fish 0 16 0 mainhand 给予玩家:其使用主手的工具,将浮标抛到 (0, 16, 0) 这一位置钓到的鱼。
/loot replace entity @p hotbar.0 mine 0 16 0 minecraft:diamond_pickaxe{isFoo:1b} 在玩家快捷栏第一栏放置:其使用拥有 isFoo 自定义 NBT 标签的钻石镐,挖掘 (0, 16, 0) 位置的方块所得到的战利品。
/execute as @p run loot spawn 2 4 8 kill @e[limit=1,tag=dead] 在 (2, 4, 8) 生成物品实体:玩家杀死 @e[limit=1,tag=dead] 这一实体所获得的战利品。
/loot insert 16 8 4 loot minecraft:entities/cat_morning_gift 在 (16, 8, 4) 的方块实体中插入:minecraft:entities/cat_morning_gift 战利品表返回的的物品。

本节完。

本教程完。


[groupid=546]Command Block Logic[/groupid]