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

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

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

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

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

    Баллы:
    76
    Всем привет. Отковырял я кое-где один плагин и когда копался в исходниках, заметил одну интересную штуку, а именно: интересная реализация команд.
    В плагине есть всего 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 command.getMinargs()) {
                    
    event.getPlayer().sendMessage(ChatColor.YELLOW "Недостаточно аргументов");
                    return;
                }
                if (
    mas.length == 1) {
                    
    this.run(command.getMethod(), event.getPlayer(), nullcommand.getInstance());
                }
                else {
                    final 
    String[] args = new String[mas.length 1];
                    for (
    int n 2mas.length; ++n) {
                        
    args[1] = mas[n];
                    }
                    
    this.run(command.getMethod(), event.getPlayer(), argscommand.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(instancesenderargs);
            }
            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 0needPermission 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 = (ICommandcls.getAnnotation(ICommand.class);
                    for (final 
    Method method cls.getMethods()) {
                        if (
    method.isAnnotationPresent(CanRunnable.class)) {
                            try {
                                
    main.loadedCommands.put(is.getName(), new Command(is.getName(), methodis.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 данные команды отсутствуют.
    Вернемся к вопросу.. Почему команды не регистрируются? У меня такое чувство, будто я упустил что-то важное и не совсем разбираюсь в теме..
    Надеюсь на вашу помощь!
     
  2. reZero

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

    Баллы:
    76
    Какая-то дичь
     
  3. MrHaber

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

    Баллы:
    66
    Попробуй в plugin.yml загрузить данные о командах.
    Код:
    commands:
     command
    
     
  4. alexandrage

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

    Баллы:
    173
    Майн же не достаточно медленный, нужно еще команды на рефлексию повесить.
     
  5. Автор темы
    Kurumi

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

    Баллы:
    76
    Это я пробовал первым делом
     
  6. dreadfaly

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

    Баллы:
    76
    Имя в Minecraft:
    dolphif
    Та а версии вообще совпадают?)
     
  7. Автор темы
    Kurumi

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

    Баллы:
    76
    Конечно
     
  8. Автор темы
    Kurumi

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

    Баллы:
    76
    Никто не шарит?
     
  9. Artemka2008

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

    Баллы:
    66
    Имя в Minecraft:
    ArCoderMine
    Зарегать команду в главном классе в методе onEnable(): Bukkit.getPluginCommand("команда").setExecutor(new НазваниеКлассаСКомандной()); в plugin.yml:
    commands:
    команда:
    можешь внутри не заполнять команду
     
  10. Artemka2008

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

    Баллы:
    66
    Имя в Minecraft:
    ArCoderMine
    Никакие отдельные методы не нужны
     
  11. Artemka2008

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

    Баллы:
    66
    Имя в Minecraft:
    ArCoderMine
    Чтобы делать команду:
    package пакет.в.котором.класс;

    import org.bukkit.command.Command;
    import org.bukkit.command.CommandExecutor;
    import org.bukkit.command.CommandSender;

    public class Команда implements CommandExecutor{

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args){
    СОДЕРЖИМОЕ КОМАНДЫ
    return true;
    }
    }
     
  12. Artemka2008

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

    Баллы:
    66
    Имя в Minecraft:
    ArCoderMine
    Весь говнокод сотри
     
  13. AbstractCoder

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

    Баллы:
    76
    Имя в Minecraft:
    AbstractCoder
    А выше у тебя не говнокод?)
     
  14. Artemka2008

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

    Баллы:
    66
    Имя в Minecraft:
    ArCoderMine
    неа
     
  15. Автор темы
    Kurumi

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

    Баллы:
    76
    Ору, сходи прогуляйся, голову проветри ;DD
     
  16. Slavkaa

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

    Баллы:
    76
    Имя в Minecraft:
    Slavok2001
    Не страдай херней, юзай стандартный CommandExecutor или напиши свое апи. Не юзай это г.
     
  17. Автор темы
    Kurumi

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

    Баллы:
    76
    Можно хотя бы конкретики почему это полное г?
     
  18. MurlikMurlik

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

    Баллы:
    96
    Попробуй без рефлексии обойтись
     
  19. Автор темы
    Kurumi

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

    Баллы:
    76
    Знал бы хоть примерно как, сюда бы не написал
     
  20. alexandrage

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

    Баллы:
    173
    Юзать как все CommandExecutor.
     
Статус темы:
Закрыта.

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