diff --git a/src/cn/citycraft/CTZLoginServer/CTZLoginServer.java b/src/cn/citycraft/CTZLoginServer/CTZLoginServer.java index 4e46656..16bc8f1 100644 --- a/src/cn/citycraft/CTZLoginServer/CTZLoginServer.java +++ b/src/cn/citycraft/CTZLoginServer/CTZLoginServer.java @@ -1,5 +1,7 @@ package cn.citycraft.CTZLoginServer; +import java.util.HashMap; + import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -9,10 +11,17 @@ import org.bukkit.plugin.java.JavaPlugin; import cn.citycraft.CTZLoginServer.Socket.CTZLoginServerSocket; import cn.citycraft.CTZLoginServer.config.Config; import cn.citycraft.CTZLoginServer.listen.PlayerListen; +import cn.citycraft.CTZLoginServer.utils.MySqlHelper; public class CTZLoginServer extends JavaPlugin { public String version; + public ServerMode servermode; public CTZLoginServerSocket serversocket; + public static MySqlHelper mysql = null; + + enum ServerMode { + Main, Obey + } @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { @@ -37,7 +46,42 @@ public class CTZLoginServer extends JavaPlugin { pm.disablePlugin(this); return; } - this.onLoadLoginServer(); + if (servermode == ServerMode.Main) { + getLogger().info("主模式启动服务器..."); + this.onLoadLoginServer(); + } else { + getLogger().info("子模式启动监听器..."); + } + if (Config.getInstance().getBoolean("config.mysql.enable")) { + this.getLogger().info("已启用MySQL保存数据,开始连接数据库..."); + + // 连接数据库用到的一些参数. + String dbHost = Config.getMessage("config.mysql.ip"); + String dbPort = Config.getMessage("config.mysql.port"); + String dbName = Config.getMessage("config.mysql.database"); + String dbuserName = Config.getMessage("config.mysql.username"); + String dbpwd = Config.getMessage("config.mysql.password"); + String dbtable = Config.getMessage("config.mysql.tablename"); + mysql = new MySqlHelper(dbHost, dbPort, dbName, dbuserName, dbpwd); + if (mysql.dbConnection()) { + this.getLogger().info("数据库连接成功,检查数据表是否存在..."); + if (!mysql.isTableExists(dbtable)) { + this.getLogger().info("数据表不存在,新建表" + dbtable + "..."); + HashMap fields = new HashMap(); + fields.put("player", "VARCHAR(255) NOT NULL"); + fields.put("ip", "NOT NULL DEFAULT '127.0.0.1'"); + fields.put("islogged", "SMALLINT(6) NOT NULL DEFAULT '0'"); + String Conditions = "UNIQUE (`player`)"; + if (!mysql.createTables(dbtable, fields, Conditions)) { + this.getLogger().info("数据表" + dbtable + "创建失败,请尝试手动创建并重启服务器..."); + } + } + } else { + this.getLogger().warning("数据库连接失败!"); + pm.disablePlugin(this); + return; + } + } pm.registerEvents(new PlayerListen(), this); getLogger().info("CTZLoginServer已加载!"); } @@ -46,6 +90,10 @@ public class CTZLoginServer extends JavaPlugin { public void onLoad() { Config.load(this, "1.0"); CTZServers.Init(Config.getInstance().getConfigurationSection("areas")); + if (Config.getMessage("config.mode").equalsIgnoreCase("main")) + servermode = ServerMode.Main; + else + servermode = ServerMode.Obey; } public void onLoadLoginServer() { @@ -53,8 +101,7 @@ public class CTZLoginServer extends JavaPlugin { serversocket.ShutDown(); getLogger().info("CTZL登录服务器已关闭!"); } - serversocket = new CTZLoginServerSocket(this, Config.getInstance().getInt("config.port", - 25580)); + serversocket = new CTZLoginServerSocket(this, Config.getInstance().getInt("config.port", 25580)); this.getServer().getScheduler().runTaskAsynchronously(this, serversocket); getLogger().info("CTZL登录服务器已开启!"); } diff --git a/src/cn/citycraft/CTZLoginServer/CTZServers.java b/src/cn/citycraft/CTZLoginServer/CTZServers.java index 04b1d0f..b8d40e9 100644 --- a/src/cn/citycraft/CTZLoginServer/CTZServers.java +++ b/src/cn/citycraft/CTZLoginServer/CTZServers.java @@ -12,7 +12,13 @@ import org.bukkit.configuration.ConfigurationSection; import com.google.gson.Gson; class Area { + /** + * 大区名称 + */ String name; + /** + * 服务器信息 + */ List servers = new ArrayList(); public String getName() { @@ -33,6 +39,9 @@ class Area { } class CTZServer { + /** + * 服务器分区信息 + */ List areas = new ArrayList(); public List getAreas() { @@ -53,11 +62,21 @@ public class CTZServers { static CTZServer sl = new CTZServer(); + /** + * 获得json字符串 + * + * @return + */ public static String getJson() { Gson gson = new Gson(); return chinaToUnicode(gson.toJson(sl)); } + /** + * 初始化服务器序列化类 + * + * @param 配置类 + */ public static void Init(ConfigurationSection cs) { Set arealist = cs.getKeys(false); for (String a : arealist) { @@ -126,18 +145,39 @@ public class CTZServers { */ class Server { + /** + * 服务器名称 + */ public String name; + /** + * 服务器地址 + */ public String address; + /** + * 服务器端口 + */ public int port; + /** + * 服务器描述 + */ public String info; + /** + * 服务器版本 + */ public String version; + /** + * 版本下载地址 + */ public String url; + /** + * 依赖版本 + */ public String depend; public String getDepend() { diff --git a/src/cn/citycraft/CTZLoginServer/Socket/CTZLoginServerSocket.java b/src/cn/citycraft/CTZLoginServer/Socket/CTZLoginServerSocket.java index a1bafcb..bea25af 100644 --- a/src/cn/citycraft/CTZLoginServer/Socket/CTZLoginServerSocket.java +++ b/src/cn/citycraft/CTZLoginServer/Socket/CTZLoginServerSocket.java @@ -2,7 +2,6 @@ package cn.citycraft.CTZLoginServer.Socket; import java.io.BufferedReader; import java.io.BufferedWriter; -import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; @@ -34,8 +33,7 @@ public class CTZLoginServerSocket implements Runnable { // 用于接收客户端发来的请求 br = new BufferedReader(new InputStreamReader(client.getInputStream())); // 用于发送返回信息,可以不需要装饰这么多io流使用缓冲流时发送数据要注意调用.flush()方法 - pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter( - client.getOutputStream())), true); + pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())), true); ip = client.getInetAddress().getHostAddress(); while (true) { String str = br.readLine(); @@ -67,8 +65,7 @@ public class CTZLoginServerSocket implements Runnable { } if (API.registerPlayer(username, password)) { res.setHtml("true"); - Bukkit.getConsoleSender().sendMessage( - "§6玩家: §a" + username + " §d注册成功 IP: " + ip); + Bukkit.getConsoleSender().sendMessage("§6玩家: §a" + username + " §d注册成功 IP: " + ip); } else { res.setHtml("false"); } @@ -87,8 +84,7 @@ public class CTZLoginServerSocket implements Runnable { } else { CTZLoginQueue.add(username); } - Bukkit.getConsoleSender().sendMessage( - "§6玩家: §a" + username + " §3登录成功 IP: " + ip); + Bukkit.getConsoleSender().sendMessage("§6玩家: §a" + username + " §3登录成功 IP: " + ip); } else { res.setHtml("false"); } @@ -182,7 +178,7 @@ public class CTZLoginServerSocket implements Runnable { try { socket.close(); s.close(); - } catch (IOException e) { + } catch (Exception e) { System.out.println("CTZL服务器已关闭..."); } } diff --git a/src/cn/citycraft/CTZLoginServer/config/Config.java b/src/cn/citycraft/CTZLoginServer/config/Config.java index 45aa142..14bb259 100644 --- a/src/cn/citycraft/CTZLoginServer/config/Config.java +++ b/src/cn/citycraft/CTZLoginServer/config/Config.java @@ -1,16 +1,30 @@ package cn.citycraft.CTZLoginServer.config; +import java.io.File; +import java.io.IOException; + import org.bukkit.plugin.Plugin; public class Config extends ConfigLoader { private static String CONFIG_NAME = "config.yml"; private static FileConfig instance; + private static File file; + + public Config(Plugin p) { + super(p, CONFIG_NAME); + file = new File(p.getDataFolder(), CONFIG_NAME); + instance = super.getInstance(); + } public Config(Plugin p, String ver) { super(p, CONFIG_NAME, ver); instance = super.getInstance(); } + public static void load(Plugin p) { + new Config(p); + } + public static void load(Plugin p, String ver) { new Config(p, ver); } @@ -20,11 +34,22 @@ public class Config extends ConfigLoader { } public static String getMessage(String path) { - String message = instance.getString(path).replaceAll("&", "§"); + String message = instance.getString(path); + if (message != null) + message = message.replaceAll("&", "§"); return message; } public static String[] getStringArray(String path) { return instance.getStringList(path).toArray(new String[0]); } + + public static void save() { + try { + instance.save(file); + } catch (IOException e) { + saveError(file); + e.printStackTrace(); + } + } } diff --git a/src/cn/citycraft/CTZLoginServer/config/ConfigLoader.java b/src/cn/citycraft/CTZLoginServer/config/ConfigLoader.java index 851c5ad..2b9dd85 100644 --- a/src/cn/citycraft/CTZLoginServer/config/ConfigLoader.java +++ b/src/cn/citycraft/CTZLoginServer/config/ConfigLoader.java @@ -32,8 +32,7 @@ public class ConfigLoader extends FileConfig { public ConfigLoader(Plugin p, String filename) { ConfigLoader.plugin = p; - config = loadConfig(p, new File(p.getDataFolder(), filename), null, - true); + config = loadConfig(p, new File(p.getDataFolder(), filename), null, true); } public ConfigLoader(Plugin p, String filename, boolean res) { @@ -56,7 +55,7 @@ public class ConfigLoader extends FileConfig { } public FileConfig loadConfig(Plugin p, File file, String ver, boolean res) { - tip = res ; + tip = res; if (!file.getParentFile().exists()) { file.getParentFile().mkdirs(); p.getLogger().info("创建新的文件夹" + file.getParentFile().getAbsolutePath() + "..."); @@ -68,16 +67,23 @@ public class ConfigLoader extends FileConfig { FileConfig configcheck = init(file); String version = configcheck.getString("version"); if (version == null || !version.equals(ver)) { + p.getLogger().warning("配置文件: " + file.getName() + " 版本过低 正在升级..."); + try { + configcheck.save(new File(file.getParent(), file.getName() + ".backup")); + p.getLogger() + .warning( + "配置文件: " + file.getName() + " 已备份为 " + file.getName() + + ".backup !"); + } catch (IOException e) { + p.getLogger().warning("配置文件: " + file.getName() + "备份失败!"); + } p.saveResource(file.getName(), true); - p.getLogger().warning( - "配置文件: " + file.getName() + " 版本过低 正在升级..."); + p.getLogger().info("配置文件: " + file.getName() + "升级成功!"); } } } if (tip) - p.getLogger().info( - "载入配置文件: " + file.getName() - + (ver != null ? " 版本: " + ver : "")); + p.getLogger().info("载入配置文件: " + file.getName() + (ver != null ? " 版本: " + ver : "")); return init(file); } diff --git a/src/cn/citycraft/CTZLoginServer/config/FileConfig.java b/src/cn/citycraft/CTZLoginServer/config/FileConfig.java index cb2b309..0aefe68 100644 --- a/src/cn/citycraft/CTZLoginServer/config/FileConfig.java +++ b/src/cn/citycraft/CTZLoginServer/config/FileConfig.java @@ -27,8 +27,8 @@ import com.google.common.base.Charsets; import com.google.common.io.Files; /** - * An implementation of {@link Configuration} which saves all files in Yaml. - * Note that this implementation is not synchronized. + * An implementation of {@link Configuration} which saves all files in Yaml. Note that this + * implementation is not synchronized. */ public class FileConfig extends YamlConfiguration { @@ -51,13 +51,13 @@ public class FileConfig extends YamlConfiguration { } protected final DumperOptions yamlOptions = new DumperOptions(); + protected final Representer yamlRepresenter = new YamlRepresenter(); - protected final Yaml yaml = new Yaml(new YamlConstructor(), - yamlRepresenter, yamlOptions); + + protected final Yaml yaml = new Yaml(new YamlConstructor(), yamlRepresenter, yamlOptions); @Override - public void load(File file) throws FileNotFoundException, IOException, - InvalidConfigurationException { + public void load(File file) throws FileNotFoundException, IOException, InvalidConfigurationException { Validate.notNull(file, "File cannot be null"); final FileInputStream stream = new FileInputStream(file); load(new InputStreamReader(stream, Charsets.UTF_8)); @@ -85,8 +85,7 @@ public class FileConfig extends YamlConfiguration { Validate.notNull(file, "File cannot be null"); Files.createParentDirs(file); String data = saveToString(); - Writer writer = new OutputStreamWriter(new FileOutputStream(file), - Charsets.UTF_8); + Writer writer = new OutputStreamWriter(new FileOutputStream(file), Charsets.UTF_8); try { writer.write(data); } finally { diff --git a/src/cn/citycraft/CTZLoginServer/utils/MySqlHelper.java b/src/cn/citycraft/CTZLoginServer/utils/MySqlHelper.java new file mode 100644 index 0000000..9c7dc13 --- /dev/null +++ b/src/cn/citycraft/CTZLoginServer/utils/MySqlHelper.java @@ -0,0 +1,340 @@ +package cn.citycraft.CTZLoginServer.utils; + +/* + * 数据库连接、选择、更新、删除演示 + */ +// import java.sql.*; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +/** + * @author 蒋天蓓 + * 2015年7月14日下午3:25:06 + * 数据库操作类 + */ +public class MySqlHelper { + + // ///////////////////////////////////////———–>>>数据成员 and 构造函数 + private Connection dbconn; + private Statement dbstate; + private ResultSet dbresult; + + protected String username; + protected String password; + protected String url; + + private String driverName = "com.mysql.jdbc.Driver"; + + public MySqlHelper() { + dbconn = null; + dbstate = null; + dbresult = null; + } + + public void print(String str)// 简化输出 + { + System.out.println(str); + } + + /** + * 连接MySql数据库 + * + * @param host + * @param port + * @param dbaName + * @param usName + * @param psw + * @return bool值,连接成功返回真,失败返回假 + */ + public MySqlHelper(String host, String port, String dbaName, String usName, String password) { + try { + Class.forName(driverName).newInstance(); + } catch (Exception e) { + }// "org.gjt.mm.mysql.Driver"两个驱动都可以用 + String dbHost = host;// 数据库的一些信息 + String dbPort = port; + String dbName = dbaName; + String Encode = "?&useUnicode=true&characterEncoding=utf-8"; // 解决MySql中文问题,要连续写不能空格 + this.username = usName; + this.password = password; + this.url = "jdbc:mysql://" + dbHost + ":" + dbPort + "/" + dbName + Encode; + }// end boolean dbConnection(…) + + public boolean dbConnection() { + try { + dbconn = DriverManager.getConnection(url, username, password); + return true; + } catch (Exception e) { + print("数据库操作出错: " + e.getMessage());// 得到出错信息 + print("登录URL: " + url); // 发生错误时,将连接数据库信息打印出来 + print("登录账户: " + username); + print("登录密码: " + password); + return false; + } + } + + public boolean isTableExists(final String table) { + try { + dbConnection(); + final DatabaseMetaData dbm = dbconn.getMetaData(); + final ResultSet tables = dbm.getTables(null, null, table, null); + return tables.next(); + } catch (final SQLException e) { + e.printStackTrace(); + } + return false; + } + + public boolean createTables(String tableName, HashMap fields, String Conditions) { + dbConnection(); + String kv = ""; + for (Entry kvs : fields.entrySet()) { + kv += "`" + kvs.getKey() + "` " + kvs.getValue() + ", "; + } + if (kv.length() == 0) + return false; + kv = kv.substring(0, kv.length() - 2);// 根据String的索引提取子串 + String sql = "CREATE TABLE `" + tableName + "` ( " + kv + (Conditions == "" ? "" : " , " + Conditions) + + " ) ENGINE = InnoDB DEFAULT CHARSET=UTF8"; + try { + PreparedStatement state = dbconn.prepareStatement(sql); + state.executeUpdate(); + state.close(); + return true; + } catch (final Exception e) { + print("数据库操作出错: " + e.getMessage()); + print("SQL查询语句: " + sql); + } + return false; + } + + /** + * 判断数据库某个值是否存在! + * + * @param tableName + * 数据库表名 + * @param fieles + * 字段名 + * @param selCondition + * 选择条件 + * @return 首个符合条件的结果 + */ + public boolean dbExist(String tableName, HashMap selConditions) { + dbConnection(); + String selCondition = ""; + if (selConditions != null && !selConditions.isEmpty()) { + for (Entry kvs : selConditions.entrySet()) { + selCondition += kvs.getKey() + "='" + kvs.getValue() + "', "; + } + selCondition = " WHERE " + selCondition.substring(0, selCondition.length() - 2);// 根据String的索引提取子串 + } + String sql = "SELECT * FROM " + tableName + selCondition; + try { + dbstate = dbconn.createStatement(); + dbresult = dbstate.executeQuery(sql); + return dbresult.next(); + } catch (Exception e) { + print("数据库操作出错: " + e.getMessage()); + print("SQL查询语句: " + sql); + } + return false; + } + + /** + * 对数据库表进行选择操作! + * + * @param tableName + * 数据库表名 + * @param fieles + * 字段名 + * @param selCondition + * 选择条件 + * @return 首个符合条件的结果 + */ + public String dbSelectFirst(String tableName, String fields, HashMap selConditions) { + dbConnection(); + String selFieldsTem = fields; + String selCondition = ""; + if (selConditions != null && !selConditions.isEmpty()) { + for (Entry kvs : selConditions.entrySet()) { + selCondition += kvs.getKey() + "='" + kvs.getValue() + "', "; + } + selCondition = " WHERE " + selCondition.substring(0, selCondition.length() - 2);// 根据String的索引提取子串 + } + String sql = "SELECT " + selFieldsTem + " FROM " + tableName + selCondition + " limit 1"; + try { + dbstate = dbconn.createStatement(); + dbresult = dbstate.executeQuery(sql); + if (dbresult.next()) { + return dbresult.getString(fields); + } + } catch (Exception e) { + print("数据库操作出错: " + e.getMessage()); + print("SQL查询语句: " + sql); + } + return null; + } + + /** + * 对数据库表进行选择操作! + * + * @param tableName + * 数据库表名 + * @param fieles + * 字段名 + * @param selCondition + * 选择条件 + * @return 一个含有map的List(列表) + */ + @SuppressWarnings({ + "rawtypes", + "unchecked" + }) + public List dbSelect(String tableName, List fields, String selCondition) { + dbConnection(); + List mapInList = new ArrayList(); + String selFields = ""; + for (int i = 0; i < fields.size(); ++i) + selFields += fields.get(i) + ", "; + String selFieldsTem = selFields.substring(0, selFields.length() - 2);// 根据String的索引提取子串 + String sql = "SELECT " + selFieldsTem + " FROM `" + tableName + "`" + selCondition == "" ? "" : " WHERE " + selCondition; + try { + dbstate = dbconn.createStatement(); + try { + dbresult = dbstate.executeQuery(sql); + } catch (Exception e) { + print("数据库操作出错: " + e.getMessage()); + print("SQL查询语句: " + sql); + } + while (dbresult.next()) { + Map selResult = new HashMap(); + for (String col : fields) { + selResult.put(col, dbresult.getString(col)); + } + mapInList.add(selResult); + } + } catch (Exception e) { + print("数据库操作出错: " + e.getMessage()); + print("SQL查询语句: " + sql); + } + return mapInList; + }// end String dbSelect(…) + + /** + * 对数据库表中的记录进行删除操作 + * + * @param tableName + * @param condition + * @return bool值,表示删除成功或者失败。 + */ + public boolean dbDelete(String tableName, HashMap selConditions) {// ——–>>>删除操作 + dbConnection(); + String selCondition = ""; + if (selConditions != null && !selConditions.isEmpty()) { + for (Entry kvs : selConditions.entrySet()) { + selCondition += kvs.getKey() + "='" + kvs.getValue() + "', "; + } + selCondition = " WHERE " + selCondition.substring(0, selCondition.length() - 2);// 根据String的索引提取子串 + } + String sql = "DELETE FROM `" + tableName + "` " + selCondition; + try { + dbstate.executeUpdate(sql); + return true; + } catch (Exception e) { + print("数据库操作出错: " + e.getMessage()); + print("SQL查询语句: " + sql); + return false; + } + }// end dbDelete(…) + + /** + * 对数据库表中记录进行更新操作 + * + * @param tabName + * @param reCount + * @return bool值,成功返回true,失败返回false + */ + @SuppressWarnings({ + "rawtypes" + }) + public boolean dbUpdate(String tabName, HashMap reCount, String upCondition) { + dbConnection(); + String Values = ""; + Iterator keyValues = reCount.entrySet().iterator(); + for (int i = 0; i < reCount.size(); ++i) { + Map.Entry entry = (Map.Entry) keyValues.next(); + Object key = entry.getKey(); + Object value = entry.getValue(); + Values += key + "='" + value + "'" + ", "; + } + String updateValues = Values.substring(0, Values.length() - 2); + String sql = "UPDATE `" + tabName + "` SET " + updateValues + " " + upCondition; + try { + dbstate.executeUpdate(sql); + return true; + } catch (Exception e) { + print("数据库操作出错: " + e.getMessage()); + print("SQL查询语句: " + sql); + return false; + } + }// end dbUpdate(…) + + /** + * 对数据库表进行插入操作 + * + * @param tabName + * - 表名 + * @param values + * - 带键值的HashMap + * @return bool值,成功返回true,失败返回false + */ + public boolean dbInsert(String tabName, HashMap values) { + dbConnection(); + String sql = ""; + String insertFields = ""; + String insertValues = ""; + for (Entry kvs : values.entrySet()) { + insertFields += "`" + kvs.getKey() + "`, "; + insertValues += "'" + kvs.getValue() + "', "; + } + insertFields = insertFields.substring(0, insertFields.length() - 2); + insertValues = insertValues.substring(0, insertValues.length() - 2); + sql += "INSERT INTO `" + tabName + "` (" + insertFields + ") VALUES" + "(" + insertValues + ")"; + try { + dbstate.executeUpdate(sql); + return true; + } catch (Exception e) { + print("数据库操作出错: " + e.getMessage()); + print("SQL查询语句: " + sql); + return false; + } + + }// end dbInsert(…) + + /** + * 断开数据库 + * + * @return bool值,成功返回true,失败返回false + */ + public boolean dbClose() { + try { + dbconn.close(); + return true; + } catch (Exception e) { + print("数据库操作出错: " + e.getMessage()); + return false; + } + }// end dbClose() + +} diff --git a/src/config.yml b/src/config.yml index c851a9a..c74a8d7 100644 --- a/src/config.yml +++ b/src/config.yml @@ -8,12 +8,28 @@ pluginname: '&6[&bCTZL&6]&r' tipplayer: true #服务器配置 config: + #服务器模式[main(主服模式)|obey(子服模式)] + mode: main #服务器监听端口 port: 25580 #断线重连超时 timeout: 10 #强制使用专用客户端(关闭则可以同时使用自带登录和外部登录) forceclient: true + mysql: + enable: true + #数据库需要自行建立 + database: minecraft + #数据表 + tablename: ctzloginserver + #用户名 + username: root + #密码 + password: + #地址 + ip: localhost + #端口 + port: 3306 areas: 1: name: '纯净大区' @@ -21,18 +37,18 @@ areas: 1: name: "InfinityZone" address: "four.mengcraft.com" - port: 25565 + port: 11133 info: "InfinityZone \u000d 稳定 声誉 生存 地皮 小游戏" depend: "1.8" version: "1.8-Forge" - url: "CityCraft.cn" + url: "four.mengcraft.com" 2: name: '模组大区' servers: 1: - name: "光板小镇" + name: "光坂小镇" address: "CityCraft.cn" - port: 25573 + port: 25565 info: "MOD服务器: 豆腐 家具 " depend: "" version: "1.7.10-Forge" diff --git a/src/plugin.yml b/src/plugin.yml index e0fb0d7..cf9d998 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -1,7 +1,7 @@ name: CTZLoginServer main: cn.citycraft.CTZLoginServer.CTZLoginServer -version: 0.0.1 -depend: [AuthMe] +version: 1.0 +softdepend: [AuthMe] commands: ctzl: description: CTZLoginServer Reload.