diff --git a/2b2t-core/pom.xml b/2b2t-core/pom.xml
index ca83c1e..bb6c2ad 100644
--- a/2b2t-core/pom.xml
+++ b/2b2t-core/pom.xml
@@ -56,6 +56,12 @@
${basedir}/../_lib/spigot.jar
system
+
+ org.cn2b2t
+ 2b2t-proxy
+ 1.0-SNAPSHOT
+ compile
+
diff --git a/2b2t-core/src/main/java/org.cn2b2t.core/Main.java b/2b2t-core/src/main/java/org.cn2b2t.core/Main.java
index 777fe80..279a837 100644
--- a/2b2t-core/src/main/java/org.cn2b2t.core/Main.java
+++ b/2b2t-core/src/main/java/org.cn2b2t.core/Main.java
@@ -9,7 +9,10 @@ import org.cn2b2t.core.commands.Kar;
import org.cn2b2t.core.listener.JoinListener;
import org.cn2b2t.core.listener.TabCompleteListener;
import org.cn2b2t.core.managers.users.UserValueManager;
-import org.cn2b2t.core.managers.utils.*;
+import org.cn2b2t.core.managers.utils.ConfigManager;
+import org.cn2b2t.core.managers.utils.DataManager;
+import org.cn2b2t.core.managers.utils.MessagerManager;
+import org.cn2b2t.core.managers.utils.ServersManager;
import org.cn2b2t.core.utils.ColorParser;
import java.util.logging.Level;
@@ -38,6 +41,15 @@ public class Main extends JavaPlugin {
//
log("&7├ &f启用跨服管理器...");
ServersManager.init();
+ if (Main.getInstance().getConfig().getBoolean("Servers.auto-register", true)) {
+ log("&7├ &f检测到启用自动注册,即将尝试向 SYSTEM.CONENCTION 注册。");
+ ServersManager.registerServer(
+ "single-" + Integer.toHexString(Bukkit.getPort()),
+ (Bukkit.getServer().getIp() == null || Bukkit.getServer().getIp().equalsIgnoreCase("") ? "127.0.0.1" : Bukkit.getServer().getIp()),
+ Bukkit.getPort(),
+ "cn2b2t"
+ );
+ }
log("&7├ &f启用用户Value管理器....");
UserValueManager.init();
diff --git a/2b2t-core/src/main/java/org.cn2b2t.core/listener/ServersUpdateListener.java b/2b2t-core/src/main/java/org.cn2b2t.core/listener/ServersUpdateListener.java
new file mode 100644
index 0000000..4365690
--- /dev/null
+++ b/2b2t-core/src/main/java/org.cn2b2t.core/listener/ServersUpdateListener.java
@@ -0,0 +1,38 @@
+package org.cn2b2t.core.listener;
+
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerJoinEvent;
+import org.bukkit.event.player.PlayerQuitEvent;
+import org.bukkit.scheduler.BukkitRunnable;
+import org.cn2b2t.core.Main;
+import org.cn2b2t.core.managers.utils.ServersManager;
+
+public class ServersUpdateListener implements Listener {
+
+
+ @EventHandler
+ public static void onJoin(PlayerJoinEvent e) {
+ if (ServersManager.getLocalRegisteredServer() != null) {
+ new BukkitRunnable() {
+ @Override
+ public void run() {
+ ServersManager.getLocalRegisteredServer().writeInfo();
+ }
+ }.runTaskLaterAsynchronously(Main.getInstance(), 10L);
+ }
+ }
+
+ @EventHandler
+ public static void onQuit(PlayerQuitEvent e) {
+ ServersManager.requests.remove(e.getPlayer());
+ if (ServersManager.getLocalRegisteredServer() != null) {
+ new BukkitRunnable() {
+ @Override
+ public void run() {
+ ServersManager.getLocalRegisteredServer().writeInfo();
+ }
+ }.runTaskLaterAsynchronously(Main.getInstance(), 10L);
+ }
+ }
+}
diff --git a/2b2t-core/src/main/java/org.cn2b2t.core/managers/utils/DataManager.java b/2b2t-core/src/main/java/org.cn2b2t.core/managers/utils/DataManager.java
index be0d37b..8719f79 100644
--- a/2b2t-core/src/main/java/org.cn2b2t.core/managers/utils/DataManager.java
+++ b/2b2t-core/src/main/java/org.cn2b2t.core/managers/utils/DataManager.java
@@ -6,22 +6,38 @@ import org.cn2b2t.core.managers.utils.database.Connection;
public class DataManager {
private static Connection connection;
+ private static Connection tempConnection;
public static void init() {
connection = new Connection(
ConfigManager.config.getString("Database.host", "127.0.0.1"),
ConfigManager.config.getInt("Database.port", 3306),
- ConfigManager.config.getString("Database.data", "guiying"),
- ConfigManager.config.getString("Database.user", "guiying"),
- ConfigManager.config.getString("Database.password", "guiying"));
+ ConfigManager.config.getString("Database.data", "moci"),
+ ConfigManager.config.getString("Database.user", "moci"),
+ ConfigManager.config.getString("Database.password", "moci"));
+ tempConnection = new Connection(
+ ConfigManager.config.getString("Database.host", "127.0.0.1"),
+ ConfigManager.config.getInt("Database.port", 3306),
+ ConfigManager.config.getString("Database.tempdata", "temp"),
+ ConfigManager.config.getString("Database.user", "moci"),
+ ConfigManager.config.getString("Database.password", "moci"));
if (connection.connect()) {
Main.log("&7├ └ &a数据库连接成功!");
} else {
Main.log("&7├ └ &c数据库连接失败!");
}
+ if (tempConnection.connect()) {
+ Main.log("&7├ └ &a临时数据库连接成功!");
+ } else {
+ Main.log("&7├ └ &c临时数据库连接失败!");
+ }
}
+ public static Connection getTempConnection() {
+ return tempConnection;
+ }
+
public static Connection getConnection() {
return connection;
}
diff --git a/2b2t-core/src/main/java/org.cn2b2t.core/managers/utils/ServersManager.java b/2b2t-core/src/main/java/org.cn2b2t.core/managers/utils/ServersManager.java
index 25955b0..2875cc6 100644
--- a/2b2t-core/src/main/java/org.cn2b2t.core/managers/utils/ServersManager.java
+++ b/2b2t-core/src/main/java/org.cn2b2t.core/managers/utils/ServersManager.java
@@ -4,68 +4,114 @@ import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
import org.cn2b2t.core.Main;
-import org.cn2b2t.core.managers.users.UserValueManager;
+import org.cn2b2t.core.listener.ServersUpdateListener;
+import org.cn2b2t.core.modules.DataServerInfo;
+import org.cn2b2t.core.modules.LocalServerInfo;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
+import java.sql.ResultSet;
+import java.sql.SQLException;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
-public class ServersManager
-// implements PluginMessageListener
-{
-
+public class ServersManager {
public static List requests = new ArrayList<>();
- public static List allPlayers = new ArrayList<>();
+
+ public static String databaseTable = "game_servers";
+ public static String messageChannel = "serversmanager";
+
+ private static LocalServerInfo localRegisteredServer;
+
+ private static Map dataServers = new HashMap<>();
+
+ private static BukkitRunnable updateRunnable;
public static void init() {
- Main.getInstance().getServer().getMessenger().registerOutgoingPluginChannel(Main.getInstance(), "BungeeCord");
- Bukkit.getMessenger().registerOutgoingPluginChannel(Main.getInstance(), "BeeSwitch");
-// Core.getInstance().getServer().getMessenger().registerIncomingPluginChannel(Core.getInstance(), "BungeeCord", new ServersManager());
-// new BukkitRunnable() {
-// @Override
-// public void run() {
-// if (Bukkit.getOnlinePlayers().size() < 1) return;
-// sendGetPlayerList();
-//
-// }
-// }.runTaskTimer(Core.getInstance(), 60L, 200L);
+ Main.regListener(new ServersUpdateListener());
+
+
+
+ updateRunnable = new BukkitRunnable() {
+ @Override
+ public void run() {
+ if (Bukkit.getOnlinePlayers().size() > 0) updateDataServers();
+ }
+ };
+
+ getUpdateRunnable().runTaskTimer(Main.getInstance(), 20L, 100L);
}
-// public static void sendGetPlayerList() {
-// ByteArrayOutputStream b = new ByteArrayOutputStream();
-// DataOutputStream out = new DataOutputStream(b);
-// try {
-// out.writeUTF("PlayerList");
-// out.writeUTF("ALL");
-// } catch (IOException ex) {
-// Logger.getLogger(Core.class.getName()).log(Level.SEVERE, null, ex);
-// }
-// Player player = Iterables.getFirst(Bukkit.getOnlinePlayers(), null);
-// if (player != null) {
-// player.sendPluginMessage(Core.getInstance(), "BungeeCord", b.toByteArray());
-// }
-// }
-//
-// @Override
-// public void onPluginMessageReceived(String tag, Player player, byte[] data) {
-// if (!tag.equals("BungeeCord")) return;
-//
-// ByteArrayDataInput in = ByteStreams.newDataInput(data);
-// String server = in.readUTF();
-//
-// if (server.equals("ALL")) {
-// String[] players = in.readUTF().split(", ");
-// allPlayers = Arrays.stream(players).collect(Collectors.toList());
-// } else {
-// return;
-// }
-// }
+ public static void registerServer(String serverID, String hostName, int port, String serverGroup) {
+ localRegisteredServer = new LocalServerInfo(serverID, hostName, port, serverGroup);
+ localRegisteredServer.register();
+ }
+
+ public static void unregisterServer() {
+ if (getLocalRegisteredServer() != null) {
+ getLocalRegisteredServer().unregister();
+ localRegisteredServer = null;
+ }
+ }
+
+ public static void updateDataServers() {
+ Map tempDataServers = new HashMap<>();
+ ResultSet rs = DataManager.getConnection().SQLqueryInTable(ServersManager.databaseTable);
+ try {
+ if (rs != null) {
+ while (rs.next()) {
+ String serverID = rs.getString("serverid");
+ String hostName = rs.getString("hostname");
+ String serverGroup = rs.getString("servergroup");
+ int players = rs.getInt("players");
+ int port = rs.getInt("port");
+ tempDataServers.put(serverID, new DataServerInfo(serverID, hostName, port, serverGroup, players));
+ }
+ rs.close();
+ }
+ } catch (SQLException e) {
+ DataManager.getConnection().info(e.getLocalizedMessage());
+ Bukkit.getLogger().log(Level.WARNING, "code: {0}", rs);
+ }
+ dataServers = tempDataServers;
+ }
+
+ public static Map getDataServers() {
+ return dataServers;
+ }
+
+ public static Integer getPlayers(String serverName) {
+ return getPlayers(serverName, false);
+ }
+
+ public static Integer getPlayers(String server, boolean isGroup) {
+ if (server.equalsIgnoreCase("#ALL") || server.equalsIgnoreCase("#AII")) {
+ return getDataServers().keySet().stream()
+ .mapToInt(s -> getDataServers().getOrDefault(s, new DataServerInfo(null, null, -1, null, 0)).getPlayers())
+ .sum();
+ } else {
+ if (isGroup) {
+ return getDataServers().keySet().stream()
+ .filter(s -> getDataServers().get(s).getServerGroup().equalsIgnoreCase(server))
+ .mapToInt(s -> getDataServers().getOrDefault(s, new DataServerInfo(null, null, -1, null, 0)).getPlayers())
+ .sum();
+ } else {
+ return getDataServers().getOrDefault(server, new DataServerInfo(null, null, -1, null, 0)).getPlayers();
+ }
+ }
+
+ }
+
+ public static BukkitRunnable getUpdateRunnable() {
+ return updateRunnable;
+ }
public static void teleport(Player p, String server) {
ByteArrayOutputStream b = new ByteArrayOutputStream();
@@ -73,6 +119,7 @@ public class ServersManager
try {
out.writeUTF("ConnectOther");
out.writeUTF(p.getName());
+// out.writeUTF("Connect");
out.writeUTF(server);
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
@@ -80,33 +127,73 @@ public class ServersManager
p.sendPluginMessage(Main.getInstance(), "BungeeCord", b.toByteArray());
}
- public static void teleport(Player player, String server, int t) {
- requests.add(player);
+ public static void teleport(Player p, String server, int t) {
+ requests.add(p);
new BukkitRunnable() {
@Override
public void run() {
- if (requests.contains(player) && player.isOnline()) {
- teleport(player, server);
- requests.remove(player);
+ if (requests.contains(p) && p.isOnline()) {
+ teleport(p, server);
+ requests.remove(p);
}
cancel();
}
}.runTaskLater(Main.getInstance(), 20L * t);
}
+ public static void backToLobby(Player p) {
+ teleport(p, "SYSTEM.MAINLOBBY");
+ }
public static void goAFK(Player p) {
- teleport(p, "SYSTEM.LIMBO");
+
+ DataServerInfo targetServer = getServerInfo("LIMBO");
+ if (targetServer != null) {
+ teleport(p, targetServer.getServerID());
+ } else {
+ p.sendMessage("§7暂无可用挂机服务器。");
+ }
+
+
}
- public static void backToLobby(Player p) {
- teleport(p, "lobby");
+
+ public static DataServerInfo getServerInfo(String name) {
+ if (getDataServers().containsKey(name)) {
+ return getDataServers().get(name);
+ } else {
+ for (DataServerInfo info : getDataServers().values()) {
+ if (info.getServerGroup().equalsIgnoreCase(name)) {
+ return info;
+ }
+ }
+ return null;
+ }
+ }
+
+
+ public static LocalServerInfo getLocalRegisteredServer() {
+ return localRegisteredServer;
}
public static void switchServer(Player p, String targetServerIp) {
p.sendPluginMessage(Main.getInstance(), "BeeSwitch", targetServerIp.getBytes(StandardCharsets.UTF_8));
}
+ public enum Operation {
+ ADD,
+ REMOVE;
+
+ public static Operation tryRead(String name) {
+ for (Operation value : Operation.values()) {
+ if (value.name().equalsIgnoreCase(name)) {
+ return value;
+ }
+ }
+ return null;
+ }
+ }
+
}
diff --git a/2b2t-core/src/main/java/org.cn2b2t.core/modules/DataServerInfo.java b/2b2t-core/src/main/java/org.cn2b2t.core/modules/DataServerInfo.java
new file mode 100644
index 0000000..61f6181
--- /dev/null
+++ b/2b2t-core/src/main/java/org.cn2b2t.core/modules/DataServerInfo.java
@@ -0,0 +1,61 @@
+package org.cn2b2t.core.modules;
+
+public class DataServerInfo {
+
+ private String serverID;
+ private String hostName;
+ private int port;
+ private String serverGroup;
+
+ private int players;
+
+ public DataServerInfo(String serverID, String hostName, int port, String serverGroup, int players) {
+ this.serverGroup = serverGroup;
+ this.serverID = serverID;
+ this.hostName = hostName;
+ this.port = port;
+
+ this.players = players;
+ }
+
+ public int getPlayers() {
+ return players;
+ }
+
+ public void setPlayers(int players) {
+ this.players = players;
+ }
+
+ public String getServerID() {
+ return serverID;
+ }
+
+ public void setServerID(String serverID) {
+ this.serverID = serverID;
+ }
+
+ public String getServerGroup() {
+ return serverGroup;
+ }
+
+ public void setServerGroup(String serverGroup) {
+ this.serverGroup = serverGroup;
+ }
+
+ public int getPort() {
+ return port;
+ }
+
+ public void setPort(int port) {
+ this.port = port;
+ }
+
+ public String getHostName() {
+ return hostName;
+ }
+
+ public void setHostName(String hostName) {
+ this.hostName = hostName;
+ }
+
+}
diff --git a/2b2t-core/src/main/java/org.cn2b2t.core/modules/LocalServerInfo.java b/2b2t-core/src/main/java/org.cn2b2t.core/modules/LocalServerInfo.java
new file mode 100644
index 0000000..0531553
--- /dev/null
+++ b/2b2t-core/src/main/java/org.cn2b2t.core/modules/LocalServerInfo.java
@@ -0,0 +1,59 @@
+package org.cn2b2t.core.modules;
+
+import org.bukkit.Bukkit;
+import org.cn2b2t.core.managers.utils.DataManager;
+import org.cn2b2t.core.managers.utils.ServersManager;
+
+public class LocalServerInfo extends DataServerInfo {
+ public LocalServerInfo(String serverID, String hostName, int port, String serverGroup) {
+ super(serverID, hostName, port, serverGroup, Bukkit.getOnlinePlayers().size());
+
+
+ }
+
+ @Override
+ public int getPlayers() {
+ return Bukkit.getOnlinePlayers().size();
+ }
+
+ public void register() {
+ writeInfo();
+ if (!this.getServerGroup().equalsIgnoreCase("SYSTEM")) {
+ sendRegisterRequest();
+ }
+
+ }
+
+ public void unregister() {
+ deleteInfo();
+ if (!this.getServerGroup().equalsIgnoreCase("SYSTEM")) {
+ sendUnregisterRequest();
+ }
+ }
+
+ public void writeInfo() {
+ DataManager.getConnection().update(ServersManager.databaseTable,
+ new String[]{"servergroup", "hostname", "port", "players"},
+ new Object[]{LocalServerInfo.this.getServerGroup(), LocalServerInfo.this.getHostName(), LocalServerInfo.this.getPort(), getPlayers()},
+ new String[]{"serverid"}, new Object[]{LocalServerInfo.this.getServerID()});
+ }
+
+ public void deleteInfo() {
+ DataManager.getConnection().delete(ServersManager.databaseTable, "serverid", LocalServerInfo.this.getServerID());
+ }
+
+
+ public void sendRegisterRequest() {
+ DataManager.getTempConnection().insert("messager_" + ServersManager.messageChannel,
+ new String[]{"start", "lasttime", "sign", "message"},
+ new Object[]{System.currentTimeMillis(), 1500, ServersManager.messageChannel, ServersManager.Operation.ADD.name() + ":" + LocalServerInfo.this.getServerID()});
+ }
+
+ public void sendUnregisterRequest() {
+ DataManager.getTempConnection().insert("messager_" + ServersManager.messageChannel,
+ new String[]{"start", "lasttime", "sign", "message"},
+ new Object[]{System.currentTimeMillis(), 1500, ServersManager.messageChannel, ServersManager.Operation.REMOVE.name() + ":" + LocalServerInfo.this.getServerID()});
+ }
+
+
+}