[Решено] Заполнить территорию определённым блоком

  • Автор темы Автор темы CoolBoy
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

CoolBoy

Активный участник
Пользователь
Баллы
96
Имя в Minecraft
Xezard
Доброго времени суток, читатели данной темы.

В одном из моих плагинов мне понадобилось заполнить нужную мне территорию специальным блоком.
Проблема в том, что сделать мне это нужно, не используя сторонние апи вроде WorldEdit и прочих.

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

Сложно для понимания с первого прочтения, правда?

Что имею:
Java:
Player player = (Player) sender;
BlockIterator iterator = new BlockIterator(player.getWorld(), player.getLocation().toVector(), new Vector(2, 0, 0).multiply(1), 0.0D, 4);
Block block;

while (iterator.hasNext()) {
    block = iterator.next;

    if (block.getType() != Material.AIR) {
        return;
    }

    block.setType(Material.<MY_VALUE>);
}

Примечательно то, что мой метод - работает только в одну сторону. В итоге - получается полоска из тех блоков, что мне нужно.
Однако мне нужно, чтобы заполнялось всё пустое пространство, вплоть до барьера в виде любого блока, отличного от воздуха.
 
Последнее редактирование:
Могу подсказать способ ,не используя BlockIterator.Кажись это будет говнокодом,но почему бы не заполнять всё это дело с помощью циклов?
 
Могу подсказать способ ,не используя BlockIterator.Кажись это будет говнокодом,но почему бы не заполнять всё это дело с помощью циклов?
Я рад любым предложениям. Но каким образом с помощью цикла можно выполнить мою задачу? Хотя... мне кажется, одним циклом тут не обойдётся явно.

Подсказывайте способ :)
 
