示例#1
0
文件: LSBiz.cs 项目: niuniuzhu/KOW
        /// <summary>
        /// LS通知CS有客户端登录成功
        /// </summary>
        public ErrorCode OnLs2CsGclogin(NetSessionBase session, Google.Protobuf.IMessage message)
        {
            Protos.LS2CS_GCLogin gcLogin = (Protos.LS2CS_GCLogin)message;
            CSUser user = CS.instance.userMgr.CreateUser(gcLogin);

            Protos.CS2LS_GCLoginRet gcLoginRet = ProtoCreator.R_LS2CS_GCLogin(gcLogin.Opts.Pid);
            gcLoginRet.Result = user != null
                                                                        ? Protos.CS2LS_GCLoginRet.Types.EResult.Success
                                                                        : Protos.CS2LS_GCLoginRet.Types.EResult.Failed;
            session.Send(gcLoginRet);
            return(ErrorCode.Success);
        }
示例#2
0
        /// <summary>
        /// 客户端与GS断开连接
        /// </summary>
        public ErrorCode OnGs2CsGclost(NetSessionBase session, IMessage message)
        {
            Protos.GS2CS_GCLost request = (Protos.GS2CS_GCLost)message;
            ulong  gcNID = request.SessionID;
            CSUser user  = CS.instance.userMgr.GetUser(gcNID);

            if (user != null)
            {
                CS.instance.userMgr.Offline(user);
                CS.instance.userMgr.DestroyUser(user);
            }
            return(ErrorCode.Success);
        }
示例#3
0
文件: GCBiz.cs 项目: niuniuzhu/KOW
        public ErrorCode OnGc2BsRequestFrameActions(NetSessionBase session, Google.Protobuf.IMessage message)
        {
            BSUser user = BS.instance.userMgr.GetUser(session.id);

            if (user != null)
            {
                Protos.GC2BS_RequestFrameActions    request = (Protos.GC2BS_RequestFrameActions)message;
                Protos.BS2GC_RequestFrameActionsRet ret     = ProtoCreator.R_GC2BS_RequestFrameActions(request.Opts.Pid);
                BS.instance.battleMgr.HandleRequestFrameActions(user.battle, request.From, request.To, ret);
                BS.instance.netSessionMgr.Send(user.gcSID, ret);
            }
            return(ErrorCode.Success);
        }
示例#4
0
文件: GCBiz.cs 项目: niuniuzhu/KOW
        public ErrorCode OnGC2GSAskLogin(NetSessionBase session, Google.Protobuf.IMessage message)
        {
            Protos.GC2GS_AskLogin login = (Protos.GC2GS_AskLogin)message;

            Protos.GS2CS_GCAskLogin gcAskLogin = ProtoCreator.Q_GS2CS_GCAskLogin();
            gcAskLogin.SessionID = login.SessionID;
            Logger.Log($"client:{gcAskLogin.SessionID} ask login");

            //向CS请求客户端登陆
            GS.instance.netSessionMgr.Send(SessionType.ServerG2CS, gcAskLogin,
                                           RPCEntry.Pop(OnCS2GSAskLoginRet, session.id, login));
            return(ErrorCode.Success);
        }
示例#5
0
        /// <summary>
        /// 客户端请求查询英雄
        /// </summary>
        public ErrorCode OnGc2CsQueryChampions(NetSessionBase session, IMessage message)
        {
            Protos.GC2CS_QueryChampions request = (Protos.GC2CS_QueryChampions)message;
            ulong  gcNID = request.Opts.Transid;
            CSUser user  = CS.instance.userMgr.GetUser(gcNID);

            if (user != null)
            {
                Protos.CS2GC_QueryChampionsRet response = ProtoCreator.R_GC2CS_QueryChampions(request.Opts.Pid);
                response.Cids.AddRange(user.champions);
                user.Send(response);
            }
            return(ErrorCode.Success);
        }
