using System; using System.Linq; using ProtoCSStruct; using Sog; namespace Rank { public class ActRankScv { public static void OnSetActRank(uint remoteAppID, StructPacket packet) { ref var res = ref packet.GetMessage(); if (res.ActRankId <= 0 || res.RealmId <= 0) return; RankServerData serverData = RankServerUtils.GetRankServerData(); ActRemRank actRem = null; serverData.m_ActRank.TryGetValue(res.RealmId, out actRem); if (actRem != null) { //存在就不需要再加载了 if (actRem.m_AcRank.ContainsKey(res.ActRankId)) return; } else { actRem = new ActRemRank(); actRem.RealmId = res.RealmId; serverData.m_ActRank.Add(res.RealmId, actRem); } //直接初始化个新榜单 if (res.Ret > 0) { ActRank.InitActRank(res.RealmId, res.ActRankId); return; } var allplayerInfo = RankServerUtils.GetAllplayerInfo(); //加载db数据 ActRankOne rankOne = new ActRankOne(); rankOne.ActRankID = res.ActRankId; rankOne.RealmId = res.RealmId; rankOne.EndTime = res.EndTime; rankOne.BeginTime = res.BeginTime; rankOne.endClear = res.EndClear > 0; for (int i = 0; i < res.RankData.RankList.Count; i++) { var uid = res.RankData.RankList[i]; if (!allplayerInfo.ContainsKey(uid)) { TraceLog.Error("ActRankScv.OnSetActRank not get player info uid:{0}", uid); continue; } rankOne.m_rankRank.Add(allplayerInfo[uid]); } actRem.m_AcRank.Add(res.ActRankId, rankOne); TraceLog.Trace("ActRankScv.OnSetActRank load rank rem:{0} actId;{1} endClear:{2} rankCount:{3}", rankOne.RealmId, rankOne.ActRankID, rankOne.endClear.ToString(), rankOne.m_rankRank.Count); } public static void OnUpgradeActRankDataReq(uint remoteAppID, StructPacket packet) { ref var req = ref packet.GetMessage(); RankServerData serverData = RankServerUtils.GetRankServerData(); ActRemRank actRem = null; serverData.m_ActRank.TryGetValue(req.RealmId, out actRem); if (actRem == null) { TraceLog.Error("ActRankScv.OnUpgradeActRankDataReq update rank error! no rem Rank. player:{0} rem:{1} actId:{2} param:{3} score:{4}", packet.ObjectID, req.RealmId, req.ActRankId, req.Param, req.M_Rank.Score); return; } ActRankOne rankOne = null; actRem.m_AcRank.TryGetValue(req.ActRankId, out rankOne); if (rankOne == null) { TraceLog.Error("ActRankScv.OnUpgradeActRankDataReq update rank error! no rank. player:{0} rem:{1} actId:{2} param:{3} score:{4}", packet.ObjectID, req.RealmId, req.ActRankId, req.Param, req.M_Rank.Score); return; } var res = new SSAddActRankDataRes(); var nowtime = RankServerUtils.GetTimeSecond(); if (rankOne.BeginTime > nowtime || rankOne.EndTime < nowtime) { TraceLog.Trace("ActRankScv.OnUpgradeActRankDataReq update rank not range rank time!"); return; } var allplayerInfo = RankServerUtils.GetAllplayerInfo(); if (allplayerInfo.ContainsKey(packet.ObjectID)) { allplayerInfo[packet.ObjectID] = req.M_Rank; } else { allplayerInfo.TryAdd(packet.ObjectID, req.M_Rank); } var index = -1; for (var i = rankOne.m_rankRank.Count - 1; i >= 0; i--) { if (rankOne.m_rankRank[i].Uid == packet.ObjectID) { rankOne.m_rankRank[i] = req.M_Rank; index = i; break; } } if (index<0) rankOne.m_rankRank.Add(req.M_Rank); rankOne.m_rankRank.Sort((one, two) => { if (one.Score > two.Score) { return -1; } else if (one.Score == two.Score) { if (one.Time > two.Time) { return 1; } else { return -1; } } else { return 1; } }); rankOne.MakeDirty(); RankServerUtils.GetPacketSender().SendToServerByID(remoteAppID, (int)SSGameMsgID.AddActRankDataRes, ref res, packet.ObjectID); TraceLog.Trace("ActRankScv.OnUpgradeActRankDataReq update rank player:{0} rem:{1} actId:{2} param:{3} score:{4}", packet.ObjectID, req.RealmId, req.ActRankId, req.Param, req.M_Rank.Score); } public static void OnQueryActRankListReq(uint remoteAppID, StructPacket packet) { ref var req = ref packet.GetMessage(); RankServerData serverData = RankServerUtils.GetRankServerData(); ActRemRank actRem = null; serverData.m_ActRank.TryGetValue(req.RealmId, out actRem); if (actRem == null) { TraceLog.Error("ActRankScv.OnQueryActRankListReq get rank error! no rem Rank. player:{0} rem:{1} actId:{2} ", packet.ObjectID, req.RealmId, req.RankId); return; } ActRankOne rankOne = null; actRem.m_AcRank.TryGetValue(req.RankId, out rankOne); if (rankOne == null) { TraceLog.Error("ActRankScv.OnQueryActRankListReq get rank error! no rank. player:{0} rem:{1} actId:{2}", packet.ObjectID, req.RealmId, req.RankId); return; } var res = new CSQueryActRankListRes(); var nowtime = RankServerUtils.GetTimeSecond(); if (rankOne.BeginTime > nowtime || rankOne.EndTime < nowtime) { res.Ret = CSErrCode.ActRankEndErr; RankServerUtils.GetPacketSender().SendToServerByID(remoteAppID, (int)CSGameMsgID.QueryActRankListRes, ref res, packet.ObjectID); TraceLog.Trace("ActRankScv.OnQueryActRankListReq update rank not range rank time!"); return; } var myRank = -1; for (var i = 0; i < rankOne.m_rankRank.Count; i++) { if (rankOne.m_rankRank[i].Uid == packet.ObjectID) { myRank = i + 1; } if (i >= req.StartPos - 1 && i <= req.EndPos - 1) { var one = rankOne.m_rankRank[i]; one.Rank = i + 1; res.RankList.Add(ref one); } } res.MyRank = myRank; RankServerUtils.GetPacketSender().SendToServerByID(remoteAppID, (int)CSGameMsgID.QueryActRankListRes, ref res, packet.ObjectID); TraceLog.Trace("ActRankScv.OnQueryActRankListReq get rank player:{0} rem:{1} actId:{2} myRank:{3}", packet.ObjectID, req.RealmId, req.RankId, myRank); } public static void OnSaveActRankDataRes(uint remoteAppID, StructPacket packet) { ref var res = ref packet.GetMessage(); RankServerData serverData = RankServerUtils.GetRankServerData(); ActRemRank actRem = null; serverData.m_ActRank.TryGetValue(res.RealmId, out actRem); if (actRem == null) { TraceLog.Error("ActRankScv.OnSaveActRankDataRes get rank error! no rem Rank. player:{0} rem:{1} actId:{2} ", packet.ObjectID, res.RealmId, res.ActRankId); return; } ActRankOne rankOne = null; actRem.m_AcRank.TryGetValue(res.ActRankId, out rankOne); if (rankOne == null) { TraceLog.Error("ActRankScv.OnSaveActRankDataRes get rank error! no rank. player:{0} rem:{1} actId:{2}", packet.ObjectID, res.RealmId, res.ActRankId); return; } rankOne.SavedSuccessSeq = res.SuccessDataSeq; } } }