Перейти к содержанию

Использование событий#

Событий в Fabric немного и они очень простые, тем не менее, было бы неплохо их знать и уметь ими пользоваться.

Коллбэки интерфейсов#

Существует серия интерфейсов, которые обрабатывают события и вызывают коллбэки, регистрирующиеся при инициализации мода. Практически все события создаются с помощью Mixins, поэтому нам ничего не стоит создать свои события (об этом позже).

Прослушивание событий#

Рассмотрим работу с событиями на примере изменения таблиц лута.

Fabric API зажжёт событие LootTableLoadingCallback при загрузке таблиц лута. Нам необходимо зарегистрировать где-нибудь слушатель, например, в методе onInitialize() нашего главного класса.

В таблицах лута предметы расположены в записях лута, а сами записи содержаться в пулах лута. Мы можем сделать пул с помощью FabricLootPoolBuilder:

    // ID таблицы лута
    private static final Identifier COAL_ORE_LOOT_TABLE_ID = new Identifier("minecraft", "blocks/coal_ore");

    @Override
    public void onInitialize() {
        FTutItems.init();
        FTutBlocks.init();
        // регистрируем слушатель
        LootTableLoadingCallback.EVENT.register((resourceManager, lootManager, id, supplier, setter) -> {
            if (COAL_ORE_LOOT_TABLE_ID.equals(id)) { // проверяем ID таблицы
                FabricLootPoolBuilder poolBuilder = FabricLootPoolBuilder.builder()
                        .rolls(ConstantLootTableRange.create(1));

                supplier.pool(poolBuilder);
            }
        });
    }

Сейчас наш пул не содержит никаких записей, исправим это:

 LootTableLoadingCallback.EVENT.register((resourceManager, lootManager, id, supplier, setter) -> {
            if (COAL_ORE_LOOT_TABLE_ID.equals(id)) {
                FabricLootPoolBuilder poolBuilder = FabricLootPoolBuilder.builder()
                        .rolls(ConstantLootTableRange.create(1))
                        .withEntry(ItemEntry.builder(Items.EGG) // теперь из угольной руды может выпасть яйцо
                        .build());

                supplier.pool(poolBuilder);
            }
        });