Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов 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. Хостинг MineCraft
    <
  3. Shevchik

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

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

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

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

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

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

    VaruosServers Новичок

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

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

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

    Исходя из логики предположил что гетчанк заработает если импортировать org.bukkit.location. Импортировал, ничего не заработало...
     
  13. Автор темы
    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;
    }
     
  14. 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;
    }
    }
    
    Всегда проверяй кто послал команду а то нечаянно из консоли заюзаешь команду и приплыли
     
  15. Автор темы
    VaNnOrus

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

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

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

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

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

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

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    @VaNnOrus
    да ни.
    Просто опечатка в слове instanceof
    UPD:
    такие вещи лучше пусть пишет сам IDE, меньше шансов опечатку оставить.
    т.е. вводим i[enter] => он заменяет на instanceof
    UPD2:
    Еще одно преимущество Intellij IDEA:
    instaceof.png
     
    Сникерсни и VaNnOrus нравится это.
  19. Автор темы
    VaNnOrus

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

    Баллы:
    123
    Спасибо, проглазел..)

    К слову, нашел таки плагин аналогичный commandhelper'у, который умеет запускать команды с правами опа: mycommand.
    Но плагин написать все же попытаюсь, правда теперь чуть позже:oops:

    upd. Как я жестоко ошибался, не хочет mycommand запускать из под опа каманды :(
     
  20. Автор темы
    VaNnOrus

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

    Баллы:
    123
    fromgate, вот получил я крайние координаты, теперь надо установить на них выделение, чтоб появилась сетка we cui. Не пойму что дальше писать...как запустить функцию выделения?
    Вроде эта функция выделяет по двум блокам:
    Код:
    CuboidSelection(org.bukkit.World world, org.bukkit.Location pt1, org.bukkit.Location pt2) 
     
  21. yar1k

    yar1k Активный участник

    Баллы:
    63
    Имя в Minecraft:
    yar1k
    Простите за спам, но кто подскажет, когда на форуме можно создавать темы?
    Написал мини плагин, хочу под суд отдать...
    P.S.
    Вот файл, кому интересно: Скачать
    /tools - выдает итемы с интервалом заданым в конфиге
    (id итемов тоже в конфиге указывать).
    /clear - очищает инвентарь.
     
    ПриветОтМиднайта нравится это.

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