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

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем MinecrafterCrafting, 15 фев 2014.

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

    MinecrafterCrafting Новичок

    Баллы:
    18
    Допустим у меня есть две точки. Как сделать регенерацию этого региона средствами WorldEdit API?
     
  2. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    MinecrafterCrafting, ну поглядите в исходниках. Я в свое время находил и результата было достаточно, чтобы понять, что "лучше так не делать".

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

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

    MinecrafterCrafting Новичок

    Баллы:
    18
    Вот код:

    Код:
    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, у меня мощный сервер. помогите плиз
     
  4. Bars

    Bars Старожил Девелопер Пользователь

    Баллы:
    173
    Чтобы уже не создавать тему: как сделать //set id в определенном параллелепипеде без выделения его игроком? На кого повесить сессию? Можно ли на Bukkit.getOfflinePlayer("FakePlayer")?
     
  5. fromgate

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

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

    Когда мне, потребовалось использовать WE для ScLoad, то я просто что-то переписал в привязке к координатам, что-то заново написал.
    Так что смотрите, где используются регионы, смотрите как работают методы и просто переписывайте их так как нужно именно Вам.
    Не знаю можно ли на кого-то повесить. В принципе, можно попробовать сделать виртуального игрока, но...
     
  6. Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    EditSession не привязана к игроку, не надо тут.
     
    ПриветОтЛайки и Bars нравится это.
  7. Bars

    Bars Старожил Девелопер Пользователь

    Баллы:
    173
    Где её получить? Мне нужно, чтобы игрок не мог ничего выделять и заменять, но когда он что-то делает (например, нажимает кнопку), блоки на определённых координатах заменяются на другие (а именно на воздух, а потом обратно).
     
  8. Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    EditSession es = new EditSession(new BukkitWorld(world), Integer.Max_VALUE)
     
    fromgate и Bars нравится это.
  9. Bars

    Bars Старожил Девелопер Пользователь

    Баллы:
    173
    Извиняюсь за тупой вопрос, но что передавать вторым аргументом?
     
  10. Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
  11. Bars

    Bars Старожил Девелопер Пользователь

    Баллы:
    173
    Амплитуду чего? Тип я знаю.
     
  12. ptnk

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

    Баллы:
    173
    Открой исходники и погляди, как это используется в его плагине?
    Неужели это так сложно?
     
  13. Bars

    Bars Старожил Девелопер Пользователь

    Баллы:
    173
    О каком плагине идёт речь? Если б я знал, то давно бы уже посмотрел.
     
  14. ptnk

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

    Баллы:
    173
    В мире не существует ни одного плагина для регенерации территории с помощью WG\WE? К примеру плагины от Свевчика, у него есть плагин, который делает данную функцию.
     
  15. Bars

    Bars Старожил Девелопер Пользователь

    Баллы:
    173
    О Боже, какая регенерация?
    Она нужна автору темы, а я задал свой ничтожно малый вопрос здесь, дабы не создавать новую тему.
     
  16. Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    /**
    * 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 нравится это.
  17. ptnk

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

    Баллы:
    173
    Я тебе привёл пример, где это можно поглядеть.
     

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