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); } }