From 4b65a2459b22786120eda449f82db9bc3f219e02 Mon Sep 17 00:00:00 2001 From: tony_all Date: Sun, 16 Apr 2023 19:13:27 +0800 Subject: [PATCH] sync --- .../main/java/cc/maxmc/msm/api/misc/ServerInfo.java | 5 +++-- .../cc/maxmc/msm/child/listener/ProtocolListener.kt | 9 ++++++--- .../main/kotlin/cc/maxmc/msm/child/misc/SubServer.kt | 3 ++- .../kotlin/cc/maxmc/msm/child/settings/Settings.kt | 7 +++++++ .../kotlin/cc/maxmc/msm/parent/manager/ChildManager.kt | 4 +++- .../cc/maxmc/msm/parent/manager/ServerManager.kt | 10 +++++----- .../kotlin/cc/maxmc/msm/parent/misc/ChildBungee.kt | 5 +++++ 7 files changed, 31 insertions(+), 12 deletions(-) diff --git a/api/src/main/java/cc/maxmc/msm/api/misc/ServerInfo.java b/api/src/main/java/cc/maxmc/msm/api/misc/ServerInfo.java index 90e0573..7117bab 100644 --- a/api/src/main/java/cc/maxmc/msm/api/misc/ServerInfo.java +++ b/api/src/main/java/cc/maxmc/msm/api/misc/ServerInfo.java @@ -8,6 +8,7 @@ import java.util.UUID; @SuppressWarnings("unused") // API public class ServerInfo { + public static final UUID NULL_UID = UUID.fromString("00000000-0000-0000-0000-000000000000"); @NotNull private final UUID uid; @Nullable @@ -15,7 +16,7 @@ public class ServerInfo { private boolean available; public ServerInfo() { - uid = UUID.fromString("00000000-0000-0000-0000-000000000000"); + uid = NULL_UID; server = null; } @@ -47,7 +48,7 @@ public class ServerInfo { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; ServerInfo that = (ServerInfo) o; - return Objects.equals(server, that.server) && Objects.equals(uid, that.uid); + return Objects.equals(uid, that.uid); } @Override diff --git a/child/src/main/kotlin/cc/maxmc/msm/child/listener/ProtocolListener.kt b/child/src/main/kotlin/cc/maxmc/msm/child/listener/ProtocolListener.kt index f173d2e..df158d8 100644 --- a/child/src/main/kotlin/cc/maxmc/msm/child/listener/ProtocolListener.kt +++ b/child/src/main/kotlin/cc/maxmc/msm/child/listener/ProtocolListener.kt @@ -37,9 +37,12 @@ object ProtocolListener : Listener { val subServer = SubServer(serverInfo.uid, packet.type, serverInfo.server!!.split(":")[1].toInt()) serverCache[serverInfo.uid] = subServer pluginScope.launch { - subServer.initServer() - subServer.startServer() - NetClient.sendPacket(PPacketServerStarted(serverInfo)) + try { + subServer.initServer() + subServer.startServer() + } catch (e: Exception) { + NetClient.sendPacket(PPacketServerStarted()) + } } } diff --git a/child/src/main/kotlin/cc/maxmc/msm/child/misc/SubServer.kt b/child/src/main/kotlin/cc/maxmc/msm/child/misc/SubServer.kt index b34d5c6..6fc9efb 100644 --- a/child/src/main/kotlin/cc/maxmc/msm/child/misc/SubServer.kt +++ b/child/src/main/kotlin/cc/maxmc/msm/child/misc/SubServer.kt @@ -1,6 +1,7 @@ package cc.maxmc.msm.child.misc import cc.maxmc.msm.child.MultiServerMan +import cc.maxmc.msm.child.settings.Settings import cc.maxmc.msm.child.utils.ScriptRunner import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext @@ -27,7 +28,7 @@ class SubServer( } suspend fun startServer() = suspendCoroutine { - runner.launch(port.toString()) + runner.launch(Settings.Patterns.arguments(type).joinToString(" ").replace("\${port}", port.toString())) runner.onOutput("For help, type \"help\" or \"?\"") { it.resume(Unit) } diff --git a/child/src/main/kotlin/cc/maxmc/msm/child/settings/Settings.kt b/child/src/main/kotlin/cc/maxmc/msm/child/settings/Settings.kt index 2e11b30..9dace11 100644 --- a/child/src/main/kotlin/cc/maxmc/msm/child/settings/Settings.kt +++ b/child/src/main/kotlin/cc/maxmc/msm/child/settings/Settings.kt @@ -17,4 +17,11 @@ object Settings { val port: Int get() = config.getInt("parent.port", 23333) } + + object Patterns { + fun arguments(type: String): List { + if (!config.contains("patterns.$type.args")) throw IllegalArgumentException("服务端样板 $type 的配置不存在,请检查settings.yml") + return config.getStringList("patterns.$type.args") + } + } } \ No newline at end of file diff --git a/parent/src/main/kotlin/cc/maxmc/msm/parent/manager/ChildManager.kt b/parent/src/main/kotlin/cc/maxmc/msm/parent/manager/ChildManager.kt index 197294f..90d4eac 100644 --- a/parent/src/main/kotlin/cc/maxmc/msm/parent/manager/ChildManager.kt +++ b/parent/src/main/kotlin/cc/maxmc/msm/parent/manager/ChildManager.kt @@ -8,6 +8,7 @@ import cc.maxmc.msm.common.utils.pluginScope import cc.maxmc.msm.parent.misc.ChildBungee import io.netty.channel.Channel import kotlinx.coroutines.launch +import java.util.* import java.util.concurrent.CopyOnWriteArrayList object ChildManager { @@ -32,9 +33,10 @@ object ChildManager { } fun requestChild(type: String): ChildBungee { + val uid = UUID.randomUUID() children.forEach { val ports = it.getAvailablePorts() - log("${ports.size} ports: $ports") + log("[${uid.toString().substring(0..8)}] ${it.channel.remoteAddress()} has ${ports.size} ports: $ports") } return children.filter { it.getAvailablePorts().isNotEmpty() && it.types.contains(type) } .maxByOrNull { it.getAvailablePorts().size } ?: throw IllegalStateException("当前无可用端口开启新服务器.") diff --git a/parent/src/main/kotlin/cc/maxmc/msm/parent/manager/ServerManager.kt b/parent/src/main/kotlin/cc/maxmc/msm/parent/manager/ServerManager.kt index 713076e..d5a0a79 100644 --- a/parent/src/main/kotlin/cc/maxmc/msm/parent/manager/ServerManager.kt +++ b/parent/src/main/kotlin/cc/maxmc/msm/parent/manager/ServerManager.kt @@ -35,11 +35,9 @@ object ServerManager { if (!serverMap.containsKey(it)) { serverMap[it] = ArrayList() } - if (serverMap[it]!!.size <= 2) { - pluginScope.launch { - repeat(2) { _ -> - requestServer(it) - } + if (serverMap[it]!!.size < 2) { + repeat(2) { _ -> + requestServer(it) } } } @@ -82,6 +80,8 @@ object ServerManager { val child = ChildManager.requestChild(type) val list = serverMap[type]!! val server = child.requestServer(type) + if (server.uid == ServerInfo.NULL_UID) + list.add(server) childMap[server] = child return server diff --git a/parent/src/main/kotlin/cc/maxmc/msm/parent/misc/ChildBungee.kt b/parent/src/main/kotlin/cc/maxmc/msm/parent/misc/ChildBungee.kt index e15a298..efdc782 100644 --- a/parent/src/main/kotlin/cc/maxmc/msm/parent/misc/ChildBungee.kt +++ b/parent/src/main/kotlin/cc/maxmc/msm/parent/misc/ChildBungee.kt @@ -5,6 +5,7 @@ import cc.maxmc.msm.common.network.BungeePacket import cc.maxmc.msm.common.network.packet.CPacketRequestServer import cc.maxmc.msm.common.network.packet.PPacketServerStarted import cc.maxmc.msm.common.utils.awaitPacket +import cc.maxmc.msm.common.utils.log import io.netty.channel.Channel import java.net.InetSocketAddress import java.util.* @@ -28,6 +29,10 @@ class ChildBungee( val packet = awaitPacket(PPacketServerStarted::class.java) { ch, packet -> ch == channel && packet.serverInfo == server } + if (packet.serverInfo.server == null) { + log("§c| §7服务器启动失败,请检查子BC端 §c(${channel.remoteAddress()})§7 日志。") + return ServerInfo() + } usedPorts += port return packet.serverInfo }