Если вы когда-нибудь задумывались, как в Minecraft моддинге найти конкретного игрока на сервере и, например, изменить его здоровье, то этот пост — для вас. Мы разберём, как работать с серверным кодом, как правильно получать игрока по нику, как безопасно менять его HP и что важно учитывать, чтобы ваш мод работал без сбоев.


Кто и зачем ищет игрока на сервере Minecraft

В первую очередь, это актуально для разработчиков плагинов и модов, особенно новичков, которые хотят создавать свои фишки для серверов. Например, вы хотите сделать плагин, который при клике на GUI изменяет здоровье определённого игрока. Или вам нужно получить ближайшего игрока для выполнения какого-то действия.


Как получить игрока по нику на сервере

В Minecraft сервере игроки представлены объектами типа EntityPlayer. Чтобы найти игрока по имени, нужно получить список всех игроков на сервере и пройтись по нему в поисках совпадения.

Вот пример метода на Java, который это делает:

public static EntityPlayer getPlayerFromName(String playerName) {
    List<EntityPlayer> players = MinecraftServer.getServer().getConfigurationManager().playerEntityList;
    for (EntityPlayer tempPlayer : players) {
        if (tempPlayer.getCommandSenderName().equalsIgnoreCase(playerName)) {
            return tempPlayer;
        }
    }
    return null; // Игрок не найден
}

Объяснение:

  • MinecraftServer.getServer() — возвращает объект сервера.
  • getConfigurationManager().playerEntityList — список всех игроков онлайн.
  • Мы перебираем список и сравниваем имена без учёта регистра.

Важные проверки для серверного кода

Чтобы код работал именно на сервере, а не на клиенте, нужно проверить сторону выполнения. Это важно, потому что Minecraft разделяет логику клиента и сервера.

Проверки:

if (!world.isRemote) {
    // Это серверная сторона
}

Или с использованием Forge API:

if (FMLCommonHandler.instance().getEffectiveSide() == Side.SERVER) {
    // Серверный код
}

Как изменить здоровье игрока

Чтобы изменить здоровье игрока, используйте метод setHealth(float health). В Minecraft здоровье измеряется в единицах, где 1 единица = половина сердца. Полное здоровье по умолчанию — 20 (10 сердец).

Пример:

player.setHealth(20f); // Устанавливаем полное здоровье

Изменение максимального здоровья с AttributeModifier

Если хотите это увеличить максимальное, используйте AttributeModifier.

Пример создания и применения модификатора:

UUID uuid = UUID.fromString("00000000-0000-0000-0000-000000000001");
double healthBoost = 1.0; // 1.0 = 1 сердце (2 единицы здоровья)

AttributeModifier modifier = new AttributeModifier(uuid, "maxHealthBoost", healthBoost, 1);

public void addMaxHealth(EntityPlayer player) {
    if (player.getEntityAttribute(SharedMonsterAttributes.maxHealth).getModifier(uuid) == null) {
        player.getEntityAttribute(SharedMonsterAttributes.maxHealth).applyModifier(modifier);
    }
}

public void removeMaxHealth(EntityPlayer player) {
    player.getEntityAttribute(SharedMonsterAttributes.maxHealth).removeModifier(modifier);
}

Обратите внимание:

  • UUID должен быть постоянным, чтобы не создавать дубликаты.
  • Значение healthBoost в единицах здоровья (0.5 = пол сердца).
  • Метод applyModifier добавляет, removeModifier — удаляет эффект.

Обработчик события для изменения здоровья

Если хотите менять здоровье игрока при определённых условиях, например, при обновлении состояния, используйте событие LivingUpdateEvent с аннотацией @SubscribeEvent.

Пример:

@SubscribeEvent
public void onPlayerUpdate(LivingUpdateEvent event) {
    if (event.entity instanceof EntityPlayer) {
        EntityPlayer player = (EntityPlayer) event.entity;
        // Проверяем условия, например, имя игрока или состояние
        if (player.getCommandSenderName().equalsIgnoreCase("ExamplePlayer")) {
            player.setHealth(20f); // Восстанавливаем здоровье
        }
    }
}

Практические советы для новичков

  • Всегда проверяйте, что код выполняется на сервере. Клиентский код не имеет доступа к списку игроков сервера.
  • Используйте понятные имена переменных и методов. Например, getPlayerFromName — сразу понятно, что делает метод.
  • Обрабатывайте случаи, когда игрок не найден. Возвращайте null и проверяйте это в вызывающем коде.
  • Не меняйте здоровье без причины. Это может нарушить баланс игры.
  • Документируйте код. Особенно если используете UUID и модификаторы.

Минимальные требования и версии

  • Учтите, что API Forge и Minecraft меняются с версиями. Примеры выше подходят для Minecraft 1.7.10 — 1.12.2.
  • Для новых версий (1.13+) методы могут отличаться, проверяйте официальную документацию Forge.

Таблица основных методов и проверок

Задача Метод / Проверка Описание
Получить сервер MinecraftServer.getServer() Возвращает объект сервера
Получить список игроков getConfigurationManager().playerEntityList Список всех онлайн игроков
Найти игрока по нику Перебор списка и сравнение getCommandSenderName() Поиск игрока без учёта регистра
Проверка серверной стороны !world.isRemote или FMLCommonHandler.instance().getEffectiveSide() == Side.SERVER Убедиться, что код выполняется на сервере
Изменить здоровье игрока player.setHealth(float) Установка текущего здоровья
Изменить максимальное здоровье applyModifier(AttributeModifier) Добавление модификатора максимального здоровья

Заключение

Теперь вы знаете, как найти игрока на сервере Minecraft, как проверить, что код выполняется на сервере, и как безопасно менять здоровье игрока. Эти знания — фундамент для создания собственных плагинов и модов, которые сделают игру интереснее и разнообразнее.


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


Погружайтесь в код, экспериментируйте и создавайте свои уникальные моды! Minecraft — это ваша песочница, а сервер — ваша сцена. Пусть ваши игроки будут здоровы и счастливы!