Помогите Не регистрируются команды

  • Автор темы Автор темы Kurumi
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

Kurumi

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
Kurumi
Всем привет. Отковырял я кое-где один плагин и когда копался в исходниках, заметил одну интересную штуку, а именно: интересная реализация команд.
В плагине есть всего 2 команды, но они не работают, т.к. не регистрируются. Ниже приложу классы...
PHP:
@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface CanRunnable {
}
PHP:
public class Command
{
    private String name;
    private Method method;
    private int minargs;
    boolean needPermission;
    private String permission;
    private String noPermissionMessage;
    private Object instance;
   
    public Command(final String name, final Method method, final int minargs, final boolean needPermission, final String permission, final String noPermissionMessage, final Object instance) {
        this.name = name;
        this.method = method;
        this.minargs = minargs;
        this.needPermission = needPermission;
        this.permission = permission;
        this.noPermissionMessage = noPermissionMessage;
        this.instance = instance;
    }
   
    public String getName() {
        return this.name;
    }
   
    public Method getMethod() {
        return this.method;
    }
   
    public int getMinargs() {
        return this.minargs;
    }
   
    public boolean isNeedPermission() {
        return this.needPermission;
    }
   
    public String getPermission() {
        return this.permission;
    }
   
    public String getNoPermissionMessage() {
        return this.noPermissionMessage;
    }
   
    public Object getInstance() {
        return this.instance;
    }
}
PHP:
public class CommandHandler implements Listener
{
    @EventHandler
    public void cmd(final PlayerCommandPreprocessEvent event) {
        final String[] mas = event.getMessage().split(" ");
        final String cmd = mas[0].toLowerCase().replaceFirst("/", "");
        if (main.loadedCommands.containsKey(cmd)) {
            event.setCancelled(true);
            final Command command = main.loadedCommands.get(cmd);
            if (command.needPermission && !event.getPlayer().hasPermission(command.getPermission())) {
                event.getPlayer().sendMessage((command.getNoPermissionMessage() == null) ? (ChatColor.RED + "Нет прав!") : command.getNoPermissionMessage());
                return;
            }
            if (mas.length - 1 < command.getMinargs()) {
                event.getPlayer().sendMessage(ChatColor.YELLOW + "Недостаточно аргументов");
                return;
            }
            if (mas.length == 1) {
                this.run(command.getMethod(), event.getPlayer(), null, command.getInstance());
            }
            else {
                final String[] args = new String[mas.length - 1];
                for (int n = 2; n < mas.length; ++n) {
                    args[n - 1] = mas[n];
                }
                this.run(command.getMethod(), event.getPlayer(), args, command.getInstance());
            }
        }
    }
   
    private boolean ctns(final String[] mas, final String l) {
        for (final String str : mas) {
            if (str.equalsIgnoreCase(l)) {
                return true;
            }
        }
        return false;
    }
   
    private void run(final Method method, final Player sender, final String[] args, final Object instance) {
        try {
            method.invoke(instance, sender, args);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}
PHP:
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE })
public @interface ICommand {
    String getName();
   
    boolean needPermission() default true;
   
    String getPermission() default "";
   
    int getMinimumArgsLength();
   
    String getNoPermissionMessage() default "§cЗапрещено!";
}
Далее, в отдельном пакете, создаются классы с самими командами и выглядит это следующим образом
PHP:
@ICommand(getName = "policesearch", getMinimumArgsLength = 0, needPermission = false)
public class PoliceSearchCmd
{
    @CanRunnable
    public void run(final Player player, final String[] args) {
        player.openInventory(main.policeSearchInventory);
    }
}
В главном классе регистрируется следующим образом:
PHP:
public static void registerCommands(final Class[] classes) {
        for (final Class cls : classes) {
            if (cls.isAnnotationPresent(ICommand.class)) {
                final ICommand is = (ICommand) cls.getAnnotation(ICommand.class);
                for (final Method method : cls.getMethods()) {
                    if (method.isAnnotationPresent(CanRunnable.class)) {
                        try {
                            main.loadedCommands.put(is.getName(), new Command(is.getName(), method, is.getMinimumArgsLength(), is.needPermission(), is.getPermission(), is.getNoPermissionMessage(), cls.newInstance()));
                        }
                        catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }


registerCommands(new Class[] { WorkHomeCmd.class, PoliceSearchCmd.class, Kitset.class });

В plugin.yml данные команды отсутствуют.
Вернемся к вопросу.. Почему команды не регистрируются? У меня такое чувство, будто я упустил что-то важное и не совсем разбираюсь в теме..
Надеюсь на вашу помощь!
 
Знал бы хоть примерно как, сюда бы не написал
Для начала мог бы не использовать подобный способ регистрации и создания команд, а сделать простые команды выше описанными способами. Может быть это не удобнее, зато понятнее.
 
Знал бы хоть примерно как, сюда бы не написал
Те рефлексией ток commandmap доставать, и то если папер там это в апи есть, рефлексия не нужна. После решаешь команду просто, CommandExecutor нах не нужен.
 
Для начала мог бы не использовать подобный способ регистрации и создания команд, а сделать простые команды выше описанными способами. Может быть это не удобнее, зато понятнее.
Наоборот удобнее, чем та каша с рефлексией, еще и через ивент вместо CommandExecutor.
 
Наоборот удобнее, чем та каша с рефлексией, еще и через ивент вместо CommandExecutor.
А, дак я не обратил внимание на то что там ивент. Тогда да, само собой удобнее регистрировать каждую команду отдельно.

А вообще, кажется что ТС не зарегистрировал собственно сам слушатель и не добавил в plugin.yml все команды.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх