🇨🇳 中文 (Chinese - China)
🇨🇳 中文 (Chinese - China)
外观
🇨🇳 中文 (Chinese - China)
🇨🇳 中文 (Chinese - China)
外观
本页面基于这个版本编写:
1.21.4
前提
首先,请确保你已完成 Datagen 设置 。
需要针对方块、箱子和实体提供不同的提供程序(类)。 请记住在 onInitializeDataGenerator
方法中的 DataGeneratorEntrypoint
中将它们全部添加到包中。
pack.addProvider(FabricDocsReferenceBlockLootTableProvider::new);
pack.addProvider(FabricDocsReferenceChestLootTableProvider::new);
战利品表定义了你破坏一个方块(不包括内容,如箱子里的东西)、杀死一个实体或打开一个新生成的容器所能得到的东西。 每个战利品表都有随机池,可从中选择物品。 战利品表还具有函数,可以通过某种方式修改最终的战利品。
战利品随机池有抽取项(entries)、条件(conditions)、函数(functions)、抽取次数(rolls)和额外抽取次数(bonus rolls)。 抽取项是物品的组、序列、可能性,或者仅仅是物品本身。 条件是在世界中需要被测试的事物,例如工具上的附魔或一个随机的概率。 随机池选择的最小抽取项数称为抽取次数(rolls),超过该数目的任何抽取项称为额外抽取次数(bonus rolls)。
为了让方块掉落物品(包括本身),我们需要制作一个战利品表。 创建一个 extends FabricBlockLootTableProvider
的类:
public class FabricDocsReferenceBlockLootTableProvider extends FabricBlockLootTableProvider {
protected FabricDocsReferenceBlockLootTableProvider(FabricDataOutput dataOutput, CompletableFuture<RegistryWrapper.WrapperLookup> registryLookup) {
super(dataOutput, registryLookup);
}
@Override
public void generate() {
}
}
确保将此提供程序添加到包中!
有很多辅助方法可用于帮助构建战利品表。 我们不会逐一介绍,因此请确保在您的 IDE 中检查它们。
我们在 generate
方法中添加一些掉落物:
// Make condensed dirt drop its block item.
// Also adds the condition that it survives the explosion that broke it, if applicable,
addDrop(ModBlocks.CONDENSED_DIRT);
// Make prismarine lamps drop themselves with silk touch only
addDropWithSilkTouch(ModBlocks.PRISMARINE_LAMP);
// Make condensed oak logs drop between 7 and 9 oak logs
addDrop(ModBlocks.CONDENSED_OAK_LOG, LootTable.builder().pool(addSurvivesExplosionCondition(Items.OAK_LOG, LootPool.builder()
.rolls(new UniformLootNumberProvider(new ConstantLootNumberProvider(7), new ConstantLootNumberProvider(9)))
.with(ItemEntry.builder(Items.OAK_LOG))))
);
箱子的战利品比方块的战利品稍微复杂一些。 创建一个类似于下面示例的 extends SimpleFabricLootTableProvider
类并将其添加到您的包中。
public class FabricDocsReferenceChestLootTableProvider extends SimpleFabricLootTableProvider {
public FabricDocsReferenceChestLootTableProvider(FabricDataOutput output, CompletableFuture<RegistryWrapper.WrapperLookup> registryLookup) {
super(output, registryLookup, LootContextTypes.CHEST);
}
@Override
public void accept(BiConsumer<RegistryKey<LootTable>, LootTable.Builder> lootTableBiConsumer) {
}
}
我们需要一个 RegistryKey<LootTable>
作为战利品表。 我们把它放入一个名为 ModLootTables
的新类中。 如果你使用拆分源,请确保它位于你的 main
源集中。
public class ModLootTables {
public static RegistryKey<LootTable> TEST_CHEST_LOOT = RegistryKey.of(RegistryKeys.LOOT_TABLE, Identifier.of(FabricDocsReference.MOD_ID, "chests/test_loot"));
}
然后,我们可以在提供程序的 generate
方法中生成一个战利品表。
lootTableBiConsumer.accept(ModLootTables.TEST_CHEST_LOOT, LootTable.builder()
.pool(LootPool.builder() // One pool
.rolls(ConstantLootNumberProvider.create(2.0f)) // That has two rolls
.with(ItemEntry.builder(Items.DIAMOND) // With an entry that has diamond(s)
.apply(SetCountLootFunction.builder(ConstantLootNumberProvider.create(1.0f)))) // One diamond
.with(ItemEntry.builder(Items.DIAMOND_SWORD) // With an entry that has a plain diamond sword
)
));