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

Разбираемся в API WorldEdit'а

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

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

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

    Баллы:
    123
    Здравствуйте.
    Столкнулся с такой проблемой - нужно запустить, например, команду //chunk из WE при вводе команды плагина.
    И сделать это нужно с правами "op".

    Вот я обрабатываю ввод своей команды, а что дальше делать понять не могу...
    Код:
    public class название_класса implements CommandExecutor {
      @Override
      public boolean onCommand(CommandSender sender, Command command, String label, String[] args){
          if(command.getName().equalsIgnoreCase("название_команды")){
     
              return true;
          }
      return false;
      }
    }
     
  2. Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Читай WorldGuard API
     
  3. Автор темы
    VaNnOrus

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

    Баллы:
    123
    Хотели сказать WorldEdit API?
    Читал, но что делать не понимаю.
    Есть
    Код:
    public boolean execute(org.bukkit.command.CommandSender sender,
                  String label,
                  String[] args)
    На сколько я понимаю - запуск команды label от имени sender с аргументами, но если у сендера нет прав, то вернется фальш. Мне нужно запустить команду из под опа от любого игрока.
     
  4. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    Конечная задача какая? Чанк выделять через API не надо будет, он сам по себе чанк. Что с чанком дальше планируете делать?
     
    ITrAnEI нравится это.
  5. Автор темы
    VaNnOrus

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

    Баллы:
    123
    Мне просто нужно выделение чанка или нескольких чанков вокруг игрока с помощью WE и их последующий приват через WG.
    Раньше с эту задачу я выполнял с помощью commandhelpera, но на 1.4.7 он блюет ошибками в консоль, хоть вроде и работает.
    Ну и вообще интересно понять как плагины писать :)
     
  6. Ission

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

    Баллы:
    173
    Skype:
    lokivava
    Я предпологаю что это невозможно. В данном случае. Если у игрока нет прав на эту команду WE, то выполненная эта же команда от имени OP выделит чанк для OP, а не нужного игрока. В данном случае нужно копаться в API WG/WE и никак иначе. Если я ошибаюсь - поправьте меня.
     
  7. Автор темы
    VaNnOrus

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

    Баллы:
    123
    Ну у ВЕ ведь на гитхабе исходники лежат, я вот думаю какова вероятность, что у меня заработает скопированная оттуда команда, с убранным пермишеном и аналагичным импортом?
    Вот команда:
    Код:
        @Command(
            aliases = { "/chunk" },
            usage = "",
            flags = "s",
            desc = "Set the selection to your current chunk.",
            help =
                "Set the selection to the chunk you are currently in.\n" +
                "With the -s flag, your current selection is expanded\n" +
                "to encompass all chunks that are part of it.",
            min = 0,
            max = 0
        )
        @Logging(POSITION)
        @CommandPermissions("worldedit.selection.chunk")
        public void chunk(CommandContext args, LocalSession session, LocalPlayer player,
                EditSession editSession) throws WorldEditException {
     
            final Vector min;
            final Vector max;
            final LocalWorld world = player.getWorld();
            if (args.hasFlag('s')) {
                Region region = session.getSelection(world);
     
                final Vector2D min2D = ChunkStore.toChunk(region.getMinimumPoint());
                final Vector2D max2D = ChunkStore.toChunk(region.getMaximumPoint());
     
                min = new Vector(min2D.getBlockX() * 16, 0, min2D.getBlockZ() * 16);
                max = new Vector(max2D.getBlockX() * 16 + 15, world.getMaxY(), max2D.getBlockZ() * 16 + 15);
     
                player.print("Chunks selected: ("
                        + min2D.getBlockX() + ", " + min2D.getBlockZ() + ") - ("
                        + max2D.getBlockX() + ", " + max2D.getBlockZ() + ")");
            } else {
                final Vector2D min2D = ChunkStore.toChunk(player.getBlockIn());
     
                min = new Vector(min2D.getBlockX() * 16, 0, min2D.getBlockZ() * 16);
                max = min.add(15, world.getMaxY(), 15);
     
                player.print("Chunk selected: "
                        + min2D.getBlockX() + ", " + min2D.getBlockZ());
            }
     
            final CuboidRegionSelector selector;
            if (session.getRegionSelector(world) instanceof ExtendingCuboidRegionSelector)
                selector = new ExtendingCuboidRegionSelector(world);
            else
                selector = new CuboidRegionSelector(world);
            selector.selectPrimary(min);
            selector.selectSecondary(max);
            session.setRegionSelector(world, selector);
     
            session.dispatchCUISelection(player);
     
        }
     
  8. Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    для этой команды тебе придётся половину ворлдэдита подтащить в зависимости.
    Да и неправлиьно ты делаешь,тебе нужно выбрать регион и заприватить его.
    Для этого тебе надо найти 6 координат, x1,y1,z1,x2,y2,z2 и воспользоваться API ворлдгарда для привата. Думай
     
  9. Автор темы
    VaNnOrus

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

    Баллы:
    123
    Проблема в том, что я не понимаю что мне нужно импортировать для работы кода -_-
    Уже подумываю о том, чтоб эклипс установить, он вроде сам импорты предлагает. К нетбинсу привык уже...
    Чтоб получить координаты я хотел использовать getchunk из ведра, какой(ие) класс(ы) импортировать чтоб getchunk работал?
     
  10. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    @VaNnOrus, серьезно не копируйте команды. Лучше разберитесь как она и что делает и через API обращайтесь к тем же функциям.
     
    ITrAnEI нравится это.
  11. Автор темы
    VaNnOrus

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

    Баллы:
    123
    Я в апи ведра ничего не понимаю, не могу понять что нужно импортировать, поэтому решил ВЕшкой работать.
    Все говорят про знания java, а по сути, надо просто разбираться в апи. Читал учебники по java и пока что знания о том как выводить на экран что-либо и прочие азы особо не пригодились...
     
  12. VaruosServers

    VaruosServers Новичок

    Баллы:
    8
    Skype:
    VaruosServers
    Имя в Minecraft:
    Jopa
    Учебники вообще не помощь для познания языков программирования,разве что сразу на практику,сидеть и сразу практиковать,сейчас учатся так,надо что либо,узнал что за параметр,выучил,а в книгах лабудни много.
     
  13. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    @VaNnOrus, я и имел в виду API WorldEdit'а.

    Вот смотрите, к примеру, Вы хотите выбрать командой //chunk определенный чанк. Но смысл Вам разбираться с этой командой. Вам нужно решить, что Вы с выделенным чанком будете делать дальше, определить какая функция в WorldEdit'е это делает и уже потом вызывать непосредственно её, передавая ей в качестве параметра нужный Вам чанк.
     
  14. Автор темы
    VaNnOrus

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

    Баллы:
    123
    Ну обычно так и происходит - посмотрел описание чего-либо - испытал.
    php и mysql я вообще, можно сказать, методом тыка познал познаю.
    Да вся проблема в том, что я даже этот чанк получить не могу, потому что не знаю какой класс из ведра нужно импортировать, чтоб получить гетчанк"ом чанк в котором стоит игрок...

    Исходя из логики предположил что гетчанк заработает если импортировать org.bukkit.location. Импортировал, ничего не заработало...
     
  15. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    @VaNnOrus, ну... я обычно о том, что нужно импортировать даже не задумываюсь.

    Делаю так. Допустим, у вас объект есть объект player класса Player. Тогда чанк в котором он находится можно получить так:
    Chunk ch = player.getLocation().getChunk();

    При этом, когда я набираю в Eclipse
    Chunk ch
    то чтобы импортировался класс достаточно навести на название класса курсор мыши и в выпадающем хинте выбираю что нужно импортировать.
     
    ITrAnEI нравится это.
  16. Автор темы
    VaNnOrus

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

    Баллы:
    123
    Вот в чем вся проблема, я в нетбинсе работаю :D
    Ладно, завтра поставлю эклипс, попробую что-нибудь состряпать.
    Мм..."Chunk" тут это тип переменной, а ch ее название?

    Вот у меня в первом посте была заготовка, я же должен использовать "sender" в качестве этого самого объекта "player" так ведь? А потом из "ch" могу получить координаты крайних блоков
    Код:
     public boolean onCommand(CommandSender sender, Command command, String label, String[] args){
    if(command.getName().equalsIgnoreCase("название_команды")){
    Chunk ch = sender.getLocation().getChunk();
    return true;
    }
    return false;
    }
     
  17. Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    надо:
    Код:
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args){
    if(command.getName().equalsIgnoreCase("название_команды")){
    if (sender instaceof Player) {
    Player player = (Player) sender;
    Chunk ch = player.getLocation().getChunk();
    return true;
    }
    return false;
    }
    }
    
    Всегда проверяй кто послал команду а то нечаянно из консоли заюзаешь команду и приплыли
     
  18. Автор темы
    VaNnOrus

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

    Баллы:
    123
    Да, про это знал :) Ну от команды зависит еще, некоторые и из консоли можно/нужно посылать)
    Скобку не закрыл в if (sender instaceof Player) { :)
     
  19. Ission

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

    Баллы:
    173
    Skype:
    lokivava
    В NetBeans для этого служит комбинация Alt+Enter(по умолчанию) с текстовым курсором на проблемном месте.
     
  20. Автор темы
    VaNnOrus

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

    Баллы:
    123
    Да, действительно, однако на некоторые ошибки он не предлагает импорта:
    Безымянный.JPG
     

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