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

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

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

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

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

    Баллы:
    1
    Здравствуйте!
    Необходимо, что бы при установке блока (допустим - губки), все блоки в радиусе от неё (5 блоков) заменились на эндерняк. Позже, через некоторое время (допустим, через 5 минут), радиус увеличивался на +1 блок во все стороны, и блоки, попавшие в него, менялись тоже.
    И так, по идее, радиус увеличивался бы (до бесконечности) на +1 во все стороны через определенное время...
    Проблема у меня именно с расширением радиуса и с заменой всех блоков в нем...
    Задержку времени, через которое будет расти радиус хочу реализовать через Шедулеры
     
  2. ItsWay

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

    Баллы:
    76
    Имя в Minecraft:
    ItsWay
    Привет, немного помогу, 1 берёшь ивент BlockPlaceEvent, 2 проверяешь какой блок он поставил, если это губка, то дальше проверяешь, есть ли в радиусе 5 блоков блоки, если там есть они, то заменяешь на определённый блок, как сделать замену, есть две идеи, но незнаю как именно я, первое, берёшь по локации куда был установлен блок, потом вычисляешь по нему кордионаты в стороны по 5 блоков и потом по очерёдке заменяешь, второй сейчас идея мне пришла, подключаешь в библиотеку плагинов плагин WorldEdit, и с помощью него уже берёшь методы выделения позиции и с помощью метода замены блоков меняешь. Дальше два пути, незнаю как тебе пойти, первый путь - через цикл к примеру for ставишь таймер через BukkitRunable и при его выполнение делаешь вычисление кордов блоков и заменяешь их, останавливаешь таймер и по циклу повторяется, хотя может я и ошибаюсь. И второй путь - просто таймер сделать, который будет без остановки. Вот так, все мои знания на это)
     
  3. Автор темы
    Ne600

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

    Баллы:
    1
    Да, спасибо. Показался интересным именно 2ой вариант. Можешь, пожалуйста, написать подробней, как из WorldEdit вытянуть метод замены блоков?
     
  4. ItsWay

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

    Баллы:
    76
    Имя в Minecraft:
    ItsWay
    Я не уверен в этом, но думаю может сработать. Во-первых подключаешь в библиотеку ворлдедит, после этого будем регистрировать методы получения разных функций из едита, но для этого, ты скачивай luyten или смотри исходный код, и смотри в главном классе, получают ли там методы.
     
  5. Автор темы
    Ne600

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

    Баллы:
    1
    WorldEdit вроде подключил. И по сути осталось именно использовать две команды (выделение региона по координатам и замена блоков). Но как рг то выделить через плагин....?
     
  6. ItsWay

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

    Баллы:
    76
    Имя в Minecraft:
    ItsWay
    поясни "как рг то выделить через плагин" подключить плагин ты имел в виду?
     
  7. mirrerror

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

    Баллы:
    76
    Имя в Minecraft:
    mirrerror
    Проще документацию по API почитать официальную, зачем декомпилить
     
  8. ItsWay

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

    Баллы:
    76
    Имя в Minecraft:
    ItsWay
    забыл про неё, так то не везде есть, но тоже.
     
  9. Автор темы
    Ne600

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

    Баллы:
    1
    Не, я плагин подключил. Я, конечно, в WorldEdit API не сильно разобрался, но возникла идея... А что если просто как-то выделить 2 точки (pos1 и pos2) в нужном мне "радиусе" и реплейснуть все на нужный блок? Возможно ли такое?
     
  10. Автор темы
    Ne600

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

    Баллы:
    1
    Осталось только понять, как точки (регион) выделить и заменить блоки в нем...
     
  11. FeniksDEV

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

    Баллы:
    76
    Имя в Minecraft:
    Feniksovich
    Мне скучно, наговнокодил тебе что-то такое.
    Ничего не тестил, так что и гарантий никаких нет.

    UPD: Забыл проверку на воздух вкорячить, но ты справишься.
    Код:
        @EventHandler
        public void onPlace(BlockPlaceEvent e) {
            Block block = e.getBlockPlaced();
            if (block.getType() != Material.SPONGE) return;
    
            Location min = block.getLocation().clone().subtract(5, 5, 5);
            Location max = block.getLocation().clone().add(5, 5, 5);
    
            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++) {
                        min.getWorld().getBlockAt(x, y, z).setType(Material.DIAMOND_BLOCK);
                    }
                }
            }
        }
     
    Последнее редактирование: 1 июл 2022
  12. Автор темы
    Ne600

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

    Баллы:
    1
    Спасибо, мы уже ближе к решению!
    Но, как я понял, этот код заменяет все блоки на алмазные. Получается, сюда нужно как-то добавить исключение для всех блоков кроме нужного (губки)
    P.S сейчас попробовал его - у меня он разместил огромный параллелепипед из алмазных блоков(
     
  13. FeniksDEV

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

    Баллы:
    76
    Имя в Minecraft:
    Feniksovich
    Угу.
    Ну я же сказал, что я забыл вкорячить проверку на воздух, чтобы он и его не заполнял.
     
  14. Автор темы
    Ne600

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

    Баллы:
    1
    а, понял, буду с ней мучиться...
    Но, т.к я кодер только начинающий (нуб короче), будь готов к моим мольбам о помощи! :good:
     
  15. FeniksDEV

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

    Баллы:
    76
    Имя в Minecraft:
    Feniksovich
    xD
     
  16. Автор темы
    Ne600

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

    Баллы:
    1
    Гхм, если тебе нечего делать будет - попробуй, пожалуйста, написать её... Просто я хочу посмотреть, как ты ее сделаешь... У меня все колхозно выходит :(
     
  17. ItsWay

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

    Баллы:
    76
    Имя в Minecraft:
    ItsWay
    if(block.getType != Material.AIR) {
    //а тут уже твой код который остальной.
    }
     
  18. ItsWay

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

    Баллы:
    76
    Имя в Minecraft:
    ItsWay
    Перепутал, это не то)
     
  19. Sturm_PT

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

    Баллы:
    76
    Это то. После третьего цикла перед заменой вставить
     
  20. 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(min.getBlockX().getType() != Material.AIR) {
                       if(min.getBlockY().getType() != Material.AIR) {
                         if(min.getBlockZ().getType() != Material.AIR) {
                              min.getWorld().getBlockAt(x, y, z).setType(Material.DIAMOND_BLOCK);
    }}
    }}
    }
    }
    
    
    Я поясню, for - цикл, int x - значение массивы по цифрам, min.getBlockX() - Получает кордионнату по x у типа как MIN, сравниваем её с типом MAX, если MIN меньше MAX(это мы проверяем через <) то идёт дальше, проверка, int y, получают позицую только уже у кордионаты y, и сравнивают по количеству, и так-же с Z кордионатой. После явсунул проверку if - сравнение, min.getBlockX() - получения блока по кордионате x, getType - получить тип блока, != если оно не равняется значению то будет выполняться, Material.AIR, получение если это не воздух. Итог проверка это воздух там или нет, если нет, то выполняется команда, остальные две строки проверки это так-же только по кордионатам Y и Z. Надеюсь я правильно всё сделал.
     
Статус темы:
Закрыта.

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