示例#6
0
        /// <summary>
        /// 玩家请求取消匹配
        /// </summary>
        public ErrorCode OnGc2CsCancelMatch(NetSessionBase session, IMessage message)
        {
            Protos.GC2CS_CancelMatch request = (Protos.GC2CS_CancelMatch)message;

            ulong  gcNID = request.Opts.Transid;
            CSUser user  = CS.instance.userMgr.GetUser(gcNID);

            if (!CS.instance.matchMgr.Leave(user))
            {
                return(ErrorCode.Failed);
            }

            return(ErrorCode.Success);
        }
示例#7
0
文件: CSBiz.cs 项目: niuniuzhu/KOW
 public void OnCSSessionClosed(NetSessionBase session)
 {
     uint[] gcSIDs = GS.instance.userMgr.GetClients();
     //广播到客户端CS丢失
     Protos.GS2GC_CSLost csLost = ProtoCreator.Q_GS2GC_CSLost();
     GS.instance.netSessionMgr.Broadcast(gcSIDs, csLost);
     //断开所有客户端
     foreach (uint gcSID in gcSIDs)
     {
         GS.instance.netSessionMgr.CloseSession(gcSID, "CS Closed");
     }
     //清空客户端信息
     GS.instance.userMgr.ClearClients();
 }
示例#8
0
文件: CSBiz.cs 项目: niuniuzhu/KOW
        private static void OnGSAskPingRet(NetSessionBase session, IMessage message, object[] args)
        {
            if (message == null)
            {
                return;
            }
            long currTime = TimeUtils.utcTime;

            Protos.G_AskPingRet askPingRet = (Protos.G_AskPingRet)message;
            long lag      = ( long )((currTime - askPingRet.Stime) * 0.5);
            long timeDiff = askPingRet.Time + lag - currTime;

            Logger.Log($"cs ping ret, lag:{lag}, timediff:{timeDiff}");
        }
示例#9
0
        public void ReportStateToCS(NetSessionBase session)
        {
            Protos.BS2CS_ReportState reportState = ProtoCreator.Q_BS2CS_ReportState();
            BSConfig config = BS.instance.config;

            reportState.BsInfo = new Protos.BSInfo
            {
                Id    = config.id,
                Ip    = config.externalIP,
                Port  = config.externalPort,
                State = (Protos.BSInfo.Types.State)BS.instance.state
            };
            session.Send(reportState);
        }
示例#10
0
        /// <summary>
        /// GS请求CS,验证GC登陆的合法性
        /// </summary>
        public ErrorCode OnGs2CsGcaskLogin(NetSessionBase session, IMessage message)
        {
            Protos.GS2CS_GCAskLogin request  = (Protos.GS2CS_GCAskLogin)message;
            Protos.CS2GS_GCLoginRet response = ProtoCreator.R_GS2CS_GCAskLogin(request.Opts.Pid);

            //创建玩家并上线
            CSUser user = CS.instance.userMgr.Online(request.SessionID, session.id, session.logicID);

            if (user == null)
            {
                //非法登陆
                response.Result = Protos.CS2GS_GCLoginRet.Types.EResult.IllegalLogin;
            }
            else
            {
                response.UserInfo = new Protos.G_UserInfo
                {
                    Ukey     = user.ukey,
                    GcNID    = user.gcNID,
                    OpenID   = user.openID,
                    Nickname = user.nickname,
                    Avatar   = user.avatar,
                    Gender   = user.gender,
                    Rank     = user.rank,
                    Money    = user.money,
                    Diamoned = user.diamoned,
                    Exp      = user.exp,
                };
                response.UserInfo.Champions.AddRange(user.champions);

                //检查玩家是否在战场
                if (user.isInBattle)
                {
                    //检查是否存在BS信息(可能当玩家上线时,BS已丢失)
                    //这里理应不会成功断言,因为BS丢失时会把玩家从战场暂存器里移除
                    INetSession bsSession = CS.instance.netSessionMgr.GetSession(user.bsSID);
                    System.Diagnostics.Debug.Assert(bsSession != null, $"can not find BS:{user.bsSID}");

                    CS.instance.lIDToBSInfos.TryGetValue((( BattleSession )bsSession).logicID, out BSInfo bsInfo);
                    System.Diagnostics.Debug.Assert(bsInfo != null, $"can not find BS:{( ( BattleSession )bsSession ).logicID}");
                    response.GcState = Protos.CS2GS_GCLoginRet.Types.EGCCState.Battle;
                    response.GcNID   = user.ukey | ( ulong )bsInfo.lid << 32;
                    response.BsIP    = bsInfo.ip;
                    response.BsPort  = bsInfo.port;
                }
                response.Result = Protos.CS2GS_GCLoginRet.Types.EResult.Success;
            }
            session.Send(response);
            return(ErrorCode.Success);
        }
