User Tools

Site Tools


zh_cn:tutorial:adding_to_loot_tables

向已有的战利品表中添加物品

介绍

有时你需要往 战利品表 中添加物品,比如给原版的方块或者实体添加自己的掉落物。替换战利品表文件是最简单的方法,但是会破坏其他模组——如果其他模组也需要修改这个战利品表呢?所以我们来看看,怎样给战利品表添加物品,而不覆盖整个表。

我们的例子是:给煤矿石的战利品表添加鸡蛋。

监听战利品表加载

Fabric API 有个事件,LootTableLoadingCallback,会在加载战利品表时 fire。你可以为你的初始化器注册一个事件监听器。我们也会检查当前战利品表是否为煤矿石的战利品表。

// 常量
private static final Identifier COAL_ORE_LOOT_TABLE_ID = Blocks.COAL_ORE.getLootTableId();
 
// 实际代码
 
LootTableLoadingCallback.EVENT.register((resourceManager, lootManager, id, table, setter) -> {
    if (COAL_ORE_LOOT_TABLE_ID.equals(id)) {
        // 我们的代码放这里
    }
});

给表添加物品

在战利品表中,物品存储在loot entries中,项(entries)存储在loot pools中。如要添加物品,我们需要给战利品表添加一个带有物品项的池(pool)。

我们使用 FabricLootPoolBuilder 来创建池,并添加到战利品表:

LootTableLoadingCallback.EVENT.register((resourceManager, lootManager, id, table, setter) -> {
    if (COAL_ORE_LOOT_TABLE_ID.equals(id)) {
        LootPool.Builder poolBuilder = LootPool.builder()
                .rolls(ConstantLootTableRange.create(1)); // 和战利品表中json中的 "rolls": 1 一样。
 
        table.pool(poolBuilder);
    }
});

我们的池还没有任何物品,所以制作一个物品项,并将其添加到池,完成。

LootTableLoadingCallback.EVENT.register((resourceManager, lootManager, id, table, setter) -> {
    if (COAL_ORE_LOOT_TABLE_ID.equals(id)) {
        LootPool.Builder poolBuilder = LootPool.builder()
                .rolls(ConstantLootTableRange.create(1))
                .with(ItemEntry.builder(Items.EGG));
 
        table.pool(poolBuilder);
    }
});

zh_cn/tutorial/adding_to_loot_tables.txt · Last modified: 2023/05/04 11:15 by solidblock