/* Sog 游戏基础库 2016 by zouwei */ using System; using System.Collections.Generic; using ProtoCSStruct; using Sog; namespace Rank { public struct DBRankOnePlayerStruct : IStructObject { public int m_objectID; public int GetObjectID() { return m_objectID; } public void SetObjectID(int id) { m_objectID = id; } public bool IsNull() { return m_objectID == -1; } public DBRankPlayerInfo data; } public class RankDataRecord : Sog.Data.DataSeqSave { public int RankId; public long BeginTime; public bool NeedUpdate; public long AwardTime; //当期排行榜发奖时间 public List Data; //Uid rank public long lastRankAwardTime; //上期排行榜结算时间,有些排行榜策划希望玩家手动领取奖励,当下次重置时才把没领的奖励邮件 public List rewardGetUids; public List lastRankData; public RankDataRecord(int rankId) { RankId = rankId; BeginTime = 0; NeedUpdate = false; Data = new List(); rewardGetUids = new List(); lastRankData = new List(); } } public class RealmRankInfo { public int m_realmId; public bool m_loadDbDataSuccess; public long m_serverStartTime; public long m_lastLoadDbReqTime; public long m_lastUpdateRankTime; public Dictionary m_rankMap; public RealmRankInfo(int realmId) { m_realmId = realmId; m_loadDbDataSuccess = false; m_rankMap = new Dictionary(); } } public class GlobalRankInfo { public bool m_loadDbDataSuccess; public long m_serverStartTime; public long m_lastLoadDbReqTime; public long m_lastUpdateRankTime; public RankDataOne rankOne = null; public GlobalRankInfo( ) { m_loadDbDataSuccess = false; } } public class RankDataOne { public int RealmId; public int RankID; public RankDataRecord CurRecord; public int SaveObjMax; //排行榜保存数量 public long CurRecordLimitScore; //排行榜上限制分数,下次tick需要进行排行 //public RankMainType MainType; //主类型 1.实时榜 2.纪录榜 // public int LinkRank; //关联榜 public RankDataInfoCache data; public int hideRankTime; // 隐藏排行榜的时间, now >= hide时隐藏 public int closeRankTime; // 关闭排行榜的实际 public RankFlushType FlushType; //刷新类型 public RankReasonType reasonType;//上榜依据 public RankDataOne(int realmId, int rankId) { RealmId = realmId; RankID = rankId; RankConfigDesc desc = RankConfigDescMgr.Instance.GetConfig(rankId); if (desc == null) { TraceLog.Error("RankData RankDataOne Init Error,rankId:{0}", rankId); return; } data = new RankDataInfoCache(desc.CacheCount * 2); SaveObjMax = desc.CacheCount; FlushType = (RankFlushType)desc.refreshType; reasonType = (RankReasonType)desc.reasonType; } public bool CheckSuccessLoad() { if(CurRecord == null) { return false; } return true; } } public class WorldRankData : IServerDataObj { public override int GetDataType() { return RankDataObjType.RankInfoCache; } //禁止上榜玩家 public Dictionary m_forbitUidMap = new Dictionary(); //排行榜数据realmId-rankId-info public Dictionary AllRank = new Dictionary(); //跨服榜rankId-info public Dictionary GlobalRank = new Dictionary(); public bool TryGetRankDataOne(out RankDataOne dataOne, int realmId, int rankId) { dataOne = null; if(AllRank.ContainsKey(realmId) && AllRank[realmId].m_rankMap.ContainsKey(rankId)) { dataOne = AllRank[realmId].m_rankMap[rankId]; return true; } return false; } } public class RankBriefDataOne { public long Uid; public int Rank; //排名 public int Index; //序号 public long Score; public long Time; public int param; public RankBriefDataOne(long uid, int rank, int index, long score, int param, long time) { this.Uid = uid; this.Rank = rank; this.Index = index; this.Score = score; this.Time = time; this.param = param; } public int CompareTo(RankBriefDataOne other, bool isLess, bool isLess2) { int result = this.Score.CompareTo(other.Score); //大值在前 乘-1 if (isLess == false) { result *= -1; } if(result == 0) {//用param排序 result = this.param.CompareTo(other.param); if (isLess2 == false) { result *= -1; } } //时间早的在前 if (result == 0) { result = this.Time.CompareTo(other.Time); } //序号低的在前 if (result == 0) { result = this.Index.CompareTo(other.Index); } //都一样只能用Uid排了 if (result == 0) { result = this.Uid.CompareTo(other.Uid); } return result; } } }