示例#11
0
        /// <summary>
        /// 处理cs通知开始战斗
        /// </summary>
        public ErrorCode OnCs2BsBattleInfo(NetSessionBase session, Google.Protobuf.IMessage message)
        {
            Protos.CS2BS_BattleInfo battleInfo = (Protos.CS2BS_BattleInfo)message;

            BS.instance.battleMgr.CreateBattle(battleInfo, (bid, success) =>
            {
                Protos.BS2CS_BattleInfoRet battleInfoRet = ProtoCreator.R_CS2BS_BattleInfo(battleInfo.Opts.Pid);
                battleInfoRet.Bid    = bid;
                battleInfoRet.Result = success
                                                                                   ? Protos.Global.Types.ECommon.Success
                                                                                   : Protos.Global.Types.ECommon.Failed;
                session.Send(battleInfoRet);
            });

            return(ErrorCode.Success);
        }
示例#12
0
        public void OnGSSessionClosed(NetSessionBase session)
        {
            //更新GS列表
            CS.instance.lIDToGSInfos.Remove(session.logicID);
            CS.instance.UpdateAppropriateGSInfo();

            //踢出所有连接到该GS的玩家
            CS.instance.userMgr.OnGSDisconnect(session.logicID);

            //通知LS有GS断开连接了
            Protos.CS2LS_GSLost message = ProtoCreator.Q_CS2LS_GSLost();
            message.Gsid = session.logicID;
            CS.instance.netSessionMgr.Send(SessionType.ServerLS, message);

            session.logicID = 0;
        }
示例#13
0
文件: CSBiz.cs 项目: niuniuzhu/KOW
        public void ReportStateToCS(NetSessionBase session)
        {
            Protos.GS2CS_ReportState reportState = ProtoCreator.Q_GS2CS_ReportState();
            GSConfig config = GS.instance.config;

            reportState.GsInfo = new Protos.GSInfo
            {
                Id       = config.gsID,
                Name     = config.name,
                Ip       = config.externalIP,
                Port     = config.externalPort,
                Password = config.password,
                State    = (Protos.GSInfo.Types.State)GS.instance.state
            };
            session.Send(reportState);
        }
示例#14
0
        /// <summary>
        /// 玩家请求离开房间
        /// </summary>
        public ErrorCode OnGc2CsLeaveRoom(NetSessionBase session, IMessage message)
        {
            Protos.GC2CS_LeaveRoom request = (Protos.GC2CS_LeaveRoom)message;

            ulong  gcNID = request.Opts.Transid;
            CSUser user  = CS.instance.userMgr.GetUser(gcNID);

            if (user != null)
            {
                if (!CS.instance.roomMgr.Leave(user))
                {
                    return(ErrorCode.Failed);
                }
            }

            return(ErrorCode.Success);
        }
示例#15
0
文件: CSBiz.cs 项目: niuniuzhu/KOW
        public ErrorCode OnECs2GsKickGc(NetSessionBase session, IMessage message)
        {
            Protos.CS2GS_KickGC kickGC = (Protos.CS2GS_KickGC)message;

            //可能在收到消息前,客户端就断开了,这里必须容错
            if (GS.instance.userMgr.GetSID(kickGC.GcNID, out uint sid_))
            {
                //通知客户端被踢下线
                Protos.GS2GC_Kick kick = ProtoCreator.Q_GS2GC_Kick();
                kick.Reason = kickGC.Reason;
                GS.instance.netSessionMgr.Send(sid_, kick);

                //强制断开客户端
                GS.instance.netSessionMgr.CloseSession(sid_, "CS Kick");
            }
            return(ErrorCode.Success);
        }
