С чего начать: Команды

Discussion in 'Разработка плагинов' started by fromgate, 12/1/16.

  1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.
Dismiss Notice
We welcome you on our site. This site is devoted to the Nukkit project and all that is connected with him. Here you can communicate, download plugins, also many other things get acquainted! Register the account right now :3
  1. fromgate

    fromgate Administrator

    Messages:
    660
    Likes Received:
    186

    Работа с командами

    Продолжим улучшать наш плагин — добавим в него возможность вывода текущего новосотного сообщения по запросу и возможность изменять его. Думаю, при этом нужно будет проверять пермишены у игрока — чтобы можно было разрешить использование команды только ограниченному списку игроков.

    1. Регистрация команды
    Для начала нужно сообщить серверу, что у плагина есть команда. Делать это можно двумя способами — описать её в файле plugin.yml или зарегистрировать команду самостоятельно. Мы будем делать первым способом, в большинстве случаев этого достаточно.

    Добавим в plugin.yml описание команды:
    Code:
    commands:
    news:
    aliases: ["info"]
    description: Show (and set current news)
    usage: "/news [set <Anouncement>]"
    Здесь:
    "news" — наша команда
    "aliases" — список алиасов. Кстати, здесь параметр - это массив строк. Поэтому если алиасов несколько то описывать надо так aliases: ["alias1", "alias2"]
    "description" — описание команды (будет выводиться по команде /help сервера)
    "usage" — пример использования команды

    2. Код исполняющий команду
    Если у плагина в plugin.yml описаны команды, то сервер при написании этой команды будет передавать управление методу onCommand, основного класса плагина.
    Соответственно, для реализации команды, необходимо переопределить метод onCommand.

    Code:
     @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
    
    [pre][code]}
    [/pre]
    [
    [/code]

    Данный метод вызывается с параметрами:
    • sender — тот кто вызвал команду;
    • command — команда;
    • label — то как команду набирали в (тут может быть и алиас команды);
    • args — строковый массив содеражищий все введённые параметры.
    Итак, нам надо реализовать команду /news таким образом, чтобы команда введённая без параметров выводила текст на экран. Но если у команды были параметры - все они рассматривались как новое значение для объявление. При этом, если команда была введена игроком, то к тексту сообщения добавлялось имя того, кто сменил объявление. Кроме того, не мешало бы проверить у игроков пермишены.

    Code:
     @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
    Player player = (sender instanceof Player) ? (Player) sender : null;
    if (args.length==0){
    if (player!=null&&!player.hasPermission("firstplugn.news.show"))
    sender.sendMessage(TextFormat.RED+"You have not enough permissions!");
    else sender.sendMessage(TextFormat.colorize("&3[NEWS] &b"+this.helloMessage));
    } else {
    if (player!=null&&!player.hasPermission("firstplugn.news.set"))
    sender.sendMessage(TextFormat.RED+"You have not enough permissions!");
    else {
    StringBuilder sb = new StringBuilder();
    for (String s : args) {
    if (sb.length() > 0) sb.append(" ");
    sb.append(s);
    }
    if (player != null) sb.append(" &3(").append(player.getName()).append(")");
    this.helloMessage = sb.toString();
    this.getConfig().set("hello-message",this.helloMessage);
    this.saveConfig();
    sender.sendMessage(TextFormat.colorize("&6You configured new announcement:"));
    sender.sendMessage(TextFormat.colorize("&3[NEWS] &b"+this.helloMessage));
    }
    }
    return true;
    }
    Компилируем, запускаем, заходим в игру и...

    news-result.png

    3. Послесловие к командам
    Вроде всё просто и понятно. По большому счёту, по другому и быть не должно. Ведь реализация команды в плагине — это по сути один метод, который нужно описать.
    Но нужно остановиться ещё на одном моменте, который не был отражен в моем примере. Если Вы опишите несколько команд в plugin.yml, то при вводе любой из этих команд будет происходить вызов одного и того же метода - onCommand.
    Поэтому, необходимо будет осущетсвлять проверку какая команда была введена игроком.

    Выглядеть это может, например, так:

    Code:
     @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
    if (command.getLabel().equalsIgnoreCase("command1")){
    // выполяемая команду command1
    
    [pre][code]    } else if (command.getLabel().equalsIgnoreCase("command2")){
            // выполяемая команду command2
    
        } else return false;
        return true;
    }
    [/code][/pre]
    Напоследок, хочу отметить, что "исполнители команда" можно зарегистрировать отдельно, не привязываясь к файлу plugin.yml и основному классу плагина. На мой взгляд, это очень удобно в случае плагинов, которые реализуют большое количество команд.
     
    Last edited: 29/2/16
    j0sky likes this.
  2. fromgate

    fromgate Administrator

    Messages:
    660
    Likes Received:
    186
    Даже не знаю. Вроде все основы изложил: бери и делай плагин ;)

    О чём ещё нужно рассказать, как считаете?
     
  3. impact

    impact Error #404, User not found In Resignation

    Messages:
    51
    Likes Received:
    19
    Приветствую, у тебя во 2 пункте ошибка с форматирования текста, у тебя
    Code:
    [code]
    берет и ему подобные и делает код кривым.
    Будь добр, исправь это ;)
     
  4. fromgate

    fromgate Administrator

    Messages:
    660
    Likes Received:
    186
    Спасибо, подправил.
     
  5. Eduard Ambroziev

    Eduard Ambroziev Pioneer

    Messages:
    3
    Likes Received:
    0
    Minecraft:
    John_
    хороший урок! я так понял, структура плагина нуккит, мало чем отличается от буккит.
     
  6. fromgate

    fromgate Administrator

    Messages:
    660
    Likes Received:
    186
    Логика такая же. Поскольку Nukkit - это порт PocketMine, то явно видно, что PocketMine писался под впечатлением от Bukkit ;)
     
  7. Andrey

    Andrey Пользователь

    Messages:
    5
    Likes Received:
    0
    What should it extend if you put it in a different file?
     
  8. Varfalomey

    Varfalomey Developer (Level 3)

    Messages:
    32
    Likes Received:
    12
    Minecraft:
    Varfalomey
     
  9. Tee7even

    Tee7even Nukkit Coders Team

    Messages:
    122
    Likes Received:
    27
    У меня такой скромный вопрос - в PM я права описывал в plugin.yml, тут такое не нужно вообще или об этом не говорится ввиду необязательности?

    Ну и тут switch нельзя использовать?
     
  10. fromgate

    fromgate Administrator

    Messages:
    660
    Likes Received:
    186
    Можно описывать, я уже "испытал": https://github.com/NukkitRu/Welcome/blob/master/src/main/resources/plugin.yml
    Не описал эту возможность в первую очередь из-за того что сам не использовал. В бакките, при обилии хороших менеджеров пермишенов, я всегда считал, что владелец сервера должен сам принять решение по каждому конкретному пермишену.

    Можно, это вопрпос техники.
    При использовании двух-трёх вариантов выбора, я вряд ли буду использовать switch. Но если их много, тогда -- это удобнее всего.
     
  11. Tee7even

    Tee7even Nukkit Coders Team

    Messages:
    122
    Likes Received:
    27
    Я, конечно, того же мнения, но тут соль в том, что тут у прав может быть поле children, которым можно описать права, которые будут добавляться автоматически, если будет добавлено исходное право. Насколько я знаю, без этого firstplugin.news.set и firstplugin.news.show не будут добавлены, если добавлен firstplugin.news. :)

    Я просто немного сомневался, т.к. строки в Java нельзя сравнивать оператором ==, то я подумал, что и switch тут не будет к месту.
     
  12. fromgate

    fromgate Administrator

    Messages:
    660
    Likes Received:
    186
    Дочерние пермишены сейчас криво работают. Так что лучше пока без них.

    До Java 7 нельзя было switch использовать для строк. Я поэтому к такому не привык :)
     
  13. Tee7even

    Tee7even Nukkit Coders Team

    Messages:
    122
    Likes Received:
    27
    Блен, ничего нормально не работает... Интересно, когда уже PE выйдет из альфы и разработчики перестанут так резко менять клиент и всё будет более-менее логично? ¯_(ツ)_/¯
     
  14. kirill3345

    kirill3345 Пользователь

    Messages:
    6
    Likes Received:
    0
    Minecraft:
    kirill3345
    А как зарегистрировать команду, если она в другом классе?
    В Bukkit так:
    Code:
    this.getCommand("helloworld").setExecutor(new Commands());
     
    Last edited: 5/5/16
  15. Pub4Game

    Pub4Game Модератор всея Nukkit.ru Moderator

    Messages:
    62
    Likes Received:
    31
    Minecraft:
    Pub4Game
    В Nukkit тоже так должно быть, но....

    Надо исправлять :)
     
  16. kirill3345

    kirill3345 Пользователь

    Messages:
    6
    Likes Received:
    0
    Minecraft:
    kirill3345
    Ды?
    [​IMG]
     
  17. Pub4Game

    Pub4Game Модератор всея Nukkit.ru Moderator

    Messages:
    62
    Likes Received:
    31
    Minecraft:
    Pub4Game
    Говорю же)) Надо исправлять, это есть в ядре, но работает некорректно.
     
  18. kirill3345

    kirill3345 Пользователь

    Messages:
    6
    Likes Received:
    0
    Minecraft:
    kirill3345
    А альтернативный способ есть?
     
  19. Pub4Game

    Pub4Game Модератор всея Nukkit.ru Moderator

    Messages:
    62
    Likes Received:
    31
    Minecraft:
    Pub4Game

    Да, можешь посмотреть в моем плагине, не могу с телефона выделить нужные строки :(

    https://github.com/NukkitRu/ToolsPro
     
  20. kirill3345

    kirill3345 Пользователь

    Messages:
    6
    Likes Received:
    0
    Minecraft:
    kirill3345
    А если у меня CommandExecutor?
     

Share This Page