- Баллы
- 76
- Имя в Minecraft
- Kurumi
Всем привет. Отковырял я кое-где один плагин и когда копался в исходниках, заметил одну интересную штуку, а именно: интересная реализация команд.
В плагине есть всего 2 команды, но они не работают, т.к. не регистрируются. Ниже приложу классы...
Далее, в отдельном пакете, создаются классы с самими командами и выглядит это следующим образом
В главном классе регистрируется следующим образом:
В 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 данные команды отсутствуют.
Вернемся к вопросу.. Почему команды не регистрируются? У меня такое чувство, будто я упустил что-то важное и не совсем разбираюсь в теме..
Надеюсь на вашу помощь!