mirror of
https://github.com/project-redbud/FunGame-Server.git
synced 2025-04-20 11:09: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 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);
|
||||
}
|
||||
|
||||
/// <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();
|
||||
|
@ -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<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)
|
||||
{
|
||||
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user