using System;
|
using System.Collections;
|
using System.Collections.Generic;
|
|
//排行榜
|
public class ArenaRankModel : ILModel<ArenaRankModel>
|
{
|
//更新用户排名信息
|
public event Action<uint, int> UpdateUserRankEvent;
|
//根据type ,查询数据
|
Dictionary<int, List<RankPageData>> m_RankDatas = new Dictionary<int, List<RankPageData>>();
|
//根据type ,查询时间列表
|
Dictionary<int, List<SearchPageData>> m_SearchTimes = new Dictionary<int, List<SearchPageData>>();
|
|
public event Action<int, int> 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<SearchPageData> 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<SearchPageData> 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<RankPageData> ranks)
|
{
|
return m_RankDatas.TryGetValue(type, out ranks);
|
}
|
public void ClearSearchData()
|
{
|
//m_SearchTimes.Clear();
|
}
|
//获得id
|
public int TryGetRankCount(int type)
|
{
|
List<RankPageData> 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<SearchPageData> searchDatas = null;
|
if (!m_SearchTimes.TryGetValue(type, out searchDatas))
|
{
|
searchDatas = new List<SearchPageData>();
|
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<SearchPageData> 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<RankPageData> rankDatas = null;
|
if (!m_RankDatas.TryGetValue(package.Type, out rankDatas))
|
{
|
rankDatas = new List<RankPageData>();
|
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; //结尾
|
}
|
|
|
|