protected async ETTask RunAsync(Player player, C2L_TeamInviteAccept message, Action <L2C_TeamInviteAccept> reply) { L2C_TeamInviteAccept response = new L2C_TeamInviteAccept(); try { var lobbyComponent = Game.Scene.GetComponent <LobbyComponent>(); // 取得自身資料 User user = await UserDataHelper.FindOneUser((player?.uid).GetValueOrDefault(0)); if (user == null) { response.Error = ErrorCode.ERR_AccountDoesntExist; reply(response); return; } // 判斷邀請是否合法 var inviteComponent = Game.Scene.GetComponent <InviteComponent>(); var invite = inviteComponent.GetByInviteId(message.InviteId); if (invite == null) { response.Error = ErrorCode.ERR_InviteIdNotFind; reply(response); return; } if (invite.data.ReceiverUid != player?.uid) { response.Error = ErrorCode.ERR_InviteNotSelf; reply(response); return; } // 刪除該邀請 await inviteComponent.DestroyByInviteId(message.InviteId); // 判斷房間是否合法 var room = lobbyComponent.GetRoom(invite.data.TeamRoomId); if (room == null) { response.Error = ErrorCode.ERR_RoomIdNotFound; reply(response); return; } if (room.Type != RoomType.Team) { response.Error = ErrorCode.ERR_RoonTypeError; reply(response); return; } if (room.State != RoomState.Start) { response.Error = ErrorCode.ERR_RoomTeamStateCanNotEnter; reply(response); return; } if (room.info.NowMemberCount >= room.info.MaxMemberCount) { response.Error = ErrorCode.ERR_RoomTeamMemberIsFull; reply(response); return; } // 連接到Map伺服器,並創建Unit實體 Session mapSession = SessionHelper.GetMapSession(IdGenerater.GetAppId(room.Id)); // 建立Map實體並進入房間 L2M_MapUnitCreate l2M_MapUnitCreate = new L2M_MapUnitCreate(); l2M_MapUnitCreate.Uid = player.uid; l2M_MapUnitCreate.GateSessionId = player.gateSessionActorId; l2M_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(l2M_MapUnitCreate); l2M_MapUnitCreate.MapUnitInfo.MapUnitId = createUnit.MapUnitId; player.EnterRoom(createUnit.MapUnitId, room); // 更新Player的MapUnitId await Game.Scene.GetComponent <PlayerComponent>().Update(player); // 對全體廣播自己剛建立的MapUnitInfo(不包含自己) await lobbyComponent.BroadcastTeamModifyMember(player.uid, room.Id); // 回傳資料 var teamData = await lobbyComponent.GetTeamInfo(room.Id); response.Info = room.info; response.Data = teamData.Item1; for (int i = 0; i < teamData.Item2.Count; i++) { if (teamData.Item2[i] != null) { response.MemberDatas.Add(teamData.Item2[i]); } } reply(response); } catch (Exception e) { ReplyError(response, e, reply); } }
protected async ETTask RunAsync(Player player, C2L_RoamingEnter message, Action <L2C_RoamingEnter> reply) { L2C_RoamingEnter response = new L2C_RoamingEnter(); try { var lobbyComponent = Game.Scene.GetComponent <LobbyComponent>(); // 判斷是否還在舊的房間 if (player.roomID != 0L) { // 如果有就強制退房 await lobbyComponent.LeaveRoom(player.roomID, player.uid); } // 判斷房間是否合法 Room room = lobbyComponent.GetRoom(message.RoamingRoomId); if (room == null) { response.Error = ErrorCode.ERR_RoomIdNotFound; reply(response); return; } // 0518 Saitou add member Limit if (room.info.NowMemberCount >= room.info.MaxMemberCount) { response.Error = ErrorCode.ERR_RoomRoamingMemberIsFull; reply(response); return; } // 回傳房間設定 response.RoadSettingId = room.info.RoadSettingId; // 取得自身資料 User user = await UserDataHelper.FindOneUser((player?.uid).GetValueOrDefault()); if (user == null) { response.Error = ErrorCode.ERR_AccountDoesntExist; reply(response); return; } // 連接到Map伺服器,並創建Unit實體 Session mapSession = SessionHelper.GetMapSession(IdGenerater.GetAppId(room.Id)); // 建立Map實體並進入房間 L2M_MapUnitCreate g2M_MapUnitCreate = new L2M_MapUnitCreate(); g2M_MapUnitCreate.Uid = player.uid; g2M_MapUnitCreate.GateSessionId = player.gateSessionActorId; g2M_MapUnitCreate.MapUnitInfo = new MapUnitInfo() { Name = user.name, Location = user.location, RoomId = message.RoamingRoomId, DistanceTravelled = 0, SpeedMS = 0, CharSetting = user.playerCharSetting, PathId = room.info.NowMemberCount % 4, StartUTCTick = DateTime.UtcNow.Ticks, Uid = player.uid, }; // 建立自身MapUnit M2L_MapUnitCreate createUnit = (M2L_MapUnitCreate)await mapSession.Call(g2M_MapUnitCreate); g2M_MapUnitCreate.MapUnitInfo.MapUnitId = createUnit.MapUnitId; // 進入房間 player.EnterRoom(createUnit.MapUnitId, room); player.StartRoom(); // 更新MapUnitId await Game.Scene.GetComponent <PlayerComponent>().Update(player); // TODO:紀錄 // 回傳自己MapUnitInfo response.SelfInfo = g2M_MapUnitCreate.MapUnitInfo; response.GlobalInfos = await lobbyComponent.GetAllMapUnitGlobalInfoOnRoom(room.Id); reply(response); } catch (Exception e) { ReplyError(response, e, reply); } }
protected async ETTask RunAsync(Player player, C2L_TeamEnter message, Action <L2C_TeamEnter> reply) { L2C_TeamEnter response = new L2C_TeamEnter(); try { var lobbyComponent = Game.Scene.GetComponent <LobbyComponent>(); // 判斷是否還在舊的房間 if (player.roomID != 0L) { // 如果有就強制退房 await lobbyComponent.LeaveRoom(player.roomID, player.uid); } // 判斷房間是否合法 Room room = lobbyComponent.GetRoom(message.TeamRoomId); if (room == null) { response.Error = ErrorCode.ERR_RoomIdNotFound; reply(response); return; } if (room.Type != RoomType.Team) { response.Error = ErrorCode.ERR_RoonTypeError; reply(response); return; } if (room.State != RoomState.Start) { response.Error = ErrorCode.ERR_RoomTeamStateCanNotEnter; reply(response); return; } if (room.info.NowMemberCount >= room.info.MaxMemberCount) { response.Error = ErrorCode.ERR_RoomTeamMemberIsFull; reply(response); return; } // 取得自身資料 User user = await UserDataHelper.FindOneUser((player?.uid).GetValueOrDefault()); if (user == null) { response.Error = ErrorCode.ERR_AccountDoesntExist; reply(response); return; } // 連接到Map伺服器,並創建Unit實體 Session mapSession = SessionHelper.GetMapSession(IdGenerater.GetAppId(room.Id)); // 建立Map實體並進入房間 L2M_MapUnitCreate g2M_MapUnitCreate = new L2M_MapUnitCreate(); g2M_MapUnitCreate.Uid = player.uid; g2M_MapUnitCreate.GateSessionId = player.gateSessionActorId; g2M_MapUnitCreate.MapUnitInfo = new MapUnitInfo() { Name = user.name, Location = user.location, RoomId = room.Id, DistanceTravelled = 0, CharSetting = user.playerCharSetting, Uid = player.uid, // PathId 一般組隊入場再決定 }; // 建立自身MapUnit M2L_MapUnitCreate createUnit = (M2L_MapUnitCreate)await mapSession.Call(g2M_MapUnitCreate); g2M_MapUnitCreate.MapUnitInfo.MapUnitId = createUnit.MapUnitId; player.EnterRoom(createUnit.MapUnitId, room); // 更新MapUnitId await Game.Scene.GetComponent <PlayerComponent>().Update(player); // 對全體廣播自己剛建立的MapUnitInfo(不包含自己) await lobbyComponent.BroadcastTeamModifyMember(player.uid, room.Id); // 回傳資料 var result = await lobbyComponent.GetTeamInfo(room.Id); response.Info = room.info; response.Data = result.Item1; for (int i = 0; i < result.Item2.Count; i++) { if (result.Item2[i] != null) { response.MemberDatas.Add(result.Item2[i]); } } for (int i = 0; i < result.Item3.Count; i++) { if (result.Item3[i] != null) { response.ReservationMemberDatas.Add(result.Item3[i]); } } reply(response); } catch (Exception e) { ReplyError(response, e, reply); } }
private async ETTask RunAsync(Player player, C2L_TeamReservationJoin message, Action <L2C_TeamReservationJoin> reply) { L2C_TeamReservationJoin response = new L2C_TeamReservationJoin(); try { //取得自身資料 User user = await UserDataHelper.FindOneUser((player?.uid).GetValueOrDefault()); if (user == null) { response.Error = ErrorCode.ERR_AccountDoesntExist; reply(response); return; } //取得預約資料 var reservationComponent = Game.Scene.GetComponent <ReservationComponent>(); var reservation = reservationComponent.GetByReservationId(message.ReservationId); //判斷是否有該預約 if (reservation == null) { response.Error = ErrorCode.ERR_ReservationIdNotFind; reply(response); return; } //判斷是否為被邀請者 if (!reservation.allData.MemberUid.Contains(player.uid)) { response.Error = ErrorCode.ERR_ReservationNotTheOwner; reply(response); return; } //判斷是否有該房間 if (reservation.room == null) { response.Error = ErrorCode.ERR_ReservationRoomNotFind; reply(response); return; } //判斷該房間是否可以進入 if (reservation.room.State != RoomState.Start) { response.Error = ErrorCode.ERR_RoomTeamStateCanNotEnter; reply(response); return; } //判斷是否人滿 if (reservation.room.info.NowMemberCount >= reservation.room.info.MaxMemberCount) { response.Error = ErrorCode.ERR_RoomTeamMemberIsFull; reply(response); return; } // 連接到Map伺服器,並創建Unit實體 Session mapSession = SessionHelper.GetMapSession(IdGenerater.GetAppId(reservation.room.Id)); //建立Map實體並進入房間 L2M_MapUnitCreate g2M_MapUnitCreate = new L2M_MapUnitCreate(); g2M_MapUnitCreate.Uid = player.uid; g2M_MapUnitCreate.GateSessionId = player.gateSessionActorId; g2M_MapUnitCreate.MapUnitInfo = new MapUnitInfo() { Name = user.name, Location = user.location, RoomId = reservation.room.Id, DistanceTravelled = 0, CharSetting = user.playerCharSetting, //PathId 一般組隊入場再決定 }; //建立自身MapUnit M2L_MapUnitCreate createUnit = (M2L_MapUnitCreate)await mapSession.Call(g2M_MapUnitCreate); g2M_MapUnitCreate.MapUnitInfo.MapUnitId = createUnit.MapUnitId; player.EnterRoom(createUnit.MapUnitId, reservation.room); // 更新MapUnitId await Game.Scene.GetComponent <PlayerComponent>().Update(player); var lobbyComponent = Game.Scene.GetComponent <LobbyComponent>(); //對全體廣播自己剛建立的MapUnitInfo(不包含自己) await lobbyComponent.BroadcastTeamModifyMember(player.uid, reservation.room.Id); //回傳資料 var result = await lobbyComponent.GetTeamInfo(reservation.room.Id); response.Error = ErrorCode.ERR_Success; response.Info = reservation.room.info; response.Data = result.Item1; for (int i = 0; i < result.Item2.Count; i++) { if (result.Item2[i] != null) { response.MemberDatas.Add(result.Item2[i]); } } for (int i = 0; i < result.Item3.Count; i++) { if (result.Item3[i] != null) { response.ReservationMemberDatas.Add(result.Item3[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); } }