User Tools

Site Tools


ru:tutorial:adding_to_loot_tables

Добавление предметов в существующие таблицы добычи

Введение

Иногда вы хотите добавить элементы в таблицы добычи, например, добавляя свои собственные капли в ванильный блок или объект. Самое простое решение, замена файла таблицы добычи, может сломать другие моды – что, если они тоже захотят их изменить? Мы рассмотрим, как вы можете добавлять предметы в таблицы добычи, не переопределяя таблицу.

Нашим примером будет добавление яиц в таблицу добычи угольной руды.

Прослушивание загрузки таблицы добычи

В 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);
    }
});

ru/tutorial/adding_to_loot_tables.txt · Last modified: 2022/03/03 13:56 by furnygo