====== 向已有的战利品表中添加物品 ======
===== 介绍 =====
有时你需要往 [[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|}}