Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите Замена всех блоков в радиусе

Статус
Закрыто для дальнейших ответов.
И опять я только туплю, я думал надо проверять, если там не пустота, тогда совсем просто....

Код:
  for (int x = min.getBlockX(); x < max.getBlockX(); x++) {
           for (int y = min.getBlockY(); y < max.getBlockY(); y++) {
               for (int z = min.getBlockZ(); z < max.getBlockZ(); z++) {
                    if(block.getType == Material.AIR) return;
                    if(block.getType == Material.Sponge) {
                          min.getWorld().getBlockAt(x, y, z).setType(Material.DIAMOND_BLOCK);
}}
}
}
 
У меня вышло такое... Но оно не работает. Скорее всего я накосячил [сильно.] upload_2022-7-1_14-12-10.png
 
if(block.getType != Material.AIR) {
//а тут уже твой код который остальной.
}
Ну, почти. Дело в том, что в Minecraft Material.AIR — не единственный тип воздуха.
Учитывая, что, скорее всего, понадобится еще какой-то список исключений для замены блоков (например, бедрок), то я бы сделал так:

В полях класса:
Код:
private static final List<Material> PROHIBITED_MATERIALS = Arrays.asList(Material.AIR, Material.CAVE_AIR, Material.VOID_AIR, Material.STRUCTURE_VOID, Material.SPONGE, Material.BEDROCK);

В теле последнего вложенного цикла:
Код:
Block b = min.getWorld().getBlockAt(x, y, z);
if (PROHIBITED_MATERIALS.contains(b.getType())) return;
b.setType(Material.DIAMOND_BLOCK);
 
Последнее редактирование:
Ну, почти. Дело в том, что в Minecraft Material.AIR — не единственный тип воздуха.
Учитывая, что, скорее всего, понадобится еще какой-то список исключений для замены блоков (например, бедрок), то я бы сделал так:

В полях класса:
Код:
private static final List<Material> PROHIBITED_MATERIALS = Arrays.asList(Material.AIR, Material.CAVE_AIR, Material.VOID_AIR, Material.STRUCTURE_VOID, Material.SPONGE, Material.BEDROCK);

В теле последнего вложенного цикла:
Код:
Block b = min.getWorld().getBlockAt(x, y, z);
if (PROHIBITED_MATERIALS.contains(b.getType())) return;
b.setType(Material.DIAMOND_BLOCK);
Вот так, сбор тут всех умников форума кроме меня)
 
Ну, почти. Дело в том, что в Minecraft Material.AIR — не единственный тип воздуха.
Учитывая, что, скорее всего, понадобится еще какой-то список исключений для замены блоков (например, бедрок), то я бы сделал так:

В полях класса:
Код:
private static final List<Material> PROHIBITED_MATERIALS = Arrays.asList(Material.AIR, Material.CAVE_AIR, Material.VOID_AIR, Material.STRUCTURE_VOID, Material.SPONGE, Material.BEDROCK);

В теле последнего вложенного цикла:
Код:
Block b = min.getWorld().getBlockAt(x, y, z);
if (PROHIBITED_MATERIALS.contains(b.getType())) return;
b.setType(Material.DIAMOND_BLOCK);
Круто придумал конечно, но мне кажется, что у меня оно работать не будет. Посмотри скриншот (который я скинул). Типа того должно получиться?
 
Круто придумал конечно, но мне кажется, что у меня оно работать не будет. Посмотри скриншот (который я скинул). Типа того должно получиться?
У тебя блок заменяется, если он губка.
 
Сделал типа того:
upload_2022-7-1_16-31-35.png
Но ничего не происходит... Ничего не заменяется...
Prohibited materials вот:
final List<Material> PROHIBITED_MATERIALS = Arrays.asList(Material.AIR, Material.CAVE_AIR, Material.VOID_AIR, Material.STRUCTURE_VOID, Material.SPONGE, Material.BEDROCK);
 
Сделал типа того:
Посмотреть вложение 62978
Но ничего не происходит... Ничего не заменяется...
Prohibited materials вот:
final List<Material> PROHIBITED_MATERIALS = Arrays.asList(Material.AIR, Material.CAVE_AIR, Material.VOID_AIR, Material.STRUCTURE_VOID, Material.SPONGE, Material.BEDROCK);
Этот код вообще с этим листом здесь не взаимодействует. Где вторая часть кода то?
Код:
Block b = min.getWorld().getBlockAt(x, y, z);
if (PROHIBITED_MATERIALS.contains(b.getType())) return;
b.setType(Material.DIAMOND_BLOCK);
 