Я рад любым предложениям. Но каким образом с помощью цикла можно выполнить мою задачу? Хотя... мне кажется, одним циклом тут не обойдётся явно.
Я хотел написать не о одном цикле,а о нескольких вложенных друг вдруга цикла.Пусть внутренний цикл заполняет всё по X до тех пор пока не приблизится к нужной координате,при приближении внешний цикл Z прибавляет значение вообщем вот пример:
Код:
for(y=0;y<20;y++){
for(x=0;x<20;x++){
   for(for(z=0;z<20;z++){
    //здесь устанавливаем блок по полученным координатам
    }
   }
}

только вместо моих x,y,z используй свои относительные игрока.
И перед установкой вставь условие на проверку воздуха.
P.S.На оформление не смотреть,писал в окне браузера.
 

  1. Код:
    public static List<Block> select(Location loc1, Location loc2, World w){
            
            List<Block> blocks = new ArrayList<Block>();
        
            int x1 = loc1.getBlockX();
            int y1 = loc1.getBlockY();
            int z1 = loc1.getBlockZ();
            int x2 = loc2.getBlockX();
            int y2 = loc2.getBlockY();
            int z2 = loc2.getBlockZ();
         
            int xMin, yMin, zMin;
            int xMax, yMax, zMax;
            int x, y, z;
          
            if(x1 > x2){ 
                xMin = x2;
                xMax = x1;
            }else{
                xMin = x1;
                xMax = x2;
            }
           
            if(y1 > y2){
                yMin = y2;
                yMax = y1;
            }else{
                yMin = y1;
                yMax = y2;
            }
            
            if(z1 > z2){
                zMin = z2;
                zMax = z1;
            }else{
                zMin = z1;
                zMax = z2;
            }
    
            for(x = xMin; x <= xMax; x ++){
                for(y = yMin; y <= yMax; y ++){
                    for(z = zMin; z <= zMax; z ++){
                        Block b = new Location(w, x, y, z).getBlock();
                        blocks.add(b);
                    }
                }
          
            return blocks;
        }
 
Я хотел написать не о одном цикле,а о нескольких вложенных друг вдруга цикла.Пусть внутренний цикл заполняет всё по X до тех пор пока не приблизится к нужной координате,при приближении внешний цикл Z прибавляет значение вообщем вот пример:
Код:
for(y=0;y<20;y++){
for(x=0;x<20;x++){
   for(for(z=0;z<20;z++){
    //здесь устанавливаем блок по полученным координатам
    }
   }
}

только вместо моих x,y,z используй свои относительные игрока.
И перед установкой вставь условие на проверку воздуха
Хм... интересно, спасибо. Чуть позже опробую.
 
Что то типо этого??
 

  1. Код:
    public static List<Block> select(Location loc1, Location loc2, World w){
            
            List<Block> blocks = new ArrayList<Block>();
        
            int x1 = loc1.getBlockX();
            int y1 = loc1.getBlockY();
            int z1 = loc1.getBlockZ();
            int x2 = loc2.getBlockX();
            int y2 = loc2.getBlockY();
            int z2 = loc2.getBlockZ();
         
            int xMin, yMin, zMin;
            int xMax, yMax, zMax;
            int x, y, z;
          
            if(x1 > x2){ 
                xMin = x2;
                xMax = x1;
            }else{
                xMin = x1;
                xMax = x2;
            }
           
            if(y1 > y2){
                yMin = y2;
                yMax = y1;
            }else{
                yMin = y1;
                yMax = y2;
            }
            
            if(z1 > z2){
                zMin = z2;
                zMax = z1;
            }else{
                zMin = z1;
                zMax = z2;
            }
    
            for(x = xMin; x <= xMax; x ++){
                for(y = yMin; y <= yMax; y ++){
                    for(z = zMin; z <= zMax; z ++){
                        Block b = new Location(w, x, y, z).getBlock();
                        blocks.add(b);
                    }
                }
          
            return blocks;
        }
Не то, что мне нужно.
В качестве стартовой точки я имею лишь локацию игрока. Всё. От неё нужно идти в разные стороны, заполняя всё тем блоком, который мне нужен, до тех пор, пока заполняемый блок = воздух.
Я хотел написать не о одном цикле,а о нескольких вложенных друг вдруга цикла.Пусть внутренний цикл заполняет всё по X до тех пор пока не приблизится к нужной координате,при приближении внешний цикл Z прибавляет значение вообщем вот пример:
Код:
for(y=0;y<20;y++){
for(x=0;x<20;x++){
   for(for(z=0;z<20;z++){
    //здесь устанавливаем блок по полученным координатам
    }
   }
}

только вместо моих x,y,z используй свои относительные игрока.
И перед установкой вставь условие на проверку воздуха.
P.S.На оформление не смотреть,писал в окне браузера.
Так не выйдет, если устанавливать блок через player.getWorld().getBlockAt(x, y, z).setType(Material.<MY_VALUE>);
Просто потому, что если представить всё это через координатную плоскость, то я заполню лишь 2 отсек, где x, y, z - положительны.

Тоесть, если построить координатную плоскость с точкой О, где О - игрок, то заполнится лишь 2 отсек / ну или как его там? 1, 3 и 4 останутся нетронутыми что мне не подходит.
 
instanceof?? Не, не слышал...
Player player = Bukkit.getPlayer(s.getName));
Вместо Player player = (Player) sender;
 
Не то, что мне нужно.
В качестве стартовой точки я имею лишь локацию игрока. Всё. От неё нужно идти в разные стороны, заполняя всё тем блоком, которыц мне нужен, до тех пор, пока заполняемый блок = воздух.

Так не выйдет, если устанавливать блок через player.getWorld().getBlockAt(x, y, z).setType(Material.<MY_VALUE>);
Просто потому что если представить всё это через координатную плоскость, то я заполню лишь 2 отсек, где x, y, z - положительны.
Ну а в чём проблема начать заполнять с отрицательных координат?
 
Ну а в чём проблема начать заполнять с отрицательных координат?
Каким образом? Ведь я в начале имею лишь координаты игрока. Может вы хотите просто использовать декремент, вместо инкремента? Тогда поля 1 и 3 останутся не тронутыми.
Или может создавать для каждого поля свой цикл? Тогда на выход получим 4 цикла в каждом из которых ещё по 2. Уверен, есть способы проще.
Я про то что ты кастишь в слепую, ну ок.
В каком смысле "вслепую"?
У меня до этого момента стоит проверка
if (sender instanceof Player)
:)
 
Каким образом? Ведь я в начале имею лишь координаты игрока. Может вы хотите просто использовать декремент, вместо инкремента? Тогда поля 1 и 3 останутся не тронутыми.
Извините,но хочется так и сказать:"Математику знаете?".Есть стандартное действие - вычитание.От x,y,z можно вычесть половину нужных заполняемых блоков.
 
Извините,но хочется так и сказать:"Математику знаете?".Есть стандартное действие - вычитание.От x,y,z можно вычесть половину нужных заполняемых блоков.
Это не поможет в моём случае.
Только если под каждое поле / секцию создавать отдельный цикл. Перечитайте мой пост выше.
 
@CoolBoy
не?
if (sender instanceof ConsoleCommandSender){
return true;
}
if (str.equalsIgnoreCase("cmd")){
Player player = Bukkit.getPlayer(s.getName());
// code
А так консоль ошибкам закидает
Упс, не прочитал, простите :)
 
@CoolBoy
не?
if (sender instanceof ConsoleCommandSender){
return true;
}
if (str.equalsIgnoreCase("cmd")){
Player player = Bukkit.getPlayer(s.getName());
// code
А так консоль ошибкам закидает
У меня там конструкция вида:
Java:
@Override
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args)
{
    if (sender instanceof Player) {
        Player player = (Player) sender;
        //some code
    }

    if (sender instanceof ConsoleCommandSender) {
        //do something from console
    }
}
 
Это не поможет в моём случае.
Только если под каждое поле / секцию создавать отдельный цикл. Перечитайте мой пост выше.
Почему это не поможет?Берёте Location игрока,берёте из него x,y,z; отнимаете у них половину нужной заполняемой территории и запускаете цикл до относительно нужного вам числа,скажите пример сколько блоков от игрока надо заполнить.
 
У меня там конструкция вида:
Java:
@Override
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args)
{
    if (sender instanceof Player) {
        Player player = (Player) sender;
        //some code
    }

    if (sender instanceof ConsoleCommandSender) {
        //do something from console
    }
}
Все, вижу :)
 
Почему это не поможет?Берёте Location игрока,берёте из него x,y,z; отнимаете у них половину нужной заполняемой территории и запускаете цикл до относительно нужного вам числа,скажите пример сколько блоков от игрока надо заполнить.
Попробуйте заполнить 5 блоков вокруг игрока. В вашем случае, вы заполните лишь секцию 2 и 3, потому что во 2 - x и z положительные, а в 3 - x и z отрицательные.

С "y" пока не работайте - он не нужен.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх