Example #1
0
        private void leave(UserToken token)
        {
            //取出用户唯一ID
            int userId = getUserId(token);

            Console.WriteLine("角色离开匹配   ID:" + userId);
            //判断用户是否有房间映射关系
            if (!userRoom.ContainsKey(userId))
            {
                return;
            }
            //获取用户所在房间ID
            int roomId = userRoom[userId];

            //判断是否拥有此房间
            if (roomMap.ContainsKey(roomId))
            {
                ExploreRoom room = roomMap[roomId];
                //根据用户所在的队伍 进行移除
                PlayerModel m;
                if (room.playerDic.ContainsKey(userId))
                {
                    room.playerDic.TryRemove(userId, out m);
                }
                //移除用户与房间之间的映射关系
                userRoom.TryRemove(userId, out roomId);
                //如果当前用户为此房间最后一人 则移除房间 并丢进缓存队列
                lock (mapLocker)
                {
                    room.PlayerLeave(token);
                    if (room.playerDic.Count == 0)
                    {
                        List <int> roomList;
                        instanceMap.TryGetValue(room.area, out roomList);
                        roomList.Remove(roomId);
                        if (roomList.Count == 0)
                        {
                            instanceMap.Remove(roomId);
                        }
                        roomMap.TryRemove(roomId, out room);
                        room.Clear();
                        cache.Push(room);
                    }
                }
            }
        }
Example #2
0
        private void inform(UserToken token, int area)
        {
            Console.WriteLine("角色开始匹配");
            token.instanceID = area;
            int userId = getUserId(token);

            //判断玩家当前是否正在匹配队列中
            if (!userRoom.ContainsKey(userId))
            {
                Console.WriteLine("用户没在某个房间内,非断线重连");
                ExploreRoom room    = null;
                bool        isenter = false;
                //当前是否有等待中的房间
                lock (mapLocker)
                {
                    List <int> instanceList;
                    if (!instanceMap.TryGetValue(area, out instanceList))
                    {
                        instanceList = new List <int>();
                        instanceMap.Add(area, instanceList);
                    }
                    if (instanceList.Count > 0)
                    {
                        //遍历当前所有等待中的房间
                        foreach (int i in instanceList)
                        {
                            //如果没满员
                            if (roomMap[i].playerMax > roomMap[i].playerDic.Count)
                            {
                                Console.WriteLine("找到一个未满的房间");
                                room = roomMap[i];
                                //如果队伍1没有满员 则进入队伍1 否则进入队伍2
                                room.PlayerEnter(token);
                                //添加玩家与房间的映射关系
                                isenter = true;
                                userRoom.TryAdd(userId, room.id);
                                break;
                            }
                        }
                        if (!isenter)
                        {
                            //走到这里 说明等待中的房间全部满员了
                            if (cache.Count > 0)
                            {
                                Console.WriteLine("满员 缓存");
                                cache.TryPop(out room);
                                room.Creat();
                                room.PlayerEnter(token);
                                roomMap.TryAdd(room.id, room);
                                userRoom.TryAdd(userId, room.id);
                                instanceMap.TryGetValue(area, out instanceList);
                                instanceList.Add(room.id);
                            }
                            else
                            {
                                Console.WriteLine("满员 新建");
                                room = new ExploreRoom();
                                room.Creat();
                                room.id = index.GetAndAdd();
                                room.PlayerEnter(token);
                                roomMap.TryAdd(room.id, room);
                                userRoom.TryAdd(userId, room.id);
                                instanceMap.TryGetValue(area, out instanceList);
                                instanceList.Add(room.id);
                            }
                        }
                    }
                    else
                    {
                        //没有等待中的房间
                        //直接从缓存列表中找出可用房间 或者创建新房间
                        if (cache.Count > 0)
                        {
                            Console.WriteLine("get room from cache");
                            cache.TryPop(out room);
                            room.area = area;
                            room.Creat();
                            room.PlayerEnter(token);
                            roomMap.TryAdd(room.id, room);
                            userRoom.TryAdd(userId, room.id);
                            instanceMap.TryGetValue(area, out instanceList);
                            instanceList.Add(room.id);
                        }
                        else
                        {
                            Console.WriteLine("创建新房间");
                            room      = new ExploreRoom();
                            room.area = area;
                            room.id   = index.GetAndAdd();
                            room.Creat();
                            room.PlayerEnter(token);
                            roomMap.TryAdd(room.id, room);
                            userRoom.TryAdd(userId, room.id);
                            instanceMap.TryGetValue(area, out instanceList);
                            instanceList.Add(room.id);
                        }
                    }
                }
            }
        }