======战利品表生成======
在阅读本教程之前,请确认你已经阅读 [[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);
}