mirror of
https://github.com/project-redbud/FunGame-Server.git
synced 2025-04-22 03:59:36 +08:00
添加准备和取消准备功能、开始和结束游戏的相关功能 (#26)
* 添加了准备和取消准备 * 修复UserStatistics造成的无法匹配问题 * 修改方法名称 * fix ready&cancelready bug * 开始游戏/提醒玩家准备/提醒房主开始游戏 * 完善开始游戏逻辑 * 添加Users参数 * 1 * 游戏结束后将所有人移除已准备列表 * 更换方法
This commit is contained in:
parent
0ed458fb77
commit
5f8ae48859
@ -25,6 +25,7 @@ namespace Milimoe.FunGame.Server.Controller
|
|||||||
private string ForgetVerify = "";
|
private string ForgetVerify = "";
|
||||||
private string RegVerify = "";
|
private string RegVerify = "";
|
||||||
private DataRequestType _LastRequest = DataRequestType.UnKnown;
|
private DataRequestType _LastRequest = DataRequestType.UnKnown;
|
||||||
|
private bool[] isReadyCheckCD = new bool[] { false, false };
|
||||||
|
|
||||||
public DataRequestController(ServerModel server)
|
public DataRequestController(ServerModel server)
|
||||||
{
|
{
|
||||||
@ -74,6 +75,18 @@ namespace Milimoe.FunGame.Server.Controller
|
|||||||
Chat(data);
|
Chat(data);
|
||||||
break;
|
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:
|
case DataRequestType.Reg_GetRegVerifyCode:
|
||||||
Reg(data, result);
|
Reg(data, result);
|
||||||
break;
|
break;
|
||||||
@ -164,14 +177,7 @@ namespace Milimoe.FunGame.Server.Controller
|
|||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(roomtype_string) && user.Id != 0)
|
if (!string.IsNullOrWhiteSpace(roomtype_string) && user.Id != 0)
|
||||||
{
|
{
|
||||||
RoomType roomtype = roomtype_string switch
|
RoomType roomtype = GameMode.GetRoomType(roomtype_string);
|
||||||
{
|
|
||||||
GameMode.Mix => RoomType.Mix,
|
|
||||||
GameMode.Team => RoomType.Team,
|
|
||||||
GameMode.MixHasPass => RoomType.MixHasPass,
|
|
||||||
GameMode.TeamHasPass => RoomType.TeamHasPass,
|
|
||||||
_ => RoomType.All
|
|
||||||
};
|
|
||||||
string roomid = Verification.CreateVerifyCode(VerifyCodeType.MixVerifyCode, 7).ToUpper();
|
string roomid = Verification.CreateVerifyCode(VerifyCodeType.MixVerifyCode, 7).ToUpper();
|
||||||
SQLHelper.Execute(RoomQuery.Insert_CreateRoom(roomid, user.Id, roomtype, password ?? ""));
|
SQLHelper.Execute(RoomQuery.Insert_CreateRoom(roomid, user.Id, roomtype, password ?? ""));
|
||||||
if (SQLHelper.Result == SQLResult.Success)
|
if (SQLHelper.Result == SQLResult.Success)
|
||||||
@ -215,6 +221,7 @@ namespace Milimoe.FunGame.Server.Controller
|
|||||||
|
|
||||||
if (roomid != "-1" && Config.RoomList.IsExist(roomid))
|
if (roomid != "-1" && Config.RoomList.IsExist(roomid))
|
||||||
{
|
{
|
||||||
|
Config.RoomList.CancelReady(roomid, Server.User);
|
||||||
Config.RoomList.QuitRoom(roomid, Server.User);
|
Config.RoomList.QuitRoom(roomid, Server.User);
|
||||||
Room Room = Config.RoomList[roomid] ?? General.HallInstance;
|
Room Room = Config.RoomList[roomid] ?? General.HallInstance;
|
||||||
// 是否是房主
|
// 是否是房主
|
||||||
@ -316,6 +323,58 @@ namespace Milimoe.FunGame.Server.Controller
|
|||||||
ResultData.Add("result", result);
|
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>
|
||||||
/// 发送聊天消息
|
/// 发送聊天消息
|
||||||
/// </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
|
#endregion
|
||||||
|
|
||||||
#region Reg
|
#region Reg
|
||||||
@ -501,7 +633,7 @@ namespace Milimoe.FunGame.Server.Controller
|
|||||||
// 验证登录
|
// 验证登录
|
||||||
if (username != null && password != null)
|
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));
|
SQLHelper.ExecuteDataSet(UserQuery.Select_Users_LoginQuery(username, password));
|
||||||
if (SQLHelper.Result == SQLResult.Success)
|
if (SQLHelper.Result == SQLResult.Success)
|
||||||
{
|
{
|
||||||
@ -511,12 +643,12 @@ namespace Milimoe.FunGame.Server.Controller
|
|||||||
SQLHelper.ExecuteDataSet(UserQuery.Select_CheckAutoKey(username, autokey));
|
SQLHelper.ExecuteDataSet(UserQuery.Select_CheckAutoKey(username, autokey));
|
||||||
if (SQLHelper.Result == SQLResult.Success)
|
if (SQLHelper.Result == SQLResult.Success)
|
||||||
{
|
{
|
||||||
ServerHelper.WriteLine("[" + DataRequest.GetTypeString(DataRequestType.Login_Login) + "] AutoKey: 已确认");
|
ServerHelper.WriteLine("[" + DataRequestSet.GetTypeString(DataRequestType.Login_Login) + "] AutoKey: 已确认");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
msg = "AutoKey不正确,拒绝自动登录!";
|
msg = "AutoKey不正确,拒绝自动登录!";
|
||||||
ServerHelper.WriteLine("[" + DataRequest.GetTypeString(DataRequestType.Login_Login) + "] " + msg);
|
ServerHelper.WriteLine("[" + DataRequestSet.GetTypeString(DataRequestType.Login_Login) + "] " + msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
key = Guid.NewGuid();
|
key = Guid.NewGuid();
|
||||||
|
@ -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)
|
public void IntoRoom(string roomid)
|
||||||
{
|
{
|
||||||
Room = Config.RoomList[roomid];
|
Room = Config.RoomList[roomid];
|
||||||
@ -305,14 +344,7 @@ namespace Milimoe.FunGame.Server.Model
|
|||||||
{
|
{
|
||||||
if (IsMatching)
|
if (IsMatching)
|
||||||
{
|
{
|
||||||
RoomType roomtype = roomtype_string switch
|
RoomType roomtype = GameMode.GetRoomType(roomtype_string);
|
||||||
{
|
|
||||||
GameMode.Mix => RoomType.Mix,
|
|
||||||
GameMode.Team => RoomType.Team,
|
|
||||||
GameMode.MixHasPass => RoomType.MixHasPass,
|
|
||||||
GameMode.TeamHasPass => RoomType.TeamHasPass,
|
|
||||||
_ => RoomType.All
|
|
||||||
};
|
|
||||||
Room room = await MatchingRoom(roomtype, user);
|
Room room = await MatchingRoom(roomtype, user);
|
||||||
if (IsMatching && Socket != null)
|
if (IsMatching && Socket != null)
|
||||||
{
|
{
|
||||||
@ -352,8 +384,8 @@ namespace Milimoe.FunGame.Server.Model
|
|||||||
List<User> players = Config.RoomList.GetPlayerList(room.Roomid);
|
List<User> players = Config.RoomList.GetPlayerList(room.Roomid);
|
||||||
if (players.Count > 0)
|
if (players.Count > 0)
|
||||||
{
|
{
|
||||||
decimal avgelo = players.Sum(u => u.Statistics.EloStats?[0] ?? 0M) / players.Count;
|
decimal avgelo = players.Sum(u => u.Statistics.EloStats.ContainsKey(0) ? u.Statistics.EloStats[0] : 0M) / players.Count;
|
||||||
decimal userelo = user.Statistics.EloStats?[0] ?? 0M;
|
decimal userelo = user.Statistics.EloStats.ContainsKey(0) ? user.Statistics.EloStats[0] : 0M;
|
||||||
if (userelo >= avgelo - (300 * i) && userelo <= avgelo + (300 * i))
|
if (userelo >= avgelo - (300 * i) && userelo <= avgelo + (300 * i))
|
||||||
{
|
{
|
||||||
return room;
|
return room;
|
||||||
@ -399,6 +431,7 @@ namespace Milimoe.FunGame.Server.Model
|
|||||||
if (User.Id != 0 && this != null)
|
if (User.Id != 0 && this != null)
|
||||||
{
|
{
|
||||||
Server.AddUser(User.Username, this);
|
Server.AddUser(User.Username, this);
|
||||||
|
UserName = User.Username;
|
||||||
ServerHelper.WriteLine("OnlinePlayers: 玩家 " + User.Username + " 已添加");
|
ServerHelper.WriteLine("OnlinePlayers: 玩家 " + User.Username + " 已添加");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user