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