예제 #1
0
        /// <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);
                }
            });
        }
예제 #2
0
        /// <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 的房间");
                }
            });
        }
예제 #3
0
        /// <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);
            });
        }
예제 #4
0
        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......");
            });
        }
예제 #5
0
        /// <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;
                }
            }
                );
        }
예제 #6
0
        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);
            }
        }
예제 #7
0
 /// <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);
     });
 }
예제 #8
0
        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);
        }
예제 #9
0
        /// <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);
            });
        }
예제 #10
0
        /// <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);
                }
            });
        }
예제 #11
0
        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);
        }
예제 #12
0
        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在游戏房间也可以发送
        }
예제 #13
0
        /// <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);
            }
        }
예제 #14
0
        /// <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);
            });
        }
예제 #15
0
        /// <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);
            });
        }
예제 #16
0
        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!");
            });
        }