示例#16
0
文件: CSBiz.cs 项目: niuniuzhu/KOW
        public ErrorCode OnCs2DbUpdateRank(NetSessionBase session, Google.Protobuf.IMessage message)
        {
            Protos.CS2DB_UpdateRank request = (Protos.CS2DB_UpdateRank)message;
            //combine id
            string ids   = string.Empty;
            int    count = request.Gains.Count;

            for (int i = 0; i < count; i++)
            {
                Protos.CS2DB_Gain gain = request.Gains[i];
                if (i < count - 1)
                {
                    ids += $"{gain.Ukey},";
                }
                else
                {
                    ids += gain.Ukey;
                }
            }
            string money    = "money = CASE id ";
            string diamoned = "diamoned = CASE id ";
            string exp      = "exp = CASE id ";
            string ranking  = "ranking = CASE id ";

            for (int i = 0; i < count; i++)
            {
                Protos.CS2DB_Gain gain = request.Gains[i];
                money    += $"WHEN {gain.Ukey} THEN {gain.Money} ";
                diamoned += $"WHEN {gain.Ukey} THEN {gain.Diamoned} ";
                exp      += $"WHEN {gain.Ukey} THEN {gain.Exp} ";
                ranking  += $"WHEN {gain.Ukey} THEN {gain.Rank} ";
            }
            //update command
            string str = "UPDATE account_user SET ";

            str += money + "END, ";
            str += diamoned + "END, ";
            str += exp + "END, ";
            str += ranking + "END ";
            str += $"WHERE id IN ({ids})";

            ErrorCode errorCode = DB.instance.accountDB.SqlExecNonQuery(str, out _, out uint _);

            return(ErrorCode.Success);
        }
示例#17
0
文件: GCBiz.cs 项目: niuniuzhu/KOW
        private static void OnCS2GSAskLoginRet(NetSessionBase session, Google.Protobuf.IMessage message, object[] args)
        {
            uint sid = ( uint )args[0];

            Protos.GC2GS_AskLogin login = (Protos.GC2GS_AskLogin)args[1];

            Protos.CS2GS_GCLoginRet csLoginRet = (Protos.CS2GS_GCLoginRet)message;
            Protos.GS2GC_LoginRet   gsLoginRet = ProtoCreator.R_GC2GS_AskLogin(login.Opts.Pid);
            switch (csLoginRet.Result)
            {
            case Protos.CS2GS_GCLoginRet.Types.EResult.Success:
                //检测客户端是否断线了
                ClientSession gcSession = GS.instance.netSessionMgr.GetSession(sid) as ClientSession;
                if (gcSession == null)
                {
                    //通知CS客户端断开了
                    Protos.GS2CS_GCLost gcLost = ProtoCreator.Q_GS2CS_GCLost();
                    gcLost.SessionID = login.SessionID;
                    GS.instance.netSessionMgr.Send(SessionType.ServerG2CS, gcLost);
                    return;
                }

                //添加到管理器
                GS.instance.userMgr.AddClient(login.SessionID, sid);

                //设置该Session为受信任的连接
                gcSession.accredited = true;

                gsLoginRet.Result   = Protos.GS2GC_LoginRet.Types.EResult.Success;
                gsLoginRet.GcNID    = csLoginRet.GcNID;
                gsLoginRet.GcState  = (Protos.GS2GC_LoginRet.Types.EGCCState)csLoginRet.GcState;
                gsLoginRet.UserInfo = csLoginRet.UserInfo;
                gsLoginRet.BsIP     = csLoginRet.BsIP;
                gsLoginRet.BsPort   = csLoginRet.BsPort;
                gsLoginRet.Defs     = Defs.binary;
                GS.instance.netSessionMgr.Send(sid, gsLoginRet);
                break;

            case Protos.CS2GS_GCLoginRet.Types.EResult.IllegalLogin:
                gsLoginRet.Result = Protos.GS2GC_LoginRet.Types.EResult.SessionExpire;
                GS.instance.netSessionMgr.Send(sid, gsLoginRet);
                GS.instance.netSessionMgr.CloseSession(sid, "client login failed");
                break;
            }
        }
