mirror of
				https://e.coding.net/circlecloud/YumCore.git
				synced 2025-11-03 23:06:02 +00:00 
			
		
		
		
	
							
								
								
									
										8
									
								
								.classpath
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								.classpath
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<classpath>
 | 
			
		||||
	<classpathentry kind="src" path="src/main/java"/>
 | 
			
		||||
	<classpathentry kind="src" path="src/main/resources"/>
 | 
			
		||||
	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 | 
			
		||||
	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"/>
 | 
			
		||||
	<classpathentry kind="output" path="bin"/>
 | 
			
		||||
</classpath>
 | 
			
		||||
							
								
								
									
										38
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,38 @@
 | 
			
		||||
# Eclipse stuff
 | 
			
		||||
/.settings
 | 
			
		||||
 | 
			
		||||
# netbeans
 | 
			
		||||
/nbproject
 | 
			
		||||
 | 
			
		||||
# we use maven!
 | 
			
		||||
/build.xml
 | 
			
		||||
 | 
			
		||||
# maven
 | 
			
		||||
/target
 | 
			
		||||
/repo
 | 
			
		||||
 | 
			
		||||
# vim
 | 
			
		||||
.*.sw[a-p]
 | 
			
		||||
 | 
			
		||||
# various other potential build files
 | 
			
		||||
/build
 | 
			
		||||
/bin
 | 
			
		||||
/dist
 | 
			
		||||
/manifest.mf
 | 
			
		||||
 | 
			
		||||
/world
 | 
			
		||||
 | 
			
		||||
# Mac filesystem dust
 | 
			
		||||
*.DS_Store
 | 
			
		||||
 | 
			
		||||
# intellij
 | 
			
		||||
*.iml
 | 
			
		||||
*.ipr
 | 
			
		||||
*.iws
 | 
			
		||||
.idea/
 | 
			
		||||
 | 
			
		||||
# Project Stuff
 | 
			
		||||
/src/main/resources/Soulbound
 | 
			
		||||
 | 
			
		||||
# Atlassian Stuff
 | 
			
		||||
/atlassian-ide-plugin.xml
 | 
			
		||||
							
								
								
									
										23
									
								
								.project
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								.project
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<projectDescription>
 | 
			
		||||
	<name>YumCore</name>
 | 
			
		||||
	<comment></comment>
 | 
			
		||||
	<projects>
 | 
			
		||||
	</projects>
 | 
			
		||||
	<buildSpec>
 | 
			
		||||
		<buildCommand>
 | 
			
		||||
			<name>org.eclipse.jdt.core.javabuilder</name>
 | 
			
		||||
			<arguments>
 | 
			
		||||
			</arguments>
 | 
			
		||||
		</buildCommand>
 | 
			
		||||
		<buildCommand>
 | 
			
		||||
			<name>org.eclipse.m2e.core.maven2Builder</name>
 | 
			
		||||
			<arguments>
 | 
			
		||||
			</arguments>
 | 
			
		||||
		</buildCommand>
 | 
			
		||||
	</buildSpec>
 | 
			
		||||
	<natures>
 | 
			
		||||
		<nature>org.eclipse.m2e.core.maven2Nature</nature>
 | 
			
		||||
		<nature>org.eclipse.jdt.core.javanature</nature>
 | 
			
		||||
	</natures>
 | 
			
		||||
