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

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

chief

Активный участник
Пользователь
Баллы
76
Пытался сделать сам но у меня одни ошибки в консоли всплывают.
Я пытаюсь сделать барьер вокруг острова, но у меня почти ничего не получается. Надо генерировать стены от 0 и до 255 между всеми точками
Java:
   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);

      }
   }
 
Нужно сделать 4 цикла (вдоль каждой из 4 стен). В каждом по циклу y = 0 to 255.
 
Ошибки в консоли нужно учиться понимать.
А если по теме, то в код я не вчитывался, но выглядит он странно. Ощущение, будто ты выставляешь столбы из барьера только по углам.
Лично я бы сделал, как предложил человек выше, - четыре последовательных цикла, в каждом постройка одной стены. Возможно даже стоит создать отдельный метод, принимающий x1, z1, x2 и z2, который будет устанавливать столбы внутри указанной области.
 
Нужно сделать 4 цикла (вдоль каждой из 4 стен). В каждом по циклу y = 0 to 255.
Ошибки в консоли нужно учиться понимать.
А если по теме, то в код я не вчитывался, но выглядит он странно. Ощущение, будто ты выставляешь столбы из барьера только по углам.
Лично я бы сделал, как предложил человек выше, - четыре последовательных цикла, в каждом постройка одной стены. Возможно даже стоит создать отдельный метод, принимающий x1, z1, x2 и z2, который будет устанавливать столбы внутри указанной области.

Основной целью есть заставить плагин работать. Написание кода по правилам придется отложить на второй план.
Я не совсем понимаю, что вы говорите но получилось что-то такое.
Java:
            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);
                }
             }

Ощущение, будто ты выставляешь столбы из барьера только по углам.
Это только четыре точки по углам
 
По моему, тут всё ясно и без комментариев.
UPD: Добавлен else, ибо лишние блоки.
Java:
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);
            }
        }
    }
}
 
Последнее редактирование:
Основной целью есть заставить плагин работать. Написание кода по правилам придется отложить на второй план.
Я не совсем понимаю, что вы говорите но получилось что-то такое.
Java:
            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);
                }
             }


Это только четыре точки по углам
Что значит "написание кода по правилам"? Ошибка - в первую очередь информация, которая поможет разобраться в причине произошедшего (найти ошибку в логике, баг или недоработку), и, соответственно, решить проблему.
А что по поводу стен, то я так и не понял: нужны столбы по углам или полноценное окружение всего острова?
 
Последнее редактирование:
По моему, тут всё ясно и без комментариев.
Мне кажется, с учётом возможности сервера держать ограниченное число чанков в памяти, а также желательным порядком их загрузки, менее красивое и элегантное решение будет на проценты быстрее твоего :)
Java:
        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);
 
будет на проценты быстрее твоего
Мне кажется, с учётом возможности сервера держать ограниченное число чанков в памяти, а также желательным порядком их загрузки, менее красивое и элегантное решение будет на проценты быстрее твоего :)
Java:
        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);
Твой вариант чаще работает быстрее моего варианта до 16ms. Но иногда мой вариант работает быстрее твоего до 16ms.

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

2016_03_23-1458710343.png
 
Надо же, теперь еще и соревнования устраивают здесь ;D
 
Даже не знаю, как сформулировать вопрос.
Надо создать остров с .schematic но я не знаю, как это сделать (искал но ничего толкового не нашел. Не знаю, как правильно искать).
Может кто-то даст код для вставки .schematic, или ссылки на литературу, где есть объяснение и разъяснение
 
Даже не знаю, как сформулировать вопрос.
Надо создать остров с .schematic но я не знаю, как это сделать (искал но ничего толкового не нашел. Не знаю, как правильно искать).
Может кто-то даст код для вставки .schematic, или ссылки на литературу, где есть объяснение и разъяснение
+ Тоже надо
 

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

Назад
Верх