有时你需要往 战利品表 中添加物品,比如给原版的方块或者实体添加自己的掉落物。替换战利品表文件是最简单的方法,但是会破坏其他模组——如果其他模组也需要修改这个战利品表呢?所以我们来看看,怎样给战利品表添加物品,而不覆盖整个表。
我们的例子是:给煤矿石的战利品表添加鸡蛋。
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); } });