Хотите добавить уникальные механики в Minecraft? Пользовательские события - ваш ключ к успеху! Вот краткое руководство:
- Спланируйте событие
- Напишите код класса события
- Создайте обработчик события
- Зарегистрируйте событие
- Протестируйте работу
Главное:
- Наследуйте класс от
Event
- Используйте
@SubscribeEvent
для обработчиков - Регистрируйте через
MinecraftForge.EVENT_BUS.register()
- Запускайте событие через
MinecraftForge.EVENT_BUS.post()
Пример простого события:
public class МоеСобытие extends Event {
private final String сообщение;
public МоеСобытие(String сообщение) {
this.сообщение = сообщение;
}
public String getСообщение() {
return сообщение;
}
}
Создавайте, тестируйте, экспериментируйте! Пользовательские события откроют новые возможности для ваших модов Minecraft.
Related video from YouTube
Что нужно перед началом работы
Перед созданием пользовательских событий вам понадобится:
Инструменты и ПО
- Java Development Kit (JDK) 17.0.2+8 или новее
- IDE (например, Eclipse для Java разработчиков)
- Minecraft Forge для версии Minecraft 1.18
"Для моддинга Minecraft нужен JDK версии 17" - из руководства по моддингу
Код модов несовместим между разными версиями игры.
Базовые навыки
- Знание Java
- Понимание механики Minecraft
- Знакомство с API модлоадера (Forge или Fabric)
Модлоадер | Особенности |
---|---|
Forge | Сложнее, поддерживает масштабные моды |
Fabric | Легковесный, быстрее обновляется |
"Fabric позволяет быстрее обновлять моды, Forge известен обширной библиотекой" - из сравнения модлоадеров
Для создания событий нужно работать с классом Event
в Forge или создавать интерфейсы обратного вызова в Fabric.
Как работают события в Minecraft
События в Minecraft позволяют модам взаимодействовать с игрой. Forge использует систему шин событий:
- Игра генерирует событие (например, разрушение блока)
- Событие отправляется на шину
MinecraftForge.EVENT_BUS
- Моды получают уведомление и реагируют
Пример обработчика:
public class MyEventHandler {
@SubscribeEvent
public void onBlockBreak(BlockEvent.BreakEvent event) {
// Код при разрушении блока
}
}
Регистрация: MinecraftForge.EVENT_BUS.register()
Некоторые события можно отменить (помечены @Cancelable
).
Тип события | Описание | Пример |
---|---|---|
Отменяемые | Можно отменить | Предотвращение разрушения блоков |
Неотменяемые | Нельзя отменить | Изменение урона игроку |
"Система событий позволяет модам взаимодействовать без изменения кода игры" - из документации Forge
События делятся на:
- События Forge (состояние игры)
- События модов (состояние мода)
Планирование вашего события
При создании события важно определить его цели:
Когда создавать событие
- Стандартные события не подходят
- Нужна уникальная механика
- Требуется отслеживать специфические действия
Постановка целей
Примеры целей:
Цель | Описание | Пример |
---|---|---|
Отслеживание | Подсчет действий | Подсчет размещенных блоков |
Изменение механики | Изменение поведения | Изменение результата крафта |
Новые возможности | Расширение функционала | Возрождение с эффектами |
"Что является целью? Когда срабатывает? Что ожидаете от подписчиков?" - Choonster, разработчик модов
Учитывайте взаимодействие с другими модами при планировании.
Написание кода события
Создание класса события:
public class СобытиеКровавойЛуны extends Event {
private final World мир;
private final int продолжительность;
public СобытиеКровавойЛуны(World мир, int продолжительность) {
this.мир = мир;
this.продолжительность = продолжительность;
}
public World getМир() {
return мир;
}
public int getПродолжительность() {
return продолжительность;
}
}
Для отменяемых событий:
public class СобытиеКровавойЛуны extends Event implements Cancellable {
private boolean отменено = false;
@Override
public boolean isCancelled() {
return отменено;
}
@Override
public void setCancelled(boolean отмена) {
this.отменено = отмена;
}
}
Добавьте HandlerList
:
public class СобытиеКровавойЛуны extends Event {
private static final HandlerList HANDLERS = new HandlerList();
public static HandlerList getHandlerList() {
return HANDLERS;
}
@Override
public HandlerList getHandlers() {
return HANDLERS;
}
}
Создание обработчика события
Пример обработчика:
public class МойОбработчикСобытий {
@SubscribeEvent
public void обработатьСобытиеКровавойЛуны(СобытиеКровавойЛуны событие) {
World мир = событие.getМир();
int продолжительность = событие.getПродолжительность();
мир.setDayTime(18000);
for (Entity сущность : мир.getEntities()) {
if (сущность instanceof Monster) {
((Monster) сущность).addPotionEffect(new EffectInstance(Effects.STRENGTH, продолжительность * 20, 1));
}
}
for (ServerPlayerEntity игрок : мир.getPlayers()) {
игрок.sendMessage(new StringTextComponent("Началась кровавая луна! Будьте осторожны!"), игрок.getUUID());
}
}
}
Регистрация:
MinecraftForge.EVENT_BUS.register(new МойОбработчикСобытий());
Для статических обработчиков:
@Mod.EventBusSubscriber(modid = "мой_мод")
public class СтатическийОбработчикСобытий {
@SubscribeEvent
public static void обработатьСобытие(СобытиеКровавойЛуны событие) {
// Код обработки
}
}
sbb-itb-b1cf51d
Регистрация вашего события
Регистрация обработчика:
MinecraftForge.EVENT_BUS.register(new МойОбработчикСобытий());
Для статических обработчиков:
MinecraftForge.EVENT_BUS.register(МойСтатическийОбработчикСобытий.class);
С аннотацией:
@Mod.EventBusSubscriber(modid = "мой_мод")
public class МойОбработчикСобытий {
@SubscribeEvent
public static void обработатьСобытие(МоеПользовательскоеСобытие событие) {
// Код обработки
}
}
Для событий жизненного цикла мода:
FMLJavaModLoadingContext.get().getModEventBus().register(new МойОбработчикСобытийМода());
Запуск вашего события
Запуск события:
МоеПользовательскоеСобытие событие = new МоеПользовательскоеСобытие(параметры);
MinecraftForge.EVENT_BUS.post(событие);
if (!событие.isCanceled()) {
// Выполните действия
}
Пример запуска при разрушении спаунера:
@SubscribeEvent
public void onBlockBreak(BlockEvent.BreakEvent event) {
if (event.getState().getBlock() == Blocks.MOB_SPAWNER) {
МоеСобытиеРазрушенияСпаунера событие = new МоеСобытиеРазрушенияСпаунера(event.getPos(), event.getPlayer());
MinecraftForge.EVENT_BUS.post(событие);
if (!событие.isCanceled()) {
event.getWorld().spawnEntity(new ItemEntity(event.getWorld(), event.getPos().getX(), event.getPos().getY(), event.getPos().getZ(), new ItemStack(Items.EXPERIENCE_BOTTLE)));
}
}
}
Тестирование вашего события
Способы тестирования:
- Консольные сообщения:
@SubscribeEvent
public void onМоеСобытие(МоеПользовательскоеСобытие событие) {
System.out.println("Мое событие сработало!");
}
@GameTest
public static void тестМоегоСобытия(GameTestHelper helper) {
helper.runAtTickTime(20, () -> {
МоеПользовательскоеСобытие событие = new МоеПользовательскоеСобытие();
MinecraftForge.EVENT_BUS.post(событие);
});
helper.succeedOnTickWhen(40, () -> {
helper.assertBlock(new BlockPos(1, 1, 1), b -> b == Blocks.DIAMOND_BLOCK, "Блок не изменился на алмазный");
});
}
-
Отладка с точками останова
-
Проверка отмены события:
@SubscribeEvent
public void onМоеСобытие(МоеПользовательскоеСобытие событие) {
событие.setCanceled(true);
System.out.println("Событие отменено");
}
// В месте вызова события
if (!событие.isCanceled()) {
// Выполняем действия
} else {
System.out.println("Событие было отменено");
}
- Тестовый мод:
@Mod("тестовый_мод")
public class ТестовыйМод {
@SubscribeEvent
public void onМоеСобытие(МоеПользовательскоеСобытие событие) {
System.out.println("Тестовый мод обработал событие");
}
}
Советы по созданию лучших событий
- Используйте подходящие базовые классы:
@SubscribeEvent
public void onAttackEntity(AttackEntityEvent event) {
if (event.getTarget() instanceof Creeper) {
// Код для атаки крипера
}
}
- Обрабатывайте отмену событий:
@SubscribeEvent
public void onМоеСобытие(МоеПользовательскоеСобытие событие) {
if (!событие.isCanceled()) {
// Выполняем действия
} else {
System.out.println("Событие отменено");
}
}
- Используйте приоритеты:
@SubscribeEvent(priority = EventPriority.HIGH)
public void onВысокийПриоритет(МоеСобытие событие) {
// Код высокого приоритета
}
-
Тщательно тестируйте
-
Проверяйте совместимость с другими модами
-
Документируйте код:
/**
* Обрабатывает стрижку овцы.
* @param player Игрок
* @param sheep Овца
* @return ActionResult.FAIL если отменено, иначе ActionResult.PASS
*/
SheepShearCallback.EVENT.register((player, sheep) -> {
// Код
return ActionResult.PASS;
});
Продвинутые функции событий
- Отменяемые события:
@Cancelable
public class МоеОтменяемоеСобытие extends Event implements Cancelable {
private boolean отменено = false;
@Override
public boolean isCanceled() {
return отменено;
}
@Override
public void setCanceled(boolean cancel) {
отменено = cancel;
}
}
- Результаты событий:
public class СобытиеСРезультатом extends Event {
private Event.Result результат = Event.Result.DEFAULT;
public Event.Result getResult() {
return результат;
}
public void setResult(Event.Result результат) {
this.результат = результат;
}
}
- Приоритеты обработчиков:
@SubscribeEvent(priority = EventPriority.HIGH)
public void onВысокийПриоритет(МоеСобытие событие) {
// Код высокого приоритета
}
Работа с другими модами
- Используйте правильную шину событий:
Шина | Использование |
---|---|
MinecraftForge.EVENT_BUS | События состояния игры |
FMLJavaModLoadingContext.get().getModEventBus() | События состояния мода |
-
Проверяйте отменяемость событий
-
Используйте InterModComms для взаимодействия между модами
-
Устанавливайте приоритеты обработки
-
Тестируйте совместимость
-
Обрабатывайте отмененные события:
@SubscribeEvent(receiveCanceled = true)
public void onМоеСобытие(МоеСобытие событие) {
if (событие.isCanceled()) {
// Обработка отмененного события
} else {
// Обычная обработка
}
}
Заключение
Создание пользовательских событий - мощный инструмент для модификации Minecraft. Ключевые шаги:
- Планирование
- Написание кода
- Создание обработчика
- Регистрация
- Тестирование
Советы:
- Изучайте ресурсы сообщества
- Присоединяйтесь к сообществу моддеров
- Тестируйте совместимость
Помните, что моддинг - творческий процесс. Экспериментируйте и создавайте уникальный контент!