====== 向已有的战利品表中添加物品 ====== ===== 介绍 ===== 有时你需要往 [[https://minecraft.fandom.com/zh/wiki/战利品表|战利品表]] 中添加物品,比如给原版的方块或者实体添加自己的掉落物。替换战利品表文件是最简单的方法,但是会破坏其他模组——如果其他模组也需要修改这个战利品表呢?所以我们来看看,怎样给战利品表添加物品,而不覆盖整个表。 我们的例子是:给煤矿石的战利品表添加鸡蛋。 ===== 监听战利品表加载 ===== 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); } }); {{:tutorial:coal_ore_egg.png?400|}}