/// <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); }
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); }