添加准备和取消准备功能、开始和结束游戏的相关功能 (#26)

* 添加了准备和取消准备

* 修复UserStatistics造成的无法匹配问题

* 修改方法名称

* fix ready&cancelready bug

* 开始游戏/提醒玩家准备/提醒房主开始游戏

* 完善开始游戏逻辑

* 添加Users参数

* 1

* 游戏结束后将所有人移除已准备列表

* 更换方法
This commit is contained in:
milimoe 2023-11-23 00:44:30 +08:00 committed by GitHub
parent 0ed458fb77
commit 5f8ae48859
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 186 additions and 21 deletions

View File

@ -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)
{
@ -74,6 +75,18 @@ namespace Milimoe.FunGame.Server.Controller
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);
break;
@ -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);
}
/// <summary>
/// 设置已准备状态
/// </summary>
/// <param name="RequestData"></param>
/// <param name="ResultData"></param>
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<string>(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));
}
/// <summary>
/// 取消已准备状态
/// </summary>
/// <param name="RequestData"></param>
/// <param name="ResultData"></param>
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<string>(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));
}
/// <summary>
/// 发送聊天消息
/// </summary>
@ -329,6 +388,79 @@ namespace Milimoe.FunGame.Server.Controller
}
}
/// <summary>
/// 开始游戏
/// </summary>
/// <param name="RequestData"></param>
/// <param name="ResultData"></param>
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<string>(RequestData, "roomid") ?? "-1";
bool isMaster = DataRequest.GetHashtableJsonObject<bool>(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<User> 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();

View File

@ -265,6 +265,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<ServerModel>().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<User> 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<ServerModel>().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<ServerModel>().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)
{
Room = Config.RoomList[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<User> 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;
}