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

Помогите Как сделать проверку на уровень блоков в чанке?

Тема в разделе "Разработка плагинов для новичков", создана пользователем No Name, 14 сен 2022.

Статус темы:
Закрыта.
  1. Автор темы
    No Name

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

    Баллы:
    61
    Приветствую! Пишу плагин на вставку schematic'a. Мне нужно сделать так, чтобы schematic вставлялся в пределах чанка, не выходя за него.

    Основной вопрос пока что заключается в следующем: Как сделать проверку на ровный чанк, то есть чтобы была чистая и ровная (на одном уровне) территория (чанк) без блоков ?

    Код:
    private static boolean scannBlock(Player player, Location loc) {
            Block block = loc.getBlock();
            for (int x = block.getX(); x < block.getX() + 16; x++) {
                for (int z = block.getZ(); z < block.getZ() + 16; z++) {
                }
            }
            return true;
        }
    Застрял на данном этапе. Надеюсь на вашу помощь
     
  2. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Если нужна идеально плоская поверхность - просто пройдись в цикле по всем X,Z и сравнивай world.getHighestBlockYAt

    Но учти, что такую поверхность довольно сложно найти - сам понимаешь, генерация такая.
    Поэтому можно сделать допустимый разброс высоты +- 4 блока.

    Для ускорения вычислений можно обрабатывать не каждый из 255 блоков, а лишь 4 блока по углам чанка. Либо же работать "по сетке" - проверять блок и пропускать 2-3 следующих
     
  3. Автор темы
    No Name

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

    Баллы:
    61
    Плоская поверхность имеется ввиду чтобы игрок сам расчистил чанк, если хочет загрузить схематику.
    По поводу getHighestBlockYAt: Гуглю уже несколько дней подряд, дабы понять как можно такую проверку сделать - ничего найти не могу, а самостоятельно написать проблематично, ибо я только начал изучение. Буду благодарен если покажешь мне пример такой проверки...
     
  4. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    World myWorld = Bukkit.getWorld("world_nether");
    int height = myWorld.getHighestBlockYAt(-100, 60, 90);

    Для каждого из 255-и блоков получить высочайших блок и проверить, что его значение равно общему значению
     
  5. Автор темы
    No Name

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

    Баллы:
    61
    Жалуется на три аргумента - Cannot resolve method 'getHighestBlockYAt(int, int, int)'
     
  6. ZDCoder

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

    Баллы:
    76
    Метод getHighestBlockYAt принимает 2 аргумента, это x & z.
     
  7. Автор темы
    No Name

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

    Баллы:
    61
    Я это осознаю, но тем не менее у меня до сих трудности с написанием проверки.

    Кому не сложно, помогите пожалуйста написать такую проверку, чтобы если поверхность чанка ровная (без посторонних блоков) отправляло сообщение игроку
     
    Последнее редактирование: 14 сен 2022
  8. ZDCoder

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

    Баллы:
    76
    Поверхность чанка ровная на определённой высоте, или например на высоте на которой игрок поставил блок/написал команду ?
     
  9. Автор темы
    No Name

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

    Баллы:
    61
    На которой игрок написал команду.
     
  10. ZDCoder

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

    Баллы:
    76
    Самый высокий блок, или например от высоты игрока и +10 блоков (условно) вверх.
     
  11. Автор темы
    No Name

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

    Баллы:
    61
    Весь чанк должен быть пустым от того места, где игрок прописал команду и до самого высокого блока.
     
  12. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Да, высоту действительно не надо указывать, он ж ищется как раз. Только X и Z

    Пустым он быть не может - как минимум бедрок в выживании не разрушить.

    В чем сложность при написании кода?
    Получаем чанк игрока, получаем минимальную и максимальную точку.
    Создаём цикл для перебора X и внутри цикл для перебора Y. Перебор в обоих циклах ведётся от минимальной до максимальной точки.
    Внутри цикла получаем высоту высочайшего блока и сравниваем ее и искомым значением.
    Искомое значение может быть либо константой, либо высотой любого блока в чанке.
    Если координаты не равны - выводим сообщение об ошибке игрокуи и прекращаем выполнение команды.
    Если два цикла завершились - начинаем вставку шематика.

    Готовый код писать не буду, иначе не научишься программировать самостоятельно. Если есть конкретные вопросы - задавай
     
    Последнее редактирование: 14 сен 2022
  13. ZDCoder

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

    Баллы:
    76
    Поддерживаю.
     
  14. Автор темы
    No Name

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

    Баллы:
    61
    Вы правы, но учиться не имея примеров и представления как должна выглядеть структура кода крайне сложно. Спасибо за инструкцию, на днях попробую.
     
  15. Автор темы
    No Name

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

    Баллы:
    61
    Код:
    ChunkSnapshot snapshot = chunk.getChunkSnapshot(true, false, false);
            int y = 0;
            for(int x = 0; x < 16; x++) {
                for(int z = 0; z < 16; z++) {
                    int highY = snapshot.getHighestBlockYAt(x, z);
                    if (y != highY) {
                        player.sendMessage(ChatColor.RED + "You dont can build.");
                        return false;
                    } else {
                        player.sendMessage(ChatColor.RED + "You can build.");
                    }
                }
            }
    Не подскажешь, что тут не так? При любых обстоятельствах срабатывает
     
  16. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Ты сравниваешь максимальную высоту с нулем. А на практике она, скорее всего, не 0.

    Если ты хочешь указать конкретную высоту - просто замени ноль на него.

    Если высота может быть произвольная, то необходимо присвоить значение, равное высочайшей точке в координате 0;0 чанка, например
     
  17. Автор темы
    No Name

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

    Баллы:
    61
    Изменил Y на текущее местоположение и все равно не работает

    Код:
    Chunk chunk = loc.getWorld().getChunkAt(loc.getBlockX() >> 4, loc.getBlockZ() >> 4);
            ChunkSnapshot snapshot = chunk.getChunkSnapshot(true, false, false);
            for (int x = 0; x < 16; x++) {
                for (int z = 0; z < 16; z++) {
                    int highY = snapshot.getHighestBlockYAt(x, z);
                    if (loc.getBlockY() != highY) {
                        player.sendMessage(ChatColor.RED + "You dont can build.");
                    } else {
                        player.sendMessage(ChatColor.RED + "You can build.");
                    }
                    return false;
                }
            }
            return true;
     
  18. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Потому что ты возвращаешь false независимо от проверки. Возвращай его только если высота не совпадает.
    К тому же, блок else здесь не нужен - он показывается в цикле, и в итоге ты будешь отсылать сообщение на каждый проверенный блок. Вместо этого подкинь его в конец, перед возвращением true.
     
  19. Автор темы
    No Name

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

    Баллы:
    61
    Большое спасибо всем, кто помогал!
     
Статус темы:
Закрыта.

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