掉落条件(Loot Conditions)
掉落条件(Loot Conditions)用于判断某个 掉落条目 或 掉落池 是否应该在当前上下文中被使用。在这两种情况下,都会定义一个条件列表;只有当所有条件都通过时,条目或池才会被使用。在数据生成(datagen)过程中,可以通过调用 #when,将条件实例添加到 LootPoolEntryContainer.Builder<?> 或 LootPool.Builder 中。本文将介绍可用的掉落条件。如需自定义掉落条件,请参阅 自定义掉落条件。
minecraft:inverted
该条件接受另一个条件,并对其结果取反。所需的掉落参数与被包裹的条件一致。
{
"condition": "minecraft:inverted",
"term": {
// 其他某个掉落条件。
}
}
在数据生成过程中,可以通过调用 InvertedLootItemCondition#invert 并传入需要取反的条件,来构建该条件的 builder。
minecraft:all_of
该条件可以包含任意数量的其他条件,只有当所有子条件都返回 true 时,才会返回 true。如果列表为空,则返回 false。所需的掉落参数与所有子条件一致。
{
"condition": "minecraft:all_of",
"terms": [
{
// 一个掉落条件。
},
{
// 另一个掉落条件。
},
{
// 还可以有更多的掉落条件。
}
]
}
在数据生成过程中,可以通过调用 AllOfCondition#allOf 并传入所需的条件,来构建该条件的 builder。
minecraft:any_of
该条件可以包含任意数量的其他条件,只要至少有一个子条件返回 true,就会返回 true。如果列表为空,则返回 false。所需的掉落参数与所有子条件一致。
{
"condition": "minecraft:any_of",
"terms": [
{
// 一个掉落条件。
},
{
// 另一个掉落条件。
},
{
// 还可以有更多的掉落条件。
}
]
}
在数据生成过程中,可以通过调用 AnyOfCondition#anyOf 并传入所需的条件,来构建该条件的 builder。
minecraft:random_chance
该条件接受一个 数字提供者,表示 0 到 1 之间的概率,并根据该概率随机返回 true 或 false。数字提供者一般不应返回 [0, 1] 区间以外的值。
{
"condition": "minecraft:random_chance",
// 该条件应用时有 50% 的概率。
"chance": 0.5
}
在数据生成过程中,可以通过调用 LootItemRandomChanceCondition#randomChance 并传入数字提供者或(常量)float 值,来构建该条件的 builder。
minecraft:random_chance_with_enchanted_bonus
该条件接受一个附魔 ID(enchantment id)、一个 LevelBasedValue 和一个常量回退浮点值(constant fallback float value)。如果指定的附魔存在,则会通过 LevelBasedValue 查询一个值。如果指定的附魔不存在,或者无法从 LevelBasedValue 获取到值,则会使用常量回退值。然后,该条件会以之前确定的概率,随机返回 true 或 false,概率即为 true 被返回的几率。需要 minecraft:attacking_entity 参数,如果缺失则会回退为 0 级。
{
"condition": "minecraft:random_chance_with_enchanted_bonus",
// 每有一级战利品附魔,就增加 20% 成功概率。
"enchantment": "minecraft:looting",
"enchanted_chance": {
"type": "linear",
"base": 0.2,
"per_level_above_first": 0.2
},
// 如果没有战利品附魔,则始终失败。
"unenchanted_chance": 0.0
}
在数据生成(datagen)期间,可以调用 LootItemRandomChanceWithEnchantedBonusCondition#randomChanceAndLootingBoost,传入注册表查找(HolderLookup.Provider)、基础值和每级增加值,来构建该条件的 builder。或者,也可以调用 new LootItemRandomChanceWithEnchantedBonusCondition 以进一步指定各项值。
minecraft:value_check
该条件接受一个 数字提供器 和一个 IntRange,只有当数字提供器产生的结果在该范围内时才返回 true。
{
"condition": "minecraft:value_check",
// 可以是任意数字提供器。
"value": {
"type": "minecraft:uniform",
"min": 0.0,
"max": 10.0
},
// 带有最小值和最大值的范围。
"range": {
"min": 2.0,
"max": 5.0
}
}
在数据生成期间,可以调用 ValueCheckCondition#hasValue,传入数字提供器和范围,来构建该条件的 builder。
minecraft:time_check
该条件用于检查世界时间是否在一个 IntRange 范围内。可以选择性地提供一个 period 参数,用于对时间取模;例如,如果 period 设为 24000(一个游戏内昼夜循环有 24000 tick),就可以用来检查一天中的时间。
{
"condition": "minecraft:time_check",
// 可选项,可以省略。如果省略则不会进行取模操作。
// 这里我们用了 24000,代表一个游戏内昼夜循环的长度。
"period": 24000,
// 带有最小值和最大 值的范围。本例检查时间是否在 0 到 12000 之间。
// 结合上方指定的 24000 取模操作,本例实际检查当前是否为白天。
"value": {
"min": 0,
"max": 12000
}
}
在数据生成期间,可以调用 TimeCheck#time,传入所需范围,来构建该条件的 builder。之后可以使用 #setPeriod 在 builder 上设置 period 值。
minecraft:weather_check
该条件用于检查当前天气是否为下雨或打雷。
{
"condition": "minecraft:weather_check",
// 可选。如果未指定,则不会检查下雨状态。
"raining": true,
// 可选。如果未指定,则不会检查雷暴状态。
// 指定 "raining": true 和 "thundering": true 在功能上等同于只指定
// "thundering": true,因为只要有雷暴就一定下雨。
"thundering": false
}
在数据生成(datagen)过程中,调用 WeatherCheck#weather 来构建此条件的 builder。然后可以分别使用 #setRaining 和 #setThundering 在 builder 上设置 raining 和 thundering 的值。
minecraft:location_check
此条件接受一个 LocationPredicate(位置断言)以及每个轴方向的可选偏移值。LocationPredicate 允许你检查例如位置本身、该位置的方块或流体状态、所在维度、生物群系(biome)或结构、光照等级、天空是否可见等条件。所有可用的值可以在 LocationPredicate 类定义中查看。此条件需要 minecraft:origin 战利品参数,如果该参数缺失则始终失败。
{
"condition": "minecraft:location_check",
"predicate": {
// 如果目标在下界(nether)中的任意位置,则条件成立。
"dimension": "the_nether"
},
// 可选的位置偏移值。仅在你以某种方式检查位置时才有意义。
// 必须要么全部提供,要么全部不提供。
"offsetX": 10,
"offsetY": 10,
"offsetZ": 10
}
在数据生成过程中,调用 LocationCheck#checkLocation,传入 LocationPredicate 以及可选的 BlockPos,以构建此条件的 builder。
minecraft:block_state_property
此条件检查指定的方块状态属性(block state properties)在被破坏的方块状态中是否为指定的值。需要 minecraft:block_state 战利品参数,如果该参数缺失则始终失败。
{
"condition": "minecraft:block_state_property",
// 期望的方块。如果这与实际被破坏的方块不符,则条件失败。
"block": "minecraft:oak_slab",
// 要匹配的方块状态属性。未指定的属性可以为任意值。
// 在本例中,我们只希望在破坏顶层台阶(无论是否充满水)时条件成立。
// 如果这里指定了方块没有的属性,会在日志中输出警告。
"properties": {
"type": "top"
}
}
在数据生成过程中,调用 LootItemBlockStatePropertyCondition#hasBlockStateProperties 并传入方块,以构建此条件的 builder。然后可以使用 #setProperties 在 builder 上设置所需的方块状态属性值。
minecraft:survives_explosion
该条件会随机销毁掉落物。掉落物存活的概率为 1 / explosion_radius 掉落参数(loot parameter)。该函数被几乎所有方块掉落物调用,极少数例外如信标(beacon)或龙蛋(dragon egg)。需要 minecraft:explosion_radius 掉落参数,如果该参数缺失则总是判断为通过。
{
"condition": "minecraft:survives_explosion"
}
在数据生成(datagen)期间,可调用 ExplosionCondition#survivesExplosion 来构建此条件的构建器。
minecraft:match_tool
该条件接受一个 ItemPredicate,并用它来检查 tool 掉落参数。ItemPredicate 可指定有效物品 id 列表(items)、物品数量的最小/最大范围(count)、DataComponentPredicate(components)以及 ItemSubPredicate 的映射(predicates);所有字段均为可选。需要 minecraft:tool 掉落参数,如果缺失则总是判断为不通过。
{
"condition": "minecraft:match_tool",
// 匹配下界合金镐或斧。
"predicate": {
"items": [
"minecraft:netherite_pickaxe",
"minecraft:netherite_axe"
]
}
}
在数据生成期间,可调用 MatchTool#toolMatches 并传入一个 ItemPredicate.Builder 来构建此条件的构建器。
minecraft:enchantment_active
该条件用于判断某个附魔是否处于激活状态。需要 minecraft:enchantment_active 掉落参数,如果该参数缺失则总是判断为不通过。
{
"condition": "minecraft:enchantment_active",
// 指定附魔是否应为激活状态(true)或非激活状态(false)。
"active": true
}
在数据生成期间,可调用 EnchantmentActiveCheck#enchantmentActiveCheck 或 #enchantmentInactiveCheck 来构建此条件的构建器。
minecraft:table_bonus
该条件类似于 minecraft:random_chance_with_enchanted_bonus,但使用固定值而非随机值。需要 minecraft:tool 掉落参数,如果缺失则总是判断为不通过。
{
"condition": "minecraft:table_bonus",
// 如果存在时运(fortune)附魔,则应用奖励。
"enchantment": "minecraft:fortune",
// 每级附魔对应的概率。本例中,未附魔时有 20% 成功概率,
// 1 级附魔时为 30%,2 级及以上为 60%。
"chances": [0.2, 0.3, 0.6]
}
在数据生成期间,可调用 BonusLevelTableCondition#bonusLevelFlatChance,传入附魔 id 和概率数组来构建此条件的构建器。
minecraft:entity_properties
该条件会用给定的 EntityPredicate 检查一个 实体目标。EntityPredicate 可以检查实体类型、生物效果、nbt 值、装备、位置等属性。
{
"condition": "minecraft:entity_properties",
// 要使用的实体目标。有效值有 "this"、"attacker"、"direct_attacker" 或 "attacking_player"。
// 它们分别对应 "this_entity"、"attacking_entity"、"direct_attacking_entity" 和
// "last_damage_player" 战利品参数。
"entity": "attacker",
// 仅当目标是猪时判定成功。谓词也可以为空,这可以用来检测指定的实体目标是否被设置。
"predicate": {
"type": "minecraft:pig"
}
}
在数据生成(datagen)期间,调用 LootItemEntityPropertyCondition#entityPresent 并传入实体目标,或调用 LootItemEntityPropertyCondition#hasProperties 并传入实体目标和 EntityPredicate,以构建此条件的构建器。
minecraft:damage_source_properties
该条件会根据给定的 DamageSourcePredicate 检查伤害来源(damage source)战利品参数。需要 minecraft:origin 和 minecraft:damage_source 战利品参数,如果这些参数缺失则始终失败。
{
"condition": "minecraft:damage_source_properties",
"predicate": {
// 检查伤害来源实体是否为僵尸。
"source_entity": {
"type": "zombie"
}
}
}
在数据生成期间,调用 DamageSourceCondition#hasDamageSource 并传入一个 DamageSourcePredicate.Builder,以构建该条件的构建器。
minecraft:killed_by_player
该条件判断击杀是否由玩家完成。部分实体掉落物(如烈焰人掉落的烈焰棒)会用到此条件。需要 minecraft:last_player_damage 战利品参数,如果该参数缺失则始终失败。
{
"condition": "minecraft:killed_by_player"
}
在数据生成期间,调用 LootItemKilledByPlayerCondition#killedByPlayer 以构建该条件的构建器。
minecraft:entity_scores
该条件会检查 实体目标 的记分板(scoreboard)。需要与指定实体目标对应的战利品参数,如果该参数缺失则始终失败。
{
"condition": "minecraft:entity_scores"
// 要使用的实体目标。有效值有 "this"、"attacker"、"direct_attacker" 或 "attacking_player"。
// 它们分别对应 "this_entity"、"attacking_entity"、"direct_attacking_entity" 和
// "last_damage_player" 战利品参数。
"entity": "attacker",
// 必须处于指定范围内的记分板分数列表。
"scores": {
"score1": {
"min": 0,
"max": 100
},
"score2": {
"min": 10,
"max": 20
}
}
}
在数据生成期间,调用 EntityHasScoreCondition#hasScores 并传入实体目标以构建该条件的构建器。之后,使用 #withScore 方法向构建器添加所需的分数。
minecraft:reference
此条件引用一个谓词文件(predicate file),并返回其结果。更多信息请参见 [物品谓词][predicate]。
```json5
{
"condition": "minecraft:reference",
// 引用 data/examplemod/predicate/example_predicate.json 路径下的谓词文件。
"name": "examplemod:example_predicate"
}
在数据生成(datagen)过程中,可以调用 ConditionReference#conditionReference 并传入被引用谓词文件的 id,以构建该条件的构建器。
neoforge:loot_table_id
此条件仅在当前战利品表(loot table)的 id 匹配时返回 true。通常用于 全局战利品修饰器。
{
"condition": "neoforge:loot_table_id",
// 仅当战利品表为泥土(dirt)时生效
"loot_table_id": "minecraft:blocks/dirt"
}
在数据生成过程中,可通过调用 LootTableIdCondition#builder 并传入期望的战利品表 id,来构建该条件的构建器。
neoforge:can_item_perform_ability
此条件仅在 tool 战利品上下文参数(LootContextParams.TOOL)中的物品(通常是用于破坏方块或击杀实体的物品)能够执行指定的 ItemAbility 时返回 true。此条件需要 minecraft:tool 战利品参数,如果该参数缺失则始终失败。
{
"condition": "neoforge:can_item_perform_ability",
// 仅当工具能够像斧头一样剥除原木(strip a log)时生效
"ability": "axe_strip"
}
在数据生成过程中,可通过调用 CanItemPerformAbility#canItemPerformAbility 并传入所需物品能力的 id,来构建该条件的构建器。
参见
- 物品谓词(参见 Minecraft Wiki)