Esempio n. 1
0
        protected override async void Run(Session session, C2G_LoginGate message, Action <G2C_LoginGate> reply)
        {
            G2C_LoginGate           response                = new G2C_LoginGate();
            StartConfigComponent    startComponent          = Game.Scene.GetComponent <StartConfigComponent>();
            GateSessionKeyComponent gateSessionKeyComponent = Game.Scene.GetComponent <GateSessionKeyComponent>();

            try
            {
                long uid = gateSessionKeyComponent.Get(message.Key);
                if (uid <= 0)
                {
                    response.Error   = ErrorCode.ERR_ConnectGateKeyError;
                    response.Message = "Gate key驗證失敗!";
                    reply(response);
                    return;
                }
                // 登入成功,刪除Gate的Key
                gateSessionKeyComponent.Remove(message.Key);
                int lobbyAppId = 0;
                var player     = CacheHelper.GetFromCache <Player>(uid);
                if (player != null && player.lobbyAppId != 0)
                {
                    lobbyAppId = player.lobbyAppId;
                }
                else
                {
                    lobbyAppId = SessionHelper.GetLobbyIdRandomly();
                }
                // 隨機連接到Lobby伺服器,並創建PlayerUnit實體
                G2L_LobbyUnitCreate g2L_LobbyUnitCreate = new G2L_LobbyUnitCreate();
                g2L_LobbyUnitCreate.Uid           = uid;
                g2L_LobbyUnitCreate.GateSessionId = session.InstanceId;
                g2L_LobbyUnitCreate.GateAppId     = (int)IdGenerater.AppId;
                g2L_LobbyUnitCreate.LobbyAppId    = lobbyAppId;

                // 等候LobbyUnit單元創建完成,並且也同步Player到了Gate
                Session             lobbySession        = SessionHelper.GetLobbySession(g2L_LobbyUnitCreate.LobbyAppId);
                L2G_LobbyUnitCreate l2G_LobbyUnitCreate = (L2G_LobbyUnitCreate)await lobbySession.Call(g2L_LobbyUnitCreate);

                if (l2G_LobbyUnitCreate.Error != ErrorCode.ERR_Success)
                {
                    response.Error = l2G_LobbyUnitCreate.Error;
                    reply(response);
                    return;
                }

                player = BsonSerializer.Deserialize <Player>(l2G_LobbyUnitCreate.Json);
                CacheExHelper.WriteInCache(player, out player);

                session.AddComponent <SessionPlayerComponent, long>(player.gateSessionActorId).Player = player;
                session.AddComponent <MailBoxComponent, string>(MailboxType.GateSession);

                response.PlayerId = player.Id;
                reply(response);
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }
        public static async ETTask <Tuple <TeamRoomData, RepeatedField <TeamMemberData>, RepeatedField <ReservationMemberData> > > GetTeamInfo(this LobbyComponent self, long roomId)
        {
            int             mapAppId        = IdGenerater.GetAppId(roomId);
            Session         mapSession      = SessionHelper.GetMapSession(mapAppId);
            M2L_GetTeamData m2L_GetTeamData = (M2L_GetTeamData)await mapSession.Call(new L2M_GetTeamData
            {
                RoomId = roomId,
            });

            if (m2L_GetTeamData.Error != ErrorCode.ERR_Success)
            {
                return(null);
            }
            var room = BsonSerializer.Deserialize <Room>(m2L_GetTeamData.RoomJson);

            CacheExHelper.WriteInCache(room, out _);
            return(new Tuple <TeamRoomData, RepeatedField <TeamMemberData>, RepeatedField <ReservationMemberData> >
                       (m2L_GetTeamData.TeamData, m2L_GetTeamData.TeamMember, m2L_GetTeamData.ReservationTeamData));
        }
        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);
        }
Esempio n. 4
0
        protected override async ETTask Run(MapUnit mapUnit, C2M_TeamInvite message, Action <M2C_TeamInvite> reply)
        {
            await ETTask.CompletedTask;

            M2C_TeamInvite response = new M2C_TeamInvite();

            try
            {
                if (mapUnit.Room == null)
                {
                    response.Error = ErrorCode.ERR_RoomIdNotFound;
                    reply(response);
                    return;
                }

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

                if (mapUnit.Room.State != RoomState.Start)
                {
                    response.Error = ErrorCode.ERR_RoomTeamStateCanNotInvite;
                    reply(response);
                    return;
                }

                User user = await UserDataHelper.FindOneUser(mapUnit.Uid);

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

                // 建立邀請
                InviteData inviteData = new InviteData()
                {
                    SenderName    = user.name,
                    SenderUid     = mapUnit.Uid,
                    ReceiverUid   = message.ReceiverUid,
                    TeamRoomId    = mapUnit.Room.Id,
                    RoadSettingId = mapUnit.Room.info.RoadSettingId
                };

                var player       = CacheExHelper.GetFromCache <Player>(mapUnit.Uid);
                var lobbySession = SessionHelper.GetLobbySession(player.lobbyAppId);
                L2M_CreateInvite l2M_CreateInvite = (L2M_CreateInvite)await lobbySession.Call(new M2L_CreateInvite
                {
                    InviteInfo = inviteData,
                });

                if (l2M_CreateInvite.Error != ErrorCode.ERR_Success)
                {
                    response.Error = ErrorCode.ERR_InviteIdNotFind;
                    reply(response);
                    return;
                }

                Invite inviteEntity = BsonSerializer.Deserialize <Invite>(l2M_CreateInvite.Json);
                CacheExHelper.WriteInCache(inviteEntity, out inviteEntity);

                // 告知對方
                Player inviteTarget = CacheExHelper.GetFromCache <Player>(message.ReceiverUid);
                if (inviteTarget != null)
                {
                    //在線上 廣播給指定玩家邀請訊息
                    G2C_TeamInviteReceiver g2c_TeamInviteReceiver = new G2C_TeamInviteReceiver();
                    g2c_TeamInviteReceiver.InviteId   = inviteEntity.Id;
                    g2c_TeamInviteReceiver.SenderName = inviteEntity.data.SenderName;
                    GateMessageHelper.BroadcastTarget(g2c_TeamInviteReceiver, message.ReceiverUid);
                }
                // 推播
                User u = await UserDataHelper.FindOneUser(message.ReceiverUid);

                var firebase = Game.Scene.GetComponent <FirebaseComponent>();
                var lang     = Game.Scene.GetComponent <LanguageComponent>();
                // 多國2-'{0}'邀請你一起組隊!
                var body = lang.GetString(u.language, 2L);
                await firebase.SendOneNotification(u.firebaseDeviceToken, string.Empty, string.Format(body, user.name));

                response.Error = ErrorCode.ERR_Success;
                reply(response);
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }