====== Adding items to existing loot tables ======
===== Introduction =====
Sometimes you want to add items to [[https://minecraft.wiki/w/Loot_table|loot tables]], for example adding your own drops to a vanilla block or entity. The simplest solution, replacing the loot table file, can break other mods – what if they want to change them as well? We’ll take a look at how you can add items to loot tables without overriding the table.
Our example will be adding eggs to the coal ore loot table.
===== Listening to loot table loading =====
Fabric API has an event that’s fired when loot tables are loaded, ''%%LootTableEvents.MODIFY%%''. You can register an event listener for it in your initializer. Let’s also check that the current loot table is the coal ore loot table.
// No magic constants!
private static final class_2960 COAL_ORE_LOOT_TABLE_ID = class_2246.COAL_ORE.getLootTableId();
// Actual code
LootTableEvents.MODIFY.register((resourceManager, lootManager, id, tableBuilder, source) -> {
// Let's only modify built-in loot tables and leave data pack loot tables untouched by checking the source.
// We also check that the loot table ID is equal to the ID we want.
if (source.isBuiltin() && COAL_ORE_LOOT_TABLE_ID.equals(id)) {
// Our code will go here
}
});
===== Adding items to the table =====
In loot tables, items are stored in //loot pool entries,// and entries are stored in //loot pools//. To add an item, we’ll need to add a pool with an item entry to the loot table.
We can make a pool with '''', and add it to the loot table:
LootTableEvents.MODIFY.register((resourceManager, lootManager, id, tableBuilder, source) -> {
if (source.isBuiltin() && COAL_ORE_LOOT_TABLE_ID.equals(id)) {
class_55.Builder poolBuilder = class_55.method_347();
tableBuilder.method_336(poolBuilder);
}
});
Our pool doesn’t have any items yet, so we’ll make an item entry and add it to the pool, and we're done:
LootTableEvents.MODIFY.register((resourceManager, lootManager, id, tableBuilder, source) -> {
if (source.isBuiltin() && COAL_ORE_LOOT_TABLE_ID.equals(id)) {
class_55.Builder poolBuilder = class_55.method_347()
.method_351(class_77.method_411(class_1802.field_8803));
tableBuilder.method_336(poolBuilder);
}
});
{{:tutorial:coal_ore_egg.png?400|}}