mirror of
				https://e.coding.net/circlecloud/YumCore.git
				synced 2025-11-03 23:06:02 +00:00 
			
		
		
		
	@@ -14,6 +14,8 @@ import org.bukkit.command.CommandSender;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import pw.yumc.YumCore.bukkit.P;
 | 
					import pw.yumc.YumCore.bukkit.P;
 | 
				
			||||||
import pw.yumc.YumCore.commands.annotation.Help;
 | 
					import pw.yumc.YumCore.commands.annotation.Help;
 | 
				
			||||||
 | 
					import pw.yumc.YumCore.commands.info.CommandInfo;
 | 
				
			||||||
 | 
					import pw.yumc.YumCore.commands.interfaces.CommandHelpParse;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 命令帮助生成类
 | 
					 * 命令帮助生成类
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,6 +28,10 @@ import org.bukkit.util.StringUtil;
 | 
				
			|||||||
import pw.yumc.YumCore.bukkit.Log;
 | 
					import pw.yumc.YumCore.bukkit.Log;
 | 
				
			||||||
import pw.yumc.YumCore.bukkit.P;
 | 
					import pw.yumc.YumCore.bukkit.P;
 | 
				
			||||||
import pw.yumc.YumCore.bukkit.compatible.C;
 | 
					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);
 | 
					            knownCommandsField.setAccessible(true);
 | 
				
			||||||
            knownCommands = (Map<String, Command>) knownCommandsField.get(commandMap);
 | 
					            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) {
 | 
					        } catch (NoSuchMethodException | SecurityException | NoSuchFieldException | IllegalArgumentException | IllegalAccessException e) {
 | 
				
			||||||
            Log.d("初始化命令管理器失败!");
 | 
					            Log.d("初始化命令管理器失败!");
 | 
				
			||||||
            Log.debug(e);
 | 
					            Log.debug(e);
 | 
				
			||||||
@@ -78,7 +82,7 @@ public class CommandManager implements TabExecutor {
 | 
				
			|||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Tab列表
 | 
					     * 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) {
 | 
					        if (args.length == 1) {
 | 
				
			||||||
            StringUtil.copyPartialMatches(args[0], cmdNameCache, completions);
 | 
					            StringUtil.copyPartialMatches(args[0], cmdNameCache, completions);
 | 
				
			||||||
        } else if (args.length >= 2) {
 | 
					        } 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, tab.execute(sender, command, token, args), completions);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            StringUtil.copyPartialMatches(token, getPlayerTabComplete(sender, command, alias, 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);
 | 
					        final CommandInfo ci = CommandInfo.parse(method, clazz);
 | 
				
			||||||
        if (ci != null) {
 | 
					        if (ci != null) {
 | 
				
			||||||
            final Class<?>[] params = method.getParameterTypes();
 | 
					            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) {
 | 
					                if (method.getReturnType() == boolean.class) {
 | 
				
			||||||
                    defCmd = ci;
 | 
					                    defCmd = ci;
 | 
				
			||||||
                    return true;
 | 
					                } else {
 | 
				
			||||||
 | 
					                    cmds.add(ci);
 | 
				
			||||||
 | 
					                    cmdCache.put(ci.getName(), ci);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                cmds.add(ci);
 | 
					 | 
				
			||||||
                cmdCache.put(ci.getName(), ci);
 | 
					 | 
				
			||||||
                return true;
 | 
					                return true;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            Log.warning(String.format(argumentTypeError, method.getName(), clazz.getClass().getName()));
 | 
					            Log.warning(String.format(argumentTypeError, method.getName(), clazz.getClass().getName()));
 | 
				
			||||||
@@ -307,7 +312,7 @@ public class CommandManager implements TabExecutor {
 | 
				
			|||||||
     * @return 是否成功
 | 
					     * @return 是否成功
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    private boolean registerTab(final Method method, final CommandExecutor clazz) {
 | 
					    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 (ti != null) {
 | 
				
			||||||
            if (method.getReturnType().equals(List.class)) {
 | 
					            if (method.getReturnType().equals(List.class)) {
 | 
				
			||||||
                tabs.add(ti);
 | 
					                tabs.add(ti);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,11 +2,13 @@ package pw.yumc.YumCore.commands;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import java.lang.annotation.Annotation;
 | 
					import java.lang.annotation.Annotation;
 | 
				
			||||||
import java.lang.reflect.Method;
 | 
					import java.lang.reflect.Method;
 | 
				
			||||||
 | 
					import java.util.HashMap;
 | 
				
			||||||
import java.util.LinkedList;
 | 
					import java.util.LinkedList;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.Map;
 | 
					import java.util.Map;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import org.bukkit.Bukkit;
 | 
					import org.bukkit.Bukkit;
 | 
				
			||||||
 | 
					import org.bukkit.command.CommandSender;
 | 
				
			||||||
import org.bukkit.entity.Player;
 | 
					import org.bukkit.entity.Player;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import pw.yumc.YumCore.commands.exception.CommandException;
 | 
					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
 | 
					 * @since 2016年10月5日 下午4:02:04
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
public class CommandParse {
 | 
					public class CommandParse {
 | 
				
			||||||
    private static Map<Class, Parse> allparses;
 | 
					    private static Map<Class, Parse> allparses = new HashMap<>();
 | 
				
			||||||
    static {
 | 
					    static {
 | 
				
			||||||
        new IntegerParse();
 | 
					        new IntegerParse();
 | 
				
			||||||
        new LongParse();
 | 
					        new LongParse();
 | 
				
			||||||
@@ -33,6 +35,9 @@ public class CommandParse {
 | 
				
			|||||||
    public CommandParse(final Class[] classes, final Annotation[][] annons) {
 | 
					    public CommandParse(final Class[] classes, final Annotation[][] annons) {
 | 
				
			||||||
        for (final Class classe : classes) {
 | 
					        for (final Class classe : classes) {
 | 
				
			||||||
            final Class clazz = classe;
 | 
					            final Class clazz = classe;
 | 
				
			||||||
 | 
					            if (clazz.isAssignableFrom(CommandSender.class)) {
 | 
				
			||||||
 | 
					                continue;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            if (!allparses.containsKey(clazz)) {
 | 
					            if (!allparses.containsKey(clazz)) {
 | 
				
			||||||
                throw new CommandParseException(String.format("无法解析的参数类型 %s !", clazz.getName()));
 | 
					                throw new CommandParseException(String.format("无法解析的参数类型 %s !", clazz.getName()));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
package pw.yumc.YumCore.commands;
 | 
					package pw.yumc.YumCore.commands.info;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.lang.reflect.InvocationTargetException;
 | 
					import java.lang.reflect.InvocationTargetException;
 | 
				
			||||||
import java.lang.reflect.Method;
 | 
					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.Log;
 | 
				
			||||||
import pw.yumc.YumCore.bukkit.P;
 | 
					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.Async;
 | 
				
			||||||
import pw.yumc.YumCore.commands.annotation.Cmd;
 | 
					import pw.yumc.YumCore.commands.annotation.Cmd;
 | 
				
			||||||
import pw.yumc.YumCore.commands.annotation.Cmd.Executor;
 | 
					import pw.yumc.YumCore.commands.annotation.Cmd.Executor;
 | 
				
			||||||
@@ -121,7 +123,7 @@ public class CommandInfo {
 | 
				
			|||||||
                @Override
 | 
					                @Override
 | 
				
			||||||
                public void run() {
 | 
					                public void run() {
 | 
				
			||||||
                    try {
 | 
					                    try {
 | 
				
			||||||
                        method.invoke(origin, cmdArgs.getSender(), parse.parse(cmdArgs));
 | 
					                        method.invoke(origin, parse.parse(cmdArgs));
 | 
				
			||||||
                    } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
 | 
					                    } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
 | 
				
			||||||
                        throw new CommandException(e);
 | 
					                        throw new CommandException(e);
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
package pw.yumc.YumCore.commands;
 | 
					package pw.yumc.YumCore.commands.info;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.lang.reflect.InvocationTargetException;
 | 
					import java.lang.reflect.InvocationTargetException;
 | 
				
			||||||
import java.lang.reflect.Method;
 | 
					import java.lang.reflect.Method;
 | 
				
			||||||
@@ -8,6 +8,7 @@ import java.util.List;
 | 
				
			|||||||
import org.bukkit.command.CommandSender;
 | 
					import org.bukkit.command.CommandSender;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import pw.yumc.YumCore.bukkit.P;
 | 
					import pw.yumc.YumCore.bukkit.P;
 | 
				
			||||||
 | 
					import pw.yumc.YumCore.commands.CommandArgument;
 | 
				
			||||||
import pw.yumc.YumCore.commands.annotation.Tab;
 | 
					import pw.yumc.YumCore.commands.annotation.Tab;
 | 
				
			||||||
import pw.yumc.YumCore.commands.exception.CommandException;
 | 
					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
 | 
					 * @since 2016年7月23日 上午9:56:42
 | 
				
			||||||
 * @author 喵♂呜
 | 
					 * @author 喵♂呜
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
public class TabInfo {
 | 
					public class CommandTabInfo {
 | 
				
			||||||
    private final Object origin;
 | 
					    private final Object origin;
 | 
				
			||||||
    private final Method method;
 | 
					    private final Method method;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public TabInfo(final Method method, final Object origin) {
 | 
					    public CommandTabInfo(final Method method, final Object origin) {
 | 
				
			||||||
        this.method = method;
 | 
					        this.method = method;
 | 
				
			||||||
        this.origin = origin;
 | 
					        this.origin = origin;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -33,12 +34,12 @@ public class TabInfo {
 | 
				
			|||||||
     *            方法
 | 
					     *            方法
 | 
				
			||||||
     * @param origin
 | 
					     * @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);
 | 
					        final Tab tab = method.getAnnotation(Tab.class);
 | 
				
			||||||
        if (tab != null) {
 | 
					        if (tab != null) {
 | 
				
			||||||
            return new TabInfo(method, origin);
 | 
					            return new CommandTabInfo(method, origin);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return null;
 | 
					        return null;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -48,8 +49,8 @@ public class TabInfo {
 | 
				
			|||||||
        if (this == obj) {
 | 
					        if (this == obj) {
 | 
				
			||||||
            return true;
 | 
					            return true;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (obj instanceof TabInfo) {
 | 
					        if (obj instanceof CommandTabInfo) {
 | 
				
			||||||
            return method.equals(((TabInfo) obj).getMethod());
 | 
					            return method.equals(((CommandTabInfo) obj).getMethod());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return super.equals(obj);
 | 
					        return super.equals(obj);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
package pw.yumc.YumCore.commands;
 | 
					package pw.yumc.YumCore.commands.interfaces;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 命令执行类
 | 
					 * 命令执行类
 | 
				
			||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
package pw.yumc.YumCore.commands;
 | 
					package pw.yumc.YumCore.commands.interfaces;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 命令解析接口
 | 
					 * 命令解析接口
 | 
				
			||||||
		Reference in New Issue
	
	Block a user