Войти или зарегистрироваться

Помогите Как сделать регенерацию региона средствами WorldEdit API?

MinecrafterCrafting

Новичок
Баллы
18
Допустим у меня есть две точки. Как сделать регенерацию этого региона средствами WorldEdit API?
 
MinecrafterCrafting, ну поглядите в исходниках. Я в свое время находил и результата было достаточно, чтобы понять, что "лучше так не делать".

Регенерация области в WE выглядит так: область сохраняется, регенерируются все затронутые чанки, затем на место возвращается то, что не входит в область.
Т.е. если вы регенерируете 1 блок, то всё равно будет регенерироваться весь чанк.

Соответственно, жди проблем: с производительностью и глюками появляющихся в результате копирования туда и обратно.
 
Вот код:

Код:
public boolean regenerate(Region region, EditSession editSession)
  {
    BaseBlock[] history = new BaseBlock[256 * (getMaxY() + 1)];
    for (Vector2D chunk : region.getChunks())
    {
      Vector min = new Vector(chunk.getBlockX() * 16, 0, chunk.getBlockZ() * 16);
      for (int x = 0; x < 16; x++) {
        for (int y = 0; y < getMaxY() + 1; y++) {
          for (int z = 0; z < 16; z++)
          {
            Vector pt = min.add(x, y, z);
            int index = y * 16 * 16 + z * 16 + x;
            history[index] = editSession.getBlock(pt);
          }
        }
      }
      try
      {
        this.world.regenerateChunk(chunk.getBlockX(), chunk.getBlockZ());
      }
      catch (Throwable t)
      {
        t.printStackTrace();
      }
      for (int x = 0; x < 16; x++) {
        for (int y = 0; y < getMaxY() + 1; y++) {
          for (int z = 0; z < 16; z++)
          {
            Vector pt = min.add(x, y, z);
            int index = y * 16 * 16 + z * 16 + x;
            if (!region.contains(pt)) {
              editSession.smartSetBlock(pt, history[index]);
            } else {
              editSession.rememberChange(pt, history[index], editSession.rawGetBlock(pt));
            }
          }
        }
      }
    }
    return true;
  }

Помогите переделать этот метод так, чтобы было не public boolean regenerate(Region region, EditSession editSession), а public boolean regenerate(минимальная точка, максимальная точка)
fromgate, у меня мощный сервер. помогите плиз
 
Чтобы уже не создавать тему: как сделать //set id в определенном параллелепипеде без выделения его игроком? На кого повесить сессию? Можно ли на Bukkit.getOfflinePlayer("FakePlayer")?
 
fromgate, у меня мощный сервер. помогите плиз

В лоб там не получится. API WE оставляет, на мой взгляд, желать лучшего. Многие методы привязаны к выделению, которое в свою очередь привязано к игроку. Отсюда вопрос, который задает @Bars.

Когда мне, потребовалось использовать WE для ScLoad, то я просто что-то переписал в привязке к координатам, что-то заново написал.
Так что смотрите, где используются регионы, смотрите как работают методы и просто переписывайте их так как нужно именно Вам.
Чтобы уже не создавать тему: как сделать //set id в определенном параллелепипеде без выделения его игроком? На кого повесить сессию? Можно ли на Bukkit.getOfflinePlayer("FakePlayer")?

Не знаю можно ли на кого-то повесить. В принципе, можно попробовать сделать виртуального игрока, но...
 
EditSession не привязана к игроку, не надо тут.
Где её получить? Мне нужно, чтобы игрок не мог ничего выделять и заменять, но когда он что-то делает (например, нажимает кнопку), блоки на определённых координатах заменяются на другие (а именно на воздух, а потом обратно).
 
Извиняюсь за тупой вопрос, но что передавать вторым аргументом?
 
О каком плагине идёт речь? Если б я знал, то давно бы уже посмотрел.
В мире не существует ни одного плагина для регенерации территории с помощью WG\WE? К примеру плагины от Свевчика, у него есть плагин, который делает данную функцию.
 
В мире не существует ни одного плагина для регенерации территории с помощью WG\WE? К примеру плагины от Свевчика, у него есть плагин, который делает данную функцию.
О Боже, какая регенерация?
Она нужна автору темы, а я задал свой ничтожно малый вопрос здесь, дабы не создавать новую тему.
Чтобы уже не создавать тему: как сделать //set id в определенном параллелепипеде без выделения его игроком? На кого повесить сессию? Можно ли на Bukkit.getOfflinePlayer("FakePlayer")?
EditSession не привязана к игроку, не надо тут.
Где её получить? Мне нужно, чтобы игрок не мог ничего выделять и заменять, но когда он что-то делает (например, нажимает кнопку), блоки на определённых координатах заменяются на другие (а именно на воздух, а потом обратно).
EditSession es = new EditSession(new BukkitWorld(world), Integer.Max_VALUE)
Извиняюсь за тупой вопрос, но что передавать вторым аргументом?
 
/**
* Construct the object with a maximum number of blocks.
*
* @param world
* @param maxBlocks
*/
public EditSession(LocalWorld world, int maxBlocks) {
if (maxBlocks < -1) {
throw new IllegalArgumentException("Max blocks must be >= -1");
}

this.maxBlocks = maxBlocks;
this.world = world;
}

сырцы говорят сами за себя.
 
  • Нравится
Реакции: Bars
Назад
Верх