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

В разработке Стены вокруг острова

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

  1. Автор темы
    chief

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

    Баллы:
    76
    Пытался сделать сам но у меня одни ошибки в консоли всплывают.
    Я пытаюсь сделать барьер вокруг острова, но у меня почти ничего не получается. Надо генерировать стены от 0 и до 255 между всеми точками
    Код:
       public static void HighlightIslandBorders(Location loc, Material edgeMat) {
          if(IsInIslandWorld(loc)) {
             World world = loc.getWorld();
             int sx = loc.getBlockX();
             sx -= sx % islandSize;
             int sz = loc.getBlockZ();
             sz -= sz % islandSize;
             if(sx >= 0 && sz >= 0) {
                int ex = sx + islandSize - 1;
                int ez = sz + islandSize - 1;
                int y = loc.getBlockY() - 1;
                if(edgeMat != null) {
                   MakeRectangle(world, y, sx, sz, ex, ez, edgeMat);
                }
    
                Material cornerMat = Material.BARRIER;
                world.getBlockAt(sx, y, sz).setType(cornerMat);
                world.getBlockAt(ex, y, sz).setType(cornerMat);
                world.getBlockAt(sx, y, ez).setType(cornerMat);
                world.getBlockAt(ex, y, ez).setType(cornerMat);
    
          }
       }
     
  2. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Нужно сделать 4 цикла (вдоль каждой из 4 стен). В каждом по циклу y = 0 to 255.
     
  3. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Ошибки в консоли нужно учиться понимать.
    А если по теме, то в код я не вчитывался, но выглядит он странно. Ощущение, будто ты выставляешь столбы из барьера только по углам.
    Лично я бы сделал, как предложил человек выше, - четыре последовательных цикла, в каждом постройка одной стены. Возможно даже стоит создать отдельный метод, принимающий x1, z1, x2 и z2, который будет устанавливать столбы внутри указанной области.
     
  4. Автор темы
    chief

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

    Баллы:
    76
    Основной целью есть заставить плагин работать. Написание кода по правилам придется отложить на второй план.
    Я не совсем понимаю, что вы говорите но получилось что-то такое.
    Код:
                Material barrierMat = Material.BARRIER /*BARRIER*/;
               
                for(int fy = 0; fy < 255; ++fy) {
                    for(int fw = 0; fw <= iss; ++fw) {
                       Block blk1 = world.getBlockAt(ex, y1 + fy, ez - fw);
                       blk1.setType(barrierMat);
                       Block blk2 = world.getBlockAt(ex - fw, y1 + fy, sz);
                       blk2.setType(barrierMat);
                       Block blk3 = world.getBlockAt(sx, y1 + fy, sz + fw);
                       blk3.setType(barrierMat);
                       Block blk4 = world.getBlockAt(sx + fw, y1 + fy, ez);
                       blk4.setType(barrierMat);
                    }
                 }
                for(int fy = 0; fy < iss; ++fy) {
                    for(int fw = 0; fw <= iss; ++fw) {
                       Block blk = world.getBlockAt(ex - fy, y2, ez - fw);
                       blk.setType(barrierMat);
                    }
                 }
    

    Это только четыре точки по углам
     
  5. Dereku

    Dereku Старожил Пользователь

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    По моему, тут всё ясно и без комментариев.
    UPD: Добавлен else, ибо лишние блоки.
    Код:
    public void buildWalls(Location pointA, Location pointB, Material material) {
        int xMin = Math.min(pointA.getBlockX(), pointB.getBlockX());
        int yMin = Math.min(pointA.getBlockY(), pointB.getBlockY());
        int zMin = Math.min(pointA.getBlockZ(), pointB.getBlockZ());
    
        int xMax = Math.max(pointA.getBlockX(), pointB.getBlockX());
        int yMax = Math.max(pointA.getBlockY(), pointB.getBlockY());
        int zMax = Math.max(pointA.getBlockZ(), pointB.getBlockZ());
    
        for (int zt = zMin; zt <= zMax; zt++) {
            for (int yt = yMin; yt <= yMax; yt++) {
                if (zt == zMin || zt == zMax) {
                    for (int xt = xMin; xt <= xMax; xt++) {
                        pointA.getWorld().getBlockAt(xt, yt, zt).setType(material);
                    }
                } else {
                    pointA.getWorld().getBlockAt(xMin, yt, zt).setType(material);
                    pointA.getWorld().getBlockAt(xMax, yt, zt).setType(material);
                }
            }
        }
    }
     
    Последнее редактирование: 23 мар 2016
  6. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Что значит "написание кода по правилам"? Ошибка - в первую очередь информация, которая поможет разобраться в причине произошедшего (найти ошибку в логике, баг или недоработку), и, соответственно, решить проблему.
    А что по поводу стен, то я так и не понял: нужны столбы по углам или полноценное окружение всего острова?
     
    Последнее редактирование: 22 мар 2016
  7. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Мне кажется, с учётом возможности сервера держать ограниченное число чанков в памяти, а также желательным порядком их загрузки, менее красивое и элегантное решение будет на проценты быстрее твоего :)
    Код:
            for(int zt = zMin; zt <= zMax; zt++)
                for(int yt = yMin; yt <= yMax; yt++)
                    pointA.getWorld().getBlockAt(xMin, yt, zt).setType(material);
            for(int zt = zMin; zt <= zMax; zt++)
                for(int yt = yMin; yt <= yMax; yt++)
                    pointA.getWorld().getBlockAt(xMax, yt, zt).setType(material);
            for(int xt = xMin + 1; xt <= xMax - 1; xt++)
                for(int yt = yMin; yt <= yMax; yt++)
                    pointA.getWorld().getBlockAt(xt, yt, zMin).setType(material);
            for(int xt = xMin + 1; xt <= xMax - 1; xt++)
                for(int yt = yMin; yt <= yMax; yt++)
                    pointA.getWorld().getBlockAt(xt, yt, zMax).setType(material);
     
  8. Dereku

    Dereku Старожил Пользователь

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Твой вариант чаще работает быстрее моего варианта до 16ms. Но иногда мой вариант работает быстрее твоего до 16ms.

    Предлагаю ничью :D

    2016_03_23-1458710343.png
     
  9. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Более чем устраивает :)
     
  10. Jampire

    Jampire Старожил Пользователь

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    Надо же, теперь еще и соревнования устраивают здесь ;D
     
  11. Автор темы
    chief

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

    Баллы:
    76
    Даже не знаю, как сформулировать вопрос.
    Надо создать остров с .schematic но я не знаю, как это сделать (искал но ничего толкового не нашел. Не знаю, как правильно искать).
    Может кто-то даст код для вставки .schematic, или ссылки на литературу, где есть объяснение и разъяснение
     
  12. MasterCapeXD

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

    Баллы:
    66
    Имя в Minecraft:
    MasterCapeXD
    + Тоже надо
     
  13. iD3LSY

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

    Баллы:
    76
    Если нужно, то ищи в интернете или создавай отдельную тему, с просьбой о помощи. Выполнил я за тебя работу, но ладно. Тык
     
  14. MasterCapeXD

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

    Баллы:
    66
    Имя в Minecraft:
    MasterCapeXD
    Спасибо, поищу нужную мне инфу там
     

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