public async override void Run()
        {
            RoomComponent roomComponent = Game.Scene.GetComponent <RoomComponent>();

            if (roomComponent == null)
            {
                //TODO:用command時防呆,這邊先return,應該有更好的做法
                return;
            }

            ConfigComponent configComponent = Game.Scene.GetComponent <ConfigComponent>();

            IConfig[] roadSettings = configComponent.GetAll(typeof(RoadSetting));

            StartConfigComponent startConfigComponent = Game.Scene.GetComponent <StartConfigComponent>();
            StartConfig          startConfig          = startConfigComponent.StartConfig;

            for (int i = 0; i < roadSettings.Length; i++)
            {
                RoadSetting roadSetting = roadSettings[i] as RoadSetting;
                if (roadSetting == null)
                {
                    continue;
                }
                if (roadSetting.Id < RoadHelper.RoamingIdStart || roadSetting.Id > RoadHelper.RoamingIdEnd)
                {
                    continue;
                }
                int mapIndex = startConfigComponent.MapConfigs.IndexOf(startConfig);
                if (startConfig.AppType != AppType.AllServer)
                {
                    if (roadSetting.MapServerIndex != mapIndex)
                    {
                        continue;
                    }
                }
                var      mapLimitSetting = (MapLimitSetting)configComponent.Get(typeof(MapLimitSetting), roadSetting.MapServerIndex);
                RoomInfo roamingRoomInfo = new RoomInfo()
                {
                    Title          = string.Empty,
                    RoadSettingId  = roadSetting.Id,
                    MaxMemberCount = mapLimitSetting == null ? 1000 : mapLimitSetting.MaxUserCount,
                };

                var room = roomComponent.GetRoamingBySettingId(roadSetting.Id);

                if (room == null)
                {
                    roamingRoomInfo.NowMemberCount = 0;
                    room = await roomComponent.CreateRoamingRoom(roamingRoomInfo);
                }
                else
                {
                    room.SetData(roamingRoomInfo);
                }

                roomComponent.Update(room).Coroutine();

                //RoomInfo teamRoomInfo = new RoomInfo()
                //{
                //    Title = $"測試組隊_{RandomHelper.RandomNumber(1515, 54861655)}",
                //    RoadSettingId = roadSetting.Id,
                //    MaxMemberCount = 8,
                //    NowMemberCount = 0,
                //};

                //TeamRoomData teamRoomData = new TeamRoomData()
                //{
                //    LeaderName = $"測試玩家_{i}",
                //    LeaderUid = 989898989,
                //    StartUTCTimeTick = DateTime.UtcNow.Ticks,
                //};

                //roomComponent.CreateTeamRoom(teamRoomInfo, teamRoomData);
            }
        }
        private async ETTask RunAsync(Session session, C2G_TeamCreate message, Action <G2C_TeamCreate> reply)
        {
            G2C_TeamCreate response = new G2C_TeamCreate();

            try
            {
                //取得自身資料
                Player player = session.GetComponent <SessionPlayerComponent>().Player;
                User   user   = await UserDataHelper.FindOneUser((player?.uid).GetValueOrDefault());

                if (user == null)
                {
                    response.Error = ErrorCode.ERR_AccountDoesntExist;
                    reply(response);
                    return;
                }

                RoomInfo roomInfo = new RoomInfo()
                {
                    RoomId         = 0,
                    Title          = user.name,
                    RoadSettingId  = message.RoadSettingId,
                    MaxMemberCount = 8,
                    NowMemberCount = 0,
                };

                TeamRoomData teamRoomData = new TeamRoomData()
                {
                    LeaderUid        = player.uid,
                    LeaderName       = user.name,
                    StartUTCTimeTick = -1,
                };

                var roomComponent = Game.Scene.GetComponent <RoomComponent>();
                var room          = await roomComponent.CreateTeamRoom(roomInfo, teamRoomData);

                if (room == null)
                {
                    response.Error = ErrorCode.ERR_RoomIdNotFound;
                    reply(response);
                    return;
                }

                if (room.Type != RoomType.Team)
                {
                    response.Error = ErrorCode.ERR_RoonTypeError;
                    reply(response);
                    return;
                }

                var roomTeamComponent = room.GetComponent <RoomTeamComponent>();
                if (roomTeamComponent == null)
                {
                    response.Error = ErrorCode.ERR_RoomTeamComponentNull;
                    reply(response);
                    return;
                }

                // 連接到Map伺服器,並創建Unit實體
                IPEndPoint mapAddress = StartConfigComponent.Instance.Get(player.mapAppId).GetComponent <InnerConfig>().IPEndPoint;
                Session    mapSession = Game.Scene.GetComponent <NetInnerComponent>().Get(mapAddress);

                //建立Map實體並進入房間
                G2M_MapUnitCreate g2M_MapUnitCreate = new G2M_MapUnitCreate();
                g2M_MapUnitCreate.Uid           = player.uid;
                g2M_MapUnitCreate.GateSessionId = session.InstanceId;
                g2M_MapUnitCreate.MapUnitInfo   = new MapUnitInfo()
                {
                    Name              = user.name,
                    Location          = user.location,
                    RoomId            = room.Id,
                    DistanceTravelled = 0,
                    CharSetting       = user.playerCharSetting,
                    //PathId 一般組隊入場再決定
                };

                //建立自身MapUnit
                M2G_MapUnitCreate createUnit = (M2G_MapUnitCreate)await mapSession.Call(g2M_MapUnitCreate);

                g2M_MapUnitCreate.MapUnitInfo.MapUnitId = createUnit.MapUnitId;
                player.EnterRoom(createUnit.MapUnitId, room);

                //回傳資料
                response.Info = room.info;
                response.Data = roomTeamComponent.Data;
                for (int i = 0; i < roomTeamComponent.MemberDatas.Length; i++)
                {
                    if (roomTeamComponent.MemberDatas[i] != null)
                    {
                        response.MemberDatas.Add(roomTeamComponent.MemberDatas[i]);
                    }
                }
                reply(response);
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }
        public static async ETTask <Room> CreateTeamRoom(this LobbyComponent self, int mapAppId, RoomInfo roomInfo, TeamRoomData teamRoomData)
        {
            // 等候房間創建完成,並且也同步Room到了Lobby
            Session        mapSession     = SessionHelper.GetMapSession(mapAppId);
            M2L_TeamCreate m2L_TeamCreate = (M2L_TeamCreate)await mapSession.Call(new L2M_TeamCreate
            {
                Info = roomInfo,
                Data = teamRoomData,
            });

            if (m2L_TeamCreate.Error != ErrorCode.ERR_Success)
            {
                return(null);
            }

            Room room = BsonSerializer.Deserialize <Room>(m2L_TeamCreate.Json);

            CacheExHelper.WriteInCache(room, out room);

            return(room);
        }
        private async ETTask RunAsync(Player player, C2L_TeamCreate message, Action <L2C_TeamCreate> reply)
        {
            L2C_TeamCreate response = new L2C_TeamCreate();

            try
            {
                var lobbyComponent = Game.Scene.GetComponent <LobbyComponent>();

                User user = await UserDataHelper.FindOneUser((player?.uid).GetValueOrDefault());

                if (user == null)
                {
                    response.Error = ErrorCode.ERR_AccountDoesntExist;
                    reply(response);
                    return;
                }

                // 判斷是否還在舊的房間
                if (player.roomID != 0L)
                {
                    // 如果有就強制退房
                    await lobbyComponent.LeaveRoom(player.roomID, player.uid);
                }

                int roomcount = lobbyComponent.GetTeamRoomCount();
                if (roomcount >= lobbyComponent.GetMaxTeamRoomLimitCount())
                {
                    response.Error = ErrorCode.ERR_TooManyRooms;
                    reply(response);
                    return;
                }

                RoomInfo roomInfo = new RoomInfo()
                {
                    RoomId         = 0,
                    Title          = user.name,
                    RoadSettingId  = message.RoadSettingId,
                    MaxMemberCount = 8,
                    NowMemberCount = 0,
                };

                TeamRoomData teamRoomData = new TeamRoomData()
                {
                    LeaderUid        = player.uid,
                    LeaderName       = user.name,
                    StartUTCTimeTick = -1,
                };

                // 隨機一個Map給要預約的房間
                var startConfig = NetworkHelper.GetRandomMap();
                var room        = await lobbyComponent.CreateTeamRoom(startConfig.AppId, roomInfo, teamRoomData);

                if (room == null)
                {
                    response.Error = ErrorCode.ERR_RoomIdNotFound;
                    reply(response);
                    return;
                }

                if (room.Type != RoomType.Team)
                {
                    response.Error = ErrorCode.ERR_RoonTypeError;
                    reply(response);
                    return;
                }

                // 連接到Map伺服器,並創建Unit實體
                Session mapSession = SessionHelper.GetMapSession(startConfig.AppId);

                // 建立Map實體並進入房間
                L2M_MapUnitCreate m2L_MapUnitCreate = new L2M_MapUnitCreate();
                m2L_MapUnitCreate.Uid           = player.uid;
                m2L_MapUnitCreate.GateSessionId = player.gateSessionActorId;
                m2L_MapUnitCreate.MapUnitInfo   = new MapUnitInfo()
                {
                    Name              = user.name,
                    Location          = user.location,
                    RoomId            = room.Id,
                    DistanceTravelled = 0,
                    CharSetting       = user.playerCharSetting,
                    // PathId 一般組隊入場再決定
                };

                // 建立自身MapUnit
                M2L_MapUnitCreate createUnit = (M2L_MapUnitCreate)await mapSession.Call(m2L_MapUnitCreate);

                player.EnterRoom(createUnit.MapUnitId, room);

                // 得到隊伍資訊
                var teamInfo = await lobbyComponent.GetTeamInfo(room.Id);

                if (teamInfo == null)
                {
                    response.Error = ErrorCode.ERR_RoomTeamComponentNull;
                    reply(response);
                    return;
                }

                // 更新PlayerUnit
                var playerComponent = Game.Scene.GetComponent <PlayerComponent>();
                await playerComponent.Update(player);

                // 回傳資料
                response.Info        = room.info;
                response.Data        = teamInfo.Item1;
                response.MemberDatas = teamInfo.Item2;
                reply(response);
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }