Пример #1
0
        public static Room Get(this RoomManagerComponent self, long id)
        {
            Room room;

            self.Rooms.TryGetValue(id, out room);
            return(room);
        }
Пример #2
0
        public static void RoomEndGame(this RoomManagerComponent self, long id)
        {
            Room room = self.GameRooms[id];

            self.GameRooms.Remove(id);
            self.ReadyRooms.Add(room.Id, room);
        }
Пример #3
0
        public static void Recycle(this RoomManagerComponent self, long id)
        {
            Room room = self.ReadyRooms[id];

            self.ReadyRooms.Remove(room.Id);
            self.IdleRooms.Enqueue(room);
        }
Пример #4
0
        protected override async void Run(Session session, JoinMatch_RT message, Action <JoinMatch_RE> reply)
        {
            JoinMatch_RE response = new JoinMatch_RE();

            try
            {
                MatchComponent matchComponent = Game.Scene.GetComponent <MatchComponent>();
                if (matchComponent.Playing.ContainsKey(message.UserID))
                {
                    //重连房间
                    long roomId = matchComponent.Playing[message.UserID];
                    RoomManagerComponent roomManager = Game.Scene.GetComponent <RoomManagerComponent>();
                    Room room = roomManager.Get(roomId);
                    foreach (var gamer in room.GetAll())
                    {
                        if (gamer.UserID == message.UserID)
                        {
                            long pastId = gamer.Id;
                            gamer.Id = message.PlayerID;
                            room.Replace(pastId, gamer);
                            break;
                        }
                    }
                    ActorProxy actorProxy = Game.Scene.GetComponent <ActorProxyComponent>().Get(roomId);
                    actorProxy.Send(new PlayerReconnect()
                    {
                        PlayerID = message.PlayerID, UserID = message.UserID, GateSessionID = message.GateSessionID
                    });

                    response.ActorID = roomId;
                    reply(response);
                    return;
                }

                //创建匹配玩家
                Matcher matcher = EntityFactory.Create <Matcher, long>(message.PlayerID);
                matcher.UserID        = message.UserID;
                matcher.GateSessionID = message.GateSessionID;
                matcher.GateAppID     = message.GateAppID;

                await matcher.AddComponent <ActorComponent>().AddLocation();

                //加入匹配队列
                Game.Scene.GetComponent <MatcherComponent>().Add(matcher);
                Log.Info($"玩家{message.PlayerID}加入匹配队列");

                response.ActorID = matcher.Id;
                reply(response);
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }
Пример #5
0
 public static Room GetIdleRoom(this RoomManagerComponent self)
 {
     if (self.IdleRoomCount > 0)
     {
         Room room = self.IdleRooms.Dequeue();
         self.ReadyRooms.Add(room.Id, room);
         return(room);
     }
     else
     {
         return(null);
     }
 }
Пример #6
0
        protected override void Run(Session session, GamerQuitRoom message)
        {
            //同步房间玩家
            RoomManagerComponent roomManager = Game.Scene.GetComponent <RoomManagerComponent>();
            Room  room  = roomManager.Get(message.RoomID);
            Gamer gamer = room.Get(message.PlayerID);

            room.Remove(message.PlayerID);
            Game.Scene.GetComponent <MatchComponent>().Playing.Remove(gamer.UserID);
            Log.Info($"匹配服务器同步:玩家{message.PlayerID}离开房间{room.Id}");
            if (room.Count == 0)
            {
                roomManager.Recycle(room.Id);
                Log.Info($"回收房间{room.Id}");
            }
        }
        public static void Update(this MatchComponent self)
        {
            while (true)
            {
                MatcherComponent     matcherComponent = Game.Scene.GetComponent <MatcherComponent>();
                Queue <Matcher>      matchers         = new Queue <Matcher>(matcherComponent.GetAll());
                RoomManagerComponent roomManager      = Game.Scene.GetComponent <RoomManagerComponent>();
                Room room = roomManager.GetReadyRoom();

                if (matchers.Count == 0)
                {
                    //当没有匹配玩家时直接结束
                    break;
                }

                if (room == null && matchers.Count >= 3)
                {
                    //当还有一桌匹配玩家且没有可加入房间时使用空房间
                    room = roomManager.GetIdleRoom();
                }

                if (room != null)
                {
                    //当有房间时匹配玩家直接加入
                    while (matchers.Count > 0 && room.Count < 3)
                    {
                        JoinRoom(self, room, matchers.Dequeue());
                    }
                }
                else if (matchers.Count >= 3)
                {
                    //当还有一桌匹配玩家且没有空房间时创建新房间
                    CreateRoom(self);
                    break;
                }
                else
                {
                    break;
                }

                //移除匹配成功玩家
                while (self.MatchSuccessQueue.Count > 0)
                {
                    matcherComponent.Remove(self.MatchSuccessQueue.Dequeue().PlayerID);
                }
            }
        }
        protected override async Task Run(Model.Fishs.Entitys.Unit unit, C2M_EnterRoom message, Action <M2C_EnterRoom> reply)
        {
            await Task.CompletedTask;

            Log.Debug("EnterRoom");
            RoomManagerComponent roomManager = Game.Scene.GetComponent <RoomManagerComponent>();
            Room room     = roomManager.GetBestRoom((RoomType)message.RoomType);
            var  response = new M2C_EnterRoom();

            if (room == null)
            {
                response.Tag = ErrorCode.ERR_RoomNOExist;
                reply(response);
            }
            response.Tag = room.EnterRoom(unit);
            reply(response);
            room.BroadcastNewUnit(unit);
        }
Пример #9
0
        protected override void Run(Session session, SyncRoomState message)
        {
            RoomManagerComponent roomManager = Game.Scene.GetComponent <RoomManagerComponent>();
            Room room = roomManager.Get(message.RoomID);

            //同步房间状态
            switch (message.State)
            {
            case RoomState.Game:
                roomManager.RoomStartGame(room.Id);
                Log.Info($"房间{room.Id}切换为游戏状态");
                break;

            case RoomState.Ready:
                Log.Info($"房间{room.Id}切换为准备状态");
                roomManager.RoomEndGame(room.Id);
                break;
            }
        }
        public static Room GetBestRoom(this RoomManagerComponent self, RoomType roomType)
        {
            var rooms = self.GetAll();

            //
            foreach (var item in rooms)
            {
                if (item.RoomType == roomType)
                {
                    if (item.UnitCount < CFG.RoomMaxNum)
                    {
                        return(item);
                    }
                }
            }
            //创建一个新的房间
            var room = ComponentFactory.Create <Room, RoomType>(roomType);

            self.Add(room);
            return(room);
        }
Пример #11
0
 public static void Add(this RoomManagerComponent self, Room room)
 {
     self.Rooms.Add(room.Id, room);
     self.IdleRooms.Enqueue(room);
 }
Пример #12
0
 public static Room GetReadyRoom(this RoomManagerComponent self)
 {
     return(self.ReadyRooms.Where(p => p.Value.Count < 3).FirstOrDefault().Value);
 }