From af5522def1cb54b7754696424edd3d392dea8105 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期三, 28 八月 2024 17:41:02 +0800 Subject: [PATCH] 10256 【越南】【砍树】排行榜名次加入积分限制 1. 跨服榜增加延迟排序,每分钟对变更数据且不实时排序的榜单进行排序,或玩家查询时触发排序; 2. 骑宠跨服榜改为仅更新数据,不实时排序; 3. 骑宠养成增加各排名上榜积分限制;增加名次达标积分额外奖励;去除跨服榜单上榜限制配置,统一取榜单模版中最后一条限制作为保底限制; --- ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py | 10 ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_QueryBillboardCross.py | 1 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py | 2 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActHorsePetTrain.py | 143 ++++++++---- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py | 205 ++++++++++++++++-- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py | 6 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActHorsePetTrain.py | 23 ++ PySysDB/PySysDBPY.h | 2 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBillboard.py | 39 +++ ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py | 205 ++++++++++++++++-- PySysDB/PySysDBG.h | 3 11 files changed, 532 insertions(+), 107 deletions(-) diff --git a/PySysDB/PySysDBG.h b/PySysDB/PySysDBG.h index 4a1396f..843631d 100644 --- a/PySysDB/PySysDBG.h +++ b/PySysDB/PySysDBG.h @@ -649,7 +649,6 @@ char EndDate; //结束日期 char JoinStartTime; //参与开始时间点 char JoinEndTime; //参与结束时间点 - WORD RankLimitPersonal; //个人上榜积分限制 WORD PersonalTemplateID; //个人排行模板编号 }; @@ -660,6 +659,8 @@ DWORD _TemplateID; //模板编号 BYTE Rank; //名次 list AwardItemList; //奖励物品列表[[物品ID,个数,是否拍品], ...] + DWORD NeedScore; //上榜所需积分 + dict ScoreAwardEx; //达标积分额外奖励 {积分:[[物品ID,个数,是否拍品], ...], ...} }; //古宝养成活动时间表 diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h index 8267ff7..216cc06 100644 --- a/PySysDB/PySysDBPY.h +++ b/PySysDB/PySysDBPY.h @@ -1924,6 +1924,8 @@ DWORD _TemplateID; //模板编号 BYTE Rank; //名次 list AwardItemList; //奖励物品列表[[物品ID,个数,是否拍品], ...] + DWORD NeedScore; //上榜所需积分 + dict ScoreAwardEx; //达标积分额外奖励 {积分:[[物品ID,个数,是否拍品], ...], ...} }; //古宝养成活动时间表 diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py index bd75dcc..fdf076f 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py @@ -36064,10 +36064,10 @@ return DumpString -class tagMCActHorsePetTrainBillard(Structure): - Rank = 0 #(DWORD Rank)// 名次,1-代表第一名;支持夸段,如1,3 代表第1名,第2~3名 - Count = 0 #(BYTE Count)// 奖励物品数 - AwardItemList = list() #(vector<tagMCActHorsePetTrainItem> AwardItemList)// 奖励物品列表 +class tagMCActHorsePetTrainAwardEx(Structure): + NeedScore = 0 #(DWORD NeedScore)// 额外奖励所需积分 + Count = 0 #(BYTE Count)// 额外奖励物品数 + AwardItemList = list() #(vector<tagMCActHorsePetTrainItem> AwardItemList)// 额外奖励物品列表 data = None def __init__(self): @@ -36076,7 +36076,7 @@ def ReadData(self, _lpData, _pos=0, _Len=0): self.Clear() - self.Rank,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.NeedScore,_pos = CommFunc.ReadDWORD(_lpData, _pos) self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos) for i in range(self.Count): temAwardItemList = tagMCActHorsePetTrainItem() @@ -36085,7 +36085,7 @@ return _pos def Clear(self): - self.Rank = 0 + self.NeedScore = 0 self.Count = 0 self.AwardItemList = list() return @@ -36101,7 +36101,7 @@ def GetBuffer(self): data = '' - data = CommFunc.WriteDWORD(data, self.Rank) + data = CommFunc.WriteDWORD(data, self.NeedScore) data = CommFunc.WriteBYTE(data, self.Count) for i in range(self.Count): data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer()) @@ -36109,13 +36109,96 @@ def OutputString(self): DumpString = ''' - Rank:%d, + NeedScore:%d, Count:%d, AwardItemList:%s '''\ %( + self.NeedScore, + self.Count, + "..." + ) + return DumpString + + +class tagMCActHorsePetTrainBillard(Structure): + Rank = 0 #(DWORD Rank)// 名次,1-代表第一名;支持夸段,如1,3 代表第1名,第2~3名 + Count = 0 #(BYTE Count)// 奖励物品数 + AwardItemList = list() #(vector<tagMCActHorsePetTrainItem> AwardItemList)// 奖励物品列表 + NeedScore = 0 #(DWORD NeedScore)// 上榜所需积分 + CountEx = 0 #(BYTE CountEx)// 额外奖励数 + AwardItemExList = list() #(vector<tagMCActHorsePetTrainAwardEx> AwardItemExList)// 额外奖励列表 + data = None + + def __init__(self): + self.Clear() + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + self.Rank,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.Count): + temAwardItemList = tagMCActHorsePetTrainItem() + _pos = temAwardItemList.ReadData(_lpData, _pos) + self.AwardItemList.append(temAwardItemList) + self.NeedScore,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.CountEx,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.CountEx): + temAwardItemExList = tagMCActHorsePetTrainAwardEx() + _pos = temAwardItemExList.ReadData(_lpData, _pos) + self.AwardItemExList.append(temAwardItemExList) + return _pos + + def Clear(self): + self.Rank = 0 + self.Count = 0 + self.AwardItemList = list() + self.NeedScore = 0 + self.CountEx = 0 + self.AwardItemExList = list() + return + + def GetLength(self): + length = 0 + length += 4 + length += 1 + for i in range(self.Count): + length += self.AwardItemList[i].GetLength() + length += 4 + length += 1 + for i in range(self.CountEx): + length += self.AwardItemExList[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteDWORD(data, self.Rank) + data = CommFunc.WriteBYTE(data, self.Count) + for i in range(self.Count): + data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer()) + data = CommFunc.WriteDWORD(data, self.NeedScore) + data = CommFunc.WriteBYTE(data, self.CountEx) + for i in range(self.CountEx): + data = CommFunc.WriteString(data, self.AwardItemExList[i].GetLength(), self.AwardItemExList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Rank:%d, + Count:%d, + AwardItemList:%s, + NeedScore:%d, + CountEx:%d, + AwardItemExList:%s + '''\ + %( self.Rank, self.Count, + "...", + self.NeedScore, + self.CountEx, "..." ) return DumpString @@ -41742,10 +41825,10 @@ return DumpString -class tagMCCrossActHorsePetTrainBillard(Structure): - Rank = 0 #(DWORD Rank)// 名次,1-代表第一名;支持夸段,如1,3 代表第1名,第2~3名 - Count = 0 #(BYTE Count)// 奖励物品数 - AwardItemList = list() #(vector<tagMCCrossActHorsePetTrainItem> AwardItemList)// 奖励物品列表 +class tagMCCrossActHorsePetTrainAwardEx(Structure): + NeedScore = 0 #(DWORD NeedScore)// 额外奖励所需积分 + Count = 0 #(BYTE Count)// 额外奖励物品数 + AwardItemList = list() #(vector<tagMCCrossActHorsePetTrainItem> AwardItemList)// 额外奖励物品列表 data = None def __init__(self): @@ -41754,7 +41837,7 @@ def ReadData(self, _lpData, _pos=0, _Len=0): self.Clear() - self.Rank,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.NeedScore,_pos = CommFunc.ReadDWORD(_lpData, _pos) self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos) for i in range(self.Count): temAwardItemList = tagMCCrossActHorsePetTrainItem() @@ -41763,7 +41846,7 @@ return _pos def Clear(self): - self.Rank = 0 + self.NeedScore = 0 self.Count = 0 self.AwardItemList = list() return @@ -41779,7 +41862,7 @@ def GetBuffer(self): data = '' - data = CommFunc.WriteDWORD(data, self.Rank) + data = CommFunc.WriteDWORD(data, self.NeedScore) data = CommFunc.WriteBYTE(data, self.Count) for i in range(self.Count): data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer()) @@ -41787,13 +41870,96 @@ def OutputString(self): DumpString = ''' - Rank:%d, + NeedScore:%d, Count:%d, AwardItemList:%s '''\ %( + self.NeedScore, + self.Count, + "..." + ) + return DumpString + + +class tagMCCrossActHorsePetTrainBillard(Structure): + Rank = 0 #(DWORD Rank)// 名次,1-代表第一名;支持夸段,如1,3 代表第1名,第2~3名 + Count = 0 #(BYTE Count)// 奖励物品数 + AwardItemList = list() #(vector<tagMCCrossActHorsePetTrainItem> AwardItemList)// 奖励物品列表 + NeedScore = 0 #(DWORD NeedScore)// 上榜所需积分 + CountEx = 0 #(BYTE CountEx)// 额外奖励数 + AwardItemExList = list() #(vector<tagMCCrossActHorsePetTrainAwardEx> AwardItemExList)// 额外奖励列表 + data = None + + def __init__(self): + self.Clear() + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + self.Rank,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.Count): + temAwardItemList = tagMCCrossActHorsePetTrainItem() + _pos = temAwardItemList.ReadData(_lpData, _pos) + self.AwardItemList.append(temAwardItemList) + self.NeedScore,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.CountEx,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.CountEx): + temAwardItemExList = tagMCCrossActHorsePetTrainAwardEx() + _pos = temAwardItemExList.ReadData(_lpData, _pos) + self.AwardItemExList.append(temAwardItemExList) + return _pos + + def Clear(self): + self.Rank = 0 + self.Count = 0 + self.AwardItemList = list() + self.NeedScore = 0 + self.CountEx = 0 + self.AwardItemExList = list() + return + + def GetLength(self): + length = 0 + length += 4 + length += 1 + for i in range(self.Count): + length += self.AwardItemList[i].GetLength() + length += 4 + length += 1 + for i in range(self.CountEx): + length += self.AwardItemExList[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteDWORD(data, self.Rank) + data = CommFunc.WriteBYTE(data, self.Count) + for i in range(self.Count): + data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer()) + data = CommFunc.WriteDWORD(data, self.NeedScore) + data = CommFunc.WriteBYTE(data, self.CountEx) + for i in range(self.CountEx): + data = CommFunc.WriteString(data, self.AwardItemExList[i].GetLength(), self.AwardItemExList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Rank:%d, + Count:%d, + AwardItemList:%s, + NeedScore:%d, + CountEx:%d, + AwardItemExList:%s + '''\ + %( self.Rank, self.Count, + "...", + self.NeedScore, + self.CountEx, "..." ) return DumpString @@ -41808,7 +41974,6 @@ EndtDate = "" #(char EndtDate[10])// 结束日期 y-m-d JoinStartTime = "" #(char JoinStartTime[5])// 参与开始时间点 mm:ss JoinEndTime = "" #(char JoinEndTime[5])// 参与结束时间点 mm:ss - RankLimitPersonal = 0 #(WORD RankLimitPersonal)// 个人榜上榜积分保底限制; PersonalBillCount = 0 #(BYTE PersonalBillCount) PersonalBillboardInfoList = list() #(vector<tagMCCrossActHorsePetTrainBillard> PersonalBillboardInfoList)// 个人榜单奖励信息列表,如果没有代表本次活动没有该榜奖励 data = None @@ -41829,7 +41994,6 @@ self.EndtDate,_pos = CommFunc.ReadString(_lpData, _pos,10) self.JoinStartTime,_pos = CommFunc.ReadString(_lpData, _pos,5) self.JoinEndTime,_pos = CommFunc.ReadString(_lpData, _pos,5) - self.RankLimitPersonal,_pos = CommFunc.ReadWORD(_lpData, _pos) self.PersonalBillCount,_pos = CommFunc.ReadBYTE(_lpData, _pos) for i in range(self.PersonalBillCount): temPersonalBillboardInfoList = tagMCCrossActHorsePetTrainBillard() @@ -41849,7 +42013,6 @@ self.EndtDate = "" self.JoinStartTime = "" self.JoinEndTime = "" - self.RankLimitPersonal = 0 self.PersonalBillCount = 0 self.PersonalBillboardInfoList = list() return @@ -41864,7 +42027,6 @@ length += 10 length += 5 length += 5 - length += 2 length += 1 for i in range(self.PersonalBillCount): length += self.PersonalBillboardInfoList[i].GetLength() @@ -41881,7 +42043,6 @@ data = CommFunc.WriteString(data, 10, self.EndtDate) data = CommFunc.WriteString(data, 5, self.JoinStartTime) data = CommFunc.WriteString(data, 5, self.JoinEndTime) - data = CommFunc.WriteWORD(data, self.RankLimitPersonal) data = CommFunc.WriteBYTE(data, self.PersonalBillCount) for i in range(self.PersonalBillCount): data = CommFunc.WriteString(data, self.PersonalBillboardInfoList[i].GetLength(), self.PersonalBillboardInfoList[i].GetBuffer()) @@ -41897,7 +42058,6 @@ EndtDate:%s, JoinStartTime:%s, JoinEndTime:%s, - RankLimitPersonal:%d, PersonalBillCount:%d, PersonalBillboardInfoList:%s '''\ @@ -41910,7 +42070,6 @@ self.EndtDate, self.JoinStartTime, self.JoinEndTime, - self.RankLimitPersonal, self.PersonalBillCount, "..." ) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_QueryBillboardCross.py b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_QueryBillboardCross.py index 0fcb5b0..eae8484 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_QueryBillboardCross.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_QueryBillboardCross.py @@ -61,6 +61,7 @@ if groupValue1 != None and groupValue2 != None: billboardObj = billboardMgr.GetCrossBillboard(billboardType, groupValue1, groupValue2) + billboardObj.DoDelaySort() dataTotal = billboardObj.GetCount() fromIndex = startRank - 1 toIndex = fromIndex + queryCount diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBillboard.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBillboard.py index ccb8aa3..2f8cfed 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBillboard.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBillboard.py @@ -115,6 +115,7 @@ self.__clientServerDataVer = 0 # 子服榜单数据版本 self.__billboardList = [] # [tagDBCrossBillboard, ...] self.__idOrderDict = {} # {id:名次, ...} + self.__sortDelay = False # 是否需要延迟排序 return def GetBillboardType(self): return self.__billboardType @@ -133,9 +134,27 @@ return def SortData(self): + GameWorld.DebugLog("跨服榜单排序: billboardType=%s,groupValue1=%s,groupValue2=%s,dataCount=%s" + % (self.__billboardType, self.__groupValue1, self.__groupValue2, len(self.__billboardList))) self.__billboardList.sort(key=operator.attrgetter("CmpValue", "CmpValue2", "CmpValue3"), reverse=True) self.__idOrderDict = {} # 排序后重置,下次查询时更新并缓存 + self.__sortDelay = False self.UpdCrossServerDataVer() + return + + def SetDelaySort(self): + ## 设置延迟排序 + GameWorld.DebugLog("跨服榜单设置延迟排序: billboardType=%s,groupValue1=%s,groupValue2=%s,dataCount=%s" + % (self.__billboardType, self.__groupValue1, self.__groupValue2, len(self.__billboardList))) + self.__sortDelay = True + self.UpdCrossServerDataVer() + return + + def DoDelaySort(self): + ## 延迟排序 + if not self.__sortDelay: + return + self.SortData() return def AddBillboardData(self, billboardData): @@ -172,6 +191,7 @@ def SaveDRData(self, eventName="", addDataDict={}): ## 记录流向数据 + self.DoDelaySort() dataCount = len(self.__billboardList) if not dataCount: return @@ -288,6 +308,15 @@ for billboardType, groupValue1, groupValue2 in groupList: billboardObj = billboardMgr.GetCrossBillboard(billboardType, groupValue1, groupValue2) billboardObj.SaveDRData("OnDay") + return + +def OnMinuteProcess(): + billboardMgr = PyDataManager.GetCrossBillboardManager() + for billboardType in ShareDefine.CrossBillboardTypeList: + groupList = billboardMgr.GetBillboardGroupList(billboardType) + for billboardType, groupValue1, groupValue2 in groupList: + billboardObj = billboardMgr.GetCrossBillboard(billboardType, groupValue1, groupValue2) + billboardObj.DoDelaySort() return def CopyBillboard(fromBillboardType, toBillboardType): @@ -419,6 +448,7 @@ queryData = {} billboardMgr = PyDataManager.GetCrossBillboardManager() billboardObj = billboardMgr.GetCrossBillboard(billboardType, groupValue1, groupValue2) + billboardObj.DoDelaySort() crossServerDataVer = billboardObj.GetCrossServerDataVer() msgData = {"BillboardType":billboardType, "GroupValue1":groupValue1, "GroupValue2":groupValue2, "QueryData":queryData, "CrossServerDataVer":crossServerDataVer} @@ -757,8 +787,15 @@ type2, value1, value2, cmpValue, cmpValue2, cmpValue3, kwargs), dataID) if noSortAndSync: return True - if autoSort and cmpValueChange: + + # 新数据可能导致榜单ID增减,强制排序一次 + if isNewData: billboardObj.SortData() + elif cmpValueChange: + if autoSort: + billboardObj.SortData() + else: + billboardObj.SetDelaySort() else: billboardObj.UpdCrossServerDataVer() return True diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py index 52c586c..6d688c0 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py @@ -375,6 +375,8 @@ DisposeGameActivePlayer(tick) #处理游戏世界中的时间事件 DisposeGameWorldEvenByTime(tick) + #榜单 + CrossBillboard.OnMinuteProcess() GameWorldActionControl.Dispose_OperationActionState() GameWorldActionControl.Dispose_DailyActionState() GameWorldActionControl.Dispose_FBStateTime() diff --git a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py index 984506e..01be09c 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py @@ -539,7 +539,6 @@ ("char", "EndDate", 0), ("char", "JoinStartTime", 0), ("char", "JoinEndTime", 0), - ("WORD", "RankLimitPersonal", 0), ("WORD", "PersonalTemplateID", 0), ), @@ -547,6 +546,8 @@ ("DWORD", "TemplateID", 1), ("BYTE", "Rank", 0), ("list", "AwardItemList", 0), + ("DWORD", "NeedScore", 0), + ("dict", "ScoreAwardEx", 0), ), "ActGubao":( @@ -1892,8 +1893,7 @@ def GetEndDate(self): return self.attrTuple[5] # 结束日期 char def GetJoinStartTime(self): return self.attrTuple[6] # 参与开始时间点 char def GetJoinEndTime(self): return self.attrTuple[7] # 参与结束时间点 char - def GetRankLimitPersonal(self): return self.attrTuple[8] # 个人上榜积分限制 WORD - def GetPersonalTemplateID(self): return self.attrTuple[9] # 个人排行模板编号 WORD + def GetPersonalTemplateID(self): return self.attrTuple[8] # 个人排行模板编号 WORD # 骑宠养成榜单模版表 class IPY_ActHorsePetTrainBillTemp(): @@ -1904,7 +1904,9 @@ def GetTemplateID(self): return self.attrTuple[0] # 模板编号 DWORD def GetRank(self): return self.attrTuple[1] # 名次 BYTE - def GetAwardItemList(self): return self.attrTuple[2] # 奖励物品列表[[物品ID,个数,是否拍品], ...] list + def GetAwardItemList(self): return self.attrTuple[2] # 奖励物品列表[[物品ID,个数,是否拍品], ...] list + def GetNeedScore(self): return self.attrTuple[3] # 上榜所需积分 DWORD + def GetScoreAwardEx(self): return self.attrTuple[4] # 达标积分额外奖励 {积分:[[物品ID,个数,是否拍品], ...], ...} dict # 古宝养成活动时间表 class IPY_ActGubao(): diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActHorsePetTrain.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActHorsePetTrain.py index b1116b7..a08bd2d 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActHorsePetTrain.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActHorsePetTrain.py @@ -85,36 +85,54 @@ if not templateID: GameWorld.Log("本次活动没有个人榜奖励!") return - tempIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActHorsePetTrainBillTemp", templateID) - if not tempIpyDataList: + billboardDataCount = billBoard.GetCount() + billBoard.Sort() + + GameWorld.Log("结算个人榜单奖励: billboardType=%s,templateID=%s,billboardDataCount=%s" % (billboardType, templateID, billboardDataCount)) + + orderIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActHorsePetTrainBillTemp", templateID) + if not orderIpyDataList: return - rankAwardDict = {} - for tempIpyData in tempIpyDataList: - rankAwardDict[tempIpyData.GetRank()] = tempIpyData.GetAwardItemList() + rankPre = 0 + billboardIndex = 0 + for ipyData in orderIpyDataList: + rank = ipyData.GetRank() + needScore = ipyData.GetNeedScore() + scoreAwardEx = ipyData.GetScoreAwardEx() + scoreAwardExList = scoreAwardEx.keys() + awardItemList = ipyData.GetAwardItemList() + orderCountTotal = rank - rankPre # 奖励名次数量 + rankPre = rank - GameWorld.Log("结算个人榜单奖励: templateID=%s,rankAwardDict=%s" % (templateID, rankAwardDict)) - billBoard.Sort() - for index in xrange(billBoard.GetCount()): - billBoardData = billBoard.At(index) - if not billBoardData: - continue - - rank = index + 1 - - awardItemList = GameWorld.GetOrderValueByDict(rankAwardDict, rank, False) - if not awardItemList: - break - - playerID = billBoardData.GetID() - name2 = billBoardData.GetName2() - cmpValue = billBoardData.GetCmpValue() - - GameWorld.Log(" 发放骑宠养成个人榜单奖励: rank=%s,playerID=%s,cmpValue=%s,awardItemList=%s, %s" - % (rank, playerID, cmpValue, awardItemList, name2)) - - PlayerCompensation.SendMailByKey("ActHorsePetTrainPlayer", [playerID], awardItemList, [rank]) - + for index in xrange(billboardIndex, billboardDataCount): + if orderCountTotal <= 0: + break + + billBoardData = billBoard.At(index) + playerID = billBoardData.GetID() + name2 = billBoardData.GetName2() + cmpValue = billBoardData.GetCmpValue() + + if cmpValue < needScore: + GameWorld.Log(" 积分不足该榜单所需积分,跳过该名次: index=%s,rank=%s,playerID=%s,cmpValue=%s < %s" % (index, rank, playerID, cmpValue, needScore)) + break + + awardItemExList = [] + for scoreEx in scoreAwardExList: + if cmpValue < scoreEx: + break + awardItemExList = scoreAwardEx[scoreEx] # 取最大满足条件的一档 + finalAwardItemList = awardItemList + awardItemExList + + playerRank = rank - orderCountTotal + 1 + GameWorld.Log(" 发放骑宠养成个人榜单奖励: index=%s,rank=%s,playerRank=%s,playerID=%s,cmpValue=%s,awardItemList=%s,scoreAwardEx=%s,finalAwardItemList=%s, %s" + % (index, rank, playerRank, playerID, cmpValue, awardItemList, scoreAwardEx, finalAwardItemList, name2)) + PlayerCompensation.SendMailByKey("ActHorsePetTrainPlayer", [playerID], finalAwardItemList, [playerRank]) + + orderCountTotal -= 1 + billboardIndex += 1 + return def MapServer_HorsePetTrain(curPlayer, msgList): @@ -187,7 +205,12 @@ ipyData = IpyGameDataPY.GetIpyGameData("CrossActHorsePetTrain", cfgID) if not ipyData: return - personlLimit = ipyData.GetRankLimitPersonal() + PersonalTemplateID = ipyData.GetPersonalTemplateID() + rankIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActHorsePetTrainBillTemp", PersonalTemplateID) + if not rankIpyDataList: + return + lastRankIpyData = rankIpyDataList[-1] # 取最后一个为最低上榜积分限制 + personlLimit = lastRankIpyData.GetNeedScore() playerID = playerInfo["playerID"] playerName = playerInfo["playerName"] @@ -201,7 +224,7 @@ if playerScore >= personlLimit: name2, type2, value1, value2 = accID, job, realmLV, 0 CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_HorsePetTrainScore, groupValue1, playerID, playerName, - name2, type2, value1, value2, playerScore) + name2, type2, value1, value2, playerScore, autoSort=False) return def OnCrossActIDChange(cfgID, zoneID, ipyData, state): @@ -278,32 +301,46 @@ % (billboardType, zoneID, cfgID, templateID, billboardDataCount)) orderIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActHorsePetTrainBillTemp", templateID) - if orderIpyDataList: - rankPre = 0 - billboardIndex = 0 - for ipyData in orderIpyDataList: - rank = ipyData.GetRank() - awardItemList = ipyData.GetAwardItemList() - orderCountTotal = rank - rankPre # 奖励名次数量 - rankPre = rank - orderCount = 0 + if not orderIpyDataList: + return + + rankPre = 0 + billboardIndex = 0 + for ipyData in orderIpyDataList: + rank = ipyData.GetRank() + needScore = ipyData.GetNeedScore() + scoreAwardEx = ipyData.GetScoreAwardEx() + scoreAwardExList = scoreAwardEx.keys() + awardItemList = ipyData.GetAwardItemList() + orderCountTotal = rank - rankPre # 奖励名次数量 + rankPre = rank + + for index in xrange(billboardIndex, billboardDataCount): + if orderCountTotal <= 0: + break - for index in xrange(billboardIndex, billboardDataCount): - if orderCount >= orderCountTotal: + billboardData = billboardObj.At(index) + playerID = billboardData.ID + name2 = billboardData.Name2 + cmpValue = billboardData.CmpValue + if cmpValue < needScore: + GameWorld.Log(" 积分不足该榜单所需积分,跳过该名次: index=%s,rank=%s,playerID=%s,cmpValue=%s < %s" % (index, rank, playerID, cmpValue, needScore)) + break + + awardItemExList = [] + for scoreEx in scoreAwardExList: + if cmpValue < scoreEx: break - - billboardData = billboardObj.At(index) - playerID = billboardData.ID - name2 = billboardData.Name2 - cmpValue = billboardData.CmpValue - - playerRank = index + 1 - GameWorld.Log(" 发放骑宠养成个人榜单奖励: rank=%s,playerID=%s,cmpValue=%s,awardItemList=%s, %s" - % (rank, playerID, cmpValue, awardItemList, name2)) - PlayerCompensation.SendMailByKey("ActHorsePetTrainCrossPlayer", [playerID], awardItemList, [playerRank], crossMail=True) - - orderCount += 1 - billboardIndex += 1 + awardItemExList = scoreAwardEx[scoreEx] # 取最大满足条件的一档 + finalAwardItemList = awardItemList + awardItemExList + + playerRank = rank - orderCountTotal + 1 + GameWorld.Log(" 发放骑宠养成个人榜单奖励: index=%s,rank=%s,playerRank=%s,playerID=%s,cmpValue=%s,awardItemList=%s,scoreAwardEx=%s,finalAwardItemList=%s, %s" + % (index, rank, playerRank, playerID, cmpValue, awardItemList, scoreAwardEx, finalAwardItemList, name2)) + PlayerCompensation.SendMailByKey("ActHorsePetTrainCrossPlayer", [playerID], finalAwardItemList, [playerRank], crossMail=True) + + orderCountTotal -= 1 + billboardIndex += 1 return diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py index bd75dcc..fdf076f 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py @@ -36064,10 +36064,10 @@ return DumpString -class tagMCActHorsePetTrainBillard(Structure): - Rank = 0 #(DWORD Rank)// 名次,1-代表第一名;支持夸段,如1,3 代表第1名,第2~3名 - Count = 0 #(BYTE Count)// 奖励物品数 - AwardItemList = list() #(vector<tagMCActHorsePetTrainItem> AwardItemList)// 奖励物品列表 +class tagMCActHorsePetTrainAwardEx(Structure): + NeedScore = 0 #(DWORD NeedScore)// 额外奖励所需积分 + Count = 0 #(BYTE Count)// 额外奖励物品数 + AwardItemList = list() #(vector<tagMCActHorsePetTrainItem> AwardItemList)// 额外奖励物品列表 data = None def __init__(self): @@ -36076,7 +36076,7 @@ def ReadData(self, _lpData, _pos=0, _Len=0): self.Clear() - self.Rank,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.NeedScore,_pos = CommFunc.ReadDWORD(_lpData, _pos) self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos) for i in range(self.Count): temAwardItemList = tagMCActHorsePetTrainItem() @@ -36085,7 +36085,7 @@ return _pos def Clear(self): - self.Rank = 0 + self.NeedScore = 0 self.Count = 0 self.AwardItemList = list() return @@ -36101,7 +36101,7 @@ def GetBuffer(self): data = '' - data = CommFunc.WriteDWORD(data, self.Rank) + data = CommFunc.WriteDWORD(data, self.NeedScore) data = CommFunc.WriteBYTE(data, self.Count) for i in range(self.Count): data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer()) @@ -36109,13 +36109,96 @@ def OutputString(self): DumpString = ''' - Rank:%d, + NeedScore:%d, Count:%d, AwardItemList:%s '''\ %( + self.NeedScore, + self.Count, + "..." + ) + return DumpString + + +class tagMCActHorsePetTrainBillard(Structure): + Rank = 0 #(DWORD Rank)// 名次,1-代表第一名;支持夸段,如1,3 代表第1名,第2~3名 + Count = 0 #(BYTE Count)// 奖励物品数 + AwardItemList = list() #(vector<tagMCActHorsePetTrainItem> AwardItemList)// 奖励物品列表 + NeedScore = 0 #(DWORD NeedScore)// 上榜所需积分 + CountEx = 0 #(BYTE CountEx)// 额外奖励数 + AwardItemExList = list() #(vector<tagMCActHorsePetTrainAwardEx> AwardItemExList)// 额外奖励列表 + data = None + + def __init__(self): + self.Clear() + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + self.Rank,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.Count): + temAwardItemList = tagMCActHorsePetTrainItem() + _pos = temAwardItemList.ReadData(_lpData, _pos) + self.AwardItemList.append(temAwardItemList) + self.NeedScore,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.CountEx,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.CountEx): + temAwardItemExList = tagMCActHorsePetTrainAwardEx() + _pos = temAwardItemExList.ReadData(_lpData, _pos) + self.AwardItemExList.append(temAwardItemExList) + return _pos + + def Clear(self): + self.Rank = 0 + self.Count = 0 + self.AwardItemList = list() + self.NeedScore = 0 + self.CountEx = 0 + self.AwardItemExList = list() + return + + def GetLength(self): + length = 0 + length += 4 + length += 1 + for i in range(self.Count): + length += self.AwardItemList[i].GetLength() + length += 4 + length += 1 + for i in range(self.CountEx): + length += self.AwardItemExList[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteDWORD(data, self.Rank) + data = CommFunc.WriteBYTE(data, self.Count) + for i in range(self.Count): + data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer()) + data = CommFunc.WriteDWORD(data, self.NeedScore) + data = CommFunc.WriteBYTE(data, self.CountEx) + for i in range(self.CountEx): + data = CommFunc.WriteString(data, self.AwardItemExList[i].GetLength(), self.AwardItemExList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Rank:%d, + Count:%d, + AwardItemList:%s, + NeedScore:%d, + CountEx:%d, + AwardItemExList:%s + '''\ + %( self.Rank, self.Count, + "...", + self.NeedScore, + self.CountEx, "..." ) return DumpString @@ -41742,10 +41825,10 @@ return DumpString -class tagMCCrossActHorsePetTrainBillard(Structure): - Rank = 0 #(DWORD Rank)// 名次,1-代表第一名;支持夸段,如1,3 代表第1名,第2~3名 - Count = 0 #(BYTE Count)// 奖励物品数 - AwardItemList = list() #(vector<tagMCCrossActHorsePetTrainItem> AwardItemList)// 奖励物品列表 +class tagMCCrossActHorsePetTrainAwardEx(Structure): + NeedScore = 0 #(DWORD NeedScore)// 额外奖励所需积分 + Count = 0 #(BYTE Count)// 额外奖励物品数 + AwardItemList = list() #(vector<tagMCCrossActHorsePetTrainItem> AwardItemList)// 额外奖励物品列表 data = None def __init__(self): @@ -41754,7 +41837,7 @@ def ReadData(self, _lpData, _pos=0, _Len=0): self.Clear() - self.Rank,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.NeedScore,_pos = CommFunc.ReadDWORD(_lpData, _pos) self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos) for i in range(self.Count): temAwardItemList = tagMCCrossActHorsePetTrainItem() @@ -41763,7 +41846,7 @@ return _pos def Clear(self): - self.Rank = 0 + self.NeedScore = 0 self.Count = 0 self.AwardItemList = list() return @@ -41779,7 +41862,7 @@ def GetBuffer(self): data = '' - data = CommFunc.WriteDWORD(data, self.Rank) + data = CommFunc.WriteDWORD(data, self.NeedScore) data = CommFunc.WriteBYTE(data, self.Count) for i in range(self.Count): data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer()) @@ -41787,13 +41870,96 @@ def OutputString(self): DumpString = ''' - Rank:%d, + NeedScore:%d, Count:%d, AwardItemList:%s '''\ %( + self.NeedScore, + self.Count, + "..." + ) + return DumpString + + +class tagMCCrossActHorsePetTrainBillard(Structure): + Rank = 0 #(DWORD Rank)// 名次,1-代表第一名;支持夸段,如1,3 代表第1名,第2~3名 + Count = 0 #(BYTE Count)// 奖励物品数 + AwardItemList = list() #(vector<tagMCCrossActHorsePetTrainItem> AwardItemList)// 奖励物品列表 + NeedScore = 0 #(DWORD NeedScore)// 上榜所需积分 + CountEx = 0 #(BYTE CountEx)// 额外奖励数 + AwardItemExList = list() #(vector<tagMCCrossActHorsePetTrainAwardEx> AwardItemExList)// 额外奖励列表 + data = None + + def __init__(self): + self.Clear() + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + self.Rank,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.Count): + temAwardItemList = tagMCCrossActHorsePetTrainItem() + _pos = temAwardItemList.ReadData(_lpData, _pos) + self.AwardItemList.append(temAwardItemList) + self.NeedScore,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.CountEx,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.CountEx): + temAwardItemExList = tagMCCrossActHorsePetTrainAwardEx() + _pos = temAwardItemExList.ReadData(_lpData, _pos) + self.AwardItemExList.append(temAwardItemExList) + return _pos + + def Clear(self): + self.Rank = 0 + self.Count = 0 + self.AwardItemList = list() + self.NeedScore = 0 + self.CountEx = 0 + self.AwardItemExList = list() + return + + def GetLength(self): + length = 0 + length += 4 + length += 1 + for i in range(self.Count): + length += self.AwardItemList[i].GetLength() + length += 4 + length += 1 + for i in range(self.CountEx): + length += self.AwardItemExList[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteDWORD(data, self.Rank) + data = CommFunc.WriteBYTE(data, self.Count) + for i in range(self.Count): + data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer()) + data = CommFunc.WriteDWORD(data, self.NeedScore) + data = CommFunc.WriteBYTE(data, self.CountEx) + for i in range(self.CountEx): + data = CommFunc.WriteString(data, self.AwardItemExList[i].GetLength(), self.AwardItemExList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Rank:%d, + Count:%d, + AwardItemList:%s, + NeedScore:%d, + CountEx:%d, + AwardItemExList:%s + '''\ + %( self.Rank, self.Count, + "...", + self.NeedScore, + self.CountEx, "..." ) return DumpString @@ -41808,7 +41974,6 @@ EndtDate = "" #(char EndtDate[10])// 结束日期 y-m-d JoinStartTime = "" #(char JoinStartTime[5])// 参与开始时间点 mm:ss JoinEndTime = "" #(char JoinEndTime[5])// 参与结束时间点 mm:ss - RankLimitPersonal = 0 #(WORD RankLimitPersonal)// 个人榜上榜积分保底限制; PersonalBillCount = 0 #(BYTE PersonalBillCount) PersonalBillboardInfoList = list() #(vector<tagMCCrossActHorsePetTrainBillard> PersonalBillboardInfoList)// 个人榜单奖励信息列表,如果没有代表本次活动没有该榜奖励 data = None @@ -41829,7 +41994,6 @@ self.EndtDate,_pos = CommFunc.ReadString(_lpData, _pos,10) self.JoinStartTime,_pos = CommFunc.ReadString(_lpData, _pos,5) self.JoinEndTime,_pos = CommFunc.ReadString(_lpData, _pos,5) - self.RankLimitPersonal,_pos = CommFunc.ReadWORD(_lpData, _pos) self.PersonalBillCount,_pos = CommFunc.ReadBYTE(_lpData, _pos) for i in range(self.PersonalBillCount): temPersonalBillboardInfoList = tagMCCrossActHorsePetTrainBillard() @@ -41849,7 +42013,6 @@ self.EndtDate = "" self.JoinStartTime = "" self.JoinEndTime = "" - self.RankLimitPersonal = 0 self.PersonalBillCount = 0 self.PersonalBillboardInfoList = list() return @@ -41864,7 +42027,6 @@ length += 10 length += 5 length += 5 - length += 2 length += 1 for i in range(self.PersonalBillCount): length += self.PersonalBillboardInfoList[i].GetLength() @@ -41881,7 +42043,6 @@ data = CommFunc.WriteString(data, 10, self.EndtDate) data = CommFunc.WriteString(data, 5, self.JoinStartTime) data = CommFunc.WriteString(data, 5, self.JoinEndTime) - data = CommFunc.WriteWORD(data, self.RankLimitPersonal) data = CommFunc.WriteBYTE(data, self.PersonalBillCount) for i in range(self.PersonalBillCount): data = CommFunc.WriteString(data, self.PersonalBillboardInfoList[i].GetLength(), self.PersonalBillboardInfoList[i].GetBuffer()) @@ -41897,7 +42058,6 @@ EndtDate:%s, JoinStartTime:%s, JoinEndTime:%s, - RankLimitPersonal:%d, PersonalBillCount:%d, PersonalBillboardInfoList:%s '''\ @@ -41910,7 +42070,6 @@ self.EndtDate, self.JoinStartTime, self.JoinEndTime, - self.RankLimitPersonal, self.PersonalBillCount, "..." ) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py index 8f7114e..ff3b49d 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py @@ -1523,6 +1523,8 @@ ("DWORD", "TemplateID", 1), ("BYTE", "Rank", 0), ("list", "AwardItemList", 0), + ("DWORD", "NeedScore", 0), + ("dict", "ScoreAwardEx", 0), ), "ActGubao":( @@ -4625,7 +4627,9 @@ def GetTemplateID(self): return self.attrTuple[0] # 模板编号 DWORD def GetRank(self): return self.attrTuple[1] # 名次 BYTE - def GetAwardItemList(self): return self.attrTuple[2] # 奖励物品列表[[物品ID,个数,是否拍品], ...] list + def GetAwardItemList(self): return self.attrTuple[2] # 奖励物品列表[[物品ID,个数,是否拍品], ...] list + def GetNeedScore(self): return self.attrTuple[3] # 上榜所需积分 DWORD + def GetScoreAwardEx(self): return self.attrTuple[4] # 达标积分额外奖励 {积分:[[物品ID,个数,是否拍品], ...], ...} dict # 古宝养成活动时间表 class IPY_ActGubao(): diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActHorsePetTrain.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActHorsePetTrain.py index f6c1cca..40afe79 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActHorsePetTrain.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActHorsePetTrain.py @@ -279,7 +279,6 @@ clientPack.EndtDate = ipyDataDict.get("EndDate", "") clientPack.JoinStartTime = ipyDataDict.get("JoinStartTime", "") clientPack.JoinEndTime = ipyDataDict.get("JoinEndTime", "") - clientPack.RankLimitPersonal = ipyDataDict.get("RankLimitPersonal", 0) clientPack.PersonalBillboardInfoList = __GetTempRankBillPackList(personalTempIpyDataList) clientPack.PersonalBillCount = len(clientPack.PersonalBillboardInfoList) @@ -317,5 +316,27 @@ # rankInfo.MemAwardItemList.append(item) # rankInfo.MemCount = len(rankInfo.MemAwardItemList) + rankInfo.NeedScore = tempIpyData.GetNeedScore() + rankInfo.AwardItemExList = [] + scoreAwardEx = tempIpyData.GetScoreAwardEx() + scoreExList = scoreAwardEx.keys() + scoreExList.sort() + for scoreEx in scoreExList: + itemExList = scoreAwardEx[scoreEx] + awardEx = ChPyNetSendPack.tagMCActHorsePetTrainAwardEx() + awardEx.NeedScore = scoreEx + awardEx.AwardItemList = [] + for itemID, itemCount, isAuctionItem in itemExList: + item = ChPyNetSendPack.tagMCActHorsePetTrainItem() + item.Clear() + item.ItemID = itemID + item.ItemCount = itemCount + item.IsBind = isAuctionItem + awardEx.AwardItemList.append(item) + awardEx.Count = len(awardEx.AwardItemList) + + rankInfo.AwardItemExList.append(awardEx) + rankInfo.CountEx = len(rankInfo.AwardItemExList) + packBillList.append(rankInfo) return packBillList -- Gitblit v1.8.0