1
0
mirror of https://e.coding.net/circlecloud/YumCore.git synced 2024-11-21 01:38:51 +00:00

fix: 修复命令自动解析错误

Signed-off-by: 502647092 <admin@yumc.pw>
This commit is contained in:
502647092 2016-10-09 20:36:10 +08:00
parent ea1ddd6385
commit 6ac2b8cf78
7 changed files with 36 additions and 21 deletions

View File

@ -14,6 +14,8 @@ import org.bukkit.command.CommandSender;
import pw.yumc.YumCore.bukkit.P;
import pw.yumc.YumCore.commands.annotation.Help;
import pw.yumc.YumCore.commands.info.CommandInfo;
import pw.yumc.YumCore.commands.interfaces.CommandHelpParse;
/**
* 命令帮助生成类

View File

@ -28,6 +28,10 @@ import org.bukkit.util.StringUtil;
import pw.yumc.YumCore.bukkit.Log;
import pw.yumc.YumCore.bukkit.P;
import pw.yumc.YumCore.bukkit.compatible.C;
import pw.yumc.YumCore.commands.info.CommandInfo;
import pw.yumc.YumCore.commands.info.CommandTabInfo;
import pw.yumc.YumCore.commands.interfaces.CommandExecutor;
import pw.yumc.YumCore.commands.interfaces.CommandHelpParse;
/**
* 命令管理类
@ -57,7 +61,7 @@ public class CommandManager implements TabExecutor {
knownCommandsField.setAccessible(true);
knownCommands = (Map<String, Command>) knownCommandsField.get(commandMap);
PluginCommandConstructor = PluginCommand.class.getConstructor(String.class, Plugin.class);
PluginCommandConstructor = PluginCommand.class.getDeclaredConstructor(String.class, Plugin.class);
} catch (NoSuchMethodException | SecurityException | NoSuchFieldException | IllegalArgumentException | IllegalAccessException e) {
Log.d("初始化命令管理器失败!");
Log.debug(e);
@ -78,7 +82,7 @@ public class CommandManager implements TabExecutor {
/**
* Tab列表
*/
private final Set<TabInfo> tabs = new HashSet<>();
private final Set<CommandTabInfo> tabs = new HashSet<>();
/**
* 命令缓存列表
*/
@ -156,7 +160,7 @@ public class CommandManager implements TabExecutor {
if (args.length == 1) {
StringUtil.copyPartialMatches(args[0], cmdNameCache, completions);
} else if (args.length >= 2) {
for (final TabInfo tab : tabs) {
for (final CommandTabInfo tab : tabs) {
StringUtil.copyPartialMatches(token, tab.execute(sender, command, token, args), completions);
}
StringUtil.copyPartialMatches(token, getPlayerTabComplete(sender, command, alias, args), completions);
@ -283,13 +287,14 @@ public class CommandManager implements TabExecutor {
final CommandInfo ci = CommandInfo.parse(method, clazz);
if (ci != null) {
final Class<?>[] params = method.getParameterTypes();
if (params.length > 0 && params[0].equals(CommandArgument.class)) {
Log.d("命令 %s 参数类型: %s", ci.getName(), Arrays.toString(params));
if (params.length > 0 && params[0].isAssignableFrom(CommandSender.class)) {
if (method.getReturnType() == boolean.class) {
defCmd = ci;
return true;
} else {
cmds.add(ci);
cmdCache.put(ci.getName(), ci);
}
cmds.add(ci);
cmdCache.put(ci.getName(), ci);
return true;
}
Log.warning(String.format(argumentTypeError, method.getName(), clazz.getClass().getName()));
@ -307,7 +312,7 @@ public class CommandManager implements TabExecutor {
* @return 是否成功
*/
private boolean registerTab(final Method method, final CommandExecutor clazz) {
final TabInfo ti = TabInfo.parse(method, clazz);
final CommandTabInfo ti = CommandTabInfo.parse(method, clazz);
if (ti != null) {
if (method.getReturnType().equals(List.class)) {
tabs.add(ti);

View File

@ -2,11 +2,13 @@ package pw.yumc.YumCore.commands;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import pw.yumc.YumCore.commands.exception.CommandException;
@ -19,7 +21,7 @@ import pw.yumc.YumCore.commands.exception.CommandParseException;
* @since 2016年10月5日 下午4:02:04
*/
public class CommandParse {
private static Map<Class, Parse> allparses;
private static Map<Class, Parse> allparses = new HashMap<>();
static {
new IntegerParse();
new LongParse();
@ -33,6 +35,9 @@ public class CommandParse {
public CommandParse(final Class[] classes, final Annotation[][] annons) {
for (final Class classe : classes) {
final Class clazz = classe;
if (clazz.isAssignableFrom(CommandSender.class)) {
continue;
}
if (!allparses.containsKey(clazz)) {
throw new CommandParseException(String.format("无法解析的参数类型 %s !", clazz.getName()));
}

View File

@ -1,4 +1,4 @@
package pw.yumc.YumCore.commands;
package pw.yumc.YumCore.commands.info;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
@ -11,6 +11,8 @@ import org.bukkit.entity.Player;
import pw.yumc.YumCore.bukkit.Log;
import pw.yumc.YumCore.bukkit.P;
import pw.yumc.YumCore.commands.CommandArgument;
import pw.yumc.YumCore.commands.CommandParse;
import pw.yumc.YumCore.commands.annotation.Async;
import pw.yumc.YumCore.commands.annotation.Cmd;
import pw.yumc.YumCore.commands.annotation.Cmd.Executor;
@ -121,7 +123,7 @@ public class CommandInfo {
@Override
public void run() {
try {
method.invoke(origin, cmdArgs.getSender(), parse.parse(cmdArgs));
method.invoke(origin, parse.parse(cmdArgs));
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
throw new CommandException(e);
}

View File

@ -1,4 +1,4 @@
package pw.yumc.YumCore.commands;
package pw.yumc.YumCore.commands.info;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
@ -8,6 +8,7 @@ import java.util.List;
import org.bukkit.command.CommandSender;
import pw.yumc.YumCore.bukkit.P;
import pw.yumc.YumCore.commands.CommandArgument;
import pw.yumc.YumCore.commands.annotation.Tab;
import pw.yumc.YumCore.commands.exception.CommandException;
@ -17,11 +18,11 @@ import pw.yumc.YumCore.commands.exception.CommandException;
* @since 2016年7月23日 上午9:56:42
* @author
*/
public class TabInfo {
public class CommandTabInfo {
private final Object origin;
private final Method method;
public TabInfo(final Method method, final Object origin) {
public CommandTabInfo(final Method method, final Object origin) {
this.method = method;
this.origin = origin;
}
@ -33,12 +34,12 @@ public class TabInfo {
* 方法
* @param origin
* 对象
* @return {@link TabInfo}
* @return {@link CommandTabInfo}
*/
public static TabInfo parse(final Method method, final Object origin) {
public static CommandTabInfo parse(final Method method, final Object origin) {
final Tab tab = method.getAnnotation(Tab.class);
if (tab != null) {
return new TabInfo(method, origin);
return new CommandTabInfo(method, origin);
}
return null;
}
@ -48,8 +49,8 @@ public class TabInfo {
if (this == obj) {
return true;
}
if (obj instanceof TabInfo) {
return method.equals(((TabInfo) obj).getMethod());
if (obj instanceof CommandTabInfo) {
return method.equals(((CommandTabInfo) obj).getMethod());
}
return super.equals(obj);
}

View File

@ -1,4 +1,4 @@
package pw.yumc.YumCore.commands;
package pw.yumc.YumCore.commands.interfaces;
/**
* 命令执行类

View File

@ -1,4 +1,4 @@
package pw.yumc.YumCore.commands;
package pw.yumc.YumCore.commands.interfaces;
/**
* 命令解析接口