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

Подсказки в майне для команд

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

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

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

    Баллы:
    66
    Всем привет, ребята подскажите пожалуйста как сделать подсказки для команд. То есть в новых версиях при написании той или иной команды выскакивают подсказки, какие слова идут следом, варианты.
    Например пишешь: /gamemode [survival, creativ...]
    Как сделать такие же для своего плагина.
     
  2. alexandrage

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

    Баллы:
    173
    комплетером
     
  3. Автор темы
    Alex555333222

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

    Баллы:
    66
    Я не знаю что это, но я понял только что нужен эвент org.bukkit.event.server.TabCompleteEvent
     
  4. alexandrage

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

    Баллы:
    173
    Мима.
     
  5. Автор темы
    Alex555333222

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

    Баллы:
    66
    Ну тогда совсем ничего не понятно
     
  6. NyanGuyMF

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

    Баллы:
    76
    Самый простой код, который можно придумать

    PHP:
    super.getCommand("gamemode").setExecutor((sendercmdlabelargs) -> {

        if (
    args.length 1)
            return 
    false;

        if (!(
    sender instanceof Player)) {
            
    sender.sendMessage("Only player can execute this command");
            return 
    true;
        }

        switch (
    args[0].toLowerCase()) {
        case 
    "creative":
            ((
    Player)sender).setGameMode(GameMode.CREATIVE);
            break;
        case 
    "survival":
            ((
    Player)sender).setGameMode(GameMode.SURVIVAL);
            break;
        case 
    "adventure":
            ((
    Player)sender).setGameMode(GameMode.SURVIVAL);
            break;
        case 
    "spectator":
            ((
    Player)sender).setGameMode(GameMode.SPECTATOR);
            break;

        default:
            
    sender.sendMessage("Unknown gamemode");
            break;
        }

        return 
    true;
    });

    List<
    StringgameModes Arrays.asList("creative""survival""adventure""spectator");
    super.getCommand("gamemode").setTabCompleter((sendercmdlabelargs) -> {
        if (
    args.length == 0)
            return 
    gameModes;

        List<
    Stringcompleted = new ArrayList<>();
        
    gameModes.forEach(gameMode -> {
            if (
    gameMode.startsWith(args[0]))
                
    completed.add(gameMode);
        });

        return 
    completed;
    });
     
  7. MurlikMurlik

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

    Баллы:
    96
    Лучше в классе в котором обычно пишем логику команды (в котором реализуем этот интерфейс: org.bukkit.command.CommandExecutor), реализовать еще интерфейс org.bukkit.command.TabCompleter а в нем метод переопределить:
    public List<String> onTabComplete(CommandSender arg0, Command arg1, String arg2, String[] arg3)

    В итоге, мы за раз регистрируем и команду и таб комплит одним методом при запуске плагина.
     
  8. Автор темы
    Alex555333222

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

    Баллы:
    66
    super.getCommand("gamemode").setExecutor((sender, cmd, label, args) -> {}; что это означает и где это пишется?
     
  9. Автор темы
    Alex555333222

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

    Баллы:
    66
    Как можно из главного класса зарегистрировать класс с TabCompleter ?
     
  10. NyanGuyMF

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

    Баллы:
    76
    В главном классе и пишется (в классе, который наследует JavaPlugin)
    UPD: там лямбды, можешь и классы использовать. Для наглядности писал через лямбды, в больших плагинах не советую так писать)
     
  11. Автор темы
    Alex555333222

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

    Баллы:
    66
    Честно говоря вообще ничего не понятно =) Какой строчкой вообще регистрируется подобный класс и что такое лямбды
    getCommand("pex").setExecutor(new Commands(this)); этой строчкой ошибку выдает, если писать оба метода там
     
  12. alexandrage

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

    Баллы:
    173
    public class Commands implements CommandExecutor, TabCompleter
     
  13. alexandrage

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

    Баллы:
    173
    А костыль постами повыше, издержки лямды :D
     
  14. Автор темы
    Alex555333222

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

    Баллы:
    66
    Ошибка в консили
    [ERROR] [PermissionEx] PermissionEx v1.0 attempted to register an invalid EventHandler method signature "public void permission.main.Handler.Tab(org.bukkit.command.TabCompleter)" in class permission.main.Handler
     
  15. NyanGuyMF

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

    Баллы:
    76
    Вопрос, кстати, недавно поднимался, просим ознакомится:
     
  16. Автор темы
    Alex555333222

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

    Баллы:
    66
    Да вроде все нормально работает, просто ошибка была, потом заметил случайно создал пустую функцию. Короче ошибку убрал, теперь выскакивает предупреждение.
    [WARNING] Plugin PermissionEx v1.0 does not specify an api-version.
    Можно его как нибудь исправить или так и должно быть этого не избежать?!
     
  17. alexandrage

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

    Баллы:
    173
    Пфф,. Нате.
    P>s И если уж юзать фичи 8 жабы с лямдами, то по нормальному.
    Код:
    public class CommandListener implements CommandExecutor, TabCompleter  {
    
        @Override
        public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
            return true;
        }
    
        @Override
        public List<String> onTabComplete(CommandSender sender, Command cmd, String label, String[] args) {
            List<String> list = Arrays.asList("creative", "survival", "adventure", "spectator");
            if(args.length==0) {
                return list;
            }
            return list.stream().filter(line -> line.startsWith(args[0])).collect(Collectors.toList());
        }
    }
     
  18. Автор темы
    Alex555333222

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

    Баллы:
    66
    Да я вообще не использую никакие лямбды, ими не умею пользоваться, не знаю как с ними работать и что это вообще такое.
    Код:
    Главный класс:
    public class Permission extends JavaPlugin{
            onEnable() {
                    getCommand("pex").setExecutor(new Commands(this));
                    getCommand("pex").setTabCompleter(new Commands(this));
            }
    }
    
    Доп. класс:
    public class Commands implements CommandExecutor, TabCompleter{
        private Permission plugin;
        public Commands(Permission plugin) {
            this.plugin = plugin;
        }
    
        @Override
        public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
            return true;
        }
        
         public void reloadPlugin(Player p) {
            if( plugin.flagPermission(p.getName(), "pex.reload") ||
                plugin.flagPermission(p.getName(), "pex.*") ||
                plugin.flagPermission(p.getName(), "*")) {
                String s = this.plugin.getConfig().getString("permission.reload");
                p.sendMessage(s.replaceAll("&", "§"));
                plugin.reloadConfig();
                return;
            }
            p.sendMessage("§aУ вас недостаточно прав");
            return;
        }
    
        @Override
        public List<String> onTabComplete(CommandSender sender, Command cmd, String alias, String[] args) {
            if (cmd.getName().equalsIgnoreCase("pex") && args.length == 1){
                if (sender instanceof Player) {
                    List<String> newList = new ArrayList<>();
                    newList.addAll(plugin.getConfig().getStringList("Sites.Names"));
                    return newList;
                }
            }
            return null;
        }
    }
    
    Файл plugin.yml:
    name: PermissionEx
    main: permission.main.Permission
    version: 1.0
    commands:
      pex:
        usage: /pex reload
    
     
  19. alexandrage

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

    Баллы:
    173
    Ну теперь знаешь и можешь мой код юзать.
     
  20. Автор темы
    Alex555333222

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

    Баллы:
    66
    Создал щас класс:
    Код:
    package main;
    
    import org.bukkit.plugin.java.JavaPlugin;
    
    public class Permissions extends JavaPlugin{
       
        public void onEnable() {
        }
        
        public void onDisable() {
        }
    }
    
    Полностью пустой, один. И в консоли так же предупреждение выскакивает:

    [INFO] Tile Max Tick Time: 50ms Entity max Tick Time: 50ms
    [INFO] [PermissionsEx] Disabling PermissionsEx v1.0
    [INFO] Reloading ResourceManager: Default, bukkit
    [INFO] Loaded 6 recipes
    [INFO] Reloading ResourceManager: Default, bukkit
    [INFO] Loaded 6 recipes
    [WARNING] Plugin PermissionsEx v1.0 does not specify an api-version.
    [INFO] [PermissionsEx] Loading PermissionsEx v1.0
    [INFO] [PermissionsEx] Enabling PermissionsEx v1.0
    [INFO] Server permissions file permissions.yml is empty, ignoring it
    [INFO] CONSOLE: Reload complete.

    Что не так не понимаю, версия ядра не та что ли?
     
Статус темы:
Закрыта.

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