Exemple #1
0
        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);
            }
        }
Exemple #3
0
        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);
            }
        }