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

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

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

Статус темы:
Закрыта.
  1. ItsWay

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

    Баллы:
    76
    Имя в Minecraft:
    ItsWay
    А не разве что я сейчас это сделал?
     
  2. ItsWay

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

    Баллы:
    76
    Имя в Minecraft:
    ItsWay
    И опять я только туплю, я думал надо проверять, если там не пустота, тогда совсем просто....

    Код:
      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);
    }}
    }
    }
     
  3. Автор темы
    Ne600

    Ne600 Ньюби Пользователь

    Баллы:
    1
    У меня вышло такое... Но оно не работает. Скорее всего я накосячил [сильно.] upload_2022-7-1_14-12-10.png
     
  4. FeniksDEV

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

    Баллы:
    76
    Имя в Minecraft:
    Feniksovich
    Ну, почти. Дело в том, что в 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);
    
     
    Последнее редактирование: 1 июл 2022
  5. ItsWay

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

    Баллы:
    76
    Имя в Minecraft:
    ItsWay
    Вот так, сбор тут всех умников форума кроме меня)
     
  6. Автор темы
    Ne600

    Ne600 Ньюби Пользователь

    Баллы:
    1
    Круто придумал конечно, но мне кажется, что у меня оно работать не будет. Посмотри скриншот (который я скинул). Типа того должно получиться?
     
  7. FeniksDEV

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

    Баллы:
    76
    Имя в Minecraft:
    Feniksovich
    У тебя блок заменяется, если он губка.
     
  8. FeniksDEV

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

    Баллы:
    76
    Имя в Minecraft:
    Feniksovich
    Все мы чего-то не знаем/не знали, это нормально. На то он и форум.
     
  9. ItsWay

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

    Баллы:
    76
    Имя в Minecraft:
    ItsWay
    Ну да, но есть и умники которые отвечают: просто бери и делай...
     
  10. Автор темы
    Ne600

    Ne600 Ньюби Пользователь

    Баллы:
    1
    Странно, вроде когда тестил - ничего не менялось. Позже посмотрю еще раз и напишу
     
  11. Автор темы
    Ne600

    Ne600 Ньюби Пользователь

    Баллы:
    1
    Сделал типа того:
    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);
     
  12. FeniksDEV

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

    Баллы:
    76
    Имя в Minecraft:
    Feniksovich
    Этот код вообще с этим листом здесь не взаимодействует. Где вторая часть кода то?
    Код:
    Block b = min.getWorld().getBlockAt(x, y, z);
    if (PROHIBITED_MATERIALS.contains(b.getType())) return;
    b.setType(Material.DIAMOND_BLOCK);
     
  13. LOVEC3327

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

    Баллы:
    76
    Имя в Minecraft:
    LOVEC3327
    PHP:
        public void replaceBlocks(Location locationMaterial materialint radius) {
            for (
    int x location.getBlockX() - radius<= location.getBlockX() + radiusx++) {
                for (
    int y location.getBlockY() - radius<= location.getBlockY() + radiusy++) {
                    for (
    int z location.getBlockZ() - radius<= location.getBlockZ() + radiusz++) {
                        
    Block block location.getWorld().getBlockAt(xyz);
                        if (
    block.getType() == Material.AIR) continue;
                        
    block.setType(material);
                    }
                }
            }
        }
     
  14. FeniksDEV

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

    Баллы:
    76
    Имя в Minecraft:
    Feniksovich
    Получится на блок больше, чем radius :)
     
  15. LOVEC3327

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

    Баллы:
    76
    Имя в Minecraft:
    LOVEC3327
    Как раз-таки нет. Всё работает как надо.
     
  16. FeniksDEV

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

    Баллы:
    76
    Имя в Minecraft:
    Feniksovich
    Хотя да, верно. Крошу печенье)
     
    Последнее редактирование: 1 июл 2022
  17. ZDCoder

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

    Баллы:
    76
    В этой теме собрались все гении рб. xd
     
  18. Автор темы
    Ne600

    Ne600 Ньюби Пользователь

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

    upload_2022-7-1_19-12-32.png
     
    Последнее редактирование: 1 июл 2022
  19. MurlikMurlik

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

    Баллы:
    96
    Замени названия метода replaceBlocks на run внутри тела анонимного класса и добавь над ним аннотацию @Override
     
  20. MurlikMurlik

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

    Баллы:
    96
    Если я правильно понял задачу в шапке темы, то вот примерно как оно должно работать.

    Код:
        //Блоки которые не нужно заменять при замене
        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();
                }
            }
        }
     
Статус темы:
Закрыта.

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