diff --git a/pom.xml b/pom.xml index 11a7b53..e828ff3 100644 --- a/pom.xml +++ b/pom.xml @@ -135,5 +135,10 @@ ProtocolLib 4.2.1-SNAPSHOT + + com.sk89q.worldedit + worldedit-bukkit + 6.1.5 + \ No newline at end of file diff --git a/src/main/java/pw/yumc/YumCore/config/inject/AbstractInjectConfig.java b/src/main/java/pw/yumc/YumCore/config/inject/AbstractInjectConfig.java index 7749b4e..b025b75 100644 --- a/src/main/java/pw/yumc/YumCore/config/inject/AbstractInjectConfig.java +++ b/src/main/java/pw/yumc/YumCore/config/inject/AbstractInjectConfig.java @@ -26,7 +26,7 @@ public abstract class AbstractInjectConfig { private static String INJECT_TYPE_ERROR = "配置节点 %s 数据类型不匹配 应该为: %s 但实际为: %s!"; private static String INJECT_ERROR = "自动注入配置失败 可能造成插件运行错误 %s: %s!"; private static String PATH_NOT_FOUND = "配置节点 %s 丢失 将使用默认值!"; - private ConfigurationSection config; + protected ConfigurationSection config; /** * 添加默认值 @@ -243,4 +243,8 @@ public abstract class AbstractInjectConfig { Log.d(ex); } } + + public ConfigurationSection getConfig() { + return config; + } } diff --git a/src/main/java/pw/yumc/YumCore/config/inject/InjectConfig.java b/src/main/java/pw/yumc/YumCore/config/inject/InjectConfig.java index 8be5449..4aa554b 100644 --- a/src/main/java/pw/yumc/YumCore/config/inject/InjectConfig.java +++ b/src/main/java/pw/yumc/YumCore/config/inject/InjectConfig.java @@ -1,9 +1,9 @@ package pw.yumc.YumCore.config.inject; -import pw.yumc.YumCore.config.FileConfig; - import java.io.File; +import pw.yumc.YumCore.config.FileConfig; + /** * 配置自动载入类 * @@ -11,8 +11,6 @@ import java.io.File; * @author 喵♂呜 */ public abstract class InjectConfig extends AbstractInjectConfig { - protected FileConfig config; - public InjectConfig() { this(new FileConfig()); } @@ -22,7 +20,6 @@ public abstract class InjectConfig extends AbstractInjectConfig { } public InjectConfig(FileConfig config) { - this.config = config; inject(config); } @@ -36,14 +33,14 @@ public abstract class InjectConfig extends AbstractInjectConfig { * @return 配置文件 */ public FileConfig getConfig() { - return config; + return (FileConfig) config; } /** * 重载配置文件 */ public void reload() { - config.reload(); + getConfig().reload(); inject(config); } @@ -52,6 +49,6 @@ public abstract class InjectConfig extends AbstractInjectConfig { */ public void save() { save(config); - config.save(); + getConfig().save(); } } diff --git a/src/main/java/pw/yumc/YumCore/mc/MinecraftTools.java b/src/main/java/pw/yumc/YumCore/mc/MinecraftTools.java new file mode 100644 index 0000000..b7cab3d --- /dev/null +++ b/src/main/java/pw/yumc/YumCore/mc/MinecraftTools.java @@ -0,0 +1,25 @@ +package pw.yumc.YumCore.mc; + +/** + * Minecraft工具类 + * + * @author 喵♂呜 + * @since 2017/1/26 0026 + */ +public class MinecraftTools { + /** + * 获得服务器信息 + * + * @param address + * 服务器地址 + * @return {@link ServerInfo} 服务器信息 + */ + public static ServerInfo getServerInfo(String address) { + if (address.contains(":")) { + String[] args = address.split(":"); + return new ServerInfo(args[0], Integer.parseInt(args[1])); + } else { + return new ServerInfo(address); + } + } +} diff --git a/src/main/java/pw/yumc/YumCore/mc/ServerInfo.java b/src/main/java/pw/yumc/YumCore/mc/ServerInfo.java new file mode 100644 index 0000000..496d975 --- /dev/null +++ b/src/main/java/pw/yumc/YumCore/mc/ServerInfo.java @@ -0,0 +1,165 @@ +package pw.yumc.YumCore.mc; + +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.nio.charset.Charset; + +/** + * Minecraft服务器数据获取类 + * + * @author 喵♂呜 + * @since 2017/1/26 0026 + */ +public class ServerInfo { + private String address = "localhost"; + private int port = 25565; + private int timeout = 1500; + private int pingVersion = -1; + private int protocolVersion = -1; + private String gameVersion = "初始化中..."; + private String motd = "初始化中..."; + private int playersOnline = -1; + private int maxPlayers = -1; + + /** + * Minecraft服务器数据获取类 + * + * @param address + * 服务器地址 默认端口25565 + */ + public ServerInfo(String address) { + this(address, 25565); + } + + /** + * Minecraft服务器数据获取类 + * + * @param address + * 服务器地址 + * @param port + * 服务器端口 + */ + public ServerInfo(String address, int port) { + this.address = address; + this.port = port; + } + + /** + * 获取服务器数据 + * + * @return 是否获取成功 + */ + public boolean fetchData() { + try { + Socket socket = new Socket(); + OutputStream outputStream; + DataOutputStream dataOutputStream; + InputStream inputStream; + InputStreamReader inputStreamReader; + + socket.setSoTimeout(this.timeout); + + socket.connect(new InetSocketAddress(this.getAddress(), this.getPort()), this.getTimeout()); + + outputStream = socket.getOutputStream(); + dataOutputStream = new DataOutputStream(outputStream); + + inputStream = socket.getInputStream(); + inputStreamReader = new InputStreamReader(inputStream, Charset.forName("UTF-16BE")); + + dataOutputStream.write(new byte[] { (byte) 0xFE, (byte) 0x01 }); + + int packetId = inputStream.read(); + + if (packetId == -1) { throw new IOException("Premature end of stream."); } + + if (packetId != 0xFF) { throw new IOException("Invalid packet ID (" + packetId + ")."); } + + int length = inputStreamReader.read(); + + if (length == -1) { throw new IOException("Premature end of stream."); } + + if (length == 0) { throw new IOException("Invalid string length."); } + + char[] chars = new char[length]; + + if (inputStreamReader.read(chars, 0, length) != length) { throw new IOException("Premature end of stream."); } + + String string = new String(chars); + + if (string.startsWith("§")) { + String[] data = string.split("\0"); + this.pingVersion = Integer.parseInt(data[0].substring(1)); + this.protocolVersion = Integer.parseInt(data[1]); + this.gameVersion = data[2]; + this.motd = data[3]; + this.playersOnline = Integer.parseInt(data[4]); + this.maxPlayers = Integer.parseInt(data[5]); + } else { + String[] data = string.split("§"); + this.motd = data[0]; + this.playersOnline = Integer.parseInt(data[1]); + this.maxPlayers = Integer.parseInt(data[2]); + } + + dataOutputStream.close(); + outputStream.close(); + + inputStreamReader.close(); + inputStream.close(); + + socket.close(); + } catch (IOException exception) { + gameVersion = "获取失败!"; + motd = "获取失败!"; + return false; + } + return true; + } + + public String getAddress() { + return this.address; + } + + public int getPort() { + return this.port; + } + + public void setTimeout(int timeout) { + this.timeout = timeout; + } + + public int getTimeout() { + return this.timeout; + } + + public int getPingVersion() { + return this.pingVersion; + } + + public int getProtocolVersion() { + return this.protocolVersion; + } + + public String getGameVersion() { + return this.gameVersion; + } + + public String getMotd() { + return this.motd; + } + + public int getPlayersOnline() { + return this.playersOnline; + } + + public int getMaxPlayers() { + return this.maxPlayers; + } + +} diff --git a/src/main/java/pw/yumc/YumCore/text/Scroller.java b/src/main/java/pw/yumc/YumCore/text/Scroller.java new file mode 100644 index 0000000..5e35410 --- /dev/null +++ b/src/main/java/pw/yumc/YumCore/text/Scroller.java @@ -0,0 +1,133 @@ +package pw.yumc.YumCore.text; + +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.ChatColor; + +/** + * 字符串滚动工具 + * + * @since 2016年6月7日 下午2:22:12 + * @author 喵♂呜 + */ +public class Scroller { + private static final char COLOUR_CHAR = '\u00A7'; + private String content; + private int position; + private final List list = new ArrayList<>(); + private ChatColor colour; + + /** + * @param text + * 需要显示的字符串 + */ + public Scroller(final String text) { + this(text, 16); + } + + /** + * @param text + * 需要显示的字符串 + * @param size + * 每次显示长度 + */ + public Scroller(final String text, final int size) { + this(text, size, 1); + } + + /** + * @param text + * 需要显示的字符串 + * @param size + * 每次显示长度 + * @param skip + * 每次滚动长度 + */ + public Scroller(final String text, final int size, final int skip) { + this(text, size, skip, '&'); + } + + /** + * @param text + * 需要显示的字符串 + * @param size + * 每次显示长度 + * @param skip + * 每次滚动长度 + * @param colorChar + * 颜色字符串 + */ + public Scroller(String text, int size, int skip, final char colorChar) { + this.colour = ChatColor.RESET; + StringBuilder result; + if (text.length() < size) { + result = new StringBuilder(text); + while (result.length() < size) { + result.append(" "); + } + text = result.toString(); + } + size -= 2; + if (size < 1) { + size = 1; + } + if (skip < 0) { + skip = 0; + } + if (colorChar != COLOUR_CHAR) { + text = ChatColor.translateAlternateColorCodes(colorChar, text); + } + for (int i = 0; i < text.length() - size; ++i) { + this.list.add(text.substring(i, i + size)); + } + result = new StringBuilder(); + for (int i = 0; i < skip; ++i) { + System.out.println(i); + list.add(text.substring(text.length() - size + (i > size ? size : i), text.length()) + result); + if (result.length() < size) { + result.append(" "); + } + } + for (int i = 0; i < size - skip; ++i) { + System.out.println(i); + list.add(text.substring(text.length() - size + skip + i, text.length()) + result + text.substring(0, i)); + } + for (int i = 0; i < skip && i <= result.length(); ++i) { + System.out.println(i); + list.add(result.substring(0, result.length() - i) + text.substring(0, size - (skip > size ? size : skip) + i)); + } + } + + /** + * 获得下一条显示的字符串 + * + * @return 字符串 + */ + public String next() { + StringBuilder result = this.getNext(); + if (result.charAt(result.length() - 1) == COLOUR_CHAR) { + result.setCharAt(result.length() - 1, ' '); + } + if (result.charAt(0) == COLOUR_CHAR) { + final ChatColor var2 = ChatColor.getByChar(result.charAt(1)); + if (var2 != null) { + colour = var2; + result = getNext(); + if (result.charAt(0) != 32) { + result.setCharAt(0, ' '); + } + } + } + return colour + result.toString(); + } + + /** + * 从List获得下一条字符串 + * + * @return 字符串 + */ + private StringBuilder getNext() { + return new StringBuilder(this.list.get(this.position++ % this.list.size())); + } +}