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

Помогите Выделение с WorldEdit API

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

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

    Deawilld Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    Deawilld
    Привет, кодеры, кто дружит с WorldEdit'ом. Официальной документации по нему, насколько понимаю, пока нет.
    И так, мне нужно, чтобы мой плагин использовал выделение, сделанное игроком с помощью Ворледит.
    Из него нужно получить крайние точки (минимальную и максимальную), предварительно проверив, является ли регион кубоидом. И кстати, может кто знает, как сохранить выделенный регион любой формы и потом его использовать для итерации блоков внутри него? Чтобы не использовать крайние локации и работать с регионами не только кубической формы.
    Кому не трудно, пожалуйста пример кода и как с ним работать, заранее спасибо!
     
  2. MurlikMurlik

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

    Баллы:
    96
    WorldEditPlugin#getSelection(player);
    Возвращает объект Selection. Может вернуть null если нет выделения. В том объекте есть все что нужно.
     
  3. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Кинет IncompleteRegionException, а не null вернёт.

    Шутишь что ли? Плагину куча лет...
    http://wiki.sk89q.com/wiki/WorldEdit
    PHP:
    LocalSession session worldEditApi.getSession(player);
    Region selection;
    try {
        
    selection session.getSelection(session.getSelectionWorld());
    } catch (
    IncompleteRegionException e) {
        
    player.sendMessage(ChatColor.RED "Регион не выделен");
        return;
    }
    PHP:
    if (!(selection instanceof CuboidRegion)) {
        
    player.sendMessage(ChatColor.RED "Выделение типа " selection.getClass().getSimpleName() + " не поддерживается");
        return;
    }
    CuboidRegion cuboid = (CuboidRegionselection;
    BlockVector3 min cuboid.getMinimumPoint();
    BlockVector3 max cuboid.getMaximumPoint();
    Зачем, если за тебя это делает сам WorldEdit? Ну, если прям приспичило - можешь посмотреть сериализацию в самих исходниках WE (в конфиг, бд или что тебе нужно).
    PHP:
    selection.iterator()
     
  4. Автор темы
    Deawilld

    Deawilld Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    Deawilld
    Потому что мне нужно его использовать потом, чтобы в этом регионе обрабатывать блоки, но я хз, как его сохранить, а с сериализацией пока не знаком. А сам писать эти все регионы типа 2d полигонов и прочих, когда есть готовые я не хочу
     
  5. Автор темы
    Deawilld

    Deawilld Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    Deawilld
  6. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Тебе не нужно самостоятельно сохранять регионы, чтобы их интерировать.
    WE сохраняет регион, ты получаешь из WE этот регион и вызываешь метод iterator().
    Если я неправильно понял твою задачу - или алгоритм сохранения и загрузки тут: https://github.com/EngineHub/WorldEdit
     
  7. Автор темы
    Deawilld

    Deawilld Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    Deawilld
    Я тупой немного, объясни пожалуйста, как это сделать. Не знаю, правильно ли ты понял, но мне нужно сохранить область, которую игрок выделил (а НЕ её содержимое). Потом уже обрабатывать изменения в ней, менять блоки, ..., но чтобы можно было сохранить и загрузить её.
     
  8. alexandrage

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

    Баллы:
    173
    Код:
    public class Cuboid {
        private long xMin;
        private long xMax;
        private long yMin;
        private long yMax;
        private long zMin;
        private long zMax;
    
        public Cuboid(Location loc1, Location loc2) {
            normalize(loc1.getBlockX(), loc1.getBlockY(), loc1.getBlockZ(), loc2.getBlockX(), loc2.getBlockY(),
                    loc2.getBlockZ());
        }
    
        public Cuboid(long x1, long y1, long z1, long x2, long y2, long z2) {
            normalize(x1, y1, z1, x2, y2, z2);
        }
    
        private void normalize(long x1, long y1, long z1, long x2, long y2, long z2) {
            this.xMin = Math.min(x1, x2);
            this.xMax = Math.max(x1, x2);
            this.yMin = Math.min(y1, y2);
            this.yMax = Math.max(y1, y2);
            this.zMin = Math.min(z1, z2);
            this.zMax = Math.max(z1, z2);
        }
    
        public boolean intersects(Cuboid cuboid) {
            return cuboid.xMin <= this.xMax && cuboid.xMax >= this.xMin && cuboid.yMin <= this.yMax
                    && cuboid.yMax >= this.yMin && cuboid.zMin <= this.zMax && cuboid.zMax >= this.zMin;
        }
    
        public boolean contains(Location loc) {
            return contains(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ());
        }
    
        public boolean contains(long x, long y, long z) {
            return x >= this.xMin && x <= this.xMax && y >= this.yMin && y <= this.yMax && z >= this.zMin && z <= this.zMax;
        }
    
        public long getVolume() {
            return getWidth() * getHeight() * getDepth();
        }
    
        public long getWidth() {
            return this.xMax - this.xMin + 1;
        }
    
        public long getHeight() {
            return this.yMax - this.yMin + 1;
        }
    
        public long getDepth() {
            return this.zMax - this.zMin + 1;
        }
    
        public Cuboid expand(CuboidDirection dir, int amount) {
            switch (dir) {
            case North:
                this.xMin = this.xMin - amount;
                return this;
            case South:
                this.xMax = this.xMax + amount;
                return this;
            case East:
                this.zMin = this.zMin - amount;
                return this;
            case West:
                this.zMax = this.zMax + amount;
                return this;
            case Down:
                this.yMin = this.yMin - amount;
                return this;
            case Up:
                this.yMax = this.yMax + amount;
                return this;
            default:
                throw new IllegalArgumentException("invalid direction " + dir);
            }
        }
    
        public Cuboid shift(CuboidDirection dir, int amount) {
            return expand(dir, amount).expand(dir.opposite(), -amount);
        }
    
        public Cuboid outset(int amount) {
            Cuboid c = expand(CuboidDirection.North, amount).expand(CuboidDirection.South, amount)
                    .expand(CuboidDirection.East, amount).expand(CuboidDirection.West, amount)
                    .expand(CuboidDirection.Down, amount).expand(CuboidDirection.Up, amount);
            return c;
        }
    
        public Cuboid inset(int amount) {
            return outset(-amount);
        }
    
        @Override
        public String toString() {
            return "Cuboid: " + this.xMin + "," + this.yMin + "," + this.zMin + "=>" + this.xMax + "," + this.yMax + ","
                    + this.zMax;
        }
    }
    Код:
    public enum CuboidDirection {
        North,South,East,West,Down,Up,Unknown;
        public CuboidDirection opposite() {
            switch(this) {
            case North:
                return South;
            case East:
                return West;
            case South:
                return North;
            case West:
                return East;
            case Up:
                return Down;
            case Down:
                return Up;
            default:
                return Unknown;
            }
        }
    }
     
  9. MurlikMurlik

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

    Баллы:
    96
    В какой версии это добавили? У меня на 6.2.2 возвращает нулл если нет выделения, даже в методе не предлагает явно обработать исключение.
     
  10. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Через WE API можно создавать и удалять регионы любого вида - кубоиды, полигоны, сферы и прочее. Он и будет хранить регионы на диске. Тебе будет достатоно хранить лишь названия регионов
     
  11. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Видимо WE 7+
     
  12. Автор темы
    Deawilld

    Deawilld Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    Deawilld
    А можно пример кода плиз? Надеюсь для этого необязательно нужен WG?
     
  13. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth

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