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;
}