private async void CreateRoomAsync(Reservation self) { var roomInfo = new RoomInfo() { RoomId = 0, Title = self.allData.SenderName, RoadSettingId = self.allData.RoadSettingId, MaxMemberCount = 8, NowMemberCount = 0, }; var teamRoomData = new TeamRoomData() { LeaderUid = -1, LeaderName = self.allData.SenderName, StartUTCTimeTick = self.allData.StartUTCTimeTick, IsReservation = true, }; var reservationMembers = new RepeatedField <ReservationMemberData>(); for (int i = 0; i < self.allData.MemberUid?.count; i++) { var uid = self.allData.MemberUid[i]; User user = await UserDataHelper.FindOneUser(uid); if (user == null) { Log.Error($"Reservation CreateRoomAsync Failed, Can't find user, uid:{uid}"); continue; } var reservationMemberData = new ReservationMemberData() { MemberIndex = i, Uid = user.Id, Name = user.name, Location = user.location, }; reservationMembers.Add(reservationMemberData); } var lobbyComponent = Game.Scene.GetComponent <LobbyComponent>(); // 隨機一個Map給要預約的房間 var startConfig = NetworkHelper.GetRandomMap(); self.room = await lobbyComponent.CreateTeamRoom(startConfig.AppId, roomInfo, teamRoomData); var reservationComponent = Game.Scene.GetComponent <ReservationComponent>(); await reservationComponent.UpdateReservation(self); await lobbyComponent.SetReservationMember(self.room.Id, reservationMembers); }
public static async ETTask <Room> CreateTeamRoom(this RoomComponent self, RoomInfo roomInfo, TeamRoomData teamRoomData) { Room room = ComponentFactory.CreateWithId <Room, RoomType>(IdGenerater.GenerateId(), RoomType.Team); room.SetData(roomInfo); room = await self.MemorySync.Create(room); room.AddComponent <RoomTeamComponent, TeamRoomData>(teamRoomData); room.AddComponent <RoomBlockComponent, Room>(room); var first = OtherHelper.Search(self.TeamList, r => r.Id == room.Id); if (first == null) { self.TeamList.Add(room); } return(room); }
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(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); } }
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); } }