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

  • Автор темы Автор темы Deawilld
  • Дата начала Дата начала

Deawilld

Участник
Пользователь
Баллы
36
Имя в Minecraft
Deawilld
Привет, кодеры, кто дружит с WorldEdit'ом. Официальной документации по нему, насколько понимаю, пока нет.
И так, мне нужно, чтобы мой плагин использовал выделение, сделанное игроком с помощью Ворледит.
Из него нужно получить крайние точки (минимальную и максимальную), предварительно проверив, является ли регион кубоидом. И кстати, может кто знает, как сохранить выделенный регион любой формы и потом его использовать для итерации блоков внутри него? Чтобы не использовать крайние локации и работать с регионами не только кубической формы.
Кому не трудно, пожалуйста пример кода и как с ним работать, заранее спасибо!
 
Привет, кодеры, кто дружит с WorldEdit'ом. Официальной документации по нему, насколько понимаю, пока нет.
И так, мне нужно, чтобы мой плагин использовал выделение, сделанное игроком с помощью Ворледит.
Из него нужно получить крайние точки (минимальную и максимальную), предварительно проверив, является ли регион кубоидом. И кстати, может кто знает, как сохранить выделенный регион любой формы и потом его использовать для итерации блоков внутри него? Чтобы не использовать крайние локации и работать с регионами не только кубической формы.
Кому не трудно, пожалуйста пример кода и как с ним работать, заранее спасибо!
WorldEditPlugin#getSelection(player);
Возвращает объект Selection. Может вернуть null если нет выделения. В том объекте есть все что нужно.
 
Может вернуть null если нет выделения. В том объекте есть все что нужно.
Кинет 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 = (CuboidRegion) selection;
BlockVector3 min = cuboid.getMinimumPoint();
BlockVector3 max = cuboid.getMaximumPoint();
как сохранить выделенный регион любой формы
Зачем, если за тебя это делает сам WorldEdit? Ну, если прям приспичило - можешь посмотреть сериализацию в самих исходниках WE (в конфиг, бд или что тебе нужно).
потом его использовать для итерации блоков внутри него? Чтобы не использовать крайние локации и работать с регионами не только кубической формы.
PHP:
selection.iterator()
 
Зачем, если за тебя это делает сам WorldEdit? Ну, если прям приспичило - можешь посмотреть сериализацию в самих исходниках WE (в конфиг, бд или что тебе нужно).
Потому что мне нужно его использовать потом, чтобы в этом регионе обрабатывать блоки, но я хз, как его сохранить, а с сериализацией пока не знаком. А сам писать эти все регионы типа 2d полигонов и прочих, когда есть готовые я не хочу
 
Потому что мне нужно его использовать потом, чтобы в этом регионе обрабатывать блоки, но я хз, как его сохранить, а с сериализацией пока не знаком. А сам писать эти все регионы типа 2d полигонов и прочих, когда есть готовые я не хочу
Тебе не нужно самостоятельно сохранять регионы, чтобы их интерировать.
WE сохраняет регион, ты получаешь из WE этот регион и вызываешь метод iterator().
Если я неправильно понял твою задачу - или алгоритм сохранения и загрузки тут: https://github.com/EngineHub/WorldEdit
 
Тебе не нужно самостоятельно сохранять регионы, чтобы их интерировать.
WE сохраняет регион, ты получаешь из WE этот регион и вызываешь метод iterator().
Если я неправильно понял твою задачу - или алгоритм сохранения и загрузки тут: https://github.com/EngineHub/WorldEdit
Я тупой немного, объясни пожалуйста, как это сделать. Не знаю, правильно ли ты понял, но мне нужно сохранить область, которую игрок выделил (а НЕ её содержимое). Потом уже обрабатывать изменения в ней, менять блоки, ..., но чтобы можно было сохранить и загрузить её.
 
Код:
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;
        }
    }
}
 
Кинет IncompleteRegionException, а не null вернёт.
В какой версии это добавили? У меня на 6.2.2 возвращает нулл если нет выделения, даже в методе не предлагает явно обработать исключение.
 
Я тупой немного, объясни пожалуйста, как это сделать. Не знаю, правильно ли ты понял, но мне нужно сохранить область, которую игрок выделил (а НЕ её содержимое). Потом уже обрабатывать изменения в ней, менять блоки, ..., но чтобы можно было сохранить и загрузить её.
Через WE API можно создавать и удалять регионы любого вида - кубоиды, полигоны, сферы и прочее. Он и будет хранить регионы на диске. Тебе будет достатоно хранить лишь названия регионов
 
Через WE API можно создавать и удалять регионы любого вида - кубоиды, полигоны, сферы и прочее. Он и будет хранить регионы на диске. Тебе будет достатоно хранить лишь названия регионов
А можно пример кода плиз? Надеюсь для этого необязательно нужен WG?
 
Назад
Верх