</projectDescription>
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								lib/PlaceholderAPI.jar
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								lib/PlaceholderAPI.jar
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								lib/ProtocolLib-3.6.5-SNAPSHOT.jar
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								lib/ProtocolLib-3.6.5-SNAPSHOT.jar
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								lib/craftbukkit-1.7.10.jar
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								lib/craftbukkit-1.7.10.jar
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										117
									
								
								pom.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								pom.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,117 @@
 | 
			
		||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 | 
			
		||||
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 | 
			
		||||
	<modelVersion>4.0.0</modelVersion>
 | 
			
		||||
	<groupId>pw.yumc</groupId>
 | 
			
		||||
	<artifactId>YumCore</artifactId>
 | 
			
		||||
	<version>1.0</version>
 | 
			
		||||
	<name>YumCore</name>
 | 
			
		||||
	<build>
 | 
			
		||||
		<finalName>${project.name}</finalName>
 | 
			
		||||
		<resources>
 | 
			
		||||
			<resource>
 | 
			
		||||
				<directory>src/main/resources</directory>
 | 
			
		||||
				<filtering>true</filtering>
 | 
			
		||||
			</resource>
 | 
			
		||||
		</resources>
 | 
			
		||||
		<plugins>
 | 
			
		||||
			<plugin>
 | 
			
		||||
				<artifactId>maven-compiler-plugin</artifactId>
 | 
			
		||||
				<version>3.3</version>
 | 
			
		||||
				<configuration>
 | 
			
		||||
					<source>1.7</source>
 | 
			
		||||
					<target>1.7</target>
 | 
			
		||||
				</configuration>
 | 
			
		||||
			</plugin>
 | 
			
		||||
			<plugin>
 | 
			
		||||
				<groupId>org.apache.maven.plugins</groupId>
 | 
			
		||||
				<artifactId>maven-source-plugin</artifactId>
 | 
			
		||||
				<version>2.2.1</version>
 | 
			
		||||
				<executions>
 | 
			
		||||
					<execution>
 | 
			
		||||
						<id>source</id><!--指定一个名字 -->
 | 
			
		||||
						<phase>compile</phase><!--在编译阶段生成source包 -->
 | 
			
		||||
						<goals>
 | 
			
		||||
							<goal>jar</goal><!--指定生成的文件为jar包 -->
 | 
			
		||||
						</goals>
 | 
			
		||||
					</execution>
 | 
			
		||||
				</executions>
 | 
			
		||||
			</plugin>
 | 
			
		||||
			<plugin>
 | 
			
		||||
				<groupId>org.apache.maven.plugins</groupId>
 | 
			
		||||
				<artifactId>maven-javadoc-plugin</artifactId>
 | 
			
		||||
				<version>2.10.3</version>
 | 
			
		||||
				<executions>
 | 
			
		||||
					<execution>
 | 
			
		||||
						<id>javadocs</id>
 | 
			
		||||
						<phase>package</phase>
 | 
			
		||||
						<goals>
 | 
			
		||||
							<goal>jar</goal>
 | 
			
		||||
						</goals>
 | 
			
		||||
						<configuration>
 | 
			
		||||
							<failOnError>false</failOnError>
 | 
			
		||||
						</configuration>
 | 
			
		||||
					</execution>
 | 
			
		||||
				</executions>
 | 
			
		||||
			</plugin>
 | 
			
		||||
		</plugins>
 | 
			
		||||
	</build>
 | 
			
		||||
	<ciManagement>
 | 
			
		||||
		<system>Jenkins</system>
 | 
			
		||||
		<url>http://ci.yumc.pw</url>
 | 
			
		||||
	</ciManagement>
 | 
			
		||||
	<properties>
 | 
			
		||||
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 | 
			
		||||
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
 | 
			
		||||
		<env.GIT_COMMIT>开发版本</env.GIT_COMMIT>
 | 
			
		||||
	</properties>
 | 
			
		||||
	<repositories>
 | 
			
		||||
		<repository>
 | 
			
		||||
			<id>spigot-repo</id>
 | 
			
		||||
			<url>https://hub.spigotmc.org/nexus/content/groups/public/</url>
 | 
			
		||||
		</repository>
 | 
			
		||||
		<repository>
 | 
			
		||||
			<id>yumc-repo</id>
 | 
			
		||||
			<url>http://repo.yumc.pw/content/groups/public/</url>
 | 
			
		||||
		</repository>
 | 
			
		||||
	</repositories>
 | 
			
		||||
	<distributionManagement>
 | 
			
		||||
		<repository>
 | 
			
		||||
			<id>jtb</id>
 | 
			
		||||
			<name>YUMC</name>
 | 
			
		||||
			<url>http://repo.yumc.pw/content/repositories/yumcenter/</url>
 | 
			
		||||
		</repository>
 | 
			
		||||
	</distributionManagement>
 | 
			
		||||
	<dependencies>
 | 
			
		||||
		<dependency>
 | 
			
		||||
			<groupId>org.spigotmc</groupId>
 | 
			
		||||
			<artifactId>spigot-api</artifactId>
 | 
			
		||||
			<version>1.10.2-R0.1-SNAPSHOT</version>
 | 
			
		||||
		</dependency>
 | 
			
		||||
		<dependency>
 | 
			
		||||
			<groupId>net.milkbowl.vault</groupId>
 | 
			
		||||
			<artifactId>Vault</artifactId>
 | 
			
		||||
			<version>1.5.6</version>
 | 
			
		||||
		</dependency>
 | 
			
		||||
		<dependency>
 | 
			
		||||
			<groupId>org.bukkit</groupId>
 | 
			
		||||
			<artifactId>bukkit</artifactId>
 | 
			
		||||
			<version>1.7.10</version>
 | 
			
		||||
			<scope>system</scope>
 | 
			
		||||
			<systemPath>${project.basedir}/lib/craftbukkit-1.7.10.jar</systemPath>
 | 
			
		||||
		</dependency>
 | 
			
		||||
		<dependency>
 | 
			
		||||
			<groupId>com.comphenix.protocol</groupId>
 | 
			
		||||
			<artifactId>ProtocolLib</artifactId>
 | 
			
		||||
			<version>3.6.5-SNAPSHOT</version>
 | 
			
		||||
			<scope>system</scope>
 | 
			
		||||
			<systemPath>${project.basedir}/lib/ProtocolLib-3.6.5-SNAPSHOT.jar</systemPath>
 | 
			
		||||
		</dependency>
 | 
			
		||||
		<dependency> 
 | 
			
		||||
			<groupId>me.clip</groupId>
 | 
			
		||||
			<artifactId>PlaceholderAPI</artifactId>
 | 
			
		||||
			<version>1.8.6</version>
 | 
			
		||||
			<scope>system</scope>
 | 
			
		||||
			<systemPath>${project.basedir}/lib/PlaceholderAPI.jar</systemPath>
 | 
			
		||||
		</dependency>
 | 
			
		||||
	</dependencies>
 | 
			
		||||
</project>
 | 
			
		||||
							
								
								
									
										11
									
								
								src/main/java/pw/yumc/YumCore/YumCore.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								src/main/java/pw/yumc/YumCore/YumCore.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
package pw.yumc.YumCore;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * YumCore核心类库
 | 
			
		||||
 * 
 | 
			
		||||
 * @since 2016年7月23日 下午1:03:41
 | 
			
		||||
 * @author 喵♂呜
 | 
			
		||||
 */
 | 
			
		||||
public class YumCore {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										48
									
								
								src/main/java/pw/yumc/YumCore/bukkit/Log.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								src/main/java/pw/yumc/YumCore/bukkit/Log.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,48 @@
 | 
			
		||||
package pw.yumc.YumCore.bukkit;
 | 
			
		||||
 | 
			
		||||
import java.util.logging.Handler;
 | 
			
		||||
import java.util.logging.Level;
 | 
			
		||||
import java.util.logging.Logger;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 插件日志输出类
 | 
			
		||||
 *
 | 
			
		||||
 * @since 2016年7月23日 上午9:11:01
 | 
			
		||||
 * @author 喵♂呜
 | 
			
		||||
 */
 | 
			
		||||
public class Log {
 | 
			
		||||
    private static Logger logger = P.instance.getLogger();
 | 
			
		||||
 | 
			
