using System; using System.Collections; using System.Collections.Generic; //排行榜 public class ArenaRankModel : ILModel { //更新用户排名信息 public event Action UpdateUserRankEvent; //根据type ,查询数据 Dictionary> m_RankDatas = new Dictionary>(); //根据type ,查询时间列表 Dictionary> m_SearchTimes = new Dictionary>(); public event Action onRankRefresh; public int myOldRank = 0; protected override void Init() { } protected override void UnInit() { } //接收排名 public void ReceiveBillboardData(HA9A2_tagPYBillboardData vNetData) { if (vNetData.Type != 28) return; if (vNetData.WatchID != 0) {//竞技场 获取当前排名 if (UpdateUserRankEvent != null) { int index = -1; if (vNetData.BillboardCount == 0) { index = -1; } else { for (int i = 0; i < vNetData.BillboardCount; i++) { if (vNetData.Billboard[i].ID == PlayerDatas.Instance.baseData.PlayerID) { index = (int)vNetData.Billboard[i].OrderIndex + 1; } } } UpdateUserRankEvent(vNetData.Type, index); SetMyRank(vNetData.Type, index); } } else {//分页数据 if (vNetData.BillboardCount == 0) return; ReceivePackage(vNetData); } } //获得自己的排名 public int GetMyRank(int type) { List searchDatas = null; m_SearchTimes.TryGetValue(type, out searchDatas); if (searchDatas == null) return 0; return searchDatas[0].count; } //设置自己的排名 public void SetMyRank(int type, int index) { //UnityEngine.Debug.Log("SetMyRank:" + type); List searchDatas = null; m_SearchTimes.TryGetValue(type, out searchDatas); if (searchDatas != null) { myOldRank = searchDatas[0].count; searchDatas[0].count = index; } } //获得id public bool TryGetRanks(int type, out List ranks) { return m_RankDatas.TryGetValue(type, out ranks); } public void ClearSearchData() { //m_SearchTimes.Clear(); } //获得id public int TryGetRankCount(int type) { List ranks = null; m_RankDatas.TryGetValue(type, out ranks); return ranks.Count; } //竞技场 排名 public void SendArenaWatchBillboard(uint startIndex, byte isSelf, byte count, byte type = 28) { int index = -2; if (isSelf == 1) { index = -1; } else { index = (int)startIndex; } List searchDatas = null; if (!m_SearchTimes.TryGetValue(type, out searchDatas)) { searchDatas = new List(); m_SearchTimes.Add(type, searchDatas); } //查询是否发同样类型的数据 int currentIndex = -1; for (int i = 0; i < searchDatas.Count; i++) { if (index == searchDatas[i].startIndex) currentIndex = i; } /// bool isSend = false; if (currentIndex == -1) { SearchPageData data = new SearchPageData(); data.startIndex = index; data.times = TimeUtility.AllSeconds; //时间 data.count = count; data.isEnd = false; searchDatas.Add(data); isSend = true; currentIndex = searchDatas.Count - 1; } else { int diff = TimeUtility.AllSeconds - searchDatas[currentIndex].times; //UnityEngine.Debug.Log("diff:" + diff + " " + TimeUtility.AllSeconds); int CDtime = int.Parse(FuncConfigConfig.Get("ArenaLVSet").Numerical3); //if (diff < CDtime || searchDatas[currentIndex].isEnd) if (diff < CDtime) { isSend = false; } else { isSend = true; } } if (isSelf == 1) isSend = true; if (isSend) { CA9A2_tagCPYWatchBillboard pack = new CA9A2_tagCPYWatchBillboard(); pack.Type = type;//28代表竞技场 pack.StartIndex = startIndex; pack.WatchCnt = count; pack.WatchID = isSelf == 1 ? PlayerDatas.Instance.baseData.PlayerID : 0; GameNetSystem.Instance.SendInfo(pack); //更新查询时间 searchDatas[currentIndex].times = TimeUtility.AllSeconds; } } //分页查询 ===================================================== public void ReceivePackage(HA9A2_tagPYBillboardData package) { if (package.Type != 28) return; ///判读是否到最后一条 List searchDatas = null; m_SearchTimes.TryGetValue(package.Type, out searchDatas); int searchindex = -1; for (int i = 0; i < searchDatas.Count; i++) { if (package.Billboard[0].OrderIndex == searchDatas[i].startIndex) searchindex = i; } //if (package.BillboardCount != searchDatas[searchindex].count) // searchDatas[searchindex].isEnd = true; //////////////////////////////////////////////////////////////////////// List rankDatas = null; if (!m_RankDatas.TryGetValue(package.Type, out rankDatas)) { rankDatas = new List(); m_RankDatas.Add(package.Type, rankDatas); } ///对查询到的数据进行添加或覆盖 for (int i = 0; i < package.BillboardCount; i++) { if (package.Billboard[i].OrderIndex < rankDatas.Count) { rankDatas[i].type = package.Type; ReSetRankData(rankDatas[(int)package.Billboard[i].OrderIndex], package.Billboard[i]); } else { var rankData = new RankPageData(); rankData.type = package.Type; ReSetRankData(rankData, package.Billboard[i]); rankDatas.Add(rankData); } } if (onRankRefresh != null) { onRankRefresh(package.Type, (int)package.WatchID); } } void ReSetRankData(RankPageData data, HA9A2_tagPYBillboardData.tagPYBillboardInfo serverData) { data.orderIndex = serverData.OrderIndex; data.id = serverData.ID; data.id2 = serverData.ID2; data.name1 = serverData.Name1.Trim().Replace("\0", ""); data.name2 = serverData.Name2.Trim().Replace("\0", ""); data.subType = serverData.Type2; data.value1 = serverData.Value1; data.value2 = serverData.Value2; data.cmpValue = serverData.CmpValue; data.cmpValue2 = serverData.CmpValue2; data.cmpValue3 = serverData.CmpValue3; } static void OnGetRankPageData(RankPageData data) { } static void OnReleaseRankPageData(RankPageData data) { } } public class RankPageData { public int type; public uint orderIndex; //名次索引,0代表第一名 public uint id; public uint id2; public string name1; //名字1,用来显示排序对象名字 public string name2; //名字2 public byte subType; //附加类型,用来表示排序对象的类型,比如,玩家所属职业门派,宠物类型等 public uint value1; //排序依赖的值,比如,等级 public uint value2; //排序依赖的值,比如,战斗力 public uint cmpValue; // 比较权值 public uint cmpValue2; // 比较权值 public uint cmpValue3; // 比较权值 } public class SearchPageData { public int type; //类型,28代表排行榜 public int startIndex; //名次索引,-1代表查自己的成绩 public int times; //时间 public int count; public bool isEnd; //结尾 }