示例#18
0
        public ErrorCode OnLs2DbQueryAccount(NetSessionBase session, Google.Protobuf.IMessage message)
        {
            Protos.LS2DB_QueryAccount    queryUser    = (Protos.LS2DB_QueryAccount)message;
            Protos.DB2LS_QueryAccountRet queryUserRet = ProtoCreator.R_LS2DB_QueryAccount(queryUser.Opts.Pid);
            ErrorCode errorCode = DB.instance.accountDB.SqlExecQuery($"select id from account_user where uname=\'{queryUser.Name}\'",
                                                                     dataReader =>
            {
                if (dataReader.HasRows)
                {
                    return(ErrorCode.UsernameExists);
                }
                return(ErrorCode.Success);
            });

            queryUserRet.Result = errorCode == ErrorCode.Success ? Protos.Global.Types.ECommon.Success : Protos.Global.Types.ECommon.Failed;
            session.Send(queryUserRet);
            return(ErrorCode.Success);
        }
示例#19
0
        public ErrorCode OnGc2LsAskSmartLogin(NetSessionBase session, Google.Protobuf.IMessage message)
        {
            uint   sid    = session.id;
            string remote = session.connection.remoteEndPoint.ToString();

            Protos.GC2LS_AskSmartLogin login      = (Protos.GC2LS_AskSmartLogin)message;
            Protos.LS2GC_AskLoginRet   gcLoginRet = ProtoCreator.R_GC2LS_AskLogin(login.Opts.Pid);

            Logger.Log($"GC {login.Id}, {session.connection.remoteEndPoint} ask login");

            //检测用户名的合法性
            if (!CheckUsername(login.Id))
            {
                gcLoginRet.Result = Protos.LS2GC_AskLoginRet.Types.EResult.InvalidUname;
                session.Send(gcLoginRet);
                session.Close(true, "login failed");
                return(ErrorCode.Success);
            }

            LoginContext context = new LoginContext();

            context.id       = login.Id;
            context.channel  = login.Channel;
            context.browser  = login.Browser;
            context.platform = login.Platform;

            //查询数据库
            //若查询失败则自动注册
            Protos.LS2DB_QueryLogin queryLogin = ProtoCreator.Q_LS2DB_QueryLogin();
            queryLogin.Name     = login.Id;
            queryLogin.Nickname = login.Id;
            queryLogin.VertPwd  = false;
            queryLogin.Time     = TimeUtils.utcTime;
            queryLogin.Ip       = remote;
            queryLogin.Channel  = login.Channel;
            queryLogin.Browser  = login.Browser;
            queryLogin.Platform = login.Platform;
            queryLogin.Money    = LS.instance.config.initMoney;
            queryLogin.Diamoned = LS.instance.config.initDiamoned;
            queryLogin.Rank     = LS.instance.config.initRank;
            LS.instance.netSessionMgr.Send(SessionType.ServerL2DB, queryLogin,
                                           RPCEntry.Pop(OnSmartQueryLoginRet, gcLoginRet, sid, context));
            return(ErrorCode.Success);
        }
