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

Статус
Закрыто для дальнейших ответов.

Alex555333222

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

PHP:
super.getCommand("gamemode").setExecutor((sender, cmd, label, args) -> {

    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<String> gameModes = Arrays.asList("creative", "survival", "adventure", "spectator");
super.getCommand("gamemode").setTabCompleter((sender, cmd, label, args) -> {
    if (args.length == 0)
        return gameModes;

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

    return completed;
});
 
Самый простой код, который можно придумать

PHP:
super.getCommand("gamemode").setExecutor((sender, cmd, label, args) -> {

    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<String> gameModes = Arrays.asList("creative", "survival", "adventure", "spectator");
super.getCommand("gamemode").setTabCompleter((sender, cmd, label, args) -> {
    if (args.length == 0)
        return gameModes;

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

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

В итоге, мы за раз регистрируем и команду и таб комплит одним методом при запуске плагина.
 
Самый простой код, который можно придумать

PHP:
super.getCommand("gamemode").setExecutor((sender, cmd, label, args) -> {

    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<String> gameModes = Arrays.asList("creative", "survival", "adventure", "spectator");
super.getCommand("gamemode").setTabCompleter((sender, cmd, label, args) -> {
    if (args.length == 0)
        return gameModes;

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

    return completed;
});
super.getCommand("gamemode").setExecutor((sender, cmd, label, args) -> {}; что это означает и где это пишется?
 
Лучше в классе в котором обычно пишем логику команды (в котором реализуем этот интерфейс: org.bukkit.command.CommandExecutor), реализовать еще интерфейс org.bukkit.command.TabCompleter а в нем метод переопределить:
public List<String> onTabComplete(CommandSender arg0, Command arg1, String arg2, String[] arg3)

В итоге, мы за раз регистрируем и команду и таб комплит одним методом при запуске плагина.
Как можно из главного класса зарегистрировать класс с TabCompleter ?
 
Как можно из главного класса зарегистрировать класс с TabCompleter ?
В главном классе и пишется (в классе, который наследует JavaPlugin)
UPD: там лямбды, можешь и классы использовать. Для наглядности писал через лямбды, в больших плагинах не советую так писать)
 
В главном классе и пишется (в классе, который наследует JavaPlugin)
UPD: там лямбды, можешь и классы использовать. Для наглядности писал через лямбды, в больших плагинах не советую так писать)
Честно говоря вообще ничего не понятно =) Какой строчкой вообще регистрируется подобный класс и что такое лямбды
getCommand("pex").setExecutor(new Commands(this)); этой строчкой ошибку выдает, если писать оба метода там
 
Честно говоря вообще ничего не понятно =) Какой строчкой вообще регистрируется подобный класс и что такое лямбды
getCommand("pex").setExecutor(new Commands(this)); этой строчкой ошибку выдает, если писать оба метода там
public class Commands implements CommandExecutor, TabCompleter
 
А костыль постами повыше, издержки лямды 😁
Ошибка в консили
[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
 
Вопрос, кстати, недавно поднимался, просим ознакомится:
Да вроде все нормально работает, просто ошибка была, потом заметил случайно создал пустую функцию. Короче ошибку убрал, теперь выскакивает предупреждение.
[WARNING] Plugin PermissionEx v1.0 does not specify an api-version.
Можно его как нибудь исправить или так и должно быть этого не избежать?!
 
Ошибка в консили
[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
Пфф,. Нате.
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());
    }
}
 
Пфф,. Нате.
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());
    }
}

Да я вообще не использую никакие лямбды, ими не умею пользоваться, не знаю как с ними работать и что это вообще такое.
Код:
Главный класс:
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
 
Ну теперь знаешь и можешь мой код юзать.

Создал щас класс:
Код:
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.

Что не так не понимаю, версия ядра не та что ли?
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх