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

  • Автор темы Автор темы 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 данные команды отсутствуют.
Вернемся к вопросу.. Почему команды не регистрируются? У меня такое чувство, будто я упустил что-то важное и не совсем разбираюсь в теме..
Надеюсь на вашу помощь!
 
Всем привет. Отковырял я кое-где один плагин и когда копался в исходниках, заметил одну интересную штуку, а именно: интересная реализация команд.
В плагине есть всего 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 данные команды отсутствуют.
Вернемся к вопросу.. Почему команды не регистрируются? У меня такое чувство, будто я упустил что-то важное и не совсем разбираюсь в теме..
Надеюсь на вашу помощь!
Попробуй в plugin.yml загрузить данные о командах.
Код:
commands:
 command
 
Майн же не достаточно медленный, нужно еще команды на рефлексию повесить.
 
Зарегать команду в главном классе в методе onEnable(): Bukkit.getPluginCommand("команда").setExecutor(new НазваниеКлассаСКомандной()); в plugin.yml:
commands:
команда:
можешь внутри не заполнять команду
 
Чтобы делать команду:
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;
}
}
 
Зарегать команду в главном классе в методе onEnable(): Bukkit.getPluginCommand("команда").setExecutor(new НазваниеКлассаСКомандной()); в plugin.yml:
commands:
команда:
можешь внутри не заполнять команду
Никакие отдельные методы не нужны
Чтобы делать команду:
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;
}
}
Весь говнокод сотри
Ору, сходи прогуляйся, голову проветри ;DD
 
Всем привет. Отковырял я кое-где один плагин и когда копался в исходниках, заметил одну интересную штуку, а именно: интересная реализация команд.
В плагине есть всего 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 данные команды отсутствуют.
Вернемся к вопросу.. Почему команды не регистрируются? У меня такое чувство, будто я упустил что-то важное и не совсем разбираюсь в теме..
Надеюсь на вашу помощь!
Попробуй без рефлексии обойтись
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх