Table of Contents
Добавление предметов в существующие таблицы добычи
Введение
Иногда вы хотите добавить элементы в таблицы добычи, например, добавляя свои собственные капли в ванильный блок или объект. Самое простое решение, замена файла таблицы добычи, может сломать другие моды – что, если они тоже захотят их изменить? Мы рассмотрим, как вы можете добавлять предметы в таблицы добычи, не переопределяя таблицу.
Нашим примером будет добавление яиц в таблицу добычи угольной руды.
Прослушивание загрузки таблицы добычи
В API Fabric есть событие, которое запускается при загрузке таблиц добычи, LootTableLoadingCallback
. Вы можете зарегистрировать для него прослушиватель событий в своем инициализаторе. Давайте также проверим, что текущая таблица добычи - это таблица добычи угольной руды:
// Никаких магических констант! 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)) { // Наш код будет здесь } });
Добавление элементов в таблицу
В таблицах добычи предметы хранятся в записях добычи, а записи хранятся в пулах добычи. Чтобы добавить предмет, нам нужно будет добавить пул с записью предмета в таблицу добычи.
Мы можем создать пул с помощью 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)); // То же, что и "rolls": 1 в таблице добычи json 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); } });