worldEdit command paste

Статус
Закрыто для дальнейших ответов.

Forest_SD

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
Forest_SD
Привет всем, делаю дополнение к плагину worldEdit, суть состоит в том чтобы для команды //cut и //paste были параметры запрещенных блоков, то есть когда выполняется команда //cut те блоки которые указанны в конфиге не вырезались, точно так же и с paste те которые указаны в конфиге не ставились, проблем состоит сейчас в команде paste потому как для cut уже сделал, буду благодарен любой помощи
 
Буду описывать что уже сделал, может кто-то из опытных подсобит.. Нашел функционал команды //paste (https://github.com/sk89q/WorldEdit/...k89q/worldedit/command/ClipboardCommands.java) Там уже немного сделал
Код:
this.getCommand("pasteUP").setExecutor((sender, command, s, args) -> {
            Player player = (Player) sender;
            LocalSession session = we.getSession(player);
            com.sk89q.worldedit.world.World world = session.getSelectionWorld();
            List<Integer> idsPaste = config.getStringList("disallowed-blocks-id-PASTE").stream().map(Integer::parseInt).collect(Collectors.toList());
            try {
                Region clipboard = session.getClipboard().getClipboard().getRegion();
               
            } catch (EmptyClipboardException e) {
                e.printStackTrace();
            }
            return true;
        });
Вот..как-то так, но что дальше делать это пока что загадка, так как мне нужно достать id блока в буфере(клипборд) сравнить его если он есть в этом списке то отменять вставку этого блока
 
Вот тут, на нижнем уровне есть проверка на воздух при команде paste.Можешь прикрутить туда вайтлист и при проверке на воздух на верхнем уровне будут так же проверятся блоки листа, соотв. их вставлять не будет, как и блоки воздуха.
Метод по ссылке выше устарел, сразу не заметил.Вместо него используется метод test.
 
Вот тут, на нижнем уровне есть проверка на воздух при команде paste.Можешь прикрутить туда вайтлист и при проверке на воздух на верхнем уровне будут так же проверятся блоки листа, соотв. их вставлять не будет, как и блоки воздуха.
Метод по ссылке выше устарел, сразу не заметил.Вместо него используется метод test.
Я сделал подобное для команды cut
Код:
this.getCommand("cutUP").setExecutor((sender, command, s, args) -> {
            Player player = (Player) sender;
            LocalSession session = we.getSession(player);
            session.setMask(new Mask() {
                @Override
                public boolean test(Vector vector) {
                    com.sk89q.worldedit.world.World world = session.getSelectionWorld();

                    List<Integer> ids = config.getStringList("disallowed-blocks-id-CUT").stream().map(Integer::parseInt).collect(Collectors.toList());
                    return !ids.contains(world.getBlock(vector).getId());
                }
                @Nullable
                @Override
                public Mask2D toMask2D() {
                    return null;
                }
            });
            return true;
        });
 
Я сделал подобное для команды cut
Код:
this.getCommand("cutUP").setExecutor((sender, command, s, args) -> {
            Player player = (Player) sender;
            LocalSession session = we.getSession(player);
            session.setMask(new Mask() {
                @Override
                public boolean test(Vector vector) {
                    com.sk89q.worldedit.world.World world = session.getSelectionWorld();

                    List<Integer> ids = config.getStringList("disallowed-blocks-id-CUT").stream().map(Integer::parseInt).collect(Collectors.toList());
                    return !ids.contains(world.getBlock(vector).getId());
                }
                @Nullable
                @Override
                public Mask2D toMask2D() {
                    return null;
                }
            });
            return true;
        });
Можешь сделать по аналогии и с paste такое, это как раз то о чём я и говорил.Но если присмотреться, то в классе ClipboardCommands в методе paste есть такая строчка:
Java:
Operation operation = holder
                .createPaste(editSession, editSession.getWorld().getWorldData())
                .to(to)
                .ignoreAirBlocks(ignoreAirBlocks)
                .build();
Конкретно нам нужен метод ignoreAirBlocks(ignoreAirBlocks), который предотвращает вставку блоков воздуха.Так что можно не писать лишний код, а лишь только подсунуть в метод проверки не только блоки воздуха, но и свои, нужный блоки.В итоге, проверку не пройдут блоки воздуха и наши вставленные блоки, соотв. в готовой структуре их не будет.Хотя, если ты уже сделал такую проверку в cut, то в буфере уже не будет этих блоков, соотв. в paste она тем более не нужна.Разве что при вставке и вырезании нужно проверять разные блоки, хотя я смысла в этом не вижу.
 
Можешь сделать по аналогии и с paste такое, это как раз то о чём я и говорил.Но если присмотреться, то в классе ClipboardCommands в методе paste есть такая строчка:
Java:
Operation operation = holder
                .createPaste(editSession, editSession.getWorld().getWorldData())
                .to(to)
                .ignoreAirBlocks(ignoreAirBlocks)
                .build();
