Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

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

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

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

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Доброго времени суток, читатели данной темы.

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

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

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

    Что имею:
    Код:
    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>);
    }
    
    Примечательно то, что мой метод - работает только в одну сторону. В итоге - получается полоска из тех блоков, что мне нужно.
    Однако мне нужно, чтобы заполнялось всё пустое пространство, вплоть до барьера в виде любого блока, отличного от воздуха.
     
    Последнее редактирование: 28 июл 2016
  2. Хостинг MineCraft
    <
  3. Novichock

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

    Баллы:
    76
    Skype:
    pavel.batalov1
    Могу подсказать способ ,не используя BlockIterator.Кажись это будет говнокодом,но почему бы не заполнять всё это дело с помощью циклов?
     
  4. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Я рад любым предложениям. Но каким образом с помощью цикла можно выполнить мою задачу? Хотя... мне кажется, одним циклом тут не обойдётся явно.

    Подсказывайте способ :)
     
  5. Novichock

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

    Баллы:
    76
    Skype:
    pavel.batalov1
    Я хотел написать не о одном цикле,а о нескольких вложенных друг вдруга цикла.Пусть внутренний цикл заполняет всё по X до тех пор пока не приблизится к нужной координате,при приближении внешний цикл Z прибавляет значение вообщем вот пример:
    Код:
    for(y=0;y<20;y++){
    for(x=0;x<20;x++){
       for(for(z=0;z<20;z++){
        //здесь устанавливаем блок по полученным координатам
        }
       }
    }
    [DOUBLEPOST=1469737319,1469737277][/DOUBLEPOST]только вместо моих x,y,z используй свои относительные игрока.
    И перед установкой вставь условие на проверку воздуха.
    P.S.На оформление не смотреть,писал в окне браузера.
     
  6. xDark

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

    Баллы:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark

    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;
          }
      
     
  7. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Хм... интересно, спасибо. Чуть позже опробую.
     
  8. xDark

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

    Баллы:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark
    Что то типо этого??
     
  9. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Не то, что мне нужно.[DOUBLEPOST=1469737754,1469737664][/DOUBLEPOST]В качестве стартовой точки я имею лишь локацию игрока. Всё. От неё нужно идти в разные стороны, заполняя всё тем блоком, который мне нужен, до тех пор, пока заполняемый блок = воздух.[DOUBLEPOST=1469737926][/DOUBLEPOST]
    Так не выйдет, если устанавливать блок через player.getWorld().getBlockAt(x, y, z).setType(Material.<MY_VALUE>);
    Просто потому, что если представить всё это через координатную плоскость, то я заполню лишь 2 отсек, где x, y, z - положительны.

    Тоесть, если построить координатную плоскость с точкой О, где О - игрок, то заполнится лишь 2 отсек / ну или как его там? 1, 3 и 4 останутся нетронутыми что мне не подходит.
     
  10. xDark

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

    Баллы:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark
    instanceof?? Не, не слышал...
    Player player = Bukkit.getPlayer(s.getName));
    Вместо Player player = (Player) sender;
     
  11. Novichock

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

    Баллы:
    76
    Skype:
    pavel.batalov1
    Ну а в чём проблема начать заполнять с отрицательных координат?
     
  12. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Не стоит меня учить, ладно? Сендер может быть консолью. Тогда ваш метод, грубо говоря, наложит.
     
  13. xDark

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

    Баллы:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark
    Я про то что ты кастишь в слепую, ну ок.
     
  14. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Каким образом? Ведь я в начале имею лишь координаты игрока. Может вы хотите просто использовать декремент, вместо инкремента? Тогда поля 1 и 3 останутся не тронутыми.
    Или может создавать для каждого поля свой цикл? Тогда на выход получим 4 цикла в каждом из которых ещё по 2. Уверен, есть способы проще.[DOUBLEPOST=1469738281,1469738182][/DOUBLEPOST]
    В каком смысле "вслепую"?
    У меня до этого момента стоит проверка
    if (sender instanceof Player)
    :)
     
  15. Novichock

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

    Баллы:
    76
    Skype:
    pavel.batalov1
    Извините,но хочется так и сказать:"Математику знаете?".Есть стандартное действие - вычитание.От x,y,z можно вычесть половину нужных заполняемых блоков.
     
  16. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Это не поможет в моём случае.
    Только если под каждое поле / секцию создавать отдельный цикл. Перечитайте мой пост выше.
     
  17. xDark

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

    Баллы:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark
    @CoolBoy
    не?
    if (sender instanceof ConsoleCommandSender){
    return true;
    }
    if (str.equalsIgnoreCase("cmd")){
    Player player = Bukkit.getPlayer(s.getName());
    // code
    А так консоль ошибкам закидает
    Упс, не прочитал, простите :)
     
  18. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    У меня там конструкция вида:
    Код:
    @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
        }
    }
    
     
  19. Novichock

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

    Баллы:
    76
    Skype:
    pavel.batalov1
    Почему это не поможет?Берёте Location игрока,берёте из него x,y,z; отнимаете у них половину нужной заполняемой территории и запускаете цикл до относительно нужного вам числа,скажите пример сколько блоков от игрока надо заполнить.
     
  20. xDark

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

    Баллы:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark
    Все, вижу :)
     
  21. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Попробуйте заполнить 5 блоков вокруг игрока. В вашем случае, вы заполните лишь секцию 2 и 3, потому что во 2 - x и z положительные, а в 3 - x и z отрицательные.

    С "y" пока не работайте - он не нужен.
     
Статус темы:
Закрыта.

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