======战利品表生成====== 在阅读本教程之前,请确认你已经阅读 [[zh_cn:tutorial:datagen_setup|开始了解数据生成]],并且知晓有一个类可以实现 ''DataGenerationEntrypoint''。 首先,创建一个类(或者多个,你需要一个给方块、箱子和实体)来继承(extends) ''SimpleFabricLootTableProvider'',然后像这样注册它: ====初始化==== 要开始使用方块战利品掉落,要先创建一个战利品表生成器 private static class MyBlockLootTables extends SimpleFabricLootTableProvider { public MyBlockLootTables(FabricDataGenerator dataGenerator) { super(dataGenerator, LootContextTypes.BLOCK); } @Override public void accept(BiConsumer biConsumer) { // ... } } // ... @Override public void onInitializeDataGenerator(FabricDataGenerator fabricDataGenerator) { fabricDataGenerator.addProvider(MyBlockLootTables::new); } 让我们为战利品表创建一个简单的矿石方块和它的掉落物。添加到你的方块初始化中,或者本实例中的 ''Tutorial'' 类中。 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(...)); // 请不要在乎没有这个方块的细节 😅 ====添加方块战利品掉落==== private static class MyBlockLootTables extends SimpleFabricLootTableProvider { public MyBlockLootTables(FabricDataGenerator dataGenerator) { super(dataGenerator, LootContextTypes.BLOCK); } @Override public void accept(BiConsumer biConsumer) { // The BlockLootTableGenerator class contains a behemoth of utility methods. Just take some time and go through the methods available to override. biConsumer.accept(new Identifier("tutorial", "test_block"), BlockLootTableGenerator.drops(Tutorial.TEST_BLOCK, Tutorial.TEST_ITEM, ConstantLootNumberProvider.create(9.0F))); } } 好啦,我们现在成功地添加了一个方块,然后让我们创建一个箱子战利品掉落。 ====添加箱子战利品掉落==== 在开始的时候,我们需要一个标识。这个标识将会指向装有你的箱子掉落物的容器的 json 文件。 // 在 Tutorial 类中 public static final Identifier TEST_CHEST = new Identifier("tutorial", "chests/test_loot"); 让我们一起创建一个箱子战利品表,然后像这样注册它: private static class MyChestLootTables extends SimpleFabricLootTableProvider { public MyChestLootGenerator(FabricDataGenerator 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.addProvider(MyChestLootTables::new); }