From adf70b42c2aef6d4a80d836c1c54f3f3fbc27fb0 Mon Sep 17 00:00:00 2001 From: milimoe Date: Thu, 9 Apr 2026 01:03:09 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=96=AD=E7=BA=BF=E9=87=8D?= =?UTF-8?q?=E8=BF=9E=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/DataRequestController.cs | 2 + FunGame.Server/Models/ServerModel.cs | 71 ++++++++++++++++--- .../Architecture/RESTfulAPIListener.cs | 6 +- FunGame.WebAPI/Architecture/WebAPIListener.cs | 6 +- 4 files changed, 72 insertions(+), 13 deletions(-) diff --git a/FunGame.Server/Controllers/DataRequestController.cs b/FunGame.Server/Controllers/DataRequestController.cs index 6e52621..1dea1e9 100644 --- a/FunGame.Server/Controllers/DataRequestController.cs +++ b/FunGame.Server/Controllers/DataRequestController.cs @@ -661,12 +661,14 @@ namespace Milimoe.FunGame.Server.Controller room.RoomState = RoomState.Gaming; Client.NowGamingServer = FunGameSystem.GameModuleLoader.GetServerMode(room.GameModule); Client.User.OnlineState = OnlineState.Gaming; + Client.Listener.NowGamingServers[Client.User.Id] = Client.NowGamingServer; Dictionary all = Client.Listener.UserList.Cast().ToDictionary(k => k.User.Username, v => v); // 给其他玩家赋值模组服务器 foreach (IServerModel model in all.Values.Where(s => s.User.Username != Client.User.Username)) { model.NowGamingServer = Client.NowGamingServer; model.User.OnlineState = OnlineState.Gaming; + Client.Listener.NowGamingServers[model.User.Id] = Client.NowGamingServer; } GamingObject obj = new(room, users, Client, all); if (Client.NowGamingServer.StartServer(obj)) diff --git a/FunGame.Server/Models/ServerModel.cs b/FunGame.Server/Models/ServerModel.cs index 6239365..bd9464c 100644 --- a/FunGame.Server/Models/ServerModel.cs +++ b/FunGame.Server/Models/ServerModel.cs @@ -33,6 +33,7 @@ namespace Milimoe.FunGame.Server.Model public MailSender? MailSender => _mailer; public bool IsDebugMode { get; } public GameModuleServer? NowGamingServer { get; set; } = null; + public GameModuleServer? NowAnonymousServer { get; set; } = null; /** * protected @@ -85,15 +86,12 @@ namespace Milimoe.FunGame.Server.Model if (eventArgs.Cancel) { - ServerHelper.WriteLine($"{SocketSet.GetTypeString(SocketMessageType.EndGame)} 请求已取消。", InvokeMessageType.Core, LogLevel.Warning); + ServerHelper.WriteLine($"{SocketSet.GetTypeString(SocketMessageType.EndGame)} 请求已取消。{(eventArgs.EventMsg != "" ? $"原因:{eventArgs.EventMsg}" : "")}", InvokeMessageType.Core, LogLevel.Warning); } else { - if (NowGamingServer != null && NowGamingServer.IsAnonymous) - { - NowGamingServer.CloseAnonymousServer(this); - } NowGamingServer = null; + Listener.NowGamingServers.Remove(User.Id, out _); User.OnlineState = OnlineState.InRoom; if (User.Id == InRoom.RoomMaster.Id) InRoom.RoomState = RoomState.Created; } @@ -105,6 +103,11 @@ namespace Milimoe.FunGame.Server.Model return !eventArgs.Cancel; } + if (type == SocketMessageType.ReconnectToGame) + { + return await CheckGamingServerReconnect(); + } + if (type == SocketMessageType.AnonymousGameServer) { return await AnonymousGameServerHandler(obj); @@ -259,17 +262,26 @@ namespace Milimoe.FunGame.Server.Model protected async Task AnonymousGameServerHandler(SocketObject obj) { string serverName = ""; + bool isDisconnect = false; Dictionary data = []; Dictionary result = []; if (obj.Parameters.Length > 0) serverName = obj.GetParam(0) ?? ""; if (obj.Parameters.Length > 1) data = obj.GetParam>(1) ?? []; + if (obj.Parameters.Length > 2) isDisconnect = obj.GetParam(2); bool willSend = false; - if (NowGamingServer != null) + if (NowAnonymousServer != null) { try { - result = await NowGamingServer.AnonymousGameServerHandler(this, data); + if (isDisconnect) + { + NowAnonymousServer.CloseAnonymousServer(this); + } + else + { + result = await NowAnonymousServer.AnonymousGameServerHandler(this, data); + } willSend = true; } catch (Exception e) @@ -278,7 +290,7 @@ namespace Milimoe.FunGame.Server.Model return await Send(SocketMessageType.AnonymousGameServer, result); } } - else + else if (!isDisconnect) { // 建立连接 if (FunGameSystem.GameModuleLoader != null && FunGameSystem.GameModuleLoader.ModuleServers.ContainsKey(serverName)) @@ -286,10 +298,10 @@ namespace Milimoe.FunGame.Server.Model GameModuleServer mod = FunGameSystem.GameModuleLoader.GetServerMode(serverName); if (mod.StartAnonymousServer(this, data)) { - NowGamingServer = mod; + NowAnonymousServer = mod; try { - result = await NowGamingServer.AnonymousGameServerHandler(this, data); + result = await NowAnonymousServer.AnonymousGameServerHandler(this, data); willSend = true; } catch (Exception e) @@ -432,7 +444,7 @@ namespace Milimoe.FunGame.Server.Model // 不是房主直接退出房间 else { - this.InRoom = General.HallInstance; + InRoom = General.HallInstance; await NotifyQuitRoom(Room); result = true; } @@ -597,6 +609,43 @@ namespace Milimoe.FunGame.Server.Model } } + protected async Task CheckGamingServerReconnect() + { + bool sendResult = false; + + if (Listener.NowGamingServers.TryGetValue(User.Id, out GameModuleServer? value) && value != null) + { + GamingObject? obj = value.GetGamingObjectOfUser(User.Id); + + if (obj != null && obj.Running && value.GetRoomOfUser(User.Id, obj) is Room room) + { + Dictionary data = await DataRequestController.GetResultData(DataRequestType.Main_IntoRoom, new() + { + { "roomid", room.Roomid } + }); + if (data.TryGetValue("result", out object? value2) && value2 is bool result && result) + { + FunGameSystem.RoomList.CancelReady(room.Roomid, User); + obj.UserReconnect(User); + sendResult = await Send(SocketMessageType.StartGame, room, obj.Users); + if (sendResult) + { + NowGamingServer = value; + User.OnlineState = OnlineState.Gaming; + } + } + } + } + + if (!sendResult) + { + Listener.NowGamingServers.Remove(User.Id, out _); + ServerHelper.WriteLine("[ " + GetClientName() + " ] " + nameof(AnonymousGameServerHandler) + ": " + sendResult, InvokeMessageType.Error); + } + + return sendResult; + } + protected async Task CreateStreamReader() { CancellationTokenSource cts = new(); diff --git a/FunGame.WebAPI/Architecture/RESTfulAPIListener.cs b/FunGame.WebAPI/Architecture/RESTfulAPIListener.cs index 48b20f5..a3bb98d 100644 --- a/FunGame.WebAPI/Architecture/RESTfulAPIListener.cs +++ b/FunGame.WebAPI/Architecture/RESTfulAPIListener.cs @@ -1,5 +1,7 @@ -using Milimoe.FunGame.Core.Api.Utility; +using System.Collections.Concurrent; +using Milimoe.FunGame.Core.Api.Utility; using Milimoe.FunGame.Core.Interface.Base; +using Milimoe.FunGame.Core.Library.Common.Addon; namespace Milimoe.FunGame.WebAPI.Architecture { @@ -13,6 +15,8 @@ namespace Milimoe.FunGame.WebAPI.Architecture public ConcurrentModelList UserList { get; } = []; + public ConcurrentDictionary NowGamingServers { get; } = []; + public List BannedList { get; } = []; public void Close() diff --git a/FunGame.WebAPI/Architecture/WebAPIListener.cs b/FunGame.WebAPI/Architecture/WebAPIListener.cs index de01a78..460e13e 100644 --- a/FunGame.WebAPI/Architecture/WebAPIListener.cs +++ b/FunGame.WebAPI/Architecture/WebAPIListener.cs @@ -1,5 +1,7 @@ -using Milimoe.FunGame.Core.Api.Utility; +using System.Collections.Concurrent; +using Milimoe.FunGame.Core.Api.Utility; using Milimoe.FunGame.Core.Interface.Base; +using Milimoe.FunGame.Core.Library.Common.Addon; using Milimoe.FunGame.Core.Library.Common.Network; namespace Milimoe.FunGame.WebAPI.Architecture @@ -12,6 +14,8 @@ namespace Milimoe.FunGame.WebAPI.Architecture public ConcurrentModelList UserList { get; } = []; + public ConcurrentDictionary NowGamingServers { get; } = []; + public List BannedList { get; } = []; public void Close()