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

Помогите Код replacenear [WorldEdit]

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

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

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

    Баллы:
    76
    Имя в Minecraft:
    CriticaMobs
    Всем привет,
    Я искал код replacenear на разных сайтах но так и не нашёл,
    Прошу помочь в этом вопросе ;)
    P.S replacenear - заменяет в определённом радиусе блоки которые вы укажите
     
    Последнее редактирование: 8 фев 2018
  2. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
  3. Автор темы
    CriticaMobslps

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

    Баллы:
    76
    Имя в Minecraft:
    CriticaMobs
  4. Типа админ:D

    Типа админ:D Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Qamulex
    Я бы написал, т.к. это слишком просто, но я ленивый
     
  5. alexandrage

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

    Баллы:
    173
    Оно и просто там

    Код:
        public void replaceNear(Player player, LocalSession session, EditSession editSession, CommandContext args) throws WorldEditException {
           
            int size = Math.max(1, args.getInteger(0));
            int affected;
            Set<BaseBlock> from;
            Pattern to;
            if (args.argsLength() == 2) {
                from = null;
                to = we.getBlockPattern(player, args.getString(1));
            } else {
                from = we.getBlocks(player, args.getString(1), true, !args.hasFlag('f'));
                to = we.getBlockPattern(player, args.getString(2));
            }
    
            Vector base = session.getPlacementPosition(player);
            Vector min = base.subtract(size, size, size);
            Vector max = base.add(size, size, size);
            Region region = new CuboidRegion(player.getWorld(), min, max);
    
            if (to instanceof SingleBlockPattern) {
                affected = editSession.replaceBlocks(region, from, ((SingleBlockPattern) to).getBlock());
            } else {
                affected = editSession.replaceBlocks(region, from, to);
            }
            player.print(affected + " block(s) have been replaced.");
        }
    С тебя получить локалсессию и едитсессию.
     
  6. Автор темы
    CriticaMobslps

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

    Баллы:
    76
    Имя в Minecraft:
    CriticaMobs
    upload_2018-2-10_2-17-46.png
    upload_2018-2-10_2-26-7.png

    Прошу объяснить в чём проблема, вроде сделал всё правильно как и требовалось
    Код:
        @Override
        public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
            Player p = (Player) sender;
            LocalWorld w = (LocalWorld) p.getLocation().getWorld();
            try {
                WorldEdit we = (WorldEdit) Bukkit.getPluginManager().getPlugin("WorldEdit");
            Methods.replaceNear(p, new LocalSession(), new EditSession((LocalWorld) we.getSession((com.sk89q.worldedit.entity.Player) sender).getSelectionWorld(), 5000), new CommandContext(args));
            } catch (WorldEditException e) {
                // TODO Автоматически созданный блок catch
                e.printStackTrace();
            } catch (CommandException e) {
                // TODO Автоматически созданный блок catch
                e.printStackTrace();
            }
            return false;
        }
    
     
  7. ql_Nik_lp

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

    Баллы:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
    [​IMG]
    player.getWorld() вернет тебе CraftWorld, а WorldEdit работает со своим LocalWorld
    CraftWorld это не LocalWorld

    Получить LocalWorld ты можешь из LocalSession (Она у тебя уже есть)
    session.getSelectionWorld();
     
  8. Автор темы
    CriticaMobslps

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

    Баллы:
    76
    Имя в Minecraft:
    CriticaMobs
    Проблема есть, но ошибка уже другая
    upload_2018-2-10_3-45-15.png
     
  9. ql_Nik_lp

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

    Баллы:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
    Та же проблема, ты кастишь классы (В скобках название класса пишешь перед чем-то) к тому чем они не являются, о чем тебе и сказало в строке Caused by
    [​IMG]
    WorldEditPlugin.class это не WorldEdit.class
    и это на самой первой строке твоей функции.
    Дальше тебя еще ждут сюрпризы что Player Bukkit'a это не com.sk89q.worldedit.entity.Player и так далее
     
  10. Автор темы
    CriticaMobslps

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

    Баллы:
    76
    Имя в Minecraft:
    CriticaMobs
    upload_2018-2-10_6-16-51.png
     
  11. alexandrage

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

    Баллы:
    173
    Код:
    static WorldEditPlugin we = (WorldEditPlugin) Bukkit.getPluginManager().getPlugin("WorldEdit");
    Код:
        public void replaceNear(Player p, CommandContext args) throws WorldEditException {
            com.sk89q.worldedit.entity.Player player = we.wrapPlayer(p);
            LocalSession session = we.getSession(p);
            EditSession editSession = we.createEditSession(p);
            int size = Math.max(1, args.getInteger(0));
            int affected;
            Set<BaseBlock> from;
            Pattern to;
            if (args.argsLength() == 2) {
                from = null;
                to = WorldEdit.getInstance().getBlockPattern(player, args.getString(1));
            } else {
                from = WorldEdit.getInstance().getBlocks(player, args.getString(1), true, !args.hasFlag('f'));
                to = WorldEdit.getInstance().getBlockPattern(player, args.getString(2));
            }
            Vector base = session.getPlacementPosition(player);
            Vector min = base.subtract(size, size, size);
            Vector max = base.add(size, size, size);
            Region region = new CuboidRegion(player.getWorld(), min, max);
            if (to instanceof SingleBlockPattern) {
                affected = editSession.replaceBlocks(region, from, ((SingleBlockPattern) to).getBlock());
            } else {
                affected = editSession.replaceBlocks(region, from, to);
            }
            player.print(affected + " block(s) have been replaced.");
        }
     
    Последнее редактирование: 10 фев 2018
  12. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    А от API WE никак не отвязаться что ли? :D
    Или специально так решили сделать?
     
    Последнее редактирование: 10 фев 2018
  13. Автор темы
    CriticaMobslps

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

    Баллы:
    76
    Имя в Minecraft:
    CriticaMobs
    Работает но вот проблемка, почему то он не обращает внимания на тот блок который я вписываю на замену
    upload_2018-2-11_2-56-49.png

    Он заменяет траву, не важно что я впишу, только траву

    upload_2018-2-11_2-57-16.png upload_2018-2-11_2-57-29.png

    У меня идёт команда /ags qwerty [size] [from] [to]
    Подскажите в чём проблема, почему именно трава?
     
  14. Автор темы
    CriticaMobslps

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

    Баллы:
    76
    Имя в Minecraft:
    CriticaMobs
    Тема до сих пор актуальна
     

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