← Back to Blog
Technical

The Complete Guide to Minecraft Bedrock Loot Tables

Loot tables control every drop in Minecraft Bedrock. When a zombie dies and drops rotten flesh, that's a loot table. When you open a dungeon chest and find a saddle, that's a loot table. When you fish up an enchanted book, that's a loot table. Understanding how they work is essential for any mod that involves mobs dropping items or chests containing loot.

This guide covers the complete loot table system from basic structure to advanced functions, with real examples you can use in your own mods.

The Basic Structure

A Bedrock loot table is a JSON file that lives in your behavior pack at loot_tables/. The structure has three levels: the table itself, pools within the table, and entries within each pool.

Think of it like a casino:

  • The table is the casino itself — one table per mob or chest type.
  • Pools are individual slot machines. Each pool runs independently and can produce loot. A table can have multiple pools, and ALL of them are rolled.
  • Entries are the possible outcomes of each slot machine. Each pool picks one entry (or none, depending on conditions).

This layering is powerful. A single mob can have one pool for its guaranteed drop (rotten flesh), another pool for its rare drop (iron ingot), and a third pool for its equipment drop (the sword it was holding). Each pool rolls independently.

Pools in Detail

Each pool has several properties that control its behavior:

Rolls

How many times the pool picks an entry. Can be a fixed number or a range.

  • Fixed: "rolls": 1 — the pool picks exactly 1 entry.
  • Range: "rolls": {"min": 1, "max": 3} — the pool picks between 1 and 3 entries (each roll is independent).

A chest loot table might use "rolls": {"min": 2, "max": 6} to fill 2-6 slots. A mob drop table typically uses "rolls": 1 for each type of drop.

Bonus Rolls

Extra rolls granted by the Looting enchantment. "bonus_rolls": 1 means Looting I adds 1 extra roll, Looting II adds 2, and so on. This is how Looting increases drop rates in vanilla.

Conditions (Pool-Level)

Conditions on a pool determine whether the pool runs at all. If the condition fails, the entire pool is skipped — zero drops from it.

Common pool-level conditions:

  • killed_by_player: The pool only runs if a player killed the mob (not fall damage, lava, etc.). Used for XP-related drops.
  • random_chance: The pool has a percentage chance to run. "chance": 0.1 means 10% chance.
  • random_chance_with_looting: Like random_chance but the probability increases with Looting level.

Entries in Detail

Each entry represents one possible drop. Entries have a type, a weight, and optionally functions and conditions.

Entry Types

  • item: Drops a specific item. The most common type. "type": "item", "name": "minecraft:diamond"
  • loot_table: References another loot table. Useful for reusing common drop sets. "type": "loot_table", "name": "loot_tables/custom/rare_gems.json"
  • empty: Drops nothing. Used to create chances of no drop. If a pool has 3 item entries and 7 empty entries with equal weight, there's a 70% chance of nothing and 30% chance of an item.

Weight

When a pool has multiple entries, weight determines how likely each entry is to be selected. Higher weight = more likely. The probability of an entry being chosen is its weight divided by the total weight of all entries in the pool.

Example: three entries with weights 10, 5, and 1:

  • Entry A (weight 10): 10/16 = 62.5% chance
  • Entry B (weight 5): 5/16 = 31.25% chance
  • Entry C (weight 1): 1/16 = 6.25% chance

This is how you create common, uncommon, and rare drops within the same pool.

Quality

Like weight, but scales with Looting. An entry with "weight": 1, "quality": 2 effectively has weight 1 + (2 * looting_level). With Looting III, its effective weight becomes 7. Use this for rare drops that should become less rare with Looting.

Functions: Modifying Drops

Functions transform the dropped item. They're applied after the entry is selected and before the item appears in the world.

set_count

Sets the stack size. Without this, you get exactly 1 of the item.

  • Fixed: "count": 3 — always drops exactly 3.
  • Range: "count": {"min": 1, "max": 5} — drops 1-5 randomly.

This is one of the most commonly used functions. Vanilla example: zombies drop 0-2 rotten flesh, implemented as "count": {"min": 0, "max": 2}.

set_data

Sets the data value (damage/variant) of an item. Used for potions, dyes, and other items with variants. "data": 5 on a dye would give you lime dye.

set_damage

Sets the durability of a tool or weapon. "damage": {"min": 0.1, "max": 0.9} gives the item 10-90% of its durability remaining. Useful for mob equipment drops — the iron sword a zombie drops is usually damaged.

enchant_with_levels

Applies random enchantments as if the item was enchanted at an enchanting table with a specific level range.

"levels": {"min": 20, "max": 30} gives enchantments equivalent to a level 20-30 enchanting table. The actual enchantments are random but follow vanilla enchanting probability.

Optional: "treasure": true allows treasure-only enchantments (like Mending and Frost Walker) to appear.

specific_enchants

Applies exact enchantments you specify. Unlike enchant_with_levels, this gives you full control.

Example: "enchants": [{"id": "sharpness", "level": 3}, {"id": "unbreaking", "level": 2}] gives the item Sharpness III and Unbreaking II every time.

looting_enchant

Adds extra items based on the Looting enchantment level. "count": {"min": 0, "max": 1} means each level of Looting adds 0-1 extra items to the stack.

set_name

Gives the item a custom name. "name": "Blade of the Forgotten" creates a named item. Great for boss drops and unique loot.

set_lore

Adds lore text (tooltip lines) to the item. "lore": ["A weapon forged in darkness", "Deals extra damage to undead"]

Conditions on Entries

Conditions can also be applied to individual entries within a pool, not just the pool itself. This lets you have conditional drops within a single pool.

  • killed_by_player: This entry only appears if a player made the kill.
  • killed_by_entity: Specific entity did the killing (e.g., wolf, arrow).
  • random_chance: Flat probability check for this specific entry.
  • has_mark_variant: The killed entity has a specific variant (useful for mobs with visual variants that drop different loot).

Practical Examples

Example 1: Custom Mob — Shadow Wolf

A hostile wolf that drops shadow fur (common), shadow fangs (uncommon), and rarely a Shadow Blade (rare, pre-enchanted).

Loot table design:

  • Pool 1 (Guaranteed): 1 roll. Shadow Fur, count 1-3. Looting adds 0-1.
  • Pool 2 (Uncommon): 1 roll, condition: killed_by_player. Two entries — Shadow Fang (weight 3) and empty (weight 7). So 30% chance of a fang when killed by player.
  • Pool 3 (Rare): 1 roll, condition: random_chance 0.05 (5% base). Shadow Blade with enchant_with_levels 15-25. Quality 1 so Looting helps.

Result: Every Shadow Wolf drops 1-3 fur. 30% chance of a fang if you kill it yourself. 5% chance (improved with Looting) of a randomly enchanted Shadow Blade.

Example 2: Dungeon Chest

A custom dungeon chest with tiered loot — always some basics, sometimes good stuff, rarely amazing stuff.

Loot table design:

  • Pool 1 (Basics, 3-5 rolls): Entries: bread (weight 10, count 1-3), arrows (weight 8, count 5-15), coal (weight 8, count 3-8), string (weight 6, count 1-4), bones (weight 6, count 1-3).
  • Pool 2 (Good stuff, 1-2 rolls): Entries: iron ingot (weight 10, count 1-3), gold ingot (weight 5, count 1-2), iron sword (weight 3, set_damage 0.3-0.8), iron armor pieces (weight 2 each, set_damage 0.2-0.7), empty (weight 15).
  • Pool 3 (Rare, 1 roll): Entries: diamond (weight 2, count 1), enchanted book (weight 2, enchant_with_levels 10-20 with treasure true), custom unique item (weight 1, specific enchant + set_name), empty (weight 20).

Result: Chests always have basic supplies. Sometimes have iron/gold gear. Rarely contain diamonds, enchanted books, or unique items. Feels rewarding without being broken.

Example 3: Boss Drop Table

A boss mob that always drops its signature item plus bonus loot.

Loot table design:

  • Pool 1 (Guaranteed trophy): 1 roll. Boss Trophy item, count 1. Always drops.
  • Pool 2 (Guaranteed XP items): 1 roll. XP Orb Shard, count 5-10.
  • Pool 3 (Signature weapon, 1 roll): Boss Sword with specific_enchants [Sharpness V, Fire Aspect II, Unbreaking III] and set_name "Infernal Edge" and set_lore ["Forged in the boss's own fire"]. 100% drop — it's a boss, they should always drop their weapon.
  • Pool 4 (Bonus loot, 2-4 rolls): Diamond (weight 10, count 2-5), emerald (weight 8, count 3-7), netherite scrap (weight 2, count 1), enchanted golden apple (weight 1).

Loot Table File Locations

Where you place the loot table JSON matters:

  • Mob drops: loot_tables/entities/your_mob.json — referenced in the entity's behavior definition under the minecraft:loot component.
  • Chest loot: loot_tables/chests/your_chest.json — referenced in structure files or applied via Script API.
  • Fishing: loot_tables/gameplay/fishing/ — vanilla fishing loot tables that you can override.
  • Block drops: loot_tables/blocks/your_block.json — what drops when a custom block is mined.

Common Mistakes

  • Forgetting empty entries. If you want a chance of nothing dropping, you need explicit empty entries with weight. Without them, something always drops.
  • Rolls too high on rare pools. If a rare pool has 5 rolls, players get 5 chances at rare loot per kill. Usually 1 roll is correct for rare drops.
  • Not using set_count. Without set_count, every drop is exactly 1 item. Mobs should usually drop variable quantities.
  • Enchant levels too high. enchant_with_levels at 30 produces very powerful gear. For mid-game content, use 10-20.
  • Missing the loot component. The loot table file exists but the entity definition doesn't reference it. Add "minecraft:loot": {"table": "loot_tables/entities/your_mob.json"} to the entity.

Auto-Generate Loot Tables

When you describe a mob to BlockSmith, include what it should drop: "drops 1-3 shadow fangs and rarely a Shadow Blade with Sharpness III." The AI generates the complete loot table with proper pools, weights, conditions, and functions. No manual JSON required.