Если вы когда-нибудь задумывались, как узнать координаты блока, на который смотрит игрок, или как использовать эти координаты в командах, чтобы поставить блок именно там — вы попали по адресу! В этом посте мы разберём, как в Minecraft с помощью моддинга и командных блоков получить координаты выделенного блока, использовать относительные координаты и команду /execute для выполнения сложных действий. Всё просто, понятно и с примерами!


Как определить координаты блока, на который смотрит игрок

В моддинге Minecraft для получения координат блока, на который смотрит игрок, часто используют метод rayTraceBlocks. Это своего рода лазерный луч, который идёт от глаз игрока вперёд и "цепляет" первый блок на своём пути.

Как работает rayTraceBlocks

  • Метод принимает начальную точку (обычно позицию глаз игрока) и конечную точку (рассчитанную по направлению взгляда и максимальной дистанции).
  • Возвращает объект MovingObjectPosition, который содержит информацию о блоке, на который попал луч.

Пример кода на Java (Forge)

@Override
public ItemStack onItemRightClick(ItemStack is, World world, EntityPlayer player) {
    MovingObjectPosition mop = block(player, 1.0F, 4.5D, false);
    if (mop != null) {
        int x = mop.blockX;
        int y = mop.blockY;
        int z = mop.blockZ;
        // Теперь можно использовать координаты x, y, z
    }
    return super.onItemRightClick(is, world, player);
}

public static MovingObjectPosition block(EntityPlayer player, float partialTicks, double dist, boolean interact) {
    Vec3 eyePos = player.getPosition(partialTicks);
    eyePos = eyePos.addVector(0, player.getEyeHeight(), 0);
    Vec3 lookVec = player.getLook(partialTicks);
    Vec3 targetVec = eyePos.addVector(lookVec.xCoord * dist, lookVec.yCoord * dist, lookVec.zCoord * dist);
    return player.worldObj.rayTraceBlocks(eyePos, targetVec, interact);
}

Здесь block — функция, которая возвращает MovingObjectPosition, а из него берутся координаты блока (blockX, blockY, blockZ).


Что такое MovingObjectPosition и как из него извлечь координаты

MovingObjectPosition — это объект, который содержит данные о результате лучевого трассирования:

Поле Описание
blockX Координата X блока
blockY Координата Y блока
blockZ Координата Z блока
typeOfHit Тип попадания (блок, сущность)

Чтобы получить координаты, достаточно проверить, что mop != null и mop.typeOfHit == MovingObjectType.BLOCK, а затем взять blockX, blockY, blockZ.


Клиентский эвент DrawBlockHighlightEvent и его особенности

Если вы хотите получить координаты выделенного блока на клиенте (например, для отображения или взаимодействия), можно использовать событие DrawBlockHighlightEvent.

@SubscribeEvent
public void onDrawBlockHighlight(DrawBlockHighlightEvent event) {
    if (event.target != null && event.target.typeOfHit == MovingObjectType.BLOCK) {
        int x = event.target.blockX;
        int y = event.target.blockY;
        int z = event.target.blockZ;
        // Используйте координаты по назначению
    }
}

Важно: Это событие работает только на клиенте и не подходит для серверной логики. Для серверных задач лучше использовать rayTraceBlocks.


Относительные координаты в командах Minecraft: ~ и ^

В командах Minecraft, например /setblock, можно использовать относительные координаты, чтобы не считать точные числа.

Символ Описание Пример использования
~ Относительно позиции исполнителя команды /setblock ~ ~ ~ stone — поставить камень на месте игрока или командного блока
^ Относительно направления взгляда исполнителя /setblock ^ ^ ^ stone — поставить камень прямо перед игроком, в направлении взгляда

Когда использовать ~

Если вы хотите поставить блок относительно текущей позиции игрока или командного блока, используйте ~. Например:

/setblock ~ ~1 ~ minecraft:stone

Поставит камень на блок выше игрока.

Когда использовать ^

^ — это координаты относительно направления взгляда. Это сложнее, но удобно, если нужно поставить блок прямо перед игроком, независимо от его ориентации.


Пример использования ^ в команде /setblock

Допустим, вы хотите поставить блок камня прямо перед игроком, куда он смотрит:

/setblock ^ ^ ^ minecraft:stone

Однако, в стандартном Minecraft ^ работает относительно позиции исполнителя команды, а не выделенного блока. Если вы хотите использовать ^ относительно выделенного блока, потребуется дополнительная логика в моде или плагине, чтобы получить координаты выделенного блока и выполнить команду с этими координатами.


Как связать координаты выделенного блока с постановкой нового блока

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

  1. Получить координаты выделенного блока (через rayTraceBlocks или DrawBlockHighlightEvent).
  2. Выполнить команду /setblock с абсолютными координатами или с относительными координатами ~, если команда выполняется от имени выделенного блока.
  3. В модах или плагинах можно программно вызвать команду с нужными координатами.

Команда /execute — мощный инструмент для работы с координатами

Команда /execute позволяет выполнять команды от имени других сущностей, в других позициях и с условиями.

Основные категории подкоманд /execute

Категория Назначение
Модификатор Изменяет исполнителя или позицию команды
Условие Проверяет условия для выполнения команды
Запись Сохраняет результат или успешность выполнения

Пример использования /execute

execute @e[type=creeper] 0 64 0 summon lightning_bolt

Создаёт молнию на координатах (0, 64, 0) для каждого крипера.


Как использовать относительные координаты в /execute

В Bedrock Edition синтаксис:

execute <origin: target> <position: x y z> <command: string>
  • position: x y z — координаты, относительно которых выполняется команда.
  • Можно использовать ~ для относительных координат.

Практические советы по работе с координатами и командами

  • Отладка: всегда выводите координаты в чат или лог, чтобы убедиться, что они правильные.
  • Проверка: используйте команды /testforblock или /execute if block для проверки наличия блока на координатах.
  • Обработка ошибок: учитывайте, что rayTraceBlocks может вернуть null, если блок не найден.
  • Безопасность: не забывайте, что клиентские эвенты не подходят для серверной логики.

Таблица сравнения методов получения координат блока

Метод Где работает Что возвращает Особенности
rayTraceBlocks Сервер и клиент MovingObjectPosition Надёжный способ для моддинга
DrawBlockHighlightEvent Клиент Координаты выделенного блока Только для визуальных эффектов
Команды /execute и /setblock Командный блок/консоль Выполнение действий на координатах Использует относительные и абсолютные координаты

Заключение

Получение координат блока, на который смотрит игрок, — это ключ к созданию крутых модов и плагинов в Minecraft. Используйте rayTraceBlocks для точного определения блока, DrawBlockHighlightEvent для клиентских эффектов, а команды /setblock и /execute — для манипуляций с миром.

Не бойтесь экспериментировать с относительными координатами ~ и ^, чтобы создавать динамичные и интерактивные механики!


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


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