/// <summary> /// player ready /// </summary> /// <param name="client"></param> private void ready(ClientPeer client) { SingleExecute.Instance.Execute(() => { if (userCache.IsOnline(client) == false) { return; } int userId = userCache.GetId(client); if (matchCache.IsMatching(userId) == false) { return; } MatchRoom room = matchCache.GetRoom(userId); room.Ready(userId); room.Broadcast(OpCode.MATCH, MatchCode.READY_BROADCAST, userId); //check:all player is ready if (room.IsAllReady()) { //start play card,deal cards startFight(room.GetUIdList); //send all player start play cards room.Broadcast(OpCode.MATCH, MatchCode.START_BROADCAST, null); //destroy room matchCache.Destroy(room); } }); }
/// <summary> /// 客户端进入房间的请求 /// </summary> /// <param name="client"></param> /// <param name="roomType"></param> private void EnterRoom(ClientPeer client, int roomType) { SingleExecute.Instance.Exeecute(() => { // 判断当前的客户端连接对象是不是在匹配房间里面,如果在,忽略 if (matchCacheList[roomType].IsMatching(client.Id)) { return; } MatchRoom room = matchCacheList[roomType].Enter(client); // 构造 UserDto UserDto userDto = DatabaseManager.CreateUserDto(client.Id); // 广播给房间内的所有玩家,除了自身,有新的玩家进来了,参数:新进用户的 UserDto room.Broadcast(OpCode.Match, MatchCode.Enter_BRO, userDto, client); // 给客户端一个相应,参数:房间传输模型,包含房间内的正在等待的玩家以及准备的玩家id 集合 client.SendMsg(OpCode.Match, MatchCode.Enter_SRES, MakeMatchRoomDto(room)); if (roomType == 0) { Console.WriteLine(userDto.name + "进入底注为 10 的房间"); } if (roomType == 1) { Console.WriteLine(userDto.name + "进入底注为 20 的房间"); } if (roomType == 2) { Console.WriteLine(userDto.name + "进入底注为 50 的房间"); } }); }
/// <summary> /// 进入匹配队列 /// </summary> /// <param name="clientPeer"></param> private void enter(ClientPeer clientPeer) { SingleExecute.Instance.processSingle(() => { if (!UserCache.Instance.IsOnline(clientPeer)) { //如果用户不在线 return; } int uid = UserCache.Instance.GetId(clientPeer); if (MatchCache.Instance.IsMatching(uid)) { //如果用户正在匹配 //clientPeer.StartSend(OpCode.MATCH, MatchCode.ENTER_SRES, -1); return; } //进入匹配房间 MatchRoom room = MatchCache.Instance.Enter(uid, clientPeer); Console.WriteLine("玩家:" + uid + "进入匹配房间:" + room.ID); //向房间内的除了自己外的人广播有玩家进入 UserModel userModel = UserCache.Instance.GetModelByClientPeer(clientPeer); UserDto userDto = new UserDto(userModel.Id, userModel.Name, userModel.Money, userModel.WinCount, userModel.LoseCount, userModel.RunCount, userModel.Lv, userModel.Exp); //给其他发送自己的用户数据模型 room.Broadcast(OpCode.MATCH, MatchCode.ENTER_BOD, userDto, clientPeer); //给玩家传回房间数据模型 MatchRoomDto roomDto; makeRoomdto(room, out roomDto); clientPeer.StartSend(OpCode.MATCH, MatchCode.ENTER_SRES, roomDto); }); }
public void enter(ClientPeer client) { SingleExecute.Instance.Execute(delegate() { if (!userCache.IsOnline(client)) { return; } int userId = userCache.GetId(client); if (matchCache.IsMatching(userId)) { //user is matching,matching=already enter room client.Send(OpCode.MATCH, MatchCode.ENTER_SRES, -1); return; } MatchRoom room = matchCache.Enter(userId, client); //broadcast to all user in room except current client UserModel model = userCache.GetModelByAccountId(userId); UserDto userDto = new UserDto(model.ID, model.Name, model.Been, model.WinCount, model.LoseCount, model.RunCount, model.LV, model.Exp); room.Broadcast(OpCode.MATCH, MatchCode.ENTER_BROADCAST, userDto, client); //send user's room data to user's client MatchRoomDto dto = makeRoomDto(room); client.Send(OpCode.MATCH, MatchCode.ENTER_SRES, dto); Console.WriteLine("Player enter room......"); }); }
/// <summary> /// 准备 /// </summary> /// <param name="clientPeer"></param> private void ready(ClientPeer clientPeer) { SingleExecute.Instance.processSingle( () => { if (!UserCache.Instance.IsOnline(clientPeer)) { return; } int uid = UserCache.Instance.GetId(clientPeer); UserModel userModel = UserCache.Instance.GetModelByClientPeer(clientPeer); if (!MatchCache.Instance.IsMatching(uid)) { return; } MatchRoom room = MatchCache.Instance.GetRoom(uid); room.Ready(uid); //通知房间内除了自己以外的人,自己准备了 room.Broadcast(OpCode.MATCH, MatchCode.READY_BOD, uid, clientPeer); Console.WriteLine("玩家" + userModel.Name + "在匹配房间:" + room.ID + "准备了"); //如果所有人都准备了则开始游戏 if (room.IsAllReady()) { //创建FightHandler FightHandler.Instance.ToString(); /*if (StartGameEvent != null) * { * StartGameEvent(room.ReadyUidlist); * }*/ //创建战斗房间 FightRoom fightRoom = FightRoomCache.Instance.Create(room.ReadyUidlist); //广播消息通知房间内所有人开始选择选择种族 room.Broadcast(OpCode.FIGHT, FightCode.SELECT_RACE_SBOD, "开始选择种族"); MatchCache.Instance.Destory(room); //销毁匹配房间重用 return; } } ); }
private void HandleReady(ClientPeer client, bool ready) { if (!Sessions.matchSession.IsMatching(client)) { return; } MatchRoom room = Sessions.matchSession.GetRoom(client); UserInfoDto userInfoDto = DatabaseManager.CreateUserInfoDto(client.userId); if (ready) { room.Ready(client); room.Broadcast(OpCode.match, MatchCode.ReadyBrd, userInfoDto, client); } else { room.UnReady(client); room.Broadcast(OpCode.match, MatchCode.UnReadyBrd, userInfoDto, client); } }
/// <summary> /// 客户端离开房间的请求 /// </summary> /// <param name="client"></param> /// <param name="roomType"></param> private void LeaveRoom(ClientPeer client, int roomType) { SingleExecute.Instance.Exeecute(() => { // 不在匹配房间 if (matchCacheList[roomType].IsMatching(client.Id) == false) { return; } MatchRoom room = matchCacheList[roomType].Leave(client.Id); // 广播给房间内的其他玩家 room.Broadcast(OpCode.Match, MatchCode.Leave_BRO, client.Id); }); }
private void HandleExitRoom(ClientPeer client) { if (!Sessions.matchSession.IsMatching(client)) // 未在房间中则不管 { return; } //先退出房间 MatchRoom room = Sessions.matchSession.ExitRoom(client); UserInfoDto userInfoDto = DatabaseManager.CreateUserInfoDto(client.userId); //然后向其他房间内用户广播退出房间信息 room.Broadcast(OpCode.match, MatchCode.ExitBrd, userInfoDto, client); }
/// <summary> /// 取消准备 /// </summary> /// <param name="client"></param> /// <param name="roomType"></param> private void UnReady(ClientPeer client, int roomType) { SingleExecute.Instance.Execute(() => { if (matchCacheList[roomType].IsMatching(client.Id) == false) { return; } MatchRoom room = matchCacheList[roomType].GetRoom(client.Id); room.UnReady(client.Id); room.Broadcast(OpCode.Match, MatchCode.UnReady_BRO, client.Id); }); }
/// <summary> /// 客户端发来准备请求 /// </summary> private void Ready(ClientPeer client, int roomType) { SingleExecute.Instance.Exeecute(() => { // 不在匹配房间 if (matchCacheList[roomType].IsMatching(client.Id) == false) { return; } MatchRoom room = matchCacheList[roomType].GetRoom(client.Id); room.Ready(client.Id); // 广播给房间内的其他玩家 room.Broadcast(OpCode.Match, MatchCode.Ready_BRO, client.Id); // 全部都准备了,可以开始游戏了 if (room.IsAllReady()) { startFight(room.clientList, roomType); // 通知房间里的所有玩家,开始游戏了 room.Broadcast(OpCode.Match, MatchCode.StartGame_BRO, null); // 销毁房间 matchCacheList[roomType].DesRoom(room); } }); }
private void HandleEnterRoom(ClientPeer client) { if (Sessions.matchSession.IsMatching(client)) // 已在队列中则不管 { return; } //先进入房间 MatchRoom room = Sessions.matchSession.EnterRoom(client); UserInfoDto userInfoDto = DatabaseManager.CreateUserInfoDto(client.userId); //然后向其他房间内用户广播进入房间信息 room.Broadcast(OpCode.match, MatchCode.EnterBrd, userInfoDto, client); //最后向客户端返回当前的房间信息 MatchRoomDto matchRoomDto = room.CreateMatchRoomDto(); client.SendNetMsg(OpCode.match, MatchCode.EnterSRes, matchRoomDto); }
private void processCREQ(ClientPeer clientPeer, int chattype) { if (!UserCache.Instance.IsOnline(clientPeer)) { return; } int uid = UserCache.Instance.GetId(clientPeer); if (MatchCache.Instance.IsMatching(uid)) { //如果用户正在匹配房间可以发送聊天信息 MatchRoom matchRoom = MatchCache.Instance.GetRoom(uid); chatDto.Change(uid, chattype); //向自己以外的玩家发送聊天消息 matchRoom.Broadcast(OpCode.CHAT, ChatCode.SBOD, chatDto); } //TODO在游戏房间也可以发送 }
/// <summary> /// 开始匹配的处理 /// </summary> /// <param name="client"></param> /// <param name="isSingle"></param> /// <param name="playerID"></param> private void OnMatchStart(MOBAClient client, int playerID) { //非法操作检测 if (playerCache.GetID(client) != playerID) { return; } MatchRoom room = matchCache.EnterMatch(client, playerID); Send(client, OperationCode.PlayerCode, OpPlayer.MatchStart, 0, "开始匹配成功"); //如果房间满了,就开始选人 if (room.RoomIsFull()) { //通知房间内所有人进入选人界面 room.Broadcast(OperationCode.PlayerCode, OpPlayer.MatchComplete, 1, "是否进入选人界面(10秒)", null); StartSelectAction(room.RedTeamIdList, room.BlueTeamIdList); //删除房间 matchCache.DeleteRoom(room); } }
/// <summary> /// 客户端聊天的请求处理 /// </summary> /// <param name="client"></param> /// <param name="msg"></param> private void Chat(ClientPeer client, string msg) { SingleExecute.Instance.Exeecute(() => { foreach (var matchCache in matchCaches) { if (matchCache.IsMatching(client.Id)) // 客户端在匹配房间里 { MatchRoom room = matchCache.GetRoom(client.Id); chatDto.Change(client.Id, client.UserName, msg); room.Broadcast(OpCode.Chat, ChatCode.BRO, chatDto); } } if (fightCache.IsFighting(client.Id) == false) { return; } FightRoom fightRoom = fightCache.GetFightRoomByUserId(client.Id); chatDto.Change(client.Id, client.UserName, msg); fightRoom.Broadcast(OpCode.Chat, ChatCode.BRO, chatDto); }); }
/// <summary> /// 离开匹配队列 /// </summary> /// <param name="clientPeer"></param> private void leave(ClientPeer clientPeer) { SingleExecute.Instance.processSingle(() => { if (!UserCache.Instance.IsOnline(clientPeer)) { return; } int uid = UserCache.Instance.GetId(clientPeer); //用户不在匹配队列 if (!MatchCache.Instance.IsMatching(uid)) { return; } UserModel userModel = UserCache.Instance.GetModelByClientPeer(clientPeer); MatchRoom room = MatchCache.Instance.Leave(uid); Console.WriteLine("玩家:" + userModel.Name + "离开匹配房间:" + room.ID); //向房间内所有人广播有玩家离开 room.Broadcast(OpCode.MATCH, MatchCode.LEAVE_BOD, uid); }); }
private void leave(ClientPeer client) { SingleExecute.Instance.Execute( delegate() { if (!userCache.IsOnline(client)) { return; } int userId = userCache.GetId(client); if (matchCache.IsMatching(userId) == false) { Console.WriteLine("User is not matching!"); return; } MatchRoom room = matchCache.Leave(userId); //broadcast to all player ,someone leave room.Broadcast(OpCode.MATCH, MatchCode.LEAVE_BROADCAST, userId); Console.WriteLine("Some player leave!"); }); }