В этом посте вы узнаете, как правильно и безопасно реализовать спавн моба рядом с игроком в Minecraft при определённом уровне голода, а также как выдать игроку эффект слепоты. Мы разберём все тонкости — от условий триггера до проверки окружения и настройки конфигурации. Готовы? Поехали!


Триггер для голода — когда и как реагировать

Первый вопрос — какие условия голода считать триггером? В примере из кода ивента FoodLevelChangeEvent используется строгое равенство FoodLvL == 6. Но стоит ли так делать?

Лучше использовать пороговое значение с проверкой ≤ 6. Почему? Потому что голод может меняться вверх, и вы хотите, чтобы эффект срабатывал, когда голод падает до 6 или ниже, а не только ровно на 6. Это предотвращает пропуск события, если голод упал сразу с 8 до 5.

if (FoodLvL <= 6) {
    // Триггерим эффект и спавн
}

При изменении голода вверх — например, с 5 до 7 — можно игнорировать событие, чтобы не спамить мобами и эффектами.


Как безопасно получить объект Player из FoodLevelChangeEvent

В событии FoodLevelChangeEvent метод getEntity() возвращает объект типа Entity. Чтобы работать с игроком, нужно проверить, что это именно игрок:

Entity entity = FoodEvent.getEntity();
if (!(entity instanceof Player)) return; // Если не игрок — выходим
Player player = (Player) entity;

Это гарантирует, что ваш код не упадёт с ошибкой, если голод меняется у моба или другого существа.


Выбор типа моба для спавна и настройка через конфиг

Чтобы сделать спавн гибким, тип моба лучше вынести в конфигурационный файл. Например:

mob-type: ZOMBIE
spawn-radius: 10
blindness-duration: 134
max-spawns-per-event: 1

В коде вы можете читать эти параметры и создавать моба нужного типа:

EntityType mobType = EntityType.valueOf(config.getString("mob-type"));

Так вы сможете менять моба без правки кода — просто редактируя конфиг.


Реализация эффекта слепоты

Эффект слепоты — это PotionEffect с типом BLINDNESS. Длительность указывается в тиках (1 секунда = 20 тиков). В конфиге, например, указано 134 тика — это примерно 6.7 секунд.

int duration = config.getInt("blindness-duration"); // например, 134
player.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, duration, 0));

Амплуа эффекта — уровень усиления — обычно 0 для слепоты. Эффект применяется только к игроку, у которого сработал триггер.


Как выбрать случайную точку в радиусе 10 блоков и проверить её безопасность

Спавнить моба нужно рядом, но не в стене или воде. Алгоритм:

  • Получаем локацию игрока
  • Генерируем случайные координаты в радиусе 10 блоков по X и Z
  • Проверяем высоту Y — ищем ближайший безопасный блок сверху (например, земля, трава)
  • Проверяем, что блок под мобом — не вода, не лавa, не воздух
  • Проверяем, что пространство над головой свободно (2 блока для моба)
  • Проверяем, что точка не в чужой территории (если есть плагин защиты)

Пример кода для случайной точки:

Random random = new Random();
Location base = player.getLocation();
for (int i = 0; i < 10; i++) { // максимум 10 попыток
    double offsetX = (random.nextDouble() * 20) - 10; // от -10 до +10
    double offsetZ = (random.nextDouble() * 20) - 10;
    Location spawnLoc = base.clone().add(offsetX, 0, offsetZ);
    spawnLoc.setY(spawnLoc.getWorld().getHighestBlockYAt(spawnLoc));

    if (isSafeSpawnLocation(spawnLoc)) {
        // Спавним моба здесь
        spawnMob(spawnLoc, mobType);
        break;
    }
}

Функция isSafeSpawnLocation проверяет:

  • Блок под мобом — твердый (не вода, не воздух)
  • Два блока над — свободны
  • Нет препятствий
  • Не в зоне защиты

Безопасные условия спавна и алгоритм поиска позиции

Чтобы избежать спавна в воде, внутри блока или в вое, проверяйте:

Условие Как проверить
Блок под мобом block.getType().isSolid()
Пространство над головой blockAbove.isAir() && blockTwoAbove.isAir()
Не вода или лава block.getType() != Material.WATER и т.д.
Не в зоне защиты Проверка через плагин защиты (если есть)

Используйте цикл с ограничением попыток (например, 10), чтобы не зациклиться.


Ограничение частоты триггера и количества спавнов

Чтобы сервер не лагал, ограничьте:

  • Количество мобов за один триггер (например, 1-2)
  • Частоту срабатывания (например, не чаще 1 раза в 10 секунд на игрока)
  • Используйте таймеры и кэширование времени последнего спавна

Многопользовательская среда и синхронизация

В мультиплеере:

  • Проверяйте, что спавн происходит рядом с конкретным игроком, а не в зоне других игроков
  • Синхронизируйте события, чтобы не было конфликтов
  • Учитывайте, что игрок может уйти из зоны или умереть — отменяйте задачи

Совместимость с версиями Spigot/Bukkit

Используйте API, доступный в вашей версии сервера. Например, методы getFoodLevel(), getEntity(), addPotionEffect() есть в большинстве современных версий.

Проверяйте документацию и тестируйте на целевой версии.


Структура конфигурации

Пример конфигурации:

mob-type: ZOMBIE
spawn-radius: 10
blindness-duration: 134
max-spawns-per-event: 1
cooldown-seconds: 10

Так вы легко сможете менять параметры без правки кода.


Тестирование и отладка

  • Запускайте на локальном сервере с консолью
  • Логируйте ключевые события: срабатывание триггера, спавн моба, выдачу эффекта
  • Используйте дебаг-выводы для проверки координат и условий
  • Тестируйте разные уровни голода и поведение при выходе игрока

Уведомления игроку

Игроку стоит показывать:

  • Сообщение в чат: "Вы чувствуете слабость..."
  • Звуковой эффект (например, звук появления моба)
  • Визуальный эффект — слепота

Пример:

player.sendMessage(ChatColor.RED + "Вас атакует моб из-за голода!");
player.playSound(player.getLocation(), Sound.ENTITY_ZOMBIE_AMBIENT, 1, 1);

Обработка смерти и выхода игрока

Если игрок умер или покинул зону:

  • Отменяйте запланированные задачи спавна и эффектов
  • Очищайте ресурсы, чтобы не было утечек памяти

Итоговая схема работы

Шаг Описание
Проверка голода Если голод ≤ 6 — триггерим
Проверка сущности Убедиться, что это игрок
Выбор точки спавна Случайная точка в радиусе 10 блоков
Проверка безопасности Нет воды, есть пространство, не в защите
Спавн моба Создаём моба нужного типа
Выдача эффекта слепоты Эффект длительностью 134 тика
Уведомление игрока Сообщение, звук, визуальный эффект
Ограничение частоты Не чаще 1 раза в 10 секунд
Обработка выхода/смерти Отмена задач и очистка

Полезные ссылки


Теперь вы вооружены знаниями, как сделать спавн моба рядом с игроком по голоду и добавить эффект слепоты — безопасно, гибко и красиво! Вперёд, к новым приключениям в Minecraft!