示例#20
0
        /// <summary>
        /// DB返回查询登陆结果
        /// </summary>
        private static void OnSmartQueryLoginRet(NetSessionBase session, Google.Protobuf.IMessage message, object[] args)
        {
            Protos.LS2GC_AskLoginRet gcLoginRet = (Protos.LS2GC_AskLoginRet)args[0];
            uint         sid     = ( uint )args[1];
            LoginContext context = ( LoginContext )args[2];

            Protos.DB2LS_QueryLoginRet queryLoginRet = (Protos.DB2LS_QueryLoginRet)message;
            //如果查询成功
            if (queryLoginRet.Result == Protos.Global.Types.ECommon.Success)
            {
                gcLoginRet.Result = Protos.LS2GC_AskLoginRet.Types.EResult.Success;

                //写入redis缓存
                if (LS.instance.redisWrapper.IsConnected)
                {
                    LS.instance.redisWrapper.HashSet("unames", context.id, string.Empty);
                }

                context.ukey      = queryLoginRet.Ukey;
                context.channel   = queryLoginRet.Channel;
                context.browser   = queryLoginRet.Browser;
                context.platform  = queryLoginRet.Platform;
                context.unionID   = queryLoginRet.UnionID;
                context.nickname  = queryLoginRet.Nickname;
                context.avatar    = queryLoginRet.Avatar;
                context.gender    = ( byte )queryLoginRet.Gender;
                context.money     = queryLoginRet.Money;
                context.diamoned  = queryLoginRet.Diamoned;
                context.rank      = queryLoginRet.Rank;
                context.exp       = queryLoginRet.Exp;
                context.champions = queryLoginRet.Champions;
                context.actorID   = queryLoginRet.ActorID;
                HandleLoginSuccess(gcLoginRet, sid, context);
            }
            else
            {
                Logger.Error($"smart register occurs an error:{queryLoginRet.Result}");

                gcLoginRet.Result = Protos.LS2GC_AskLoginRet.Types.EResult.Failed;
                //通知客户端登陆失败
                LS.instance.netSessionMgr.Send(sid, gcLoginRet);
                LS.instance.netSessionMgr.CloseSession(sid, "login failed");
            }
        }
示例#21
0
文件: BSBiz.cs 项目: niuniuzhu/KOW
        private ErrorCode BStateReportHandler(NetSessionBase session, Protos.BSInfo BSInfoRecv)
        {
            session.logicID = BSInfoRecv.Id;
            bool hasRecord = CS.instance.lIDToBSInfos.TryGetValue(session.logicID, out BSInfo gsInfo);

            if (!hasRecord)
            {
                gsInfo = new BSInfo();
                CS.instance.lIDToBSInfos[session.logicID] = gsInfo;
            }
            //更新BS信息
            gsInfo.lid       = session.logicID;
            gsInfo.sessionID = session.id;
            gsInfo.ip        = BSInfoRecv.Ip;
            gsInfo.port      = BSInfoRecv.Port;
            gsInfo.state     = (BSInfo.State)BSInfoRecv.State;
            //Logger.Log( $"report from BS:{gsInfo}" );
            return(ErrorCode.Success);
        }
示例#22
0
文件: GCBiz.cs 项目: niuniuzhu/KOW
        public ErrorCode OnGc2BsRequestSnapShot(NetSessionBase session, Google.Protobuf.IMessage message)
        {
            Protos.GC2BS_RequestSnapshot    request = (Protos.GC2BS_RequestSnapshot)message;
            Protos.BS2GC_RequestSnapshotRet ret     = ProtoCreator.R_GC2BS_RequestSnapshot(request.Opts.Pid);

            BSUser user = BS.instance.userMgr.GetUser(session.id);

            if (user == null)
            {
                ret.Result = Protos.BS2GC_RequestSnapshotRet.Types.EResult.InvalidUser;
            }
            else
            {
                BS.instance.battleMgr.HandleRequestSnapshot(user.battle, request, ret);
            }
            BS.instance.netSessionMgr.Send(session.id, ret);

            return(ErrorCode.Success);
        }
示例#23
0
        /// <summary>
        /// 玩家请求查询排行榜
        /// </summary>
        public ErrorCode OnGc2CsQueryRanking(NetSessionBase session, IMessage message)
        {
            Protos.GC2CS_QueryRanking request = (Protos.GC2CS_QueryRanking)message;
            ulong  gcNID = request.Opts.Transid;
            CSUser user  = CS.instance.userMgr.GetUser(gcNID);

            if (user != null)
            {
                Protos.CS2GC_QueryRankingRet resp         = ProtoCreator.R_GC2CS_QueryRanking(request.Opts.Pid);
                Protos.CS2DB_QueryRanking    queryRanking = ProtoCreator.Q_CS2DB_QueryRanking();
                queryRanking.SortType = (Protos.CS2DB_QueryRanking.Types.SortType)request.SortType;
                queryRanking.From     = request.From;
                queryRanking.Count    = request.Count;

                CS.instance.netSessionMgr.Send(SessionType.ServerC2DB, queryRanking, RPCEntry.Pop(OnQueryRankingRet, user, resp));
            }

            return(ErrorCode.Success);
        }
