====== Добавление предметов в существующие таблицы добычи ======
===== Введение =====
Иногда вы хотите добавить элементы в [[https://minecraft.fandom.com/ru/wiki/Таблицы_добычи|таблицы добычи]], например, добавляя свои собственные капли в ванильный блок или объект. Самое простое решение, замена файла таблицы добычи, может сломать другие моды – что, если они тоже захотят их изменить? Мы рассмотрим, как вы можете добавлять предметы в таблицы добычи, не переопределяя таблицу.
Нашим примером будет добавление яиц в таблицу добычи угольной руды.
===== Прослушивание загрузки таблицы добычи =====
В 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);
}
});
{{:tutorial:coal_ore_egg.png?400|}}