Войти или зарегистрироваться

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

  • Автор темы Автор темы 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;
    }

Застрял на данном этапе. Надеюсь на вашу помощь
 
Если нужна идеально плоская поверхность - просто пройдись в цикле по всем X,Z и сравнивай world.getHighestBlockYAt

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

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

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

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

Плоская поверхность имеется ввиду чтобы игрок сам расчистил чанк, если хочет загрузить схематику.
По поводу getHighestBlockYAt: Гуглю уже несколько дней подряд, дабы понять как можно такую проверку сделать - ничего найти не могу, а самостоятельно написать проблематично, ибо я только начал изучение. Буду благодарен если покажешь мне пример такой проверки...
 
Плоская поверхность имеется ввиду чтобы игрок сам расчистил чанк, если хочет загрузить схематику.
По поводу getHighestBlockYAt: Гуглю уже несколько дней подряд, дабы понять как можно такую проверку сделать - ничего найти не могу, а самостоятельно написать проблематично, ибо я только начал изучение. Буду благодарен если покажешь мне пример такой проверки...
World myWorld = Bukkit.getWorld("world_nether");
int height = myWorld.getHighestBlockYAt(-100, 60, 90);

Для каждого из 255-и блоков получить высочайших блок и проверить, что его значение равно общему значению
 
World myWorld = Bukkit.getWorld("world_nether");
int height = myWorld.getHighestBlockYAt(-100, 60, 90);

Для каждого из 255-и блоков получить высочайших блок и проверить, что его значение равно общему значению
Жалуется на три аргумента - Cannot resolve method 'getHighestBlockYAt(int, int, int)'
 
Метод getHighestBlockYAt принимает 2 аргумента, это x & z.
 
Метод getHighestBlockYAt принимает 2 аргумента, это x & z.
Я это осознаю, но тем не менее у меня до сих трудности с написанием проверки.

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

Кому не сложно, помогите пожалуйста написать такую проверку, чтобы если поверхность чанка ровная (без посторонних блоков) отправляло сообщение игроку
Поверхность чанка ровная на определённой высоте, или например на высоте на которой игрок поставил блок/написал команду ?
 
Жалуется на три аргумента - Cannot resolve method 'getHighestBlockYAt(int, int, int)'
Да, высоту действительно не надо указывать, он ж ищется как раз. Только X и Z

Весь чанк должен быть пустым от того места, где игрок прописал команду и до самого высокого блока.
Пустым он быть не может - как минимум бедрок в выживании не разрушить.

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

Готовый код писать не буду, иначе не научишься программировать самостоятельно. Если есть конкретные вопросы - задавай
 
Последнее редактирование:
Да, высоту действительно не надо указывать, он ж ищется как раз. Только X и Z


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

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

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


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

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

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

Код:
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.");
                }
            }
        }

Не подскажешь, что тут не так? При любых обстоятельствах срабатывает
player.sendMessage(ChatColor.RED + "You dont can build.");
 
Код:
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.");
                }
            }
        }

Не подскажешь, что тут не так? При любых обстоятельствах срабатывает
Ты сравниваешь максимальную высоту с нулем. А на практике она, скорее всего, не 0.

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

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

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

Если высота может быть произвольная, то необходимо присвоить значение, равное высочайшей точке в координате 0;0 чанка, например
Изменил 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;
 
Изменил 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;
Потому что ты возвращаешь false независимо от проверки. Возвращай его только если высота не совпадает.
К тому же, блок else здесь не нужен - он показывается в цикле, и в итоге ты будешь отсылать сообщение на каждый проверенный блок. Вместо этого подкинь его в конец, перед возвращением true.
 
Большое спасибо всем, кто помогал!
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх