====== 战利品表生成 ====== 在本教程,你将学习如何使用数据生成器为方块和其他内容生成战利品表。使用数据生成,就不再需要为每个方块写 JSON。在阅读本教程之前,请确认你已经阅读 [[datagen_setup|开始了解数据生成]],并且已经有一个实现了 ''DataGenerationEntrypoint'' 的类。 首先,创建一个类(或者多个,你需要一个给方块、箱子和实体)来继承(extends) ''SimpleFabricLootTableProvider'',然后像这样注册它: ===== 方块战利品表 ===== 要为方块战利品表添加数据生成,只需要创建一个继承了 ''FabricBlockLootTableProvider'' 的类。 public class TutorialBlockLootTableProvider extends FabricBlockLootTableProvider { protected TutorialBlockLootTableProvider(FabricDataOutput dataOutput, CompletableFuture registryLookup) { super(dataOutput, registryLookup); } @Override public void generate() { // ... } } 然后,将数据生成添加到入口点中(这里我们用的例子是 ''ExampleModDataGenerator''): public class ExampleModDataGenerator implements DataGeneratorEntrypoint { @Override public void onInitializeDataGenerator(FabricDataGenerator generator) { FabricDataGenerator.Pack pack = generator.createPack(); pack.addProvider(TutorialBlockLootTableProvider::new); } } > 如果使用的是 1.20 之前的版本,请将 ''pack.addProvider(TutorialBlockLootTableProvider::new);'' 替换为 ''fabricDataGenerator.addProvider(TutorialBlockLootTableProvider::new);'' 并移除 ''FabricDataGenerator.Pack myPack = fabricDataGenerator.createPack();''。 在此前的[[blocks|方块]]教程中,我们创建了一个//示例方块//。所以使用数据生成器生成战利品表,就像这样简单: @Override public void generate() { addDrop(TutorialBlocks.EXAMPLE_BLOCK); } 这是方块最简单的战利品表。被挖掘时,掉落一个。在带有损耗的爆炸中被炸掉时(例如苦力怕、下界床),会被完成破坏而不掉落。 也可以弄得复杂一点点,比如(这里的代码仅用作举例,请不要为一个方块多次添加战利品表): // 什么也不掉落 addDrop(TutorialBlocks.EXAMPLE_BLOCK, dropsNothing()); // 掉落泥土方块 addDrop(TutorialBlocks.EXAMPLE_BLOCK, Blocks.DIRT); // 只有在使用带有精准采集的工具时掉落自身,否则不掉落 addDropWithSilkTouch(TutorialBlocks.EXAMPLE_BLOCK); // 只有在使用带有精准采集的工具时掉落自身,否则掉落泥土方块 addDropWithSilkTouch(TutorialBlocks.EXAMPLE_BLOCK, Blocks.DIRT); // 只有在使用剪刀或带有精准采集的工具时掉落自身,否则不掉落 addDrop(TutorialBlocks.EXAMPLE_BLOCK, dropsWithSilkTouchOrShears(TutorialBlocks.EXAMPLE_BLOCK)); // 掉落五个方块 addDrop(TutorialBlocks.EXAMPLE_BLOCK, drops(TutorialBlocks.EXAMPLE_BLOCK) .apply(SetCountLootFunction.builder(ConstantLootNumberProvider.create(5)))); 也可以为我们此前介绍的[[crops|自定义作物]]生成战利品表: 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)))); ===== 简单战利品表 ===== 要添加一个简单的战利品表,我们只需要继承 ''SimpleFabricLootTableProvider''。简单的战利品表也可在多种场合下使用,例如箱子。 public class TutorialChestLootTableProvider extends SimpleFabricLootTableProvider { public TutorialChestLootTableProvider(FabricDataOutput output, CompletableFuture registryLookup) { super(output, registryLookup, LootContextTypes.CHEST); } public static final RegistryKey TEST_CHEST = RegistryKey.of(RegistryKeys.LOOT_TABLE, Identifier.of("tutorial", "test_chest")); @Override public void accept(BiConsumer, LootTable.Builder> lootTableBiConsumer) { lootTableBiConsumer.accept(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))) ); } } 然后在入口点中: public class ExampleModDataGenerator implements DataGeneratorEntrypoint { @Override public void onInitializeDataGenerator(FabricDataGenerator generator) { // ... pack.addProvider(TutorialChestLootTableProvider::new); } } > 如果使用的是 1.20 之前的版本,请将 ''pack.addProvider(TutorialChestLootTableProvider::new);'' 替换为 ''fabricDataGenerator.addProvider(TutorialChestLootTableProvider::new);'',并移除 ''FabricDataGenerator.Pack myPack = fabricDataGenerator.createPack();''。 现在运行数据生成器,然后启动 Minecraft,并运行多次命令 ''/loot give @s loot tutorial:test_chest'',看看会发生什么!也可以试试运行命令 ''/setblock ~ ~ ~ chest{LootTable:"tutorial:test_chest"}'' 然后打开箱子看看。