Події
API Fabric надає систему, яка дозволяє модам реагувати на дії або випадки, які також визначаються як події, що відбуваються в грі.
Події — це хуки, які задовольняють звичайні сценарії використання та/або забезпечують покращену сумісність і продуктивність між модами, які використовуються однакові області коду. Використання подій часто замінює використання міксинів.
API Fabric надає події для важливих областей у кодовій базі Minecraft, до яких можуть бути зацікавлені кілька хуків.
Події представлені екземплярами net.fabricmc.fabric.api.event.Event, які зберігають і викликають callbacks. Часто існує один екземпляр події для зворотного виклику, який зберігається в статичному полі EVENT інтерфейсу зворотного виклику, але існують також інші шаблони. Наприклад, ClientTickEvents групує кілька пов’язаних подій разом.
Зворотний виклик
Зворотний виклик — це фрагмент коду, який передається як аргумент події. Коли подія ініціюється грою, переданий фрагмент коду буде виконано.
Інтерфейс зворотного виклику
Кожна подія має відповідний інтерфейс зворотного виклику. Зворотні виклики реєструються шляхом виклику методу register() для екземпляра події з екземпляром інтерфейсу зворотного виклику як аргументу.
Прослуховування подій
У цьому прикладі реєструється AttackBlockCallback, щоб завдати шкоди гравцеві, коли він потрапляє в блоки, з яких не випадає предмет під час видобутку вручну.
java
No lines matched.1
Додавання предметів до наявних таблиць здобичі
Іноді ви можете додати предмети до таблиць здобичі. Наприклад, додавання вашої здобичі до усталеного блока або сутності.
Найпростіше рішення, заміна файлу таблиці здобичі, може зламати інші моди. А якщо вони захочуть змінити і їх? Ми розглянемо, як можна додавати предмети до таблиць здобичі, не перевизначаючи таблицю.
Ми додамо яйця до таблиці здобичі вугільної руди.
Прослуховування завантаження таблиці здобичі
API Fabric має подію, яка запускається під час завантаження таблиць здобичі, LootTableEvents.MODIFY. Ви можете зареєструвати зворотний виклик для нього в ініціалізаторі мода. Також перевірмо, чи поточна таблиця здобичі є таблицею здобичі вугільної руди.
java
// #region callback
// #region loot-table-item
LootTableEvents.MODIFY.register((key, tableBuilder, source, registries) -> {1
2
3
2
3
Додавання предметів до таблиці здобичі
У таблицях здобичі предмети зберігаються в записах пулу здобичі, а записи зберігаються в пулах здобичі. Щоб додати предмет, нам потрібно буде додати пул із записом предмета до таблиці здобичі.
Ми можемо створити пул за допомогою LootPool#builder і додати його до таблиці здобичі.
У нашому пулі також немає предметів, тому ми зробимо запис про елемент за допомогою ItemEntry#builder і додамо його до пулу.
java
No lines matched.1
Власні події
Деякі області гри не мають хуків, наданих Fabric API, тому ви можете використовувати міксин або створити власну подію.
Ми розглянемо створення події, яка запускається, коли вівцю стрижуть. Процес створення події:
- Створення інтерфейсу зворотного виклику події
- Запуск події з міксина
- Створення тестової реалізації
Створення інтерфейсу зворотного виклику події
Інтерфейс зворотного виклику описує, що має бути реалізоване слухачами подій, які слухатимуть вашу подію. Інтерфейс зворотного виклику також описує, як подія буде викликана з нашого міксина. Традиційно розміщувати об’єкт Event як поле в інтерфейсі зворотного виклику, яке ідентифікуватиме нашу фактичну подію.
Для нашої реалізації Event ми виберемо використання події на основі масиву. Масив міститиме всі слухачі подій, які прослуховують подію.
Наша реалізація буде викликати слухачі подій по черзі, доки один із них не поверне ActionResult.PASS. Це означає, що слухач може сказати «скасувати це», «затвердити це» або «не хвилюйтеся, залиште це наступному слухачу події», використовуючи його значення, що повертається.
Використання ActionResult як значення, що повертається, є звичайним способом змусити обробники подій співпрацювати таким чином.
Вам потрібно буде створити інтерфейс, який має екземпляр Event і метод для реалізації відповіді. Основні налаштування для зворотного виклику стрижки овець:
java
No lines matched.1
Розгляньмо це глибше. Коли виклик викликається, ми повторюємо всі слухачі:
java
public interface SheepShearCallback {
Event<SheepShearCallback> EVENT = EventFactory.createArrayBacked(SheepShearCallback.class,1
2
2
Потім ми викликаємо наш метод (у цьому випадку interact) для слухача, щоб отримати його відповідь:
java
1
Якщо слухач каже, що ми повинні скасувати (ActionResult.FAIL) або повністю завершити (ActionResult.SUCCESS), функція зворотного виклику повертає результат і завершує цикл. ActionResult.PASS переходить до наступного слухача, і в більшості випадків має завершуватися успішно, якщо більше не зареєстровано слухачів:
java
for (SheepShearCallback listener : listeners) {
InteractionResult result = listener.interact(player, sheep);
if (result != InteractionResult.PASS) {
return result;
}1
2
3
4
5
6
2
3
4
5
6
Ми можемо додати коментарі Javadoc у верхній частині класів зворотного виклику, щоб документувати, що робить кожен ActionResult. У нашому випадку це може бути:
java
// #region javadoc
/**
* Callback for shearing a sheep.
* Called before the sheep is sheared, items are dropped, and items are damaged.
* Upon return:
* - SUCCESS cancels further processing and continues with normal shearing behavior.
* - PASS falls back to further processing and defaults to SUCCESS if no other listeners are available1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
Запуск події з міксина
Тепер у нас є основна структура подій, але нам потрібно його запустити. Оскільки ми хочемо, щоб подія викликалася, коли гравець намагається підстригти вівцю, ми викликаємо подію invoker у SheepEntity#interactMob, коли викликається sheared() (тобто вівцю можна стригти, якщо гравець тримає ножиці):
java
No lines matched.1
Створення тестової реалізації
Тепер нам потрібно перевірити нашу подію. Ви можете зареєструвати слухача у своєму методі ініціалізації (або в іншій області, якщо хочете) і додати туди спеціальну логіку. Ось приклад, коли замість вовни випадає діамант:
java
No lines matched.1
Якщо ви входите в гру і стрижете вівцю, замість вовни повинен випасти діамант.