PHP:
    public void replaceBlocks(Location location, Material material, int radius) {
        for (int x = location.getBlockX() - radius; x <= location.getBlockX() + radius; x++) {
            for (int y = location.getBlockY() - radius; y <= location.getBlockY() + radius; y++) {
                for (int z = location.getBlockZ() - radius; z <= location.getBlockZ() + radius; z++) {
                    Block block = location.getWorld().getBlockAt(x, y, z);
                    if (block.getType() == Material.AIR) continue;
                    block.setType(material);
                }
            }
        }
    }
 
PHP:
    public void replaceBlocks(Location location, Material material, int radius) {
        for (int x = location.getBlockX() - radius; x <= location.getBlockX() + radius; x++) {
            for (int y = location.getBlockY() - radius; y <= location.getBlockY() + radius; y++) {
                for (int z = location.getBlockZ() - radius; z <= location.getBlockZ() + radius; z++) {
                    Block block = location.getWorld().getBlockAt(x, y, z);
                    if (block.getType() == Material.AIR) continue;
                    block.setType(material);
                }
            }
        }
    }
Получится на блок больше, чем radius :)
 
В этой теме собрались все гении рб. xd
 
PHP:
    public void replaceBlocks(Location location, Material material, int radius) {
        for (int x = location.getBlockX() - radius; x <= location.getBlockX() + radius; x++) {
            for (int y = location.getBlockY() - radius; y <= location.getBlockY() + radius; y++) {
                for (int z = location.getBlockZ() - radius; z <= location.getBlockZ() + radius; z++) {
                    Block block = location.getWorld().getBlockAt(x, y, z);
                    if (block.getType() == Material.AIR) continue;
                    block.setType(material);
                }
            }
        }
    }
Не понимаю, что не так. Помоги, пожалуйста... Ошибка: "is not abstract and does not override abstract method run() in java.lang.Runnable"...
Может я вообще все напутал? Можешь прямо целиком весь код дать?
Если что, кроме того, что я заскринил, я изменений не делал
UPD: "material" - заменил

upload_2022-7-1_19-12-32.png
 
Последнее редактирование:
Не понимаю, что не так. Помоги, пожалуйста... Ошибка: "is not abstract and does not override abstract method run() in java.lang.Runnable"...
Может я вообще все напутал? Можешь прямо целиком весь код дать?
Если что, кроме того, что я заскринил, я изменений не делал
UPD: "material" - заменил

Посмотреть вложение 62979
Замени названия метода replaceBlocks на run внутри тела анонимного класса и добавь над ним аннотацию @Override
 
Ничего не поменялось. Только @Override тоже стал красным. У тебя, как я понял, твой код работает?
Просто если да, то где-то я накосячил... Даже не знаю... Могу кинуть в лс абсолютно весь код... Хотя это вряд-ли поможет
Если я правильно понял задачу в шапке темы, то вот примерно как оно должно работать.

Код:
    //Блоки которые не нужно заменять при замене
    private static final List<Material> PROHIBITED_MATERIALS = Arrays.asList(Material.AIR, Material.CAVE_AIR,
            Material.VOID_AIR, Material.STRUCTURE_VOID, Material.SPONGE, Material.BEDROCK);

    //Обработчик ивента при размещении блоков
    @EventHandler
    public void onBlockPlaceEvent(BlockPlaceEvent e) {
        if (e.isCancelled()) {
            return;
        }

        Location loc = e.getBlockPlaced().getLocation();

        //Запуск настраиваемого шедулера, который будет запускать задачу каждые 20 тиков или 1 секунду
        new BlockHandler(loc).runTaskTimer(plugin, 0L, 20L);
    }

    //Размещаем блоки относительно нужной локацией и с нужным радиусов с нужным типом блоков
    private static void placeBlocks(Location originalLoc, int radius, Material type) {
        Location min = originalLoc.clone().subtract(radius, radius, radius);
        Location max = originalLoc.clone().add(radius, radius, radius);

        World world = originalLoc.getWorld();

        for (int x = min.getBlockX(); x <= max.getBlockX(); x++) {
            for (int y = min.getBlockY(); y <= max.getBlockY(); y++) {
                for (int z = min.getBlockZ(); z <= max.getBlockZ(); z++) {
                    Block b = world.getBlockAt(x, y, z);
                    if (PROHIBITED_MATERIALS.contains(b.getType())) {
                        continue;
                    }
                    b.setType(type);
                }
            }
        }
    }

    //Простой класс, который реализует метод run для выполнения расширения блоков
    private static class BlockHandler extends BukkitRunnable {

        private int count = 1;
        private final Location location;

        public BlockHandler(Location location) {
            this.location = location;
        }

        @Override
        public void run() {
            //Каждый раз радиус будет больше
            placeBlocks(this.location, this.count, Material.DIAMOND_BLOCK);

            this.count++;

            //TODO Здесь можно отменить задачу если например радиус будет больше 10
            if (this.count >= 10) {
                cancel();
            }
        }
    }
 
Статус
Закрыто для дальнейших ответов.

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

Назад
Верх