====== Loot Table Generation ====== Before reading this, make sure you've read [[datagen_setup|Getting started with Data Generation]], and have a class that implements ''DataGenerationEntrypoint'' To begin, make a class (or a few, you need one for blocks, chests and entities) that extends ''SimpleFabricLootTableProvider'' and register it like so: ==== Setting Up ==== To get started with block loot, create a block loot table generator private static class MyBlockLootTables extends FabricBlockLootTableProvider { public MyBlockLootTables(FabricDataOutput dataOutput) { super(dataOutput); } @Override public void generate() { // ... } } // ... @Override public void onInitializeDataGenerator(FabricDataGenerator fabricDataGenerator) { // ... FabricDataGenerator.Pack myPack = fabricDataGenerator.createPack(); myPack.addProvider(MyBlockLootTables::new); // ... } If you're using versions pre-1.20, please replace ''myPack.addProvider(MyBlockLootTables::new);'' with ''fabricDataGenerator.addProvider(MyBlockLootTables::new);''。You can also remove ''FabricDataGenerator.Pack myPack = fabricDataGenerator.createPack();''。 Let's just create a simple ore block and an item to drop from it for a block loot table. Add this to your block init or ''Tutorial'' class in this case. public static final Block TEST_ORE = Registry.register(Registry.BLOCK, new Identifier("tutorial", "test_ore"), new Block(...)); public static final Item TEST_ITEM = Registry.register(Registry.ITEM, new Identifier("tutorial", "test_item", new Item(...)); // Let's just ignore the fact that there isn't a block item 😅 ==== Adding Block Loot ==== private static class MyBlockLootTables extends FabricBlockLootTableProvider { public MyBlockLootTables(FabricDataOutput dataOutput) { super(dataOutput); } @Override public void generate() { addDrop(Tutorial.TEST_BLOCK, drops(Tutorial.TEST_ITEM)); } } Now that we successfully adding a block. Now let's add chest loot. ==== Adding Chest Loot ==== Firstly, we need an identifier. This identifier points to a json file that contains your chest loot. // In Tutorial class public static final Identifier TEST_CHEST = new Identifier("tutorial", "chests/test_loot"); Let's create a chest loot table generator and register it like so. private static class MyChestLootTables extends SimpleFabricLootTableProvider { public MyChestLootGenerator(FabricDataOutput dataGenerator) { super(dataGenerator, LootContextTypes.CHEST); } @Override public void accept(BiConsumer biConsumer) { biConsumer.accept(Tutorial.TEST_CHEST, LootTable.builder() .pool(LootPool.builder().rolls(ConstantLootNumberProvider.create(1.0F)) .with(ItemEntry.builder(Items.DIAMOND) .apply(SetCountLootFunction.builder(ConstantLootNumberProvider.create(1.0F))) .with(ItemEntry.builder(Items.DIAMOND_SWORD)).apply(EnchantWithLevelsLootFunction.create(UniformLootNumberProvider.create(20.0F, 39.0F)))) ); } } // ... @Override public void onInitializeDataGenerator(FabricDataGenerator fabricDataGenerator) { FabricDataGenerator.Pack myPack = fabricDataGenerator.createPack(); myPack.addProvider(MyChestLootTables::new); } If you're using versions pre-1.20, please replace ''myPack.addProvider(MyBlockLootTables::new);'' with ''fabricDataGenerator.addProvider(MyBlockLootTables::new);''。You can also remove ''FabricDataGenerator.Pack myPack = fabricDataGenerator.createPack();''。