10256 【越南】【砍树】排行榜名次加入积分限制
1. 跨服榜增加延迟排序,每分钟对变更数据且不实时排序的榜单进行排序,或玩家查询时触发排序;
2. 骑宠跨服榜改为仅更新数据,不实时排序;
3. 骑宠养成增加各排名上榜积分限制;增加名次达标积分额外奖励;去除跨服榜单上榜限制配置,统一取榜单模版中最后一条限制作为保底限制;
11个文件已修改
639 ■■■■ 已修改文件
PySysDB/PySysDBG.h 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/PySysDBPY.h 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py 205 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_QueryBillboardCross.py 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBillboard.py 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActHorsePetTrain.py 143 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 205 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActHorsePetTrain.py 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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,个数,是否拍品], ...], ...}
};
//古宝养成活动时间表
PySysDB/PySysDBPY.h
@@ -1924,6 +1924,8 @@
    DWORD        _TemplateID;    //模板编号
    BYTE        Rank;    //名次
    list        AwardItemList;    //奖励物品列表[[物品ID,个数,是否拍品], ...]
    DWORD        NeedScore;    //上榜所需积分
    dict        ScoreAwardEx;    //达标积分额外奖励 {积分:[[物品ID,个数,是否拍品], ...], ...}
};
//古宝养成活动时间表
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,
                                "..."
                                )
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
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
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()
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():
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
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,
                                "..."
                                )
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():
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