tutorial:datagen_loot

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
tutorial:datagen_loot [2025/04/01 13:24] solidblocktutorial:datagen_loot [2025/04/01 13:47] (current) solidblock
Line 4: Line 4:
  
 ===== Block loot tables ===== ===== Block loot tables =====
-To create add a data generation for block loot tables, just create a class which extends ''FabricBlockLootTableProvider''.+To add a data generation for block loot tables, just create a class which extends ''FabricBlockLootTableProvider''.
  
 <code java TutorialBlockLootTableProvider.java> <code java TutorialBlockLootTableProvider.java>
Line 20: Line 20:
  
 And then, add this data generation in the entrypoint (we use ''ExampleModDataGenerator'' as an example): And then, add this data generation in the entrypoint (we use ''ExampleModDataGenerator'' as an example):
-<code java ExampleModDataGenerator >+<code java ExampleModDataGenerator.java>
 public class ExampleModDataGenerator implements DataGeneratorEntrypoint { public class ExampleModDataGenerator implements DataGeneratorEntrypoint {
   @Override   @Override
Line 34: Line 34:
  
 In the previous [[blocks]] tutorial, we created an //example block//. Now let's use the data generator to generate its loot table. It's as simple as: In the previous [[blocks]] tutorial, we created an //example block//. Now let's use the data generator to generate its loot table. It's as simple as:
-<code java TutorialBlockLootTableProvider>+<code java TutorialBlockLootTableProvider.java>
   @Override   @Override
   public void generate() {   public void generate() {
Line 48: Line 48:
     addDrop(TutorialBlocks.EXAMPLE_BLOCK, dropsNothing());     addDrop(TutorialBlocks.EXAMPLE_BLOCK, dropsNothing());
          
-    // drops a dirt when mined+    // drops a dirt block
     addDrop(TutorialBlocks.EXAMPLE_BLOCK, Blocks.DIRT);     addDrop(TutorialBlocks.EXAMPLE_BLOCK, Blocks.DIRT);
          
Line 60: Line 60:
     addDrop(TutorialBlocks.EXAMPLE_BLOCK, dropsWithSilkTouchOrShears(TutorialBlocks.EXAMPLE_BLOCK));     addDrop(TutorialBlocks.EXAMPLE_BLOCK, dropsWithSilkTouchOrShears(TutorialBlocks.EXAMPLE_BLOCK));
          
-    // drops three blocks +    // drops five blocks 
-    addDrop(TutorialBlocks.EXAMPLE_BLOCK, drops(TutorialBlocks.EXAMPLE_BLOCK).apply(SetCountLootFunction.builder(ConstantLootNumberProvider.create(5))));+    addDrop(TutorialBlocks.EXAMPLE_BLOCK, drops(TutorialBlocks.EXAMPLE_BLOCK) 
 +        .apply(SetCountLootFunction.builder(ConstantLootNumberProvider.create(5))));
 </code> </code>
  
-You can also generate data for the [[crops]] we introduced before:+You can also generate loot tables for the [[crops]] we introduced before:
 <code java> <code java>
-    addDrop(TutorialBlocks.CUSTOM_CROP, cropDrops(TutorialBlocks.CUSTOM_CROP, TutorialItems.CUSTOM_ITEM, TutorialItems.CUSTOM_SEEDS, BlockStatePropertyLootCondition.builder(Blocks.WHEAT).properties(StatePredicate.Builder.create().exactMatch(CropBlock.AGE, 7))));+    addDrop(TutorialBlocks.CUSTOM_CROP, cropDrops(TutorialBlocks.CUSTOM_CROP, TutorialItems.CUSTOM_ITEM, TutorialItems.CUSTOM_SEEDS, BlockStatePropertyLootCondition.builder(TutorialBlocks.CUSTOM_CROP).properties(StatePredicate.Builder.create().exactMatch(CropBlock.AGE, 7))));
 </code> </code>
  
-==== Adding Chest Loot ====+===== Simple Loot Table =====
  
-Firstly, we need an identifierThis identifier points to a json file that contains your chest loot.+To add a simple loot table, which can also be used in many occasions, such as chests, we just extend ''SimpleFabricLootTableProvider''. 
 +<code java TutorialChestLootTableProvider.java> 
 +public class TutorialChestLootTableProvider extends SimpleFabricLootTableProvider { 
 +  public TutorialChestLootTableProvider(FabricDataOutput output, CompletableFuture<RegistryWrapper.WrapperLookup> registryLookup) { 
 +    super(output, registryLookup, LootContextTypes.CHEST); 
 +  }
  
-<code java> +  public static final RegistryKey<LootTable> TEST_CHEST = RegistryKey.of(RegistryKeys.LOOT_TABLE, Identifier.of("tutorial", "test_chest"));
-// In Tutorial class +
-public static final Identifier TEST_CHEST = new Identifier("tutorial", "chests/test_loot"); +
-</code>+
  
-Let's create a chest loot table generator and register it like so. +  @Override 
- +  public void accept(BiConsumer<RegistryKey<LootTable>, LootTable.Builder> lootTableBiConsumer) { 
-<code java> +    lootTableBiConsumer.accept(TEST_CHEST, LootTable.builder() 
- +        .pool(LootPool.builder().rolls(ConstantLootNumberProvider.create(1.0F)) 
-private static class MyChestLootTables extends SimpleFabricLootTableProvider { +            .with(ItemEntry.builder(Items.DIAMOND) 
-    public MyChestLootGenerator(FabricDataOutput dataGenerator) { +                .apply(SetCountLootFunction.builder(ConstantLootNumberProvider.create(1.0F)))) 
- super(dataGenerator, LootContextTypes.CHEST); +            .with(ItemEntry.builder(Items.DIAMOND_SWORD))) 
-    } +    ); 
- +  }
-    @Override +
-    public void accept(BiConsumer<Identifier, LootTable.Builder> 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)))) +
-        ); +
-    }+
 } }
 +</code>
  
-// ...+And then in your entry point: 
 +<code java ExampleModDataGenerator.java> 
 +public class ExampleModDataGenerator implements DataGeneratorEntrypoint { 
 +  @Override 
 +  public void onInitializeDataGenerator(FabricDataGenerator generator) { 
 +    // ...
  
-@Override +    pack.addProvider(TutorialChestLootTableProvider::new); 
-public void onInitializeDataGenerator(FabricDataGenerator fabricDataGenerator) { +  }
-    FabricDataGenerator.Pack myPack = fabricDataGenerator.createPack(); +
-    myPack.addProvider(MyChestLootTables::new);+
 } }
 </code> </code>
  
-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();''+If you're using versions pre-1.20, please replace ''pack.addProvider(TutorialChestLootTableProvider::new);'' with ''fabricDataGenerator.addProvider(TutorialChestLootTableProvider::new);'', and remove ''FabricDataGenerator.Pack myPack = fabricDataGenerator.createPack();''
 + 
 +Now run the data generator, then start Minecraft and run the command ''/loot give @s loot tutorial:test_chest'' multiple times. See what happens! You can also try running the command ''/setblock ~ ~ ~ chest{LootTable:"tutorial:test_chest"}'' and open the chest.
tutorial/datagen_loot.1743513842.txt.gz · Last modified: 2025/04/01 13:24 by solidblock