/// <summary> /// 销毁战场 /// 主线程调用 /// </summary> private void EndBattle(Battle battle) { battle.Stop(); int count = battle.numChampions; //通知CS战场结束 Protos.BS2CS_BattleEnd battleEnd = ProtoCreator.Q_BS2CS_BattleEnd(); battleEnd.Bid = battle.id; for (int i = 0; i < count; ++i) { Champion champion = battle.GetChampionAt(i); var info = new Protos.BS2CS_BattleEndInfo { Result = (Protos.BS2CS_BattleEndInfo.Types.Result)champion.result, Team = champion.team, Damage = champion.damage, Hurt = champion.hurt, Heal = champion.heal, OccupyTime = champion.occupyTime, Skill0Used = champion.skill0Used, Skill0Damage = champion.skill0Damage, Skill1Used = champion.skill1Used, Skill1Damage = champion.skill1Damage, }; battleEnd.Infos.Add(champion.user.gcNID, info); } BS.instance.netSessionMgr.Send(SessionType.ServerB2CS, battleEnd, RPCEntry.Pop(this.OnCSBattleEndRet, battle)); }
/// <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); }