Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

worldEdit command paste

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

Статус темы:
Закрыта.
  1. Автор темы
    Forest_SD

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

    Баллы:
    36
    Имя в Minecraft:
    Forest_SD
    Привет всем, делаю дополнение к плагину worldEdit, суть состоит в том чтобы для команды //cut и //paste были параметры запрещенных блоков, то есть когда выполняется команда //cut те блоки которые указанны в конфиге не вырезались, точно так же и с paste те которые указаны в конфиге не ставились, проблем состоит сейчас в команде paste потому как для cut уже сделал, буду благодарен любой помощи
     
  2. Хостинг MineCraft
    <
  3. Автор темы
    Forest_SD

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

    Баллы:
    36
    Имя в Minecraft:
    Forest_SD
    Буду описывать что уже сделал, может кто-то из опытных подсобит.. Нашел функционал команды //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 блока в буфере(клипборд) сравнить его если он есть в этом списке то отменять вставку этого блока
     
  4. AtomicInteger

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

    Баллы:
    46
    Вот тут, на нижнем уровне есть проверка на воздух при команде paste.Можешь прикрутить туда вайтлист и при проверке на воздух на верхнем уровне будут так же проверятся блоки листа, соотв. их вставлять не будет, как и блоки воздуха.[DOUBLEPOST=1485608472,1485608277][/DOUBLEPOST]Метод по ссылке выше устарел, сразу не заметил.Вместо него используется метод test.
     
  5. Автор темы
    Forest_SD

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

    Баллы:
    36
    Имя в Minecraft:
    Forest_SD
    Я сделал подобное для команды 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;
            });
     
  6. AtomicInteger

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

    Баллы:
    46
    Можешь сделать по аналогии и с paste такое, это как раз то о чём я и говорил.Но если присмотреться, то в классе ClipboardCommands в методе paste есть такая строчка:
    Код:
    Operation operation = holder
                    .createPaste(editSession, editSession.getWorld().getWorldData())
                    .to(to)
                    .ignoreAirBlocks(ignoreAirBlocks)
                    .build();
    Конкретно нам нужен метод ignoreAirBlocks(ignoreAirBlocks), который предотвращает вставку блоков воздуха.Так что можно не писать лишний код, а лишь только подсунуть в метод проверки не только блоки воздуха, но и свои, нужный блоки.В итоге, проверку не пройдут блоки воздуха и наши вставленные блоки, соотв. в готовой структуре их не будет.Хотя, если ты уже сделал такую проверку в cut, то в буфере уже не будет этих блоков, соотв. в paste она тем более не нужна.Разве что при вставке и вырезании нужно проверять разные блоки, хотя я смысла в этом не вижу.
     
  7. Автор темы
    Forest_SD

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

    Баллы:
    36
    Имя в Minecraft:
    Forest_SD
    "Хотя, если ты уже сделал такую проверку в cut, то в буфере уже не будет этих блоков, соотв. в paste она тем более не нужна." Да, проверку я такую сделал и казалось бы все готово, начал тестировать и нашел такую вещь, в буфер оно сохраняет при вырезании, то при cut вырезаются те блоки которые есть в моем списке и идейно должно было просто вставить те блоки которые вырезало без моих, но нет, оно сохраняет весь кубоид со всеми блоками, а вот то что ты предложил это дельно и даже очень, потому как я уже сутки сижу и думаю как сделать, я немного понаглею(прости), не мог бы пример навести как это сделать?Просто мозги уже немного в кашу, огромное спасибо за помощь!
     
  8. AtomicInteger

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

    Баллы:
    46
    Ну, на скорую руку накидал вот это:
    Код:
        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());
    Тогда получится что в буфере нет запрещённых блоков, соотв. незачем их при вставке проверять.
     
  9. Автор темы
    Forest_SD

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

    Баллы:
    36
    Имя в Minecraft:
    Forest_SD
    Спасибо огромное, ты даже не представляешь как ты мне помог удачи тебе! Тему закрываю.
     
Статус темы:
Закрыта.

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