mirror of
				https://e.coding.net/circlecloud/YumCore.git
				synced 2025-11-03 23:06:02 +00:00 
			
		
		
		
	@@ -13,6 +13,7 @@ import pw.yumc.YumCore.bukkit.Log;
 | 
				
			|||||||
import pw.yumc.YumCore.bukkit.P;
 | 
					import pw.yumc.YumCore.bukkit.P;
 | 
				
			||||||
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.Help;
 | 
					import pw.yumc.YumCore.commands.annotation.Help;
 | 
				
			||||||
import pw.yumc.YumCore.commands.annotation.Sort;
 | 
					import pw.yumc.YumCore.commands.annotation.Sort;
 | 
				
			||||||
import pw.yumc.YumCore.commands.exception.CommandException;
 | 
					import pw.yumc.YumCore.commands.exception.CommandException;
 | 
				
			||||||
@@ -27,6 +28,7 @@ public class CommandInfo {
 | 
				
			|||||||
    public static final CommandInfo Unknow = new CommandInfo();
 | 
					    public static final CommandInfo Unknow = new CommandInfo();
 | 
				
			||||||
    private static final String onlyPlayer = "§c控制台无法使用此命令(§4请在游戏内执行§c)!";
 | 
					    private static final String onlyPlayer = "§c控制台无法使用此命令(§4请在游戏内执行§c)!";
 | 
				
			||||||
    private static final String onlyConsole = "§c玩家无法使用此命令(§4请使用控制台执行§c)!";
 | 
					    private static final String onlyConsole = "§c玩家无法使用此命令(§4请使用控制台执行§c)!";
 | 
				
			||||||
 | 
					    private static final String onlyExecutor = "§c当前命令仅允许 §b%s §c执行!";
 | 
				
			||||||
    private static final String losePerm = "§c你需要有 %s 的权限才能执行此命令!";
 | 
					    private static final String losePerm = "§c你需要有 %s 的权限才能执行此命令!";
 | 
				
			||||||
    private static final String cmdErr = "§6错误原因: §4命令参数不正确!";
 | 
					    private static final String cmdErr = "§6错误原因: §4命令参数不正确!";
 | 
				
			||||||
    private static final String cmdUse = "§6使用方法: §e/%s %s %s";
 | 
					    private static final String cmdUse = "§6使用方法: §e/%s %s %s";
 | 
				
			||||||
@@ -35,6 +37,8 @@ public class CommandInfo {
 | 
				
			|||||||
    private final Method method;
 | 
					    private final Method method;
 | 
				
			||||||
    private final String name;
 | 
					    private final String name;
 | 
				
			||||||
    private final List<String> aliases;
 | 
					    private final List<String> aliases;
 | 
				
			||||||
 | 
					    private final List<Executor> executors;
 | 
				
			||||||
 | 
					    private final String executorStr;
 | 
				
			||||||
    private final boolean async;
 | 
					    private final boolean async;
 | 
				
			||||||
    private final Cmd command;
 | 
					    private final Cmd command;
 | 
				
			||||||
    private final Help help;
 | 
					    private final Help help;
 | 
				
			||||||
@@ -45,6 +49,8 @@ public class CommandInfo {
 | 
				
			|||||||
        this.origin = origin;
 | 
					        this.origin = origin;
 | 
				
			||||||
        this.name = "".equals(command.value()) ? method.getName().toLowerCase() : command.value();
 | 
					        this.name = "".equals(command.value()) ? method.getName().toLowerCase() : command.value();
 | 
				
			||||||
        this.aliases = Arrays.asList(command.aliases());
 | 
					        this.aliases = Arrays.asList(command.aliases());
 | 
				
			||||||
 | 
					        this.executors = Arrays.asList(command.executor());
 | 
				
			||||||
 | 
					        this.executorStr = eS(executors);
 | 
				
			||||||
        this.command = command;
 | 
					        this.command = command;
 | 
				
			||||||
        this.help = help;
 | 
					        this.help = help;
 | 
				
			||||||
        this.async = async;
 | 
					        this.async = async;
 | 
				
			||||||
@@ -56,6 +62,8 @@ public class CommandInfo {
 | 
				
			|||||||
        this.origin = null;
 | 
					        this.origin = null;
 | 
				
			||||||
        this.name = "unknow";
 | 
					        this.name = "unknow";
 | 
				
			||||||
        this.aliases = null;
 | 
					        this.aliases = null;
 | 
				
			||||||
 | 
					        this.executors = null;
 | 
				
			||||||
 | 
					        this.executorStr = null;
 | 
				
			||||||
        this.command = null;
 | 
					        this.command = null;
 | 
				
			||||||
        this.help = null;
 | 
					        this.help = null;
 | 
				
			||||||
        this.async = false;
 | 
					        this.async = false;
 | 
				
			||||||
@@ -93,15 +101,9 @@ public class CommandInfo {
 | 
				
			|||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 执行命令
 | 
					     * 执行命令
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @param sender
 | 
					     * @param cmdArgs
 | 
				
			||||||
     *            命令发送者
 | 
					     *            命令参数
 | 
				
			||||||
     * @param command
 | 
					     * @return 是否执行成功
 | 
				
			||||||
     *            主命令
 | 
					 | 
				
			||||||
     * @param label
 | 
					 | 
				
			||||||
     *            主命令别名
 | 
					 | 
				
			||||||
     * @param args
 | 
					 | 
				
			||||||
     *            子命令参数
 | 
					 | 
				
			||||||
     * @return
 | 
					 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public boolean execute(final CommandArgument cmdArgs) {
 | 
					    public boolean execute(final CommandArgument cmdArgs) {
 | 
				
			||||||
        if (method == null) {
 | 
					        if (method == null) {
 | 
				
			||||||
@@ -183,12 +185,33 @@ public class CommandInfo {
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    private boolean check(final CommandArgument cmdArgs) {
 | 
					    private boolean check(final CommandArgument cmdArgs) {
 | 
				
			||||||
        final CommandSender sender = cmdArgs.getSender();
 | 
					        final CommandSender sender = cmdArgs.getSender();
 | 
				
			||||||
 | 
					        return checkArgs(sender, cmdArgs) && checkSender(sender) && checkPerm(sender);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private boolean checkArgs(final CommandSender sender, final CommandArgument cmdArgs) {
 | 
				
			||||||
        if (cmdArgs.getArgs().length < command.minimumArguments()) {
 | 
					        if (cmdArgs.getArgs().length < command.minimumArguments()) {
 | 
				
			||||||
            Log.toSender(sender, cmdErr);
 | 
					            Log.toSender(sender, cmdErr);
 | 
				
			||||||
            Log.toSender(sender, String.format(cmdUse, cmdArgs.getAlias(), getName(), help.possibleArguments()));
 | 
					            Log.toSender(sender, String.format(cmdUse, cmdArgs.getAlias(), getName(), help.possibleArguments()));
 | 
				
			||||||
            Log.toSender(sender, String.format(cmdDes, help.value()));
 | 
					            Log.toSender(sender, String.format(cmdDes, help.value()));
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private boolean checkPerm(final CommandSender sender) {
 | 
				
			||||||
 | 
					        final String perm = command.permission();
 | 
				
			||||||
 | 
					        if (perm != null && !"".equals(perm) && !sender.hasPermission(perm)) {
 | 
				
			||||||
 | 
					            Log.toSender(sender, String.format(losePerm, perm));
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private boolean checkSender(final CommandSender sender) {
 | 
				
			||||||
 | 
					        if (!executors.contains(Executor.ALL) && !executors.contains(Executor.valueOf(sender))) {
 | 
				
			||||||
 | 
					            Log.toSender(sender, String.format(onlyExecutor, executorStr));
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        if (sender instanceof Player) {
 | 
					        if (sender instanceof Player) {
 | 
				
			||||||
            if (command.onlyConsole()) {
 | 
					            if (command.onlyConsole()) {
 | 
				
			||||||
                Log.toSender(sender, onlyConsole);
 | 
					                Log.toSender(sender, onlyConsole);
 | 
				
			||||||
@@ -200,11 +223,15 @@ public class CommandInfo {
 | 
				
			|||||||
                return false;
 | 
					                return false;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        final String perm = command.permission();
 | 
					 | 
				
			||||||
        if (perm != null && !"".equals(perm) && !sender.hasPermission(perm)) {
 | 
					 | 
				
			||||||
            Log.toSender(sender, String.format(losePerm, perm));
 | 
					 | 
				
			||||||
            return false;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        return true;
 | 
					        return true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private String eS(final List<Executor> executors) {
 | 
				
			||||||
 | 
					        final StringBuffer str = new StringBuffer();
 | 
				
			||||||
 | 
					        for (final Executor executor : executors) {
 | 
				
			||||||
 | 
					            str.append(executor.getName());
 | 
				
			||||||
 | 
					            str.append(", ");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return str.toString().substring(0, str.length() - 2);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,6 +5,13 @@ import java.lang.annotation.Retention;
 | 
				
			|||||||
import java.lang.annotation.RetentionPolicy;
 | 
					import java.lang.annotation.RetentionPolicy;
 | 
				
			||||||
import java.lang.annotation.Target;
 | 
					import java.lang.annotation.Target;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.bukkit.command.BlockCommandSender;
 | 
				
			||||||
 | 
					import org.bukkit.command.CommandSender;
 | 
				
			||||||
 | 
					import org.bukkit.command.ConsoleCommandSender;
 | 
				
			||||||
 | 
					import org.bukkit.command.RemoteConsoleCommandSender;
 | 
				
			||||||
 | 
					import org.bukkit.entity.Player;
 | 
				
			||||||
 | 
					import org.bukkit.entity.minecart.CommandMinecart;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 命令注解
 | 
					 * 命令注解
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
@@ -29,28 +36,136 @@ public @interface Cmd {
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    String[] aliases() default "";
 | 
					    String[] aliases() default "";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @return 命令执行者
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    Executor[] executor() default Executor.ALL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @return 命令最小参数
 | 
					     * @return 命令最小参数
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    int minimumArguments() default 0;
 | 
					    int minimumArguments() default 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @deprecated 详见 {@link Executor}
 | 
				
			||||||
 | 
					     * @return 只允许控制台执行
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Deprecated
 | 
				
			||||||
 | 
					    boolean onlyConsole() default false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @deprecated 详见 {@link Executor}
 | 
				
			||||||
 | 
					     * @return 只允许玩家执行
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Deprecated
 | 
				
			||||||
 | 
					    boolean onlyPlayer() default false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @return 当前命令权限
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    String permission() default "";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @return 命令名称
 | 
					     * @return 命令名称
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    String value() default "";
 | 
					    String value() default "";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @return 只允许控制台执行
 | 
					     * 命令执行者
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @author 喵♂呜
 | 
				
			||||||
 | 
					     * @since 2016年8月26日 下午8:55:15
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    boolean onlyConsole() default false;
 | 
					    public enum Executor {
 | 
				
			||||||
 | 
					 | 
				
			||||||
        /**
 | 
					        /**
 | 
				
			||||||
     * @return 只允许玩家执行
 | 
					         * 玩家
 | 
				
			||||||
         */
 | 
					         */
 | 
				
			||||||
    boolean onlyPlayer() default false;
 | 
					        PLAYER {
 | 
				
			||||||
 | 
					            @Override
 | 
				
			||||||
    /**
 | 
					            public String getName() {
 | 
				
			||||||
     * @return 当前命令权限
 | 
					                return "玩家";
 | 
				
			||||||
     */
 | 
					            }
 | 
				
			||||||
    String permission() default "";
 | 
					        },
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * 控制台
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        CONSOLE {
 | 
				
			||||||
 | 
					            @Override
 | 
				
			||||||
 | 
					            public String getName() {
 | 
				
			||||||
 | 
					                return "控制台";
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * 命令方块
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        BLOCK {
 | 
				
			||||||
 | 
					            @Override
 | 
				
			||||||
 | 
					            public String getName() {
 | 
				
			||||||
 | 
					                return "命令方块";
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * 命令矿车
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        COMMANDMINECART {
 | 
				
			||||||
 | 
					            @Override
 | 
				
			||||||
 | 
					            public String getName() {
 | 
				
			||||||
 | 
					                return "命令矿车";
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * 远程控制台
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        REMOTECONSOLE {
 | 
				
			||||||
 | 
					            @Override
 | 
				
			||||||
 | 
					            public String getName() {
 | 
				
			||||||
 | 
					                return "远程控制台";
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * 所有
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        ALL {
 | 
				
			||||||
 | 
					            @Override
 | 
				
			||||||
 | 
					            public String getName() {
 | 
				
			||||||
 | 
					                return "所有执行者";
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * 未知
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        UNKNOW {
 | 
				
			||||||
 | 
					            @Override
 | 
				
			||||||
 | 
					            public String getName() {
 | 
				
			||||||
 | 
					                return "未知";
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * 解析Executor
 | 
				
			||||||
 | 
					         *
 | 
				
			||||||
 | 
					         * @param sender
 | 
				
			||||||
 | 
					         *            命令执行者
 | 
				
			||||||
 | 
					         * @return {@link Executor}
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        public static Executor valueOf(final CommandSender sender) {
 | 
				
			||||||
 | 
					            if (sender instanceof Player) {
 | 
				
			||||||
 | 
					                return Executor.PLAYER;
 | 
				
			||||||
 | 
					            } else if (sender instanceof ConsoleCommandSender) {
 | 
				
			||||||
 | 
					                return Executor.CONSOLE;
 | 
				
			||||||
 | 
					            } else if (sender instanceof BlockCommandSender) {
 | 
				
			||||||
 | 
					                return Executor.BLOCK;
 | 
				
			||||||
 | 
					            } else if (sender instanceof CommandMinecart) {
 | 
				
			||||||
 | 
					                return Executor.COMMANDMINECART;
 | 
				
			||||||
 | 
					            } else if (sender instanceof RemoteConsoleCommandSender) {
 | 
				
			||||||
 | 
					                return Executor.REMOTECONSOLE;
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                return Executor.UNKNOW;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * @return 执行者名称
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        public abstract String getName();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user