diff --git a/FunGame.Server/Controllers/DataRequestController.cs b/FunGame.Server/Controllers/DataRequestController.cs index 7be3a3b..d8032a0 100644 --- a/FunGame.Server/Controllers/DataRequestController.cs +++ b/FunGame.Server/Controllers/DataRequestController.cs @@ -25,6 +25,7 @@ namespace Milimoe.FunGame.Server.Controller private string ForgetVerify = ""; private string RegVerify = ""; private DataRequestType _LastRequest = DataRequestType.UnKnown; + private bool[] isReadyCheckCD = new bool[] { false, false }; public DataRequestController(ServerModel server) { @@ -73,6 +74,18 @@ namespace Milimoe.FunGame.Server.Controller case DataRequestType.Main_Chat: Chat(data); break; + + case DataRequestType.Main_Ready: + SetReady(data, result); + break; + + case DataRequestType.Main_CancelReady: + CancelReady(data, result); + break; + + case DataRequestType.Main_StartGame: + StartGame(data, result); + break; case DataRequestType.Reg_GetRegVerifyCode: Reg(data, result); @@ -164,14 +177,7 @@ namespace Milimoe.FunGame.Server.Controller if (!string.IsNullOrWhiteSpace(roomtype_string) && user.Id != 0) { - RoomType roomtype = roomtype_string switch - { - GameMode.Mix => RoomType.Mix, - GameMode.Team => RoomType.Team, - GameMode.MixHasPass => RoomType.MixHasPass, - GameMode.TeamHasPass => RoomType.TeamHasPass, - _ => RoomType.All - }; + RoomType roomtype = GameMode.GetRoomType(roomtype_string); string roomid = Verification.CreateVerifyCode(VerifyCodeType.MixVerifyCode, 7).ToUpper(); SQLHelper.Execute(RoomQuery.Insert_CreateRoom(roomid, user.Id, roomtype, password ?? "")); if (SQLHelper.Result == SQLResult.Success) @@ -215,6 +221,7 @@ namespace Milimoe.FunGame.Server.Controller if (roomid != "-1" && Config.RoomList.IsExist(roomid)) { + Config.RoomList.CancelReady(roomid, Server.User); Config.RoomList.QuitRoom(roomid, Server.User); Room Room = Config.RoomList[roomid] ?? General.HallInstance; // 是否是房主 @@ -316,6 +323,58 @@ namespace Milimoe.FunGame.Server.Controller ResultData.Add("result", result); } + /// + /// 设置已准备状态 + /// + /// + /// + private void SetReady(Hashtable RequestData, Hashtable ResultData) + { + bool result = false; + string roomid = "-1"; + if (RequestData.Count >= 1) + { + ServerHelper.WriteLine("[" + ServerSocket.GetTypeString(SocketMessageType.DataRequest) + "] " + Server.GetClientName() + " -> SetReady"); + roomid = DataRequest.GetHashtableJsonObject(RequestData, "roomid") ?? "-1"; + User user = Server.User; + + if (roomid != "-1" && user.Id != 0 && !Config.RoomList.GetReadyPlayerList(roomid).Contains(user)) + { + Config.RoomList.SetReady(roomid, user); + result = true; + } + } + ResultData.Add("result", result); + ResultData.Add("ready", Config.RoomList.GetReadyPlayerList(roomid)); + ResultData.Add("notready", Config.RoomList.GetNotReadyPlayerList(roomid)); + } + + /// + /// 取消已准备状态 + /// + /// + /// + private void CancelReady(Hashtable RequestData, Hashtable ResultData) + { + bool result = false; + string roomid = "-1"; + if (RequestData.Count >= 1) + { + ServerHelper.WriteLine("[" + ServerSocket.GetTypeString(SocketMessageType.DataRequest) + "] " + Server.GetClientName() + " -> CancelReady"); + roomid = DataRequest.GetHashtableJsonObject(RequestData, "roomid") ?? "-1"; + User user = Server.User; + + if (roomid != "-1" && user.Id != 0 && Config.RoomList.GetReadyPlayerList(roomid).Contains(user)) + { + Config.RoomList.CancelReady(roomid, user); + result = true; + } + } + ResultData.Add("result", result); + ResultData.Add("ready", Config.RoomList.GetReadyPlayerList(roomid)); + ResultData.Add("notready", Config.RoomList.GetNotReadyPlayerList(roomid)); + } + /// /// 发送聊天消息 /// @@ -329,6 +388,79 @@ namespace Milimoe.FunGame.Server.Controller } } + /// + /// 开始游戏 + /// + /// + /// + private void StartGame(Hashtable RequestData, Hashtable ResultData) + { + bool result = false; + if (RequestData.Count >= 2) + { + ServerHelper.WriteLine("[" + ServerSocket.GetTypeString(SocketMessageType.DataRequest) + "] " + Server.GetClientName() + " -> StartGame"); + string roomid = DataRequest.GetHashtableJsonObject(RequestData, "roomid") ?? "-1"; + bool isMaster = DataRequest.GetHashtableJsonObject(RequestData, "isMaster"); + + if (roomid != "-1") + { + if (isMaster) + { + string[] usernames = Config.RoomList.GetNotReadyPlayerList(roomid).Select(user => user.Username).ToArray(); + if (usernames.Length > 0) + { + if (isReadyCheckCD[0] == false) + { + // 提醒玩家准备 + Server.SendSystemMessage(ShowMessageType.None, "还有玩家尚未准备,无法开始游戏。", "", 0, Server.User.Username); + Server.SendSystemMessage(ShowMessageType.Tip, "房主即将开始游戏,请准备!", "请准备就绪", 10, usernames); + isReadyCheckCD[0] = true; + TaskUtility.RunTimer(() => + { + isReadyCheckCD[0] = false; + }, 15000); + } + else + { + Server.SendSystemMessage(ShowMessageType.None, "还有玩家尚未准备,无法开始游戏。15秒内只能发送一次准备提醒。", "", 0, Server.User.Username); + } + } + else + { + List users = Config.RoomList.GetPlayerList(roomid); + if (users.Count < 2) + { + Server.SendSystemMessage(ShowMessageType.None, "玩家数量不足,无法开始游戏。", "", 0, Server.User.Username); + } + else + { + usernames = users.Select(user => user.Username).ToArray(); + Server.SendSystemMessage(ShowMessageType.None, "所有玩家均已准备,游戏将在10秒后开始。", "", 0, usernames); + Server.StartGame(roomid, users, usernames); + result = true; + } + } + } + else if (isReadyCheckCD[1] == false) + { + // 提醒房主开始游戏 + Server.SendSystemMessage(ShowMessageType.None, "已提醒房主立即开始游戏。", "", 0, Server.User.Username); + Server.SendSystemMessage(ShowMessageType.Tip, "房间中的玩家已请求你立即开始游戏。", "请求开始", 10, Config.RoomList[roomid].RoomMaster.Username); + isReadyCheckCD[1] = true; + TaskUtility.RunTimer(() => + { + isReadyCheckCD[1] = false; + }, 15000); + } + else + { + Server.SendSystemMessage(ShowMessageType.None, "15秒内只能发送一次提醒,请稍后再试。", "", 0, Server.User.Username); + } + } + } + ResultData.Add("result", result); + } + #endregion #region Reg @@ -501,7 +633,7 @@ namespace Milimoe.FunGame.Server.Controller // 验证登录 if (username != null && password != null) { - ServerHelper.WriteLine("[" + DataRequest.GetTypeString(DataRequestType.Login_Login) + "] UserName: " + username); + ServerHelper.WriteLine("[" + DataRequestSet.GetTypeString(DataRequestType.Login_Login) + "] UserName: " + username); SQLHelper.ExecuteDataSet(UserQuery.Select_Users_LoginQuery(username, password)); if (SQLHelper.Result == SQLResult.Success) { @@ -511,12 +643,12 @@ namespace Milimoe.FunGame.Server.Controller SQLHelper.ExecuteDataSet(UserQuery.Select_CheckAutoKey(username, autokey)); if (SQLHelper.Result == SQLResult.Success) { - ServerHelper.WriteLine("[" + DataRequest.GetTypeString(DataRequestType.Login_Login) + "] AutoKey: 已确认"); + ServerHelper.WriteLine("[" + DataRequestSet.GetTypeString(DataRequestType.Login_Login) + "] AutoKey: 已确认"); } else { msg = "AutoKey不正确,拒绝自动登录!"; - ServerHelper.WriteLine("[" + DataRequest.GetTypeString(DataRequestType.Login_Login) + "] " + msg); + ServerHelper.WriteLine("[" + DataRequestSet.GetTypeString(DataRequestType.Login_Login) + "] " + msg); } } key = Guid.NewGuid(); diff --git a/FunGame.Server/Models/ServerModel.cs b/FunGame.Server/Models/ServerModel.cs index 3f70fed..a9d8d8d 100644 --- a/FunGame.Server/Models/ServerModel.cs +++ b/FunGame.Server/Models/ServerModel.cs @@ -264,6 +264,45 @@ namespace Milimoe.FunGame.Server.Model } } } + + public void SendSystemMessage(ShowMessageType showtype, string msg, string title, int autoclose, params string[] usernames) + { + foreach (ServerModel serverTask in Server.UserList.Cast().Where(model => usernames.Length > 0 && usernames.Contains(model.UserName))) + { + if (serverTask != null && serverTask.Socket != null) + { + serverTask.Send(serverTask.Socket, SocketMessageType.System, showtype, msg, title, autoclose); + } + } + } + + public void StartGame(string roomid, List users, params string[] usernames) + { + Room room = General.HallInstance; + if (roomid != "-1") + { + room = Config.RoomList[roomid]; + } + if (room.Roomid == "-1") return; + foreach (ServerModel serverTask in Server.UserList.Cast().Where(model => usernames.Length > 0 && usernames.Contains(model.User.Username))) + { + if (serverTask != null && serverTask.Socket != null) + { + serverTask.Send(serverTask.Socket, SocketMessageType.StartGame, room, users); + } + } + TaskUtility.RunTimer(() => + { + foreach (ServerModel serverTask in Server.UserList.Cast().Where(model => usernames.Length > 0 && usernames.Contains(model.User.Username))) + { + if (serverTask != null && serverTask.Socket != null) + { + Config.RoomList.CancelReady(roomid, serverTask.User); + serverTask.Send(serverTask.Socket, SocketMessageType.EndGame, room, users); + } + } + }, 20 * 1000); + } public void IntoRoom(string roomid) { @@ -305,14 +344,7 @@ namespace Milimoe.FunGame.Server.Model { if (IsMatching) { - RoomType roomtype = roomtype_string switch - { - GameMode.Mix => RoomType.Mix, - GameMode.Team => RoomType.Team, - GameMode.MixHasPass => RoomType.MixHasPass, - GameMode.TeamHasPass => RoomType.TeamHasPass, - _ => RoomType.All - }; + RoomType roomtype = GameMode.GetRoomType(roomtype_string); Room room = await MatchingRoom(roomtype, user); if (IsMatching && Socket != null) { @@ -352,8 +384,8 @@ namespace Milimoe.FunGame.Server.Model List players = Config.RoomList.GetPlayerList(room.Roomid); if (players.Count > 0) { - decimal avgelo = players.Sum(u => u.Statistics.EloStats?[0] ?? 0M) / players.Count; - decimal userelo = user.Statistics.EloStats?[0] ?? 0M; + decimal avgelo = players.Sum(u => u.Statistics.EloStats.ContainsKey(0) ? u.Statistics.EloStats[0] : 0M) / players.Count; + decimal userelo = user.Statistics.EloStats.ContainsKey(0) ? user.Statistics.EloStats[0] : 0M; if (userelo >= avgelo - (300 * i) && userelo <= avgelo + (300 * i)) { return room; @@ -399,6 +431,7 @@ namespace Milimoe.FunGame.Server.Model if (User.Id != 0 && this != null) { Server.AddUser(User.Username, this); + UserName = User.Username; ServerHelper.WriteLine("OnlinePlayers: 玩家 " + User.Username + " 已添加"); return true; }