mirror of
https://github.com/CarmJos/cn2b2t-project.git
synced 2024-09-19 13:55:45 +00:00
Cn2b2t添加注册指令
This commit is contained in:
parent
4df7c31eb9
commit
1f5428ccdc
@ -56,6 +56,12 @@
|
||||
<systemPath>${basedir}/../_lib/spigot.jar</systemPath>
|
||||
<scope>system</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.cn2b2t</groupId>
|
||||
<artifactId>2b2t-proxy</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
|
||||
</dependencies>
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
@ -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<Player> requests = new ArrayList<>();
|
||||
public static List<String> allPlayers = new ArrayList<>();
|
||||
|
||||
public static String databaseTable = "game_servers";
|
||||
public static String messageChannel = "serversmanager";
|
||||
|
||||
private static LocalServerInfo localRegisteredServer;
|
||||
|
||||
private static Map<String/*serverID*/, DataServerInfo> 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<String, DataServerInfo> 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<String, DataServerInfo> 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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
@ -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()});
|
||||
}
|
||||
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user