Fabric 教程
安装
- 启用 log4j 调试信息(英文)
基础
- 约定和术语
- 注册
- 开发工具
物品
方块和方块实体
数据生成
世界生成
命令
事件
实体
流体
Mixin 和 ASM
杂项
Yarn
贡献 Fabric
- FabLabs - 在提交 PR 之前起草新功能的试验场
有时你需要往 战利品表 中添加物品,比如给原版的方块或者实体添加自己的掉落物。替换战利品表文件是最简单的方法,但是会破坏其他模组——如果其他模组也需要修改这个战利品表呢?所以我们来看看,怎样给战利品表添加物品,而不覆盖整个表。
我们的例子是:给煤矿石的战利品表添加鸡蛋。
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)) { FabricLootPoolBuilder poolBuilder = FabricLootPoolBuilder.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)) { FabricLootPoolBuilder poolBuilder = FabricLootPoolBuilder.builder() .rolls(ConstantLootTableRange.create(1)) .with(ItemEntry.builder(Items.EGG)); table.pool(poolBuilder); } });