1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите Ближайший блок такого-то типа

Тема в разделе "Разработка плагинов для новичков", создана пользователем lamovski, 11 июн 2019.

Метки:
Статус темы:
Закрыта.
  1. Автор темы
    lamovski

    lamovski Участник

    Баллы:
    31
    Имя в Minecraft:
    lamovski
    Собсна, вопрос в заголовке: как найти ближайший к Entity блок определённого типа (в моём случае - Chest)?
    Не, можно кнчн поставить к каждому такому блоку по асту, но хотелось бы что-то попроще
     
    Последнее редактирование: 11 июн 2019
  2. LuckyZeeRo

    LuckyZeeRo Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    i0xHeX
    Перебором всех блоков в нужном радиусе через for-loop.
    https://www.baeldung.com/java-loops
    Код:
    // Здесь проверка по кубоиду
    Block startBlock = ... // центр
    int radius = 10;
    
    for (int dx = -radius; dx <= radius; dx++) {
        for (int dy = -radius; dy <= radius; dy++) {
            for (int dz = -radius; dz <= radius; dz++) {
                Block block = startBlock.getRelative(dx, dy, dz);
                // Проверка нужный ли блок и действия
            }
        }
    }
    Оптимальнее это брать ближайшие чанки, в них брать TileEntity (ибо сундуки, воронки и т.п. это как раз они), из них фильтровать которые находятся в нужном радиусе. Еще оптимальнее это делать снепшоты чанков и в них уже перебирать блоки в асинхроне, либо использовать FAWE API.
     
    Последнее редактирование: 11 июн 2019
  3. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Ну давай порассуждаем.
    Как это вообще работает? Я про getNearbyEntities().
    Идём в исходники метода и видим, что там происходит самый обычный перебор всех энтити в мире по определённым условиям - в первую очередь по радусу (который конвертируется в BoundingBox).
    По аналогии можно создать список необходимых блоков. Ничего не мешает держать в памяти список необходимых блоков с их координатами, а потом просто просто проверять их по необходимым условиям.
    Ещё оптимальнее будет хранить блоки почанково, чтобы не перебирать весь мир сразу, а только нужные куски.
    Подскажу, что в ядре уже есть все эти списки. С сундуками ещё проще, потому что они относятся к TileEntity - для них вообще отдельный список вместе с печками, воронками и другими тикающими энтити.
    Правда не знаю, реально ли вытаскивать эти списки без использования НМС.
    Если решишь создавать списки самостоятельно - не забывай актуализировать их при всех необходимых действиях: удаление/установка блока, применение физики, возможно сет через WE и так далее
     
  4. Автор темы
    lamovski

    lamovski Участник

    Баллы:
    31
    Имя в Minecraft:
    lamovski
    Благодарю
     
Статус темы:
Закрыта.

Поделиться этой страницей