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
:- 如果
type
为item
,则填写给予的物品id,如minecraft:stone
。默认物品数量为1。 - 如果
type
为loot_table
,则填写调用的战利品表名称。(命名空间):路径
。请看战利品表名称部分,
- 如果
functions
: 如果type
为item
,则对给予的物品执行特定函数,随机附魔、attributes、数量等等。注意函数的次序非常重要,游戏会顺序执行函数,所以一些修改物品数据的函数应该在如set_count
函数后执行,否则便会出错。- 一个函数(见下)
weight
: 此随机项目的权重。随机项目被选择的几率=此项目权重/整个随机池的所有随机项目权重的加总
。整数。quality
: 每点幸运值对该项目的权重增值,加完后向下取整数。整数。
条件(Condition)
- (一个条件)
condition
: 条件的名称,如entity_properties
。- ...: 其他条件的标签。
比如有一个条件叫作entity_scores
。其描述是这样的:
entity_scores
- 检测一个实体的记分板分数。entity
: 需要检测的实体。this
为这个死掉的实体(如果这是生物掉落的战利品表),killer
为检测杀死该实体的实体,killer_player
为检测杀死该实体的玩家。
如果指定了killer
或killer_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
,数值为战利品表名称。这样箱子打开时就会生成指定战利品表的物品(物品会被随机放置在不同格子内),取代原先的物品。
注意: 箱子和箱子矿车被打开时,战利品表会被设置为无,如果这时候被重新设置战利品表的话就会马上刷新箱子内容。高频的话甚至会造成以下情况:
参见
本章不是一个详细讲解战利品表的章节,因为目前已经有很详细的教程覆盖了战利品表的各种使用。