示例#24
0
        /// <summary>
        /// 处理回应
        /// </summary>
        private void OnBattleInfoRet(NetSessionBase session_, Google.Protobuf.IMessage ret, object[] args)
        {
            BattleUser[]   users  = ( BattleUser[] )args[0];
            BattleUser[][] tUsers = ( BattleUser[][] )args[1];
            string         bsIP   = ( string )args[2];
            int            bsPort = ( int )args[3];
            uint           bsSID  = ( uint )args[4];
            uint           bsLID  = ( uint )args[5];

            Protos.BS2CS_BattleInfoRet battleInfoRet = (Protos.BS2CS_BattleInfoRet)ret;
            //检查是否成功创建战场
            if (battleInfoRet.Result != Protos.Global.Types.ECommon.Success)
            {
                this.NotifyGCEnterBattleFailed(users, Protos.CS2GC_EnterBattle.Types.Result.BattleCreateFailed);
                return;
            }

            Logger.Log($"battle:{battleInfoRet.Bid} created");

            CS.instance.battleStaging.OnBattleCreated(bsLID, battleInfoRet.Bid);

            //把所有玩家移动到战场暂存器里
            int count = users.Length;

            for (int i = 0; i < count; i++)
            {
                BattleUser matchUser = users[i];
                CSUser     user      = CS.instance.userMgr.GetUser(matchUser.id);
                CS.instance.battleStaging.Add(user, bsLID, bsSID, battleInfoRet.Bid);
            }

            //广播给玩家
            Protos.CS2GC_EnterBattle enterBattle = ProtoCreator.Q_CS2GC_EnterBattle();
            enterBattle.Ip   = bsIP;
            enterBattle.Port = bsPort;
            for (int i = 0; i < count; i++)
            {
                BattleUser matchUser = users[i];
                CSUser     user      = CS.instance.userMgr.GetUser(matchUser.id);
                enterBattle.GcNID = user.ukey | ( ulong )bsLID << 32;
                user.Send(enterBattle);
            }
        }
示例#25
0
        private static void OnQueryRankingRet(NetSessionBase session, IMessage message, object[] args)
        {
            CSUser user = ( CSUser )args[0];

            Protos.CS2GC_QueryRankingRet resp   = (Protos.CS2GC_QueryRankingRet)args[1];
            Protos.DB2CS_QueryRankingRet result = (Protos.DB2CS_QueryRankingRet)message;
            foreach (Protos.DB2CS_RankingInfo rankingInfoResult in result.RankingInfos)
            {
                Protos.CS2GC_RankingInfo rankingInfo = new Protos.CS2GC_RankingInfo();
                rankingInfo.Ukey          = rankingInfoResult.Ukey;
                rankingInfo.Name          = rankingInfoResult.Name;
                rankingInfo.Avatar        = rankingInfoResult.Avatar;
                rankingInfo.Gender        = rankingInfoResult.Gender;
                rankingInfo.LastLoginTime = rankingInfoResult.LastLoginTime;
                rankingInfo.Rank          = rankingInfoResult.Rank;
                rankingInfo.Exp           = rankingInfoResult.Exp;
                resp.RankingInfos.Add(rankingInfo);
            }
            user.Send(resp);
        }
示例#26
0
文件: CSBiz.cs 项目: niuniuzhu/KOW
        public ErrorCode OnCs2DbBuyChampion(NetSessionBase session, Google.Protobuf.IMessage message)
        {
            Protos.CS2DB_BuyChampion    request = (Protos.CS2DB_BuyChampion)message;
            Protos.DB2CS_BuyChampionRet resp    = ProtoCreator.R_CS2DB_BuyChampion(request.Opts.Pid);
            string    cids      = string.Join('|', request.Cids);
            string    str       = $"UPDATE account_user SET money={request.Money},diamoned={request.Diamoned},champions={cids} where id={request.Ukey}";
            ErrorCode errorCode = DB.instance.accountDB.SqlExecNonQuery(str, out _, out uint _);

            switch (errorCode)
            {
            case ErrorCode.Success:
                request.Result = Protos.Global.Types.ECommon.Success;
                break;

            default:
                request.Result = Protos.Global.Types.ECommon.Failed;
                break;
            }
            session.Send(resp);
            return(ErrorCode.Success);
        }
