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

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

Статус
Закрыто для дальнейших ответов.

Ne600

Ньюби
Пользователь
Баллы
1
Здравствуйте!
Необходимо, что бы при установке блока (допустим - губки), все блоки в радиусе от неё (5 блоков) заменились на эндерняк. Позже, через некоторое время (допустим, через 5 минут), радиус увеличивался на +1 блок во все стороны, и блоки, попавшие в него, менялись тоже.
И так, по идее, радиус увеличивался бы (до бесконечности) на +1 во все стороны через определенное время...
Проблема у меня именно с расширением радиуса и с заменой всех блоков в нем...
Задержку времени, через которое будет расти радиус хочу реализовать через Шедулеры
 
Привет, немного помогу, 1 берёшь ивент BlockPlaceEvent, 2 проверяешь какой блок он поставил, если это губка, то дальше проверяешь, есть ли в радиусе 5 блоков блоки, если там есть они, то заменяешь на определённый блок, как сделать замену, есть две идеи, но незнаю как именно я, первое, берёшь по локации куда был установлен блок, потом вычисляешь по нему кордионаты в стороны по 5 блоков и потом по очерёдке заменяешь, второй сейчас идея мне пришла, подключаешь в библиотеку плагинов плагин WorldEdit, и с помощью него уже берёшь методы выделения позиции и с помощью метода замены блоков меняешь. Дальше два пути, незнаю как тебе пойти, первый путь - через цикл к примеру for ставишь таймер через BukkitRunable и при его выполнение делаешь вычисление кордов блоков и заменяешь их, останавливаешь таймер и по циклу повторяется, хотя может я и ошибаюсь. И второй путь - просто таймер сделать, который будет без остановки. Вот так, все мои знания на это)
 
Привет, немного помогу, 1 берёшь ивент BlockPlaceEvent, 2 проверяешь какой блок он поставил, если это губка, то дальше проверяешь, есть ли в радиусе 5 блоков блоки, если там есть они, то заменяешь на определённый блок, как сделать замену, есть две идеи, но незнаю как именно я, первое, берёшь по локации куда был установлен блок, потом вычисляешь по нему кордионаты в стороны по 5 блоков и потом по очерёдке заменяешь, второй сейчас идея мне пришла, подключаешь в библиотеку плагинов плагин WorldEdit, и с помощью него уже берёшь методы выделения позиции и с помощью метода замены блоков меняешь. Дальше два пути, незнаю как тебе пойти, первый путь - через цикл к примеру for ставишь таймер через BukkitRunable и при его выполнение делаешь вычисление кордов блоков и заменяешь их, останавливаешь таймер и по циклу повторяется, хотя может я и ошибаюсь. И второй путь - просто таймер сделать, который будет без остановки. Вот так, все мои знания на это)
Да, спасибо. Показался интересным именно 2ой вариант. Можешь, пожалуйста, написать подробней, как из WorldEdit вытянуть метод замены блоков?
 
Да, спасибо. Показался интересным именно 2ой вариант. Можешь, пожалуйста, написать подробней, как из WorldEdit вытянуть метод замены блоков?
Я не уверен в этом, но думаю может сработать. Во-первых подключаешь в библиотеку ворлдедит, после этого будем регистрировать методы получения разных функций из едита, но для этого, ты скачивай luyten или смотри исходный код, и смотри в главном классе, получают ли там методы.
 
Я не уверен в этом, но думаю может сработать. Во-первых подключаешь в библиотеку ворлдедит, после этого будем регистрировать методы получения разных функций из едита, но для этого, ты скачивай luyten или смотри исходный код, и смотри в главном классе, получают ли там методы.
WorldEdit вроде подключил. И по сути осталось именно использовать две команды (выделение региона по координатам и замена блоков). Но как рг то выделить через плагин....?
 
WorldEdit вроде подключил. И по сути осталось именно использовать две команды (выделение региона по координатам и замена блоков). Но как рг то выделить через плагин....?
поясни "как рг то выделить через плагин" подключить плагин ты имел в виду?
 
ты скачивай luyten или смотри исходный код, и смотри в главном классе, получают ли там методы.
Проще документацию по API почитать официальную, зачем декомпилить
 
поясни "как рг то выделить через плагин" подключить плагин ты имел в виду?
Не, я плагин подключил. Я, конечно, в WorldEdit API не сильно разобрался, но возникла идея... А что если просто как-то выделить 2 точки (pos1 и pos2) в нужном мне "радиусе" и реплейснуть все на нужный блок? Возможно ли такое?
 
Осталось только понять, как точки (регион) выделить и заменить блоки в нем...
 
Осталось только понять, как точки (регион) выделить и заменить блоки в нем...

Мне скучно, наговнокодил тебе что-то такое.
Ничего не тестил, так что и гарантий никаких нет.

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);
                }
            }
        }
    }
 
Последнее редактирование:
Мне скучно, наговнокодил тебе что-то такое.
Ничего не тестил, так что и гарантий никаких нет.

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);
                }
            }
        }
    }
Спасибо, мы уже ближе к решению!
Но, как я понял, этот код заменяет все блоки на алмазные. Получается, сюда нужно как-то добавить исключение для всех блоков кроме нужного (губки)
P.S сейчас попробовал его - у меня он разместил огромный параллелепипед из алмазных блоков(
 
Но, как я понял, этот код заменяет все блоки на алмазные.
Угу.
P.S сейчас попробовал его - у меня он разместил огромный параллелепипед из алмазных блоков(
Ну я же сказал, что я забыл вкорячить проверку на воздух, чтобы он и его не заполнял.
 
а, понял, буду с ней мучиться...
Но, т.к я кодер только начинающий (нуб короче), будь готов к моим мольбам о помощи! :good:
 
Мне скучно, наговнокодил тебе что-то такое.
Ничего не тестил, так что и гарантий никаких нет.

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);
                }
            }
        }
    }
Гхм, если тебе нечего делать будет - попробуй, пожалуйста, написать её... Просто я хочу посмотреть, как ты ее сделаешь... У меня все колхозно выходит :(
 
а, понял, буду с ней мучиться...
Но, т.к я кодер только начинающий (нуб короче), будь готов к моим мольбам о помощи! :good:
if(block.getType != Material.AIR) {
//а тут уже твой код который остальной.
}
 
Код:
  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. Надеюсь я правильно всё сделал.
 
Статус
Закрыто для дальнейших ответов.

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

Назад
Верх