Table of Contents

战利品表生成

在阅读本教程之前,请确认你已经阅读 开始了解数据生成,并且知晓有一个类可以实现 DataGenerationEntrypoint

首先,创建一个类(或者多个,你需要一个给方块、箱子和实体)来继承(extends) SimpleFabricLootTableProvider,然后像这样注册它:

初始化

要开始使用方块战利品掉落,要先创建一个战利品表生成器

private static class MyBlockLootTables extends SimpleFabricLootTableProvider {
    public MyBlockLootTables(FabricDataGenerator dataGenerator) {
         super(dataGenerator, LootContextTypes.BLOCK);
    }
 
    @Override
    public void accept(BiConsumer<Identifier, LootTable.Builder> 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<Identifier, LootTable.Builder> 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<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))))
        );
    }
}
 
// ...
 
@Override
public void onInitializeDataGenerator(FabricDataGenerator fabricDataGenerator) {
    fabricDataGenerator.addProvider(MyChestLootTables::new);
}