示例#27
0
        /// <summary>
        /// 玩家请求开始匹配
        /// </summary>
        public ErrorCode OnGc2CsBeginMatch(NetSessionBase session, IMessage message)
        {
            Protos.GC2CS_BeginMatch    request  = (Protos.GC2CS_BeginMatch)message;
            Protos.CS2GC_BeginMatchRet response = ProtoCreator.R_GC2CS_BeginMatch(request.Opts.Pid);

            ulong  gcNID = request.Opts.Transid;
            CSUser user  = CS.instance.userMgr.GetUser(gcNID);

            if (user.isInBattle)
            {
                response.Result = Protos.CS2GC_BeginMatchRet.Types.EResult.UserInBattle;
            }
            else
            {
                response.Result = CS.instance.matchMgr.Join(request.Mode, user) ?
                                  Protos.CS2GC_BeginMatchRet.Types.EResult.Success :
                                  Protos.CS2GC_BeginMatchRet.Types.EResult.Failed;
            }
            user.Send(response);
            return(ErrorCode.Success);
        }
示例#28
0
文件: GCBiz.cs 项目: niuniuzhu/KOW
        public void OnGCSessionClosed(NetSessionBase session, string reason)
        {
            ClientSession gcSession = ( ClientSession )session;

            gcSession.activeTime = 0;

            //检查玩家是否登陆了
            BSUser user = BS.instance.userMgr.GetUser(gcSession.id);

            if (user != null)
            {
                if (reason != "battle_end")
                {
                    //通知cs玩家断线
                    Protos.BS2CS_KickUser msg = ProtoCreator.Q_BS2CS_KickUser();
                    msg.Reason = Protos.BS2CS_KickUser.Types.Reason.Gclost;
                    msg.GcNID  = user.gcNID;
                    BS.instance.netSessionMgr.Send(SessionType.ServerB2CS, msg);
                    BS.instance.userMgr.OnDisconnect(user);
                }
            }
        }
示例#29
0
        private void OnCSBattleEndRet(NetSessionBase session, Google.Protobuf.IMessage message, object[] args)
        {
            Battle battle = ( Battle )args[0];
            int    count  = battle.numChampions;

            for (int i = 0; i < count; i++)
            {
                Champion champion = battle.GetChampionAt(i);
                if (champion.user.isOnline)
                {
                    //断开玩家连接
                    BS.instance.netSessionMgr.CloseSession(champion.user.gcSID, "battle_end");
                    //玩家下线
                    BS.instance.userMgr.Offline(champion.user);
                }
                //销毁玩家
                BS.instance.userMgr.DestroyUser(champion.user);
            }
            this._finishBattles.Remove(battle);
            Logger.Log($"battle:{battle.id} destroied");
            POOL.Push(battle);
        }
示例#30
0
文件: BSBiz.cs 项目: niuniuzhu/KOW
        /// <summary>
        /// BS通知玩家离开战场
        /// </summary>
        public ErrorCode OnBs2CsKickUser(NetSessionBase session, Google.Protobuf.IMessage message)
        {
            Protos.BS2CS_KickUser kickUser = (Protos.BS2CS_KickUser)message;
            CSUser user = CS.instance.battleStaging.GetUser(kickUser.GcNID);

            if (user != null)
            {
                Protos.CS2GS_KickGC.Types.EReason reason = Protos.CS2GS_KickGC.Types.EReason.OutOfSync;
                switch (kickUser.Reason)
                {
                case Protos.BS2CS_KickUser.Types.Reason.OutOfSync:
                    reason = Protos.CS2GS_KickGC.Types.EReason.OutOfSync;
                    break;

                case Protos.BS2CS_KickUser.Types.Reason.Gclost:
                    reason = Protos.CS2GS_KickGC.Types.EReason.Bslost;
                    break;
                }
                //踢下线
                CS.instance.userMgr.KickUser(user, reason);
            }
            return(ErrorCode.Success);
        }