Example #1
0
        /// <summary>
        /// BS通知战场结束
        /// </summary>
        public ErrorCode OnBs2CsBattleEnd(NetSessionBase session, Google.Protobuf.IMessage message)
        {
            Protos.BS2CS_BattleEnd battleEnd = (Protos.BS2CS_BattleEnd)message;
            //评分
            Dictionary <int, int> ratings = this.ComputeElorating(battleEnd.Infos);

            //数据库
            Protos.CS2DB_UpdateRank dbRequest = ProtoCreator.Q_CS2DB_UpdateRank();
            //通知客户端战场结束
            Protos.CS2GC_BattleEnd gcBattleEnd = ProtoCreator.Q_CS2GC_BattleEnd();
            foreach (var kv in battleEnd.Infos)
            {
                CSUser user = CS.instance.battleStaging.GetUser(kv.Key);

                Protos.BS2CS_BattleEndInfo info = kv.Value;
                gcBattleEnd.Result    = (Protos.CS2GC_BattleEnd.Types.Result)info.Result;
                gcBattleEnd.GMoney    = info.Result == Protos.BS2CS_BattleEndInfo.Types.Result.Win ? ( int )(0.01f * user.rank) : 0;
                gcBattleEnd.GDiamoned = 0;
                gcBattleEnd.GRank     = ratings[info.Team];
                gcBattleEnd.GExp      = info.Result == Protos.BS2CS_BattleEndInfo.Types.Result.Win ? 10u : 0u;

                user.money    += gcBattleEnd.GMoney;
                user.diamoned += gcBattleEnd.GDiamoned;
                user.rank     += gcBattleEnd.GRank;
                user.exp      += gcBattleEnd.GExp;

                gcBattleEnd.Money    = user.rank;
                gcBattleEnd.Diamoned = user.diamoned;
                gcBattleEnd.Rank     = user.rank;
                gcBattleEnd.Exp      = user.exp;

                CS.instance.netSessionMgr.Send(user.gsSID, gcBattleEnd, null, Protos.MsgOpts.Types.TransTarget.Gc, user.gcNID);

                //数据库
                Protos.CS2DB_Gain gain = new Protos.CS2DB_Gain();
                gain.Ukey     = user.ukey;
                gain.Money    = user.money;
                gain.Diamoned = user.diamoned;
                gain.Rank     = user.rank;
                gain.Exp      = user.exp;
                dbRequest.Gains.Add(gain);
            }
            //数据库
            CS.instance.netSessionMgr.Send(SessionType.ServerC2DB, dbRequest);
            //移除指定BS里指定战场里的所有玩家
            CS.instance.battleStaging.Remove(session.logicID, battleEnd.Bid);

            //回应
            Protos.CS2BS_BattleEndRet battleEndRet = ProtoCreator.R_BS2CS_BattleEnd(battleEnd.Opts.Pid);
            session.Send(battleEndRet);

            return(ErrorCode.Success);
        }
Example #2
0
        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);
        }