Конкретно нам нужен метод ignoreAirBlocks(ignoreAirBlocks), который предотвращает вставку блоков воздуха.Так что можно не писать лишний код, а лишь только подсунуть в метод проверки не только блоки воздуха, но и свои, нужный блоки.В итоге, проверку не пройдут блоки воздуха и наши вставленные блоки, соотв. в готовой структуре их не будет.Хотя, если ты уже сделал такую проверку в cut, то в буфере уже не будет этих блоков, соотв. в paste она тем более не нужна.Разве что при вставке и вырезании нужно проверять разные блоки, хотя я смысла в этом не вижу.
"Хотя, если ты уже сделал такую проверку в cut, то в буфере уже не будет этих блоков, соотв. в paste она тем более не нужна." Да, проверку я такую сделал и казалось бы все готово, начал тестировать и нашел такую вещь, в буфер оно сохраняет при вырезании, то при cut вырезаются те блоки которые есть в моем списке и идейно должно было просто вставить те блоки которые вырезало без моих, но нет, оно сохраняет весь кубоид со всеми блоками, а вот то что ты предложил это дельно и даже очень, потому как я уже сутки сижу и думаю как сделать, я немного понаглею(прости), не мог бы пример навести как это сделать?Просто мозги уже немного в кашу, огромное спасибо за помощь!
 
"Хотя, если ты уже сделал такую проверку в cut, то в буфере уже не будет этих блоков, соотв. в paste она тем более не нужна." Да, проверку я такую сделал и казалось бы все готово, начал тестировать и нашел такую вещь, в буфер оно сохраняет при вырезании, то при cut вырезаются те блоки которые есть в моем списке и идейно должно было просто вставить те блоки которые вырезало без моих, но нет, оно сохраняет весь кубоид со всеми блоками, а вот то что ты предложил это дельно и даже очень, потому как я уже сутки сижу и думаю как сделать, я немного понаглею(прости), не мог бы пример навести как это сделать?Просто мозги уже немного в кашу, огромное спасибо за помощь!
Ну, на скорую руку накидал вот это:
Java:
    public boolean test(Vector vector) {
        return getExtent().getLazyBlock(vector).getType() != BlockID.AIR
                && !getConfig().getStringList("disallowed-blocks-material-CUT").contains(getExtent().getLazyBlock(vector).getType().toString());
    }
У меня нет развернутой иде+ не знаю когда ставится блок(если test возвращает true или если возвращает false), но скорее всего когда true.В итоге получается следующее:
если(БлокНеВоздух && БлокНеЗапрещён) ставимБлокИзБуфера();
Стоит учесть, что эту проверку проходит каждый блок из буфера(в этом я не уверен, но у тебя есть возможность это проверить), так что при большом объеме буфера возможны лаги.
Так же, я заменил проверку id на material(используя класс WorldEdit'a на высшем уровне), а это значит что блоки из модов вставляться не будут(хотя они вроде и так не поддерживались).Сделал я так потому, что material есть более постоянный, чем id, и это позволяет увеличить отказоустойчивость.
Но опять таки, если сделать проверку в cut, то метод paste изменять не придется.Как я понял, у тебя вырезает наоборот, только те блоки, которые запрещены, да?Если это так то убери "!" перед строкой ids.contains(world.getBlock(vector).getId());
Тогда получится что в буфере нет запрещённых блоков, соотв. незачем их при вставке проверять.
 
Ну, на скорую руку накидал вот это:
Java:
    public boolean test(Vector vector) {
        return getExtent().getLazyBlock(vector).getType() != BlockID.AIR
                && !getConfig().getStringList("disallowed-blocks-material-CUT").contains(getExtent().getLazyBlock(vector).getType().toString());
    }
У меня нет развернутой иде+ не знаю когда ставится блок(если test возвращает true или если возвращает false), но скорее всего когда true.В итоге получается следующее:
если(БлокНеВоздух && БлокНеЗапрещён) ставимБлокИзБуфера();
Стоит учесть, что эту проверку проходит каждый блок из буфера(в этом я не уверен, но у тебя есть возможность это проверить), так что при большом объеме буфера возможны лаги.
Так же, я заменил проверку id на material(используя класс WorldEdit'a на высшем уровне), а это значит что блоки из модов вставляться не будут(хотя они вроде и так не поддерживались).Сделал я так потому, что material есть более постоянный, чем id, и это позволяет увеличить отказоустойчивость.
Но опять таки, если сделать проверку в cut, то метод paste изменять не придется.Как я понял, у тебя вырезает наоборот, только те блоки, которые запрещены, да?Если это так то убери "!" перед строкой ids.contains(world.getBlock(vector).getId());
Тогда получится что в буфере нет запрещённых блоков, соотв. незачем их при вставке проверять.
Спасибо огромное, ты даже не представляешь как ты мне помог удачи тебе! Тему закрываю.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх