Conditions 
While conditions can be used in different ways, from now on the examples on this page will shown with LootEntries but they can easily be used in other places.
matchTool 
Matches the tool, the player used to destroy the block. This is only set when destroying blocks.
INFO
When working with block loot, prefer matchTool over matchMainHand.
- Syntax: 
.matchTool(filter: ItemPredicate | ItemFilter | Item), see ItemFilter or ItemPredicateLootCondition.matchTool(filter: ItemPredicate | ItemFilter | Item)
 
LootEntry.of("minecraft:diamond").matchTool("#c:tools")LootEntry.of("minecraft:diamond").matchTool(
    ItemFilter.tag("c:tools").and(ItemFilter.hasEnchantment("minecraft:fortune", 3))
)Using an ItemPredicate:
LootEntry.of("minecraft:diamond").matchTool({
    items: "#c:tools",
    predicates: {
        enchantments: [
            {
                enchantments: "minecraft:fortune",
                levels: 3,
            },
        ],
    },
})matchMainHand 
Matches the main hand item of the player by given ItemFilter or Ingredient
- Syntax: 
.matchMainHand(filter: ItemFilter | Item), see ItemFilterLootCondition.matchMainHand(filter: ItemFilter | Item)
 
LootEntry.of("minecraft:diamond").matchMainHand("#minecraft:pickaxes")matchOffHand 
Matches the off hand item of the player by given ItemFilter or Ingredient
- Syntax: 
.matchOffHand(filter: ItemFilter | Item), see ItemFilterLootCondition.matchOffHand(filter: ItemFilter | Item)
 
LootEntry.of("minecraft:diamond").matchOffHand("#minecraft:pickaxes")matchEquip 
Matches the equipment from a slot of the player by given ItemFilter or Ingredient.
 Possible slots are: "mainhand", "offhand", "head", "chest", "legs", "feet".
- Syntax: 
.matchEquip(slot, filter: ItemFilter | Item), see ItemFilterLootCondition.matchEquip(slot, filter: ItemFilter | Item)
 
LootEntry.of("minecraft:diamond").matchEquip("mainhand", "#minecraft:pickaxes")survivesExplosion 
Matches if the item survives an explosion. Calculated by probability of random_number < (1 / explosion_radius), where random_number is a random generated number between 0 and 1. If no explosion happens, it will always survive.
- Syntax: 
.survivesExplosion()LootCondition.survivesExplosion()
 
LootEntry.of("minecraft:diamond").survivesExplosion()matchTime 
Compares the current day time (24000 * day_count + day_time) against given values.
- Syntax: 
.matchTime(min: number, max: number).matchTime(period: number, min: number, max: number)LootCondition.matchTime(min: number, max: number)LootCondition.matchTime(period: number, min: number, max: number)
If period is provided,day_timewill be reduced modulo by givenperiod. Setting this to 24000 simulates a full day check. Default is 24000, if not provided
 
// Will match if the current day time is between 0 and 9000.
LootEntry.of("minecraft:diamond").matchTime(0, 9000)// Will match the first day of the week. (If we go with 7 days per minecraft "week")
LootEntry.of("minecraft:diamond").matchTime(24000 * 7, 0, 24000)matchWeather 
Matches the current weather
- Syntax: 
.matchWeather(isRaining: boolean | null, isThundering: boolean | null)LootCondition.matchWeather(isRaining: boolean | null, isThundering: boolean | null)
 
// Matches if it is raining and not thundering
LootEntry.of("minecraft:diamond").matchWeather(true, false)// Matches if it is raining
LootEntry.of("minecraft:diamond").matchWeather(true, null)randomChance 
Matches if a random number between 0 and 1 is lower than the given value
- Syntax: 
.randomChance(chance: number)LootCondition.randomChance(chance: number)
 
LootEntry.of("minecraft:diamond").randomChance(0.5) // 50% chancerandomTableBonus 
Passes with probability picked from a list of probabilities, indexed by enchantment power. Mainly used for block drops, because a tool is required.
- Syntax: 
LootCondition.randomTableBonus(enchantment: Enchantment, probabilities: number[])
 
LootEntry.of("minecraft:diamond").randomTableBonus("minecraft:fortune", [0, 0.33, 0.66, 1.0])randomChanceWithEnchantment 
Passes with probability picked from a list of probabilities, indexed by enchantment power. Mainly used for fishing and entity drops, because an attacker is required.
- Syntax: 
.randomChanceWithEnchantment(chance: number, probabilities: number[])LootCondition.randomChanceWithEnchantment(chance: number, probabilities: number[])
 
LootEntry.of("minecraft:diamond").randomChanceWithEnchantment(
    "minecraft:looting",
    [0, 0.33, 0.66, 1.0]
)matchBiome 
Matches if the player is in the given biome
- Syntax: 
.matchBiome(biomes: string | string[] | tag)LootCondition.matchBiome(biomes: string | string[] | tag)
 
LootEntry.of("minecraft:diamond").matchBiome("minecraft:jungle")matchDimension 
Matches if the player is in one of the given dimensions
- Syntax: 
.matchDimension(dimension: id)LootCondition.matchDimension(dimension: id)
 
LootEntry.of("minecraft:diamond").matchDimension("minecraft:overworld")matchStructure 
Matches if the player is in one of the given structures. 
 If exact is set to true, it will check if the player is inside the structure parts (like houses in a village). Otherwise it will just check if the player is within the structure bounds.
- Syntax: 
.matchStructure(structure: string | string[] | tag)LootCondition.matchStructure(structure: string | string[] | tag).matchStructure(structure: string | string[] | tag, exact: boolean)LootCondition.matchStructure(structure: string | string[] | tag, exact: boolean)
 
LootEntry.of("minecraft:diamond").matchStructure(["minecraft:stronghold", "minecraft:village"], false)isLightLevel 
Matches if the player is in the given light level
- Syntax: 
.isLightLevel(min: number, max: number)LootCondition.isLightLevel(min: number, max: number)
 
LootEntry.of("minecraft:diamond").isLightLevel(0, 15)luck 
Matches if the player has the given luck level
- Syntax: 
.luck(level: Range), see RangeLootCondition.luck(level: Range)
 
killedByPlayer 
Matches if an entity was killed by the player
- Syntax: 
.killedByPlayer()LootCondition.killedByPlayer()
 
LootEntry.of("minecraft:diamond").killedByPlayer()matchEntity 
Matches against the entity that died, opened the chest or destroyed the block.
- Syntax: 
.matchEntity(predicate: EntityPredicate), see EntityPredicateLootCondition.matchEntity(predicate: EntityPredicate)
 
LootEntry.of("minecraft:diamond").matchEntity(Predicates.entity().isCrouching(true))matchDirectAttacker 
Matches against the direct entity which caused the death, e.g. the arrow entity, not the shooter.
- Syntax: 
.matchDirectAttacker(predicate: EntityPredicate), see EntityPredicateLootCondition.matchDirectAttacker(predicate: EntityPredicate)
 
LootEntry.of("minecraft:diamond").matchDirectAttacker(Predicates.entity().isCrouching(true))matchAttacker 
Matches against the entity which caused the death.
- Syntax: 
.matchAttacker(predicate: EntityPredicate), see EntityPredicateLootCondition.matchAttacker(predicate: EntityPredicate)
 
LootEntry.of("minecraft:diamond").matchAttacker(Predicates.entity().isCrouching(true))matchPlayer 
Matches against the player. If a player kills another player, it will check against the attacker.
- Syntax: 
.matchPlayer(predicate: EntityPredicate), see EntityPredicateLootCondition.matchPlayer(predicate: EntityPredicate)
 
LootEntry.of("minecraft:diamond").matchPlayer(Predicates.entity().isCrouching(true))matchPlayerCustom 
Custom callback predicate to check the player. The callback must return either true or false.
- Syntax: 
.matchPlayerCustom((player) => {}), where player is the actual playerLootCondition.matchPlayerCustom((player) => {})
 
LootEntry.of("minecraft:diamond").matchPlayerCustom(player => {
    // We are working with the actual player here
    return player.getMaxHealth() > 20
})matchEntityCustom 
Custom callback predicate to check the entity. The callback must return either true or false.
- Syntax: 
.matchEntityCustom((entity) => {}), where entity is the actual entityLootCondition.matchEntityCustom((entity) => {})
 
LootEntry.of("minecraft:diamond").matchEntityCustom(entity => {
    // We are working with the actual entity here
    return entity.getMaxHealth() > 20
})matchAttackerCustom 
Custom callback predicate to check the attacker. The callback must return either true or false.
- Syntax: 
.matchAttackerCustom((entity) => {}), where entity is the actual entityLootCondition.matchAttackerCustom((entity) => {})
 
LootEntry.of("minecraft:diamond").matchAttackerCustom(entity => {
    // We are working with the actual entity here
    return entity.getMaxHealth() > 20
})matchDirectAttackerCustom 
Custom callback predicate to check the direct attacker. The callback must return either true or false.
- Syntax: 
.matchDirectAttackerCustom((entity) => {}), where entity is the actual entityLootCondition.matchDirectAttackerCustom((entity) => {})
 
LootEntry.of("minecraft:diamond").matchDirectAttackerCustom(entity => {
    // We are working with the actual entity here
    return entity.getMaxHealth() > 20
})matchDamageSource 
Matches if the damage source is of the given type
- Syntax: 
.matchDamageSource(predicate: DamageSourcePredicate), see DamageSourcePredicateLootCondition.matchDamageSource(predicate: DamageSourcePredicate)
 
LootEntry.of("minecraft:diamond").matchDamageSource(
    Predicates.damageSource()
        .is("minecraft:falling_block")
        .isNot("minecraft:magic")
        .direct(Predicates.entity().isCrouching(true))
        .source(Predicates.entity().isCrouching(true))
)matchDistance 
Matches if the player is within the given distance
- Syntax: 
.matchDistance(predicate: DistancePredicate), see DistancePredicateLootCondition.matchDistance(predicate: DistancePredicate)
 
LootEntry.of("minecraft:diamond").matchDistance({
    absolute: {
        min: 42,
    },
})blockEntity 
Match the given block entity. Must return either true or false.
- Syntax: 
.blockEntity((blockEntity) => {})LootCondition.blockEntity((blockEntity) => {})
 
LootEntry.of("minecraft:diamond").blockEntity(blockEntity => {
    // We are working with the actual block entity here.
    // Return either true or false to match or not
})matchAllOf 
Will match if all the given conditions match. False otherwise.
- Syntax: 
.matchAllOf((container) => {})LootCondition.matchAllOf(condition1, condition2, ...)
 
LootEntry.of("minecraft:diamond").matchAllOf(conditions => {
    conditions
        .matchMainHand("#minecraft:pickaxes")
        .randomChance(0.5)
        .survivesExplosion()
        .matchBiome("#minecraft:forest")
})Using LootCondition.matchAllOf directly to create the condition.
const ourAndCondition = LootCondition.matchAllOf(
    LootCondition.matchMainHand("#minecraft:pickaxes"),
    LootCondition.randomChance(0.5),
    LootCondition.survivesExplosion(),
    LootCondition.matchBiome("#minecraft:forest")
)
LootEntry.of("minecraft:diamond").when(c => {
    c.addCondition(ourAndCondition)
})matchAnyOf 
Will match if one of the given conditions match. False otherwise.
- Syntax: 
.matchAnyOf((container) => {})LootCondition.matchAnyOf(condition1, condition2, ...)
 
LootEntry.of("minecraft:diamond").matchAnyOf(conditions => {
    conditions
        .matchMainHand("#minecraft:pickaxes")
        .randomChance(0.5)
        .survivesExplosion()
        .matchBiome("#minecraft:forest")
})Using LootCondition.matchAnyOf directly to create the condition.
const ourOrCondition = LootCondition.matchAnyOf(
    LootCondition.matchMainHand("#minecraft:pickaxes"),
    LootCondition.randomChance(0.5),
    LootCondition.survivesExplosion(),
    LootCondition.matchBiome("#minecraft:forest")
)
LootEntry.of("minecraft:diamond").when(c => {
    c.addCondition(ourOrCondition)
})matchCustomCondition 
Create a condition directly from JSON. This is useful to load conditions from other mods.
- Syntax: 
.matchCustomCondition(json)LootCondition.matchCustomCondition(json)
 
LootEntry.of("minecraft:diamond").matchCustomCondition({
    condition: "minecraft:match_tool",
    predicate: {
        enchantments: [
            {
                enchantment: "minecraft:silk_touch",
                levels: {
                    min: 1,
                },
            },
        ],
    },
})