		||||
    public static void addHandler(final Handler handler) throws SecurityException {
 | 
			
		||||
        logger.addHandler(handler);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void info(final String msg) {
 | 
			
		||||
        logger.info(msg);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void log(final Level level, final String msg) {
 | 
			
		||||
        logger.log(level, msg);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void log(final Level level, final String msg, final Object param1) {
 | 
			
		||||
        logger.log(level, msg, param1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void log(final Level level, final String msg, final Object[] params) {
 | 
			
		||||
        logger.log(level, msg, params);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void log(final Level level, final String msg, final Throwable thrown) {
 | 
			
		||||
        logger.log(level, msg, thrown);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void severe(final String msg) {
 | 
			
		||||
        logger.severe(msg);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void warning(final String msg) {
 | 
			
		||||
        logger.warning(msg);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										29
									
								
								src/main/java/pw/yumc/YumCore/bukkit/P.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								src/main/java/pw/yumc/YumCore/bukkit/P.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,29 @@
 | 
			
		||||
package pw.yumc.YumCore.bukkit;
 | 
			
		||||
 | 
			
		||||
import java.lang.reflect.Field;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.plugin.java.JavaPlugin;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 插件Instance获取类
 | 
			
		||||
 *
 | 
			
		||||
 * @since 2016年7月23日 上午9:09:57
 | 
			
		||||
 * @author 喵♂呜
 | 
			
		||||
 */
 | 
			
		||||
public class P {
 | 
			
		||||
    /**
 | 
			
		||||
     * 插件实例
 | 
			
		||||
     */
 | 
			
		||||
    public static JavaPlugin instance;
 | 
			
		||||
 | 
			
		||||
    static {
 | 
			
		||||
        final Object pluginClassLoader = P.class.getClassLoader();
 | 
			
		||||
        try {
 | 
			
		||||
            final Field field = pluginClassLoader.getClass().getDeclaredField("plugin");
 | 
			
		||||
            field.setAccessible(true);
 | 
			
		||||
            instance = (JavaPlugin) field.get(pluginClassLoader);
 | 
			
		||||
        } catch (final Exception e) {
 | 
			
		||||
            e.printStackTrace();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										96
									
								
								src/main/java/pw/yumc/YumCore/bukkit/compatible/C.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								src/main/java/pw/yumc/YumCore/bukkit/compatible/C.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,96 @@
 | 
			
		||||
package pw.yumc.YumCore.bukkit.compatible;
 | 
			
		||||
 | 
			
		||||
import java.lang.reflect.Constructor;
 | 
			
		||||
import java.lang.reflect.Method;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.Collection;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.Bukkit;
 | 
			
		||||
import org.bukkit.OfflinePlayer;
 | 
			
		||||
import org.bukkit.Server;
 | 
			
		||||
 | 
			
		||||
import com.google.common.base.Charsets;
 | 
			
		||||
 | 
			
		||||
import pw.yumc.YumCore.bukkit.Log;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Bukkit兼容类
 | 
			
		||||
 *
 | 
			
		||||
 * @since 2016年7月23日 下午1:04:56
 | 
			
		||||
 * @author 喵♂呜
 | 
			
		||||
 */
 | 
			
		||||
public class C {
 | 
			
		||||
    /**
 | 
			
		||||
     * Bukkit Player兼容类
 | 
			
		||||
     * 
 | 
			
		||||
     * @since 2016年7月23日 下午4:33:40
 | 
			
		||||
     * @author 喵♂呜
 | 
			
		||||
     */
 | 
			
		||||
    public static class Player {
 | 
			
		||||
        private static Class<?> gameProfileClass;
 | 
			
		||||
        private static Constructor<?> gameProfileConstructor;
 | 
			
		||||
        private static Constructor<?> craftOfflinePlayerConstructor;
 | 
			
		||||
 | 
			
		||||
        private static Method getOnlinePlayers;
 | 
			
		||||
 | 
			
		||||
        static {
 | 
			
		||||
            try {
 | 
			
		||||
                // getOnlinePlayers start
 | 
			
		||||
                getOnlinePlayers = Bukkit.class.getDeclaredMethod("getOnlinePlayers");
 | 
			
		||||
                if (getOnlinePlayers.getReturnType() != Player[].class) {
 | 
			
		||||
                    getOnlinePlayers = Bukkit.class.getDeclaredMethod("_INVALID_getOnlinePlayers");
 | 
			
		||||
                }
 | 
			
		||||
                // getOnlinePlayers end
 | 
			
		||||
                // getOfflinePlayer start
 | 
			
		||||
                try {
 | 
			
		||||
                    gameProfileClass = Class.forName("net.minecraft.util.com.mojang.authlib.GameProfile");
 | 
			
		||||
                } catch (final ClassNotFoundException e) {
 | 
			
		||||
                    try {
 | 
			
		||||
                        gameProfileClass = Class.forName("com.mojang.authlib.GameProfile");
 | 
			
		||||
                    } catch (final ClassNotFoundException e1) {
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                gameProfileConstructor = gameProfileClass.getDeclaredConstructor(new Class[] { UUID.class, String.class });
 | 
			
		||||
                gameProfileConstructor.setAccessible(true);
 | 
			
		||||
                final Class<? extends Server> craftServer = Bukkit.getServer().getClass();
 | 
			
		||||
                final Class<?> craftOfflinePlayer = Class.forName(craftServer.getName().replace("CraftServer", "CraftOfflinePlayer"));
 | 
			
		||||
                craftOfflinePlayerConstructor = craftOfflinePlayer.getDeclaredConstructor(new Class[] { craftServer, gameProfileClass });
 | 
			
		||||
                craftOfflinePlayerConstructor.setAccessible(true);
 | 
			
		||||
                // getOfflinePlayer end
 | 
			
		||||
            } catch (NoSuchMethodException | SecurityException | ClassNotFoundException e) {
 | 
			
		||||
                Log.warning(Player.class.getSimpleName() + "兼容性工具初始化失败 可能造成部分功能不可用!");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * 获取离线玩家(跳过网络获取)
 | 
			
		||||
         *
 | 
			
		||||
         * @param playerName
 | 
			
		||||
         *            玩家名称
 | 
			
		||||
         * @return {@link OfflinePlayer}
 | 
			
		||||
         */
 | 
			
		||||
        public static OfflinePlayer getOfflinePlayer(final String playerName) {
 | 
			
		||||
            try {
 | 
			
		||||
                final Object gameProfile = gameProfileConstructor.newInstance(new Object[] { UUID.nameUUIDFromBytes(("OfflinePlayer:" + playerName).getBytes(Charsets.UTF_8)), playerName });
 | 
			
		||||
                final Object offlinePlayer = craftOfflinePlayerConstructor.newInstance(new Object[] { Bukkit.getServer(), gameProfile });
 | 
			
		||||
                return (OfflinePlayer) offlinePlayer;
 | 
			
		||||
            } catch (final Throwable var5) {
 | 
			
		||||
                return Bukkit.getOfflinePlayer(playerName);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * 获取在线玩家
 | 
			
		||||
         *
 | 
			
		||||
         * @return 在线玩家
 | 
			
		||||
         */
 | 
			
		||||
        public static Collection<? extends org.bukkit.entity.Player> getOnlinePlayers() {
 | 
			
		||||
            try {
 | 
			
		||||
                return Arrays.asList((org.bukkit.entity.Player[]) getOnlinePlayers.invoke(null));
 | 
			
		||||
            } catch (final Throwable e) {
 | 
			
		||||
                return Bukkit.getOnlinePlayers();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										80
									
								
								src/main/java/pw/yumc/YumCore/commands/CommandArgument.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								src/main/java/pw/yumc/YumCore/commands/CommandArgument.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,80 @@
 | 
			
		||||
package pw.yumc.YumCore.commands;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.command.Command;
 | 
			
		||||
import org.bukkit.command.CommandSender;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
 | 
			
		||||
import pw.yumc.YumCore.commands.exception.IllegalPermissionException;
 | 
			
		||||
import pw.yumc.YumCore.commands.exception.IllegalSenderException;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 子命令调用事件类
 | 
			
		||||
 *
 | 
			
		||||
 * @since 2015年8月22日上午8:29:44
 | 
			
		||||
 * @author 喵♂呜
 | 
			
		||||
 */
 | 
			
		||||
public class CommandArgument {
 | 
			
		||||
    private final CommandSender sender;
 | 
			
		||||
    private final Command command;
 | 
			
		||||
    private final String alias;
 | 
			
		||||
    private final String[] args;
 | 
			
		||||
 | 
			
		||||
    public CommandArgument(final CommandSender sender, final Command command, final String alias, final String[] args) {
 | 
			
		||||
        this.sender = sender;
 | 
			
		||||
        this.command = command;
 | 
			
		||||
        this.alias = alias;
 | 
			
		||||
        this.args = args;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean check(final CommandInfo info) {
 | 
			
		||||
        if (sender instanceof Player) {
 | 
			
		||||
            if (info.getCommand().onlyConsoleExecutable()) {
 | 
			
		||||
                throw new IllegalSenderException("§c玩家无法使用此命令(§4请使用控制台执行§c)!");
 | 
			
		||||
            }
 | 
			
		||||
        } else if (info.getCommand().onlyPlayerExecutable()) {
 | 
			
		||||
            throw new IllegalSenderException("§c玩家无法使用此命令(§4请使用控制台执行§c)!");
 | 
			
		||||
        }
 | 
			
		||||
        final String perm = info.getCommand().permission();
 | 
			
		||||
        if (perm != null && !sender.hasPermission(perm)) {
 | 
			
		||||
            throw new IllegalPermissionException("§c你需要有 " + perm + " 的权限才能执行此命令!");
 | 
			
		||||
        }
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 命令别名
 | 
			
		||||
     *
 | 
			
		||||
     * @return alias
 | 
			
		||||
     */
 | 
			
		||||
    public String getAlias() {
 | 
			
		||||
        return alias;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 命令参数
 | 
			
		||||
     *
 | 
			
		||||
     * @return args
 | 
			
		||||
     */
 | 
			
		||||
    public String[] getArgs() {
 | 
			
		||||
        return args;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 命令实体
 | 
			
		||||
     *
 | 
			
		||||
     * @return command
 | 
			
		||||
     */
 | 
			
		||||
    public Command getCommand() {
 | 
			
		||||
        return command;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 命令发送者
 | 
			
		||||
     *
 | 
			
		||||
     * @return sender
 | 
			
		||||
     */
 | 
			
		||||
    public CommandSender getSender() {
 | 
			
		||||
        return sender;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										121
									
								
								src/main/java/pw/yumc/YumCore/commands/CommandHelp.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								src/main/java/pw/yumc/YumCore/commands/CommandHelp.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,121 @@
 | 
			
		||||
package pw.yumc.YumCore.commands;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.Collection;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.Comparator;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.LinkedList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.command.Command;
 | 
			
		||||
import org.bukkit.command.CommandSender;
 | 
			
		||||
import org.bukkit.plugin.Plugin;
 | 
			
		||||
 | 
			
		||||
import pw.yumc.YumCore.bukkit.P;
 | 
			
		||||
import pw.yumc.YumCore.commands.annotation.Help;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 命令帮助生成类
 | 
			
		||||
 *
 | 
			
		||||
 * @since 2016年7月23日 上午10:12:32
 | 
			
		||||
 * @author 喵♂呜
 | 
			
		||||
 */
 | 
			
		||||
public class CommandHelp {
 | 
			
		||||
    /**
 | 
			
		||||
     * 插件实例
 | 
			
		||||
     */
 | 
			
		||||
    Plugin plugin = P.instance;
 | 
			
		||||
    /**
 | 
			
		||||
     * 消息配置
 | 
			
		||||
     */
 | 
			
		||||
    String prefix = String.format("§6[§b%s§6] ", P.instance.getName());
 | 
			
		||||
    String commandNotFound = prefix + "§c当前插件未注册任何子命令!";
 | 
			
		||||
    String pageNotFound = prefix + "§c不存在的帮助页面 §b请输入 /%s help §e1-%s";
 | 
			
		||||
    String helpTitle = String.format("§6========= %s §6插件帮助列表=========", prefix);
 | 
			
		||||
    String helpBody = "§6/%1$s §a%2$s §e%3$s §6- §b%4$s";
 | 
			
		||||
    String helpFooter = "§6查看更多的帮助页面 §b请输入 /%s help §e1-%s";
 | 
			
		||||
    /**
 | 
			
		||||
     * 已排序的命令列表
 | 
			
		||||
     */
 | 
			
		||||
    List<CommandInfo> cmdlist;
 | 
			
		||||
    /**
 | 
			
		||||
     * 帮助页面数量
 | 
			
		||||
     */
 | 
			
		||||
    private final int HELPPAGECOUNT;
 | 
			
		||||
    /**
 | 
			
		||||
     * 帮助页面每页行数
 | 
			
		||||
     */
 | 
			
		||||
    private final int LINES_PER_PAGE = 7;
 | 
			
		||||
    /**
 | 
			
		||||
     * 帮助列表缓存
 | 
			
		||||
     */
 | 
			
		||||
    private final Map<String, String[]> cacheHelp = new HashMap<>();
 | 
			
		||||
 | 
			
		||||
    public CommandHelp(final Collection<? extends CommandInfo> list) {
 | 
			
		||||
        cmdlist = new LinkedList<>(list);
 | 
			
		||||
        Collections.sort(cmdlist, new CommandComparator());
 | 
			
		||||
        this.HELPPAGECOUNT = (int) Math.ceil((double) cmdlist.size() / LINES_PER_PAGE);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 发送帮助
 | 
			
		||||
     *
 | 
			
		||||
     * @param ca
 | 
			
		||||
     *            命令参数
 | 
			
		||||
     */
 | 
			
		||||
    public void send(final CommandSender sender, final Command command, final String label, final String[] args) {
 | 
			
		||||
        if (this.HELPPAGECOUNT == 0) {
 | 
			
		||||
            sender.sendMessage(commandNotFound);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        int page = 1;
 | 
			
		||||
        try {
 | 
			
		||||
            page = Integer.parseInt(args[1]);
 | 
			
		||||
            page = page == 0 ? 1 : page;
 | 
			
		||||
        } catch (final Exception e) {
 | 
			
		||||
        }
 | 
			
		||||
        final String helpkey = label + page;
 | 
			
		||||
        if (!cacheHelp.containsKey(helpkey)) {
 | 
			
		||||
            final List<String> helpList = new ArrayList<>();
 | 
			
		||||
            if (page > this.HELPPAGECOUNT || page < 1) {
 | 
			
		||||
                // 帮助页面不存在
 | 
			
		||||
                helpList.add(String.format(commandNotFound, HELPPAGECOUNT));
 | 
			
		||||
            } else {
 | 
			
		||||
                // 帮助标题
 | 
			
		||||
                helpList.add(helpTitle);
 | 
			
		||||
                final int start = this.LINES_PER_PAGE * (page - 1);
 | 
			
		||||
                final int end = start + this.LINES_PER_PAGE;
 | 
			
		||||
                for (int i = start; i < end; i++) {
 | 
			
		||||
                    if (this.cmdlist.size() > i) {
 | 
			
		||||
                        final CommandInfo ci = cmdlist.get(i);
 | 
			
		||||
                        final String aliases = Arrays.toString(ci.getCommand().aliases());
 | 
			
		||||
                        final String cmd = ci.getName() + (aliases.length() == 2 ? "" : "§7" + aliases);
 | 
			
		||||
                        final Help help = ci.getHelp();
 | 
			
		||||
                        // 帮助列表
 | 
			
		||||
                        helpList.add(String.format(helpBody, label, cmd, help.possibleArguments(), help.description()));
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            // 帮助结尾
 | 
			
		||||
            helpList.add(String.format(helpFooter, label, HELPPAGECOUNT));
 | 
			
		||||
            cacheHelp.put(helpkey, helpList.toArray(new String[0]));
 | 
			
		||||
        }
 | 
			
		||||
        sender.sendMessage(cacheHelp.get(helpkey));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 命令排序比较器
 | 
			
		||||
     *
 | 
			
		||||
     * @since 2016年7月23日 下午4:17:18
 | 
			
		||||
     * @author 喵♂呜
 | 
			
		||||
     */
 | 
			
		||||
    static class CommandComparator implements Comparator<CommandInfo> {
 | 
			
		||||
        @Override
 | 
			
		||||
        public int compare(final CommandInfo o1, final CommandInfo o2) {
 | 
			
		||||
            return Integer.valueOf(o1.getSort()).compareTo(Integer.valueOf(o2.getSort()));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										130
									
								
								src/main/java/pw/yumc/YumCore/commands/CommandInfo.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										130
									
								
								src/main/java/pw/yumc/YumCore/commands/CommandInfo.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,130 @@
 | 
			
		||||
package pw.yumc.YumCore.commands;
 | 
			
		||||
 | 
			
		||||
import java.lang.reflect.InvocationTargetException;
 | 
			
		||||
import java.lang.reflect.Method;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.Bukkit;
 | 
			
		||||
import org.bukkit.command.Command;
 | 
			
		||||
import org.bukkit.command.CommandSender;
 | 
			
		||||
 | 
			
		||||
import pw.yumc.YumCore.bukkit.P;
 | 
			
		||||
import pw.yumc.YumCore.commands.annotation.Async;
 | 
			
		||||
import pw.yumc.YumCore.commands.annotation.Cmd;
 | 
			
		||||
import pw.yumc.YumCore.commands.annotation.Help;
 | 
			
		||||
import pw.yumc.YumCore.commands.annotation.Sort;
 | 
			
		||||
import pw.yumc.YumCore.commands.exception.CommandException;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 命令信息存储类
 | 
			
		||||
 *
 | 
			
		||||
 * @since 2016年7月23日 上午9:56:42
 | 
			
		||||
 * @author 喵♂呜
 | 
			
		||||
 */
 | 
			
		||||
public class CommandInfo {
 | 
			
		||||
    public static CommandInfo Unknow = new CommandInfo();
 | 
			
		||||
    private final Object origin;
 | 
			
		||||
    private final Method method;
 | 
			
		||||
    private final String name;
 | 
			
		||||
    private final List<String> aliases;
 | 
			
		||||
    private final boolean async;
 | 
			
		||||
    private final Cmd command;
 | 
			
		||||
    private final Help help;
 | 
			
		||||
    private final int sort;
 | 
			
		||||
 | 
			
		||||
    public CommandInfo(final Method method, final Object origin, final Cmd command, final Help help, final boolean async, final int sort) {
 | 
			
		||||
        this.method = method;
 | 
			
		||||
        this.origin = origin;
 | 
			
		||||
        this.name = "".equals(command.name()) ? method.getName().toLowerCase() : command.name();
 | 
			
		||||
        this.aliases = Arrays.asList(command.aliases());
 | 
			
		||||
        this.command = command;
 | 
			
		||||
        this.help = help;
 | 
			
		||||
        this.async = async;
 | 
			
		||||
        this.sort = sort;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private CommandInfo() {
 | 
			
		||||
        this.method = null;
 | 
			
		||||
        this.origin = null;
 | 
			
		||||
        this.name = "unknow";
 | 
			
		||||
        this.aliases = null;
 | 
			
		||||
        this.command = null;
 | 
			
		||||
        this.help = null;
 | 
			
		||||
        this.async = false;
 | 
			
		||||
        this.sort = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static CommandInfo parse(final Method method, final Object origin) {
 | 
			
		||||
        final Class<?> clazz = method.getClass();
 | 
			
		||||
        final Cmd command = clazz.getAnnotation(Cmd.class);
 | 
			
		||||
        if (command != null) {
 | 
			
		||||
            final Help help = clazz.getAnnotation(Help.class);
 | 
			
		||||
            final Async async = clazz.getAnnotation(Async.class);
 | 
			
		||||
            final Sort sort = clazz.getAnnotation(Sort.class);
 | 
			
		||||
            return new CommandInfo(method, origin, command, help != null ? help : Help.DEFAULT, async != null, sort != null ? sort.sort() : 50);
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean equals(final Object obj) {
 | 
			
		||||
        if (obj instanceof CommandInfo) {
 | 
			
		||||
            return name.equalsIgnoreCase(((CommandInfo) obj).getName());
 | 
			
		||||
        }
 | 
			
		||||
        return super.equals(obj);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean execute(final CommandSender sender, final Command command, final String label, final String[] args) {
 | 
			
		||||
        if (method == null) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        final CommandArgument cmdArgs = new CommandArgument(sender, command, label, args);
 | 
			
		||||
        final Runnable runnable = new Runnable() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void run() {
 | 
			
		||||
                try {
 | 
			
		||||
                    try {
 | 
			
		||||
                        cmdArgs.check(CommandInfo.this);
 | 
			
		||||
                    } catch (final CommandException e) {
 | 
			
		||||
                        sender.sendMessage(e.getMessage());
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
                    method.invoke(origin, cmdArgs);
 | 
			
		||||
                } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
 | 
			
		||||
                    throw new CommandException(e);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
        if (async) {
 | 
			
		||||
            Bukkit.getScheduler().runTaskAsynchronously(P.instance, runnable);
 | 
			
		||||
        } else {
 | 
			
		||||
            runnable.run();
 | 
			
		||||
        }
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Cmd getCommand() {
 | 
			
		||||
        return command;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Help getHelp() {
 | 
			
		||||
        return help;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getName() {
 | 
			
		||||
        return name;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getSort() {
 | 
			
		||||
        return sort;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isAsync() {
 | 
			
		||||
        return async;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isValid(final String cmd) {
 | 
			
		||||
        return name.equalsIgnoreCase(cmd) || aliases.contains(cmd);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										198
									
								
								src/main/java/pw/yumc/YumCore/commands/CommandManager.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										198
									
								
								src/main/java/pw/yumc/YumCore/commands/CommandManager.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,198 @@
 | 
			
		||||
package pw.yumc.YumCore.commands;
 | 
			
		||||
 | 
			
		||||
import java.lang.reflect.Method;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.command.Command;
 | 
			
		||||
import org.bukkit.command.CommandSender;
 | 
			
		||||
import org.bukkit.command.PluginCommand;
 | 
			
		||||
import org.bukkit.command.TabExecutor;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
import org.bukkit.plugin.java.JavaPlugin;
 | 
			
		||||
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.api.CommandExecutor;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 命令管理类
 | 
			
		||||
 *
 | 
			
		||||
 * @since 2016年7月23日 上午9:06:03
 | 
			
		||||
 * @author 喵♂呜
 | 
			
		||||
 */
 | 
			
		||||
public class CommandManager implements TabExecutor {
 | 
			
		||||
    private final String argumentTypeError = "注解命令方法 %s 位于 %s 的参数错误 应只有 CommandArgument 参数!";
 | 
			
		||||
    private final String returnTypeError = "注解命令补全 %s 位于 %s 的返回值错误 应实现 List 接口!";
 | 
			
		||||
    /**
 | 
			
		||||
     * 插件实例类
 | 
			
		||||
     */
 | 
			
		||||
    JavaPlugin plugin = P.instance;
 | 
			
		||||
    /**
 | 
			
		||||
     * 命令列表
 | 
			
		||||
     */
 | 
			
		||||
    Set<CommandInfo> cmdlist = new HashSet<>();
 | 
			
		||||
    /**
 | 
			
		||||
     * Tab列表
 | 
			
		||||
     */
 | 
			
		||||
    Set<TabInfo> tablist = new HashSet<>();
 | 
			
		||||
    /**
 | 
			
		||||
     * 命令缓存列表
 | 
			
		||||
     */
 | 
			
		||||
    Map<String, CommandInfo> cmdcache = new HashMap<>();
 | 
			
		||||
    /**
 | 
			
		||||
     * 命令帮助
 | 
			
		||||
     */
 | 
			
		||||
    CommandHelp help = new CommandHelp(cmdlist);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 命令管理器
 | 
			
		||||
     *
 | 
			
		||||
     * @param name
 | 
			
		||||
     *            注册的命令
 | 
			
		||||
     */
 | 
			
		||||
    public CommandManager(final String name) {
 | 
			
		||||
        final PluginCommand cmd = plugin.getCommand(name);
 | 
			
		||||
        if (cmd == null) {
 | 
			
		||||
            throw new IllegalStateException("未找到命令 必须在plugin.yml先注册 " + name + " 命令!");
 | 
			
		||||
        }
 | 
			
		||||
        cmd.setExecutor(this);
 | 
			
		||||
        cmd.setTabCompleter(this);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 命令管理器
 | 
			
		||||
     *
 | 
			
		||||
     * @param name
 | 
			
		||||
     *            注册的命令
 | 
			
		||||
     * @param executor
 | 
			
		||||
     *            命令执行类
 | 
			
		||||
     */
 | 
			
		||||
    public CommandManager(final String name, final CommandExecutor executor) {
 | 
			
		||||
        this(name);
 | 
			
		||||
        registerCommands(executor);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean onCommand(final CommandSender sender, final Command command, final String label, final String[] args) {
 | 
			
		||||
        if (args.length == 0) {
 | 
			
		||||
            help.send(sender, command, label, args);
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        final String subcmd = args[0].toLowerCase();
 | 
			
		||||
        if (subcmd.equalsIgnoreCase("help")) {
 | 
			
		||||
            help.send(sender, command, label, args);
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        final String[] subargs = moveStrings(args, 1);
 | 
			
		||||
        if (!cmdcache.containsKey(label)) {
 | 
			
		||||
            for (final CommandInfo cmdinfo : cmdlist) {
 | 
			
		||||
                if (cmdinfo.isValid(label)) {
 | 
			
		||||
                    cmdcache.put(label, cmdinfo);
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            cmdcache.put(label, CommandInfo.Unknow);
 | 
			
		||||
        }
 | 
			
		||||
        return cmdcache.get(label).execute(sender, command, label, subargs);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<String> onTabComplete(final CommandSender sender, final Command command, final String alias, final String[] args) {
 | 
			
		||||
        final List<String> completions = new ArrayList<>();
 | 
			
		||||
        final String token = args[args.length - 1];
 | 
			
		||||
        if (args.length == 1) {
 | 
			
		||||
            final Set<String> commands = this.cmdcache.keySet();
 | 
			
		||||
            StringUtil.copyPartialMatches(args[0], commands, completions);
 | 
			
		||||
        } else if (args.length >= 2) {
 | 
			
		||||
            for (final TabInfo tab : tablist) {
 | 
			
		||||
                StringUtil.copyPartialMatches(token, tab.execute(sender, command, token, args), completions);
 | 
			
		||||
            }
 | 
			
		||||
            StringUtil.copyPartialMatches(token, getPlayerTabComplete(sender, command, alias, args), completions);
 | 
			
		||||
        }
 | 
			
		||||
        Collections.sort(completions, String.CASE_INSENSITIVE_ORDER);
 | 
			
		||||
        return completions;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 通过注解读取命令并注册
 | 
			
		||||
     *
 | 
			
		||||
     * @param clazz
 | 
			
		||||
     *            子命令处理类
 | 
			
		||||
     */
 | 
			
		||||
    public void registerCommands(final CommandExecutor clazz) {
 | 
			
		||||
        final Method[] methods = clazz.getClass().getDeclaredMethods();
 | 
			
		||||
        for (final Method method : methods) {
 | 
			
		||||
            final CommandInfo ci = CommandInfo.parse(method, clazz);
 | 
			
		||||
            if (ci != null) {
 | 
			
		||||
                final Class<?>[] params = method.getParameterTypes();
 | 
			
		||||
                if (params.length == 1 && params[0].equals(CommandArgument.class)) {
 | 
			
		||||
                    if (cmdlist.add(ci)) {
 | 
			
		||||
                        cmdcache.put(ci.getName(), ci);
 | 
			
		||||
                        continue;
 | 
			
		||||
                    }
 | 
			
		||||
                } else {
 | 
			
		||||
                    Log.warning(String.format(argumentTypeError, method.getName(), clazz.getClass().getName()));
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            final TabInfo ti = TabInfo.parse(method, clazz);
 | 
			
		||||
            if (ti != null) {
 | 
			
		||||
                if (!method.getReturnType().equals(List.class)) {
 | 
			
		||||
                    Log.warning(String.format(returnTypeError, method.getName(), clazz.getClass().getName()));
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
                tablist.add(ti);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        help = new CommandHelp(cmdlist);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取玩家命令补全
 | 
			
		||||
     *
 | 
			
		||||
     * @param sender
 | 
			
		||||
     *            命令发送者
 | 
			
		||||
     * @param command
 | 
			
		||||
     *            命令
 | 
			
		||||
     * @param alias
 | 
			
		||||
     *            别名
 | 
			
		||||
     * @param args
 | 
			
		||||
     *            数组
 | 
			
		||||
     * @return 在线玩家数组
 | 
			
		||||
     */
 | 
			
		||||
    private List<String> getPlayerTabComplete(final CommandSender sender, final Command command, final String alias, final String[] args) {
 | 
			
		||||
        final String lastWord = args[args.length - 1];
 | 
			
		||||
        final Player senderPlayer = sender instanceof Player ? (Player) sender : null;
 | 
			
		||||
        final ArrayList<String> matchedPlayers = new ArrayList<>();
 | 
			
		||||
        for (final Player player : C.Player.getOnlinePlayers()) {
 | 
			
		||||
            final String name = player.getName();
 | 
			
		||||
            if ((senderPlayer == null || senderPlayer.canSee(player)) && StringUtil.startsWithIgnoreCase(name, lastWord)) {
 | 
			
		||||
                matchedPlayers.add(name);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return matchedPlayers;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 转移数组
 | 
			
		||||
     *
 | 
			
		||||
     * @param args
 | 
			
		||||
     *            原数组
 | 
			
		||||
     * @param start
 | 
			
		||||
     *            数组开始位置
 | 
			
		||||
     * @return 转移后的数组字符串
 | 
			
		||||
     */
 | 
			
		||||
    private String[] moveStrings(final String[] args, final int start) {
 | 
			
		||||
        final String[] ret = new String[args.length - start];
 | 
			
		||||
        System.arraycopy(args, start, ret, 0, ret.length);
 | 
			
		||||
        return ret;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										80
									
								
								src/main/java/pw/yumc/YumCore/commands/TabInfo.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								src/main/java/pw/yumc/YumCore/commands/TabInfo.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,80 @@
 | 
			
		||||
package pw.yumc.YumCore.commands;
 | 
			
		||||
 | 
			
		||||
import java.lang.reflect.InvocationTargetException;
 | 
			
		||||
import java.lang.reflect.Method;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.command.CommandSender;
 | 
			
		||||
 | 
			
		||||
import pw.yumc.YumCore.bukkit.P;
 | 
			
		||||
import pw.yumc.YumCore.commands.annotation.Tab;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Tab补全
 | 
			
		||||
 *
 | 
			
		||||
 * @since 2016年7月23日 上午9:56:42
 | 
			
		||||
 * @author 喵♂呜
 | 
			
		||||
 */
 | 
			
		||||
public class TabInfo {
 | 
			
		||||
    private final Object origin;
 | 
			
		||||
    private final Method method;
 | 
			
		||||
 | 
			
		||||
    public TabInfo(final Method method, final Object origin) {
 | 
			
		||||
        this.method = method;
 | 
			
		||||
        this.origin = origin;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 解析TabInfo
 | 
			
		||||
     *
 | 
			
		||||
     * @param method
 | 
			
		||||
     *            方法
 | 
			
		||||
     * @param origin
 | 
			
		||||
     *            对象
 | 
			
		||||
     * @return {@link TabInfo}
 | 
			
		||||
     */
 | 
			
		||||
    public static TabInfo parse(final Method method, final Object origin) {
 | 
			
		||||
        final Class<?> clazz = method.getClass();
 | 
			
		||||
        final Tab tab = clazz.getAnnotation(Tab.class);
 | 
			
		||||
        if (tab != null) {
 | 
			
		||||
            return new TabInfo(method, origin);
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean equals(final Object obj) {
 | 
			
		||||
        if (obj instanceof TabInfo) {
 | 
			
		||||
            return method.equals(((TabInfo) obj).getMethod());
 | 
			
		||||
        }
 | 
			
		||||
        return super.equals(obj);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获得补全List
 | 
			
		||||
     *
 | 
			
		||||
     * @param sender
 | 
			
		||||
     *            发送者
 | 
			
		||||
     * @param command
 | 
			
		||||
     *            命令
 | 
			
		||||
     * @param label
 | 
			
		||||
     *            命令
 | 
			
		||||
     * @param args
 | 
			
		||||
     *            参数
 | 
			
		||||
     * @return Tab补全信息
 | 
			
		||||
     */
 | 
			
		||||
    @SuppressWarnings("unchecked")
 | 
			
		||||
    public List<String> execute(final CommandSender sender, final org.bukkit.command.Command command, final String label, final String[] args) {
 | 
			
		||||
        final CommandArgument cmdArgs = new CommandArgument(sender, command, label, args);
 | 
			
		||||
        try {
 | 
			
		||||
            return (List<String>) method.invoke(origin, cmdArgs);
 | 
			
		||||
        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
 | 
			
		||||
            throw new RuntimeException("调用Tab自动补全发生错误 请反馈给开发者 " + Arrays.toString(P.instance.getDescription().getAuthors().toArray()) + " !", e);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Method getMethod() {
 | 
			
		||||
        return method;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										18
									
								
								src/main/java/pw/yumc/YumCore/commands/annotation/Async.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								src/main/java/pw/yumc/YumCore/commands/annotation/Async.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
			
		||||
package pw.yumc.YumCore.commands.annotation;
 | 
			
		||||
 | 
			
		||||
import java.lang.annotation.ElementType;
 | 
			
		||||
import java.lang.annotation.Retention;
 | 
			
		||||
import java.lang.annotation.RetentionPolicy;
 | 
			
		||||
import java.lang.annotation.Target;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 异步命令注解
 | 
			
		||||
 * 
 | 
			
		||||
 * @since 2016年7月23日 上午9:00:27
 | 
			
		||||
 * @author 喵♂呜
 | 
			
		||||
 */
 | 
			
		||||
@Target(ElementType.METHOD)
 | 
			
		||||
@Retention(RetentionPolicy.RUNTIME)
 | 
			
		||||
public @interface Async {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										46
									
								
								src/main/java/pw/yumc/YumCore/commands/annotation/Cmd.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								src/main/java/pw/yumc/YumCore/commands/annotation/Cmd.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,46 @@
 | 
			
		||||
package pw.yumc.YumCore.commands.annotation;
 | 
			
		||||
 | 
			
		||||
import java.lang.annotation.ElementType;
 | 
			
		||||
import java.lang.annotation.Retention;
 | 
			
		||||
import java.lang.annotation.RetentionPolicy;
 | 
			
		||||
import java.lang.annotation.Target;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 命令注解
 | 
			
		||||
 *
 | 
			
		||||
 * @since 2016年7月23日 上午8:59:05
 | 
			
		||||
 * @author 喵♂呜
 | 
			
		||||
 */
 | 
			
		||||
@Target(ElementType.METHOD)
 | 
			
		||||
@Retention(RetentionPolicy.RUNTIME)
 | 
			
		||||
public @interface Cmd {
 | 
			
		||||
    /**
 | 
			
		||||
     * @return 命令别名
 | 
			
		||||
     */
 | 
			
		||||
    String[] aliases() default "";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return 命令最小参数
 | 
			
		||||
     */
 | 
			
		||||
    int minimumArguments() default 0;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return 命令名称
 | 
			
		||||
     */
 | 
			
		||||
    String name() default "";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return 只允许控制台执行
 | 
			
		||||
     */
 | 
			
		||||
    boolean onlyConsoleExecutable() default false;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return 只允许玩家执行
 | 
			
		||||
     */
 | 
			
		||||
    boolean onlyPlayerExecutable() default false;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return 当前命令权限
 | 
			
		||||
     */
 | 
			
		||||
    String permission() default "";
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										44
									
								
								src/main/java/pw/yumc/YumCore/commands/annotation/Help.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								src/main/java/pw/yumc/YumCore/commands/annotation/Help.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,44 @@
 | 
			
		||||
package pw.yumc.YumCore.commands.annotation;
 | 
			
		||||
 | 
			
		||||
import java.lang.annotation.Annotation;
 | 
			
		||||
import java.lang.annotation.ElementType;
 | 
			
		||||
import java.lang.annotation.Retention;
 | 
			
		||||
import java.lang.annotation.RetentionPolicy;
 | 
			
		||||
import java.lang.annotation.Target;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 命令帮助注解
 | 
			
		||||
 *
 | 
			
		||||
 * @since 2016年7月23日 上午9:00:07
 | 
			
		||||
 * @author 喵♂呜
 | 
			
		||||
 */
 | 
			
		||||
@Target(ElementType.METHOD)
 | 
			
		||||
@Retention(RetentionPolicy.RUNTIME)
 | 
			
		||||
public @interface Help {
 | 
			
		||||
    public static Help DEFAULT = new Help() {
 | 
			
		||||
        @Override
 | 
			
		||||
        public Class<? extends Annotation> annotationType() {
 | 
			
		||||
            return getClass();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public String description() {
 | 
			
		||||
            return "这家伙很懒";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public String possibleArguments() {
 | 
			
		||||
            return "没有帮助信息";
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return 命令描述
 | 
			
		||||
     */
 | 
			
		||||
    String description() default "无";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return 当前命令可能需要的参数
 | 
			
		||||
     */
 | 
			
		||||
    String possibleArguments() default "";
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										13
									
								
								src/main/java/pw/yumc/YumCore/commands/annotation/Sort.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								src/main/java/pw/yumc/YumCore/commands/annotation/Sort.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
			
		||||
package pw.yumc.YumCore.commands.annotation;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *
 | 
			
		||||
 * @since 2016年7月23日 上午9:04:56
 | 
			
		||||
 * @author 喵♂呜
 | 
			
		||||
 */
 | 
			
		||||
public @interface Sort {
 | 
			
		||||
    /**
 | 
			
		||||
     * @return 命令排序
 | 
			
		||||
     */
 | 
			
		||||
    int sort() default 50;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										10
									
								
								src/main/java/pw/yumc/YumCore/commands/annotation/Tab.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/main/java/pw/yumc/YumCore/commands/annotation/Tab.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
			
		||||
package pw.yumc.YumCore.commands.annotation;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 自动补全注解
 | 
			
		||||
 * 
 | 
			
		||||
 * @since 2016年7月23日 上午9:43:40
 | 
			
		||||
 * @author 喵♂呜
 | 
			
		||||
 */
 | 
			
		||||
public @interface Tab {
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,11 @@
 | 
			
		||||
package pw.yumc.YumCore.commands.api;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 命令执行类
 | 
			
		||||
 * 
 | 
			
		||||
 * @since 2016年7月23日 上午9:55:51
 | 
			
		||||
 * @author 喵♂呜
 | 
			
		||||
 */
 | 
			
		||||
public interface CommandExecutor {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,19 @@
 | 
			
		||||
package pw.yumc.YumCore.commands.exception;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 命令执行异常类
 | 
			
		||||
 *
 | 
			
		||||
 * @since 2016年7月23日 上午10:50:23
 | 
			
		||||
 * @author 喵♂呜
 | 
			
		||||
 */
 | 
			
		||||
public class CommandException extends RuntimeException {
 | 
			
		||||
 | 
			
		||||
    public CommandException(final Exception e) {
 | 
			
		||||
        super(e);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public CommandException(final String string) {
 | 
			
		||||
        super(string);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,14 @@
 | 
			
		||||
package pw.yumc.YumCore.commands.exception;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *
 | 
			
		||||
 * @since 2016年7月23日 上午11:00:34
 | 
			
		||||
 * @author 喵♂呜
 | 
			
		||||
 */
 | 
			
		||||
public class IllegalArgumentException extends CommandException {
 | 
			
		||||
 | 
			
		||||
    public IllegalArgumentException(final String string) {
 | 
			
		||||
        super(string);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,12 @@
 | 
			
		||||
package pw.yumc.YumCore.commands.exception;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *
 | 
			
		||||
 * @since 2016年7月23日 上午10:50:23
 | 
			
		||||
 * @author 喵♂呜
 | 
			
		||||
 */
 | 
			
		||||
public class IllegalPermissionException extends CommandException {
 | 
			
		||||
    public IllegalPermissionException(final String string) {
 | 
			
		||||
        super(string);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,14 @@
 | 
			
		||||
package pw.yumc.YumCore.commands.exception;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *
 | 
			
		||||
 * @since 2016年7月23日 上午11:00:34
 | 
			
		||||
 * @author 喵♂呜
 | 
			
		||||
 */
 | 
			
		||||
public class IllegalSenderException extends CommandException {
 | 
			
		||||
 | 
			
		||||
    public IllegalSenderException(final String string) {
 | 
			
		||||
        super(string);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user