From cfd9fd059c78903926bf8f265d6eb52904ec3e77 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 13 八月 2024 11:14:51 +0800
Subject: [PATCH] 10241 【越南】【砍树】【主干】【港台】古宝养成(增加古宝养成活动;任务活动增加古宝寻宝任务类型,任务支持配置循环轮次;)

---
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py          |    7 
 ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py                                  |  101 ++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py               |   14 
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py                             |    9 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py           |  514 +++++++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py     |    8 
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActGubao.py                          |  297 ++++++++
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py                                |  514 +++++++++++++++
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py                         |    4 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActTask.py      |   49 +
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py                   |    4 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGubao.py        |    7 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py             |   62 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActGubao.py     |  303 ++++++++
 ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py                                       |    1 
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossActionControl.py              |    7 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py           |    5 
 PySysDB/PySysDBPY.h                                                                              |   23 
 ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py                                    |   14 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py |    7 
 PySysDB/PySysDBG.h                                                                               |   40 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                  |    9 
 22 files changed, 1,978 insertions(+), 21 deletions(-)

diff --git a/PySysDB/PySysDBG.h b/PySysDB/PySysDBG.h
index f755866..82a556f 100644
--- a/PySysDB/PySysDBG.h
+++ b/PySysDB/PySysDBG.h
@@ -633,6 +633,46 @@
 	WORD		FamilyTemplateID;	//仙盟排行模板编号
 };
 
+//古宝养成活动时间表
+
+struct tagActGubao
+{
+	DWORD		_CfgID;	//配置ID
+	list		PlatformList;	//活动平台列表["平台A", "平台A", ...],配[]代表所有
+	list		ServerGroupIDList;	//服务器ID列表
+	BYTE		ActNum;	//活动分组编号, 活动类型 * 10 + 不同界面编号
+	char		StartDate;	//开启日期
+	char		EndDate;	//结束日期
+	char		JoinStartTime;	//参与开始时间点
+	char		JoinEndTime;	//参与结束时间点
+	WORD		PersonalTemplateID;	//个人排行模板编号
+};
+
+//古宝养成活动跨服表
+
+struct tagCrossActGubao
+{
+	DWORD		_CfgID;	//配置ID
+	char		ActGroupName;	//活动组名(同组活动的名字需相同)
+	BYTE		ZoneID;		//组内分组编号
+	list		ServerIDRangeList;	//活动的账号服务器ID范围列表 [[serverIDA, serverIDB], ...]
+	char		StartDate;	//开启日期
+	char		EndDate;	//结束日期
+	char		JoinStartTime;	//参与开始时间点
+	char		JoinEndTime;	//参与结束时间点
+	WORD		RankLimitPersonal;	//个人上榜积分限制
+	WORD		PersonalTemplateID;	//个人排行模板编号
+};
+
+//古宝养成榜单模版表
+
+struct tagActGubaoBillTemp
+{
+	DWORD		_TemplateID;	//模板编号
+	BYTE		Rank;	//名次
+	list		AwardItemList;	//奖励物品列表[[物品ID,个数,是否拍品], ...]
+};
+
 //仙匣秘境活动时间表
 
 struct tagActXianXiaMJ
diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index a777435..e56021b 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -1955,6 +1955,28 @@
 	list		MemAwardItemList;	//仙盟榜成员奖励物品信息列表[[物品ID,个数,是否拍品], ...]
 };
 
+//古宝养成活动时间表
+
+struct tagActGubao
+{
+	DWORD		_CfgID;	//配置ID
+	char		StartDate;	//开启日期
+	char		EndDate;	//结束日期
+	char		JoinStartTime;	//参与开始时间点
+	char		JoinEndTime;	//参与结束时间点
+	WORD		LVLimit;	//限制等级
+	WORD		PersonalTemplateID;	//个人排行模板编号
+};
+
+//古宝养成榜单模版表
+
+struct tagActGubaoBillTemp
+{
+	DWORD		_TemplateID;	//模板编号
+	BYTE		Rank;	//名次
+	list		AwardItemList;	//奖励物品列表[[物品ID,个数,是否拍品], ...]
+};
+
 //仙匣秘境活动时间表
 
 struct tagActXianXiaMJ
@@ -2578,6 +2600,7 @@
 	BYTE		IsDayReset;	//是否每天重置
 	BYTE		ResetType;	//重置类型,0-0点重置;1-5点重置
 	BYTE		TemplateID;	//登录奖励模板编号
+	BYTE		RoundMax;	//任务最大轮次
 };
 
 //任务活动模板表
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py b/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
index 43c3267..8ff3061 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
@@ -610,6 +610,7 @@
             ShareDefine.Def_BT_BossTrialSubmitFamily    : 100,           #boss凭证仙盟 (boss历练活动)
             ShareDefine.Def_BT_BossTrialSubmitFamilyBak : 100,           #boss凭证仙盟 (boss历练活动 - 上一期)
             ShareDefine.Def_BT_XianXiaMJScore           : 200,           #仙匣秘境积分榜 (仙匣秘境活动)
+            ShareDefine.Def_BT_GubaoScore               : 200,           #古宝养成积分榜 (古宝养成活动)
             ShareDefine.Def_BT_AlineInvade              : 1000,          #异兽入侵
             }
 
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index 0aceafa..897ab27 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -35624,6 +35624,273 @@
 
 
 #------------------------------------------------------
+# AA 81 古宝养成活动信息 #tagMCActGubaoInfo
+
+class  tagMCActGubaoItem(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("ItemID", c_int),    
+                  ("ItemCount", c_ushort),    
+                  ("IsBind", c_ubyte),    
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.ItemID = 0
+        self.ItemCount = 0
+        self.IsBind = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCActGubaoItem)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 81 古宝养成活动信息 //tagMCActGubaoInfo:
+                                ItemID:%d,
+                                ItemCount:%d,
+                                IsBind:%d
+                                '''\
+                                %(
+                                self.ItemID,
+                                self.ItemCount,
+                                self.IsBind
+                                )
+        return DumpString
+
+
+class  tagMCActGubaoBillard(Structure):
+    Rank = 0    #(DWORD Rank)// 名次,1-代表第一名;支持夸段,如1,3 代表第1名,第2~3名
+    Count = 0    #(BYTE Count)// 奖励物品数
+    AwardItemList = list()    #(vector<tagMCActGubaoItem> AwardItemList)// 奖励物品列表
+    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 = tagMCActGubaoItem()
+            _pos = temAwardItemList.ReadData(_lpData, _pos)
+            self.AwardItemList.append(temAwardItemList)
+        return _pos
+
+    def Clear(self):
+        self.Rank = 0
+        self.Count = 0
+        self.AwardItemList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 1
+        for i in range(self.Count):
+            length += self.AwardItemList[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())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Rank:%d,
+                                Count:%d,
+                                AwardItemList:%s
+                                '''\
+                                %(
+                                self.Rank,
+                                self.Count,
+                                "..."
+                                )
+        return DumpString
+
+
+class  tagMCActGubaoInfo(Structure):
+    Head = tagHead()
+    ActNum = 0    #(BYTE ActNum)// 活动编号
+    StartDate = ""    #(char StartDate[10])// 开始日期 y-m-d
+    EndtDate = ""    #(char EndtDate[10])// 结束日期 y-m-d
+    JoinStartTime = ""    #(char JoinStartTime[5])// 参与开始时间点 mm:ss
+    JoinEndTime = ""    #(char JoinEndTime[5])// 参与结束时间点 mm:ss
+    LimitLV = 0    #(WORD LimitLV)// 限制等级
+    PersonalBillCount = 0    #(BYTE PersonalBillCount)
+    PersonalBillboardInfoList = list()    #(vector<tagMCActGubaoBillard> PersonalBillboardInfoList)// 个人榜单奖励信息列表,如果没有代表本次活动没有该榜奖励
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x81
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.ActNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.StartDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
+        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.LimitLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.PersonalBillCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.PersonalBillCount):
+            temPersonalBillboardInfoList = tagMCActGubaoBillard()
+            _pos = temPersonalBillboardInfoList.ReadData(_lpData, _pos)
+            self.PersonalBillboardInfoList.append(temPersonalBillboardInfoList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x81
+        self.ActNum = 0
+        self.StartDate = ""
+        self.EndtDate = ""
+        self.JoinStartTime = ""
+        self.JoinEndTime = ""
+        self.LimitLV = 0
+        self.PersonalBillCount = 0
+        self.PersonalBillboardInfoList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        length += 10
+        length += 10
+        length += 5
+        length += 5
+        length += 2
+        length += 1
+        for i in range(self.PersonalBillCount):
+            length += self.PersonalBillboardInfoList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.ActNum)
+        data = CommFunc.WriteString(data, 10, self.StartDate)
+        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.LimitLV)
+        data = CommFunc.WriteBYTE(data, self.PersonalBillCount)
+        for i in range(self.PersonalBillCount):
+            data = CommFunc.WriteString(data, self.PersonalBillboardInfoList[i].GetLength(), self.PersonalBillboardInfoList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                ActNum:%d,
+                                StartDate:%s,
+                                EndtDate:%s,
+                                JoinStartTime:%s,
+                                JoinEndTime:%s,
+                                LimitLV:%d,
+                                PersonalBillCount:%d,
+                                PersonalBillboardInfoList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.ActNum,
+                                self.StartDate,
+                                self.EndtDate,
+                                self.JoinStartTime,
+                                self.JoinEndTime,
+                                self.LimitLV,
+                                self.PersonalBillCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCActGubaoInfo=tagMCActGubaoInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActGubaoInfo.Head.Cmd,m_NAtagMCActGubaoInfo.Head.SubCmd))] = m_NAtagMCActGubaoInfo
+
+
+#------------------------------------------------------
+# AA 82 古宝养成活动玩家信息 #tagMCActGubaoPlayerInfo
+
+class  tagMCActGubaoPlayerInfo(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("ActNum", c_ubyte),    # 活动编号
+                  ("Score", c_int),    # 当前积分
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xAA
+        self.SubCmd = 0x82
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.Cmd = 0xAA
+        self.SubCmd = 0x82
+        self.ActNum = 0
+        self.Score = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCActGubaoPlayerInfo)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 82 古宝养成活动玩家信息 //tagMCActGubaoPlayerInfo:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                ActNum:%d,
+                                Score:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.ActNum,
+                                self.Score
+                                )
+        return DumpString
+
+
+m_NAtagMCActGubaoPlayerInfo=tagMCActGubaoPlayerInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActGubaoPlayerInfo.Cmd,m_NAtagMCActGubaoPlayerInfo.SubCmd))] = m_NAtagMCActGubaoPlayerInfo
+
+
+#------------------------------------------------------
 # AA 54 骑宠盛宴活动信息 #tagMCActHorsePetFeastInfo
 
 class  tagMCActHorsePetFeastTime(Structure):
@@ -37911,6 +38178,7 @@
     LimitLV = 0    #(WORD LimitLV)// 限制等级
     TaskCount = 0    #(BYTE TaskCount)
     TaskList = list()    #(vector<tagMCActTask> TaskList)// 任务列表
+    RoundMax = 0    #(BYTE RoundMax)// 最大可循环轮次,当小于等于1时代表不循环
     data = None
 
     def __init__(self):
@@ -37933,6 +38201,7 @@
             temTaskList = tagMCActTask()
             _pos = temTaskList.ReadData(_lpData, _pos)
             self.TaskList.append(temTaskList)
+        self.RoundMax,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         return _pos
 
     def Clear(self):
@@ -37948,6 +38217,7 @@
         self.LimitLV = 0
         self.TaskCount = 0
         self.TaskList = list()
+        self.RoundMax = 0
         return
 
     def GetLength(self):
@@ -37962,6 +38232,7 @@
         length += 1
         for i in range(self.TaskCount):
             length += self.TaskList[i].GetLength()
+        length += 1
 
         return length
 
@@ -37977,6 +38248,7 @@
         data = CommFunc.WriteBYTE(data, self.TaskCount)
         for i in range(self.TaskCount):
             data = CommFunc.WriteString(data, self.TaskList[i].GetLength(), self.TaskList[i].GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.RoundMax)
         return data
 
     def OutputString(self):
@@ -37989,7 +38261,8 @@
                                 ResetType:%d,
                                 LimitLV:%d,
                                 TaskCount:%d,
-                                TaskList:%s
+                                TaskList:%s,
+                                RoundMax:%d
                                 '''\
                                 %(
                                 self.Head.OutputString(),
@@ -38000,7 +38273,8 @@
                                 self.ResetType,
                                 self.LimitLV,
                                 self.TaskCount,
-                                "..."
+                                "...",
+                                self.RoundMax
                                 )
         return DumpString
 
@@ -38017,6 +38291,7 @@
     ActNum = 0    #(BYTE ActNum)// 活动编号
     AwardCount = 0    #(BYTE AwardCount)
     AwardRecordList = list()    #(vector<DWORD> AwardRecordList)// 任务ID领奖记录值列表,根据任务ID位判断是否已领取,一个记录值存31位 [记录值0, 记录值1, ...]
+    RoundNum = 0    #(BYTE RoundNum)// 当前轮次,从1开始
     data = None
 
     def __init__(self):
@@ -38033,6 +38308,7 @@
         for i in range(self.AwardCount):
             value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
             self.AwardRecordList.append(value)
+        self.RoundNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         return _pos
 
     def Clear(self):
@@ -38043,6 +38319,7 @@
         self.ActNum = 0
         self.AwardCount = 0
         self.AwardRecordList = list()
+        self.RoundNum = 0
         return
 
     def GetLength(self):
@@ -38051,6 +38328,7 @@
         length += 1
         length += 1
         length += 4 * self.AwardCount
+        length += 1
 
         return length
 
@@ -38061,6 +38339,7 @@
         data = CommFunc.WriteBYTE(data, self.AwardCount)
         for i in range(self.AwardCount):
             data = CommFunc.WriteDWORD(data, self.AwardRecordList[i])
+        data = CommFunc.WriteBYTE(data, self.RoundNum)
         return data
 
     def OutputString(self):
@@ -38068,13 +38347,15 @@
                                 Head:%s,
                                 ActNum:%d,
                                 AwardCount:%d,
-                                AwardRecordList:%s
+                                AwardRecordList:%s,
+                                RoundNum:%d
                                 '''\
                                 %(
                                 self.Head.OutputString(),
                                 self.ActNum,
                                 self.AwardCount,
-                                "..."
+                                "...",
+                                self.RoundNum
                                 )
         return DumpString
 
@@ -40931,6 +41212,231 @@
 
 
 #------------------------------------------------------
+# AA 83 古宝养成跨服活动信息 #tagMCCrossActGubaoInfo
+
+class  tagMCCrossActGubaoItem(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("ItemID", c_int),    
+                  ("ItemCount", c_ushort),    
+                  ("IsBind", c_ubyte),    
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.ItemID = 0
+        self.ItemCount = 0
+        self.IsBind = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCCrossActGubaoItem)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 83 古宝养成跨服活动信息 //tagMCCrossActGubaoInfo:
+                                ItemID:%d,
+                                ItemCount:%d,
+                                IsBind:%d
+                                '''\
+                                %(
+                                self.ItemID,
+                                self.ItemCount,
+                                self.IsBind
+                                )
+        return DumpString
+
+
+class  tagMCCrossActGubaoBillard(Structure):
+    Rank = 0    #(DWORD Rank)// 名次,1-代表第一名;支持夸段,如1,3 代表第1名,第2~3名
+    Count = 0    #(BYTE Count)// 奖励物品数
+    AwardItemList = list()    #(vector<tagMCCrossActGubaoItem> AwardItemList)// 奖励物品列表
+    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 = tagMCCrossActGubaoItem()
+            _pos = temAwardItemList.ReadData(_lpData, _pos)
+            self.AwardItemList.append(temAwardItemList)
+        return _pos
+
+    def Clear(self):
+        self.Rank = 0
+        self.Count = 0
+        self.AwardItemList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 1
+        for i in range(self.Count):
+            length += self.AwardItemList[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())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Rank:%d,
+                                Count:%d,
+                                AwardItemList:%s
+                                '''\
+                                %(
+                                self.Rank,
+                                self.Count,
+                                "..."
+                                )
+        return DumpString
+
+
+class  tagMCCrossActGubaoInfo(Structure):
+    Head = tagHead()
+    ServerInfoLen = 0    #(BYTE ServerInfoLen)
+    ServerIDRangeInfo = ""    #(String ServerIDRangeInfo)//开放该活动的服务器ID范围列表,json格式 [[IDA, IDB], ...], [] 为全服
+    GroupValue1 = 0    #(BYTE GroupValue1)// 活动榜单分组值1,用于查询对应榜单
+    StartDate = ""    #(char StartDate[10])// 开始日期 y-m-d
+    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<tagMCCrossActGubaoBillard> PersonalBillboardInfoList)// 个人榜单奖励信息列表,如果没有代表本次活动没有该榜奖励
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x83
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.ServerInfoLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.ServerIDRangeInfo,_pos = CommFunc.ReadString(_lpData, _pos,self.ServerInfoLen)
+        self.GroupValue1,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.StartDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
+        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 = tagMCCrossActGubaoBillard()
+            _pos = temPersonalBillboardInfoList.ReadData(_lpData, _pos)
+            self.PersonalBillboardInfoList.append(temPersonalBillboardInfoList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x83
+        self.ServerInfoLen = 0
+        self.ServerIDRangeInfo = ""
+        self.GroupValue1 = 0
+        self.StartDate = ""
+        self.EndtDate = ""
+        self.JoinStartTime = ""
+        self.JoinEndTime = ""
+        self.RankLimitPersonal = 0
+        self.PersonalBillCount = 0
+        self.PersonalBillboardInfoList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        length += len(self.ServerIDRangeInfo)
+        length += 1
+        length += 10
+        length += 10
+        length += 5
+        length += 5
+        length += 2
+        length += 1
+        for i in range(self.PersonalBillCount):
+            length += self.PersonalBillboardInfoList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.ServerInfoLen)
+        data = CommFunc.WriteString(data, self.ServerInfoLen, self.ServerIDRangeInfo)
+        data = CommFunc.WriteBYTE(data, self.GroupValue1)
+        data = CommFunc.WriteString(data, 10, self.StartDate)
+        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())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                ServerInfoLen:%d,
+                                ServerIDRangeInfo:%s,
+                                GroupValue1:%d,
+                                StartDate:%s,
+                                EndtDate:%s,
+                                JoinStartTime:%s,
+                                JoinEndTime:%s,
+                                RankLimitPersonal:%d,
+                                PersonalBillCount:%d,
+                                PersonalBillboardInfoList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.ServerInfoLen,
+                                self.ServerIDRangeInfo,
+                                self.GroupValue1,
+                                self.StartDate,
+                                self.EndtDate,
+                                self.JoinStartTime,
+                                self.JoinEndTime,
+                                self.RankLimitPersonal,
+                                self.PersonalBillCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCCrossActGubaoInfo=tagMCCrossActGubaoInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCCrossActGubaoInfo.Head.Cmd,m_NAtagMCCrossActGubaoInfo.Head.SubCmd))] = m_NAtagMCCrossActGubaoInfo
+
+
+#------------------------------------------------------
 # AA 80 仙匣秘境跨服活动信息 #tagMCCrossActXianXiaMJInfo
 
 class  tagMCCrossActXianXiaMJItem(Structure):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossActionControl.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossActionControl.py
index b22ea56..9e4d0ba 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossActionControl.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossActionControl.py
@@ -24,6 +24,7 @@
 import CrossActCTGBillboard
 import PlayerActBossTrial
 import PlayerActXianXiaMJ
+import PlayerActGubao
 import CrossRealmMsg
 import PyGameData
 import ChConfig
@@ -628,6 +629,9 @@
                 elif actName == ShareDefine.CrossActName_XianXiaMJ:
                     PlayerActXianXiaMJ.OnCrossActIDChange(cfgID, zoneID, ipyData, state)
                     
+                elif actName == ShareDefine.CrossActName_Gubao:
+                    PlayerActGubao.OnCrossActIDChange(cfgID, zoneID, ipyData, state)
+                    
                 else:
                     actChangeList.append([actName, ipyData, state, cfgID, groupName, zoneID, dbActID, actID, forceReset, dbTemplateID])
                     
@@ -655,6 +659,9 @@
                     elif actName == ShareDefine.CrossActName_XianXiaMJ:
                         PlayerActXianXiaMJ.OnCrossActJoinEnd(cfgID, zoneID, ipyData)
                         
+                    elif actName == ShareDefine.CrossActName_Gubao:
+                        PlayerActGubao.OnCrossActJoinEnd(cfgID, zoneID, ipyData)
+                        
             GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossActInfo % actName, crossActInfoDict[actName])
             # 非活动中的处理完关闭后,最后删除
             if not state and isEnd:
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py
index ef5a07d..425ab9b 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py
@@ -26,6 +26,7 @@
 import PlayerCompensation
 import PlayerActBossTrial
 import PlayerActXianXiaMJ
+import PlayerActGubao
 import CrossActionControl
 import CrossActAllRecharge
 import CrossChampionship
@@ -177,6 +178,9 @@
         elif msgType == ShareDefine.ClientServerMsg_XianXiaMJScore:
             PlayerActXianXiaMJ.ClientServerMsg_XianXiaMJScore(serverGroupID, msgData)
             
+        elif msgType == ShareDefine.ClientServerMsg_GubaoScore:
+            PlayerActGubao.ClientServerMsg_GubaoScore(serverGroupID, msgData)
+            
         elif msgType == ShareDefine.ClientServerMsg_CreateFuncTeam:
             PlayerFuncTeam.ClientServerMsg_CreateFuncTeam(serverGroupID, msgData)
             
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
index 224a624..a0d9378 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
@@ -37,6 +37,7 @@
 import PlayerActGarbageSorting
 import PlayerActBossTrial
 import PlayerActXianXiaMJ
+import PlayerActGubao
 import PlayerUniversalGameRec
 import GameWorldAverageLv
 import PlayerFamilyBoss
@@ -823,6 +824,8 @@
                         PlayerActBossTrial.OnActEnd(actNum, ipyData, dayIndex)
                     elif actName == ShareDefine.OperationActionName_XianXiaMJ:
                         PlayerActXianXiaMJ.OnActEnd(actNum, ipyData, dayIndex)
+                    elif actName == ShareDefine.OperationActionName_Gubao:
+                        PlayerActGubao.OnActEnd(actNum, ipyData, dayIndex)
                         
                 if curActID:
                     if actName in ShareDefine.NeedWorldLVOperationActNameList:
@@ -855,6 +858,8 @@
                         PlayerActBossTrial.OnActStart(actNum)
                     elif actName == ShareDefine.OperationActionName_XianXiaMJ:
                         PlayerActXianXiaMJ.OnActStart(actNum)
+                    elif actName == ShareDefine.OperationActionName_Gubao:
+                        PlayerActGubao.OnActStart(actNum)
                     elif actName == ShareDefine.OperationActionName_FamilyCTGAssist:
                         PlayerActFamilyCTGAssist.OnActStart(actNum)
                 else:
@@ -876,6 +881,8 @@
                         PlayerActBossTrial.OnActJoinEnd(actNum, ipyData, dayIndex)
                     elif actName == ShareDefine.OperationActionName_XianXiaMJ:
                         PlayerActXianXiaMJ.OnActJoinEnd(actNum, ipyData, dayIndex)
+                    elif actName == ShareDefine.OperationActionName_Gubao:
+                        PlayerActGubao.OnActJoinEnd(actNum, ipyData, dayIndex)
                         
             if ipyData and actName in ShareDefine.NeedWorldLVOperationActNameList:
                 actWorldLV = PlayerDBGSEvent.GetDBGSTrig_ByKey(dbOperationActWorldLVKey)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
index 1161e8c..de35981 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
@@ -526,6 +526,37 @@
                         ("WORD", "FamilyTemplateID", 0),
                         ),
 
+                "ActGubao":(
+                        ("DWORD", "CfgID", 1),
+                        ("list", "PlatformList", 0),
+                        ("list", "ServerGroupIDList", 0),
+                        ("BYTE", "ActNum", 0),
+                        ("char", "StartDate", 0),
+                        ("char", "EndDate", 0),
+                        ("char", "JoinStartTime", 0),
+                        ("char", "JoinEndTime", 0),
+                        ("WORD", "PersonalTemplateID", 0),
+                        ),
+
+                "CrossActGubao":(
+                        ("DWORD", "CfgID", 1),
+                        ("char", "ActGroupName", 0),
+                        ("BYTE", "ZoneID", 0),
+                        ("list", "ServerIDRangeList", 0),
+                        ("char", "StartDate", 0),
+                        ("char", "EndDate", 0),
+                        ("char", "JoinStartTime", 0),
+                        ("char", "JoinEndTime", 0),
+                        ("WORD", "RankLimitPersonal", 0),
+                        ("WORD", "PersonalTemplateID", 0),
+                        ),
+
+                "ActGubaoBillTemp":(
+                        ("DWORD", "TemplateID", 1),
+                        ("BYTE", "Rank", 0),
+                        ("list", "AwardItemList", 0),
+                        ),
+
                 "ActXianXiaMJ":(
                         ("DWORD", "CfgID", 1),
                         ("list", "PlatformList", 0),
@@ -1812,6 +1843,52 @@
     def GetPersonalTemplateID(self): return self.attrTuple[14] # 个人排行模板编号 WORD
     def GetFamilyTemplateID(self): return self.attrTuple[15] # 仙盟排行模板编号 WORD
 
+# 古宝养成活动时间表
+class IPY_ActGubao():
+    
+    def __init__(self):
+        self.attrTuple = None
+        return
+        
+    def GetCfgID(self): return self.attrTuple[0] # 配置ID DWORD
+    def GetPlatformList(self): return self.attrTuple[1] # 活动平台列表["平台A", "平台A", ...],配[]代表所有 list
+    def GetServerGroupIDList(self): return self.attrTuple[2] # 服务器ID列表 list
+    def GetActNum(self): return self.attrTuple[3] # 活动分组编号, 活动类型 * 10 + 不同界面编号 BYTE
+    def GetStartDate(self): return self.attrTuple[4] # 开启日期 char
+    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 GetPersonalTemplateID(self): return self.attrTuple[8] # 个人排行模板编号 WORD
+
+# 古宝养成活动跨服表
+class IPY_CrossActGubao():
+    
+    def __init__(self):
+        self.attrTuple = None
+        return
+        
+    def GetCfgID(self): return self.attrTuple[0] # 配置ID DWORD
+    def GetActGroupName(self): return self.attrTuple[1] # 活动组名(同组活动的名字需相同) char
+    def GetZoneID(self): return self.attrTuple[2] # 组内分组编号 BYTE
+    def GetServerIDRangeList(self): return self.attrTuple[3] # 活动的账号服务器ID范围列表 [[serverIDA, serverIDB], ...] list
+    def GetStartDate(self): return self.attrTuple[4] # 开启日期 char
+    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
+
+# 古宝养成榜单模版表
+class IPY_ActGubaoBillTemp():
+    
+    def __init__(self):
+        self.attrTuple = None
+        return
+        
+    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
+
 # 仙匣秘境活动时间表
 class IPY_ActXianXiaMJ():
     
@@ -2730,6 +2807,9 @@
         self.__LoadFileData("ActBossTrial", onlyCheck)
         self.__LoadFileData("ActBossTrialTemplate", onlyCheck)
         self.__LoadFileData("CrossActBossTrial", onlyCheck)
+        self.__LoadFileData("ActGubao", onlyCheck)
+        self.__LoadFileData("CrossActGubao", onlyCheck)
+        self.__LoadFileData("ActGubaoBillTemp", onlyCheck)
         self.__LoadFileData("ActXianXiaMJ", onlyCheck)
         self.__LoadFileData("CrossActXianXiaMJ", onlyCheck)
         self.__LoadFileData("ActXianXiaMJBillTemp", onlyCheck)
@@ -3316,6 +3396,27 @@
         self.CheckLoadData("CrossActBossTrial")
         return self.ipyCrossActBossTrialCache[index]
 
+    def GetActGubaoCount(self):
+        self.CheckLoadData("ActGubao")
+        return self.ipyActGubaoLen
+    def GetActGubaoByIndex(self, index):
+        self.CheckLoadData("ActGubao")
+        return self.ipyActGubaoCache[index]
+
+    def GetCrossActGubaoCount(self):
+        self.CheckLoadData("CrossActGubao")
+        return self.ipyCrossActGubaoLen
+    def GetCrossActGubaoByIndex(self, index):
+        self.CheckLoadData("CrossActGubao")
+        return self.ipyCrossActGubaoCache[index]
+
+    def GetActGubaoBillTempCount(self):
+        self.CheckLoadData("ActGubaoBillTemp")
+        return self.ipyActGubaoBillTempLen
+    def GetActGubaoBillTempByIndex(self, index):
+        self.CheckLoadData("ActGubaoBillTemp")
+        return self.ipyActGubaoBillTempCache[index]
+
     def GetActXianXiaMJCount(self):
         self.CheckLoadData("ActXianXiaMJ")
         return self.ipyActXianXiaMJLen
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActGubao.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActGubao.py
new file mode 100644
index 0000000..2e1255d
--- /dev/null
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActGubao.py
@@ -0,0 +1,297 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package PlayerActGubao
+#
+# @todo:古宝养成活动
+# @author hxp
+# @date 2024-08-12
+# @version 1.0
+#
+# 详细描述: 古宝养成活动
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2024-08-12 19:30"""
+#-------------------------------------------------------------------------------
+
+
+import ShareDefine
+import IpyGameDataPY
+import DataRecordPack
+import PlayerDBGSEvent
+import PlayerBillboard
+import PlayerCompensation
+import CrossActionControl
+import CrossBillboard
+import PyDataManager
+import CrossRealmMsg
+import GameWorld
+
+def OnActStart(actNum):
+    ## 活动开启
+    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActGubaoAward % actNum, 0)
+    PlayerBillboard.ClearBillboardByIndex(ShareDefine.Def_BT_GubaoScore)
+    return
+
+def OnActEnd(actNum, ipyData, dayIndex):
+    ## 活动结束
+    cfgID = ipyData.GetCfgID() if ipyData else 0
+    GameWorld.Log("=== 古宝养成活动结束! === actNum=%s,cfgID=%s,dayIndex=%s" % (actNum, cfgID, dayIndex))
+    
+    __OnEndAward(actNum, ipyData, dayIndex) # 兼容活动没有配置参与时间段的在活动结束补触发结算奖励
+    
+    GameWorld.Log("=================================================================================")
+    return
+
+def OnActJoinEnd(actNum, ipyData, dayIndex):
+    ## 活动参与结束
+    __OnEndAward(actNum, ipyData, dayIndex)
+    return
+
+def __OnEndAward(actNum, ipyData, dayIndex):
+    ## 结算奖励
+    if not ipyData:
+        return
+    cfgID = ipyData.GetCfgID()
+    awardState = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActGubaoAward % actNum)
+    if awardState:
+        #已经结算过该活动
+        GameWorld.Log("古宝养成活动已经结算过奖励了! actNum=%s,cfgID=%s,dayIndex=%s" % (actNum, cfgID, dayIndex))
+        return
+    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActGubaoAward % actNum, 1)
+    
+    GameWorld.Log("=== 本服古宝养成活动发放榜单奖励! === actNum=%s,cfgID=%s,dayIndex=%s" % (actNum, cfgID, dayIndex))
+    
+    __OnEndAward_Personal(ipyData.GetPersonalTemplateID(), ShareDefine.Def_BT_GubaoScore)
+    
+    DataRecordPack.DR_BillboardData(ShareDefine.Def_BT_GubaoScore, "ActGubao", {"actNum":actNum, "cfgID":cfgID, "dayIndex":dayIndex})
+    GameWorld.Log("=================================================================================")
+    return
+
+def __OnEndAward_Personal(templateID, billboardType):
+    billBoard = GameWorld.GetBillboard().FindBillboard(billboardType)
+    if not billBoard:
+        return
+    if not templateID:
+        GameWorld.Log("本次活动没有个人榜奖励!")
+        return
+    tempIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActGubaoBillTemp", templateID)
+    if not tempIpyDataList:
+        return
+    
+    rankAwardDict = {}
+    for tempIpyData in tempIpyDataList:
+        rankAwardDict[tempIpyData.GetRank()] = tempIpyData.GetAwardItemList()
+        
+    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("ActGubaoPlayer", [playerID], awardItemList, [rank])
+        
+    return
+
+def MapServer_Gubao(curPlayer, msgList):
+    mapID = curPlayer.GetRealMapID()
+    playerID = curPlayer.GetPlayerID()
+    GameWorld.DebugLog("MapServer_Gubao mapID=%s,msgList=%s" % (mapID, msgList), playerID)
+    if not msgList:
+        return
+    
+    msgType, dataMsg = msgList
+    ret = None
+    
+    if msgType == "AddGubaoScore":
+        ret = __OnAddGubaoScore(curPlayer, dataMsg)
+        
+    if ret == None:
+        return
+    return msgList + (ret if isinstance(ret, list) else [ret])
+
+def __OnAddGubaoScore(curPlayer, dataMsg):
+    ## 地图增加积分
+    playerID = curPlayer.GetPlayerID()
+    accID = curPlayer.GetAccID()
+    playerName = curPlayer.GetName()
+    job = curPlayer.GetJob()
+    realmLV = curPlayer.GetOfficialRank()
+    _, updScore = dataMsg
+    
+    #同步跨服
+    playerInfo = {"playerID":playerID, "playerName":playerName, "accID":accID, "job":job, "realmLV":realmLV,
+                  "playerScore":updScore}
+    SyncGubaoToCrossServer(curPlayer, playerInfo)
+    return
+
+def SyncGubaoToCrossServer(curPlayer, playerInfo):
+    ## 同步到跨服服务器
+    actInfo = CrossActionControl.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_Gubao)
+    if not actInfo.get(ShareDefine.ActKey_State):
+        return
+    cfgID = actInfo.get(ShareDefine.ActKey_CfgID)
+    ipyDataDict = actInfo.get(ShareDefine.ActKey_IpyDataInfo, {})
+    if not ipyDataDict:
+        return
+    zoneID = ipyDataDict.get("ZoneID")
+    if not cfgID or not zoneID:
+        return
+    
+    dataMsg = {"cfgID":cfgID, "zoneID":zoneID, "playerInfo":playerInfo}
+    CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_GubaoScore, dataMsg)
+    return
+
+##------------------------------------------ 跨服古宝养成活动 ---------------------------------------
+def ClientServerMsg_GubaoScore(serverGroupID, msgData):
+    ## 收到子服 - 同步积分
+    
+    cfgID = msgData["cfgID"]
+    zoneID = msgData["zoneID"]
+    playerInfo = msgData["playerInfo"]
+    
+    actInfo = CrossActionControl.GetCrossActInfoByCfgID(ShareDefine.CrossActName_Gubao, cfgID, zoneID)
+    if not actInfo or not actInfo[ShareDefine.ActKey_State]:
+        GameWorld.ErrLog("跨服古宝养成非活动中,无法更新! cfgID=%s, zoneID=%s" % (cfgID, zoneID))
+        return
+    if actInfo[ShareDefine.ActKey_StateJoin] != ShareDefine.ActStateJoin_Start:
+        GameWorld.ErrLog("跨服古宝养成非可参与状态,无法更新! cfgID=%s, zoneID=%s" % (cfgID, zoneID))
+        return
+    ipyData = IpyGameDataPY.GetIpyGameData("CrossActGubao", cfgID)
+    if not ipyData:
+        return
+    personlLimit = ipyData.GetRankLimitPersonal()
+    
+    playerID = playerInfo["playerID"]
+    playerName = playerInfo["playerName"]
+    job = playerInfo["job"]
+    accID = playerInfo["accID"]
+    realmLV = playerInfo["realmLV"]
+    playerScore = playerInfo["playerScore"]
+    
+    groupValue1 = zoneID
+    
+    if playerScore >= personlLimit:
+        name2, type2, value1, value2 = accID, job, realmLV, 0
+        CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_GubaoScore, groupValue1, playerID, playerName, 
+                                         name2, type2, value1, value2, playerScore)
+    return
+
+def OnCrossActIDChange(cfgID, zoneID, ipyData, state):
+    ## 跨服活动ID变更
+    if state:
+        OnCrossActStart(cfgID, zoneID, ipyData)
+    else:
+        OnCrossActEnd(cfgID, zoneID, ipyData)
+    return
+
+def OnCrossActStart(cfgID, zoneID, ipyData):
+    ## 跨服活动开启
+    
+    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActGubaoAwardC % zoneID, 0)
+    
+    groupValue1 = zoneID
+    billboardMgr = PyDataManager.GetCrossBillboardManager()
+    billboardObj = billboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_GubaoScore, groupValue1)
+    billboardObj.ClearData() # 新活动重置榜单数据
+    return
+
+def OnCrossActEnd(cfgID, zoneID, ipyData):
+    ## 跨服活动结束
+    
+    groupValue1 = zoneID
+    GameWorld.Log("=== 跨服古宝养成活动结束! === cfgID=%s,zoneID=%s" % (cfgID, zoneID))
+    __OnCrossEndAward(cfgID, zoneID, ipyData)
+    
+    # 备份、清除榜单数据
+    billboardMgr = PyDataManager.GetCrossBillboardManager()
+    billboardObj = billboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_GubaoScore, groupValue1)
+    billboardObj.ClearData()
+    
+    GameWorld.Log("=================================================================================")
+    return
+
+def OnCrossActJoinEnd(cfgID, zoneID, ipyData):
+    ## 跨服活动参与结束
+    __OnCrossEndAward(cfgID, zoneID, ipyData)
+    return
+
+def __OnCrossEndAward(cfgID, zoneID, ipyData):
+    ## 结算跨服奖励
+    awardState = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActGubaoAwardC % zoneID)
+    if awardState:
+        #已经结算过该活动
+        GameWorld.Log("跨服古宝养成活动已经结算过奖励了! cfgID=%s,zoneID=%s" % (cfgID, zoneID))
+        return
+    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActGubaoAwardC % zoneID, 1)
+    
+    GameWorld.Log("=== 跨服古宝养成活动发放榜单奖励! === cfgID=%s,zoneID=%s" % (cfgID, zoneID))
+    
+    PersonalTemplateID = ipyData.GetPersonalTemplateID()
+    
+    __GiveCrossOrderAwardPersonal(cfgID, zoneID, PersonalTemplateID, ShareDefine.Def_CBT_GubaoScore)
+    GameWorld.Log("=================================================================================")
+    return
+    
+def __GiveCrossOrderAwardPersonal(cfgID, zoneID, templateID, billboardType):
+    
+    groupValue1 = zoneID
+    billboardMgr = PyDataManager.GetCrossBillboardManager()
+    billboardObj = billboardMgr.GetCrossBillboard(billboardType, groupValue1)
+    billboardDataCount = billboardObj.GetCount()
+    if not billboardDataCount:
+        GameWorld.Log("跨服古宝养成个人排行数据为空! billboardType=%s,zoneID=%s,cfgID=%s,templateID=%s" % (billboardType, zoneID, cfgID, templateID))
+        return
+    
+    # 结算时排序并保存榜单数据流向
+    billboardObj.SortData()
+    billboardObj.SaveDRData("Award", {"cfgID":cfgID, "zoneID":zoneID})
+    
+    GameWorld.Log("结算跨服古宝养成个人排行奖励: billboardType=%s,zoneID=%s,cfgID=%s,templateID=%s,billboardDataCount=%s" 
+                  % (billboardType, zoneID, cfgID, templateID, billboardDataCount))
+    
+    orderIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActGubaoBillTemp", templateID)
+    if orderIpyDataList:
+        rankPre = 0
+        billboardIndex = 0
+        for ipyData in orderIpyDataList:
+            rank = ipyData.GetRank()
+            awardItemList = ipyData.GetAwardItemList()
+            orderCountTotal = rank - rankPre # 奖励名次数量
+            rankPre = rank
+            orderCount = 0
+            
+            for index in xrange(billboardIndex, billboardDataCount):
+                if orderCount >= orderCountTotal:
+                    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("ActGubaoCrossPlayer", [playerID], awardItemList, [playerRank], crossMail=True)
+                
+                orderCount += 1
+                billboardIndex += 1
+                
+    return
+
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py
index ff108a1..b740c6c 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py
@@ -182,6 +182,10 @@
 Def_ActXianXiaMJAward = "ActXianXiaMJAward_%s"
 #跨服仙匣秘境结算状态,参数(zoneID)
 Def_ActXianXiaMJAwardC = "ActXianXiaMJAwardC_%s"
+#古宝养成结算状态,参数(actNum),跨服活动参数(zoneID)
+Def_ActGubaoAward = "ActGubaoAward_%s"
+#跨服古宝养成结算状态,参数(zoneID)
+Def_ActGubaoAwardC = "ActGubaoAwardC_%s"
 
 def SetInitOpenServerTime(initTime):
     openDatetime = GameWorld.ChangeTimeNumToDatetime(initTime)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
index f644f4f..5938379 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
@@ -75,6 +75,7 @@
 import CrossChampionship
 import CrossBattlefield
 import CrossActAllRecharge
+import PlayerActGubao
 import PlayerActXianXiaMJ
 import PlayerActBossTrial
 import PlayerActFamilyCTGAssist
@@ -706,6 +707,14 @@
         PlayerActXianXiaMJ.MapServer_XianXiaMJ(curPlayer, eval(resultName))
         return
     
+    # 古宝养成
+    if callName == "ActGubao":
+        curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(srcPlayerID)
+        if not curPlayer:
+            return
+        PlayerActGubao.MapServer_Gubao(curPlayer, eval(resultName))
+        return
+    
     #py喇叭聊天
     if callName == 'PYSpeaker':
         curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(srcPlayerID)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
index c5b9ab0..531117f 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -294,6 +294,7 @@
 OperationActionName_ActTask = "ActTask" # 活动任务
 OperationActionName_BuyCountGift = "ActBuyCountGift" # 购买次数礼包活动
 OperationActionName_FamilyCTGAssist = "ActFamilyCTGAssist" # 仙盟充值协助
+OperationActionName_Gubao = "ActGubao" # 古宝养成活动
 #节日活动类型列表 - 该类型无视开服天,日期到了就开启
 FeastOperationActionNameList = [OperationActionName_FeastWeekParty, OperationActionName_FeastRedPacket,
                                 OperationActionName_RechargeRebateGold, OperationActionName_GrowupBuy,
@@ -316,6 +317,7 @@
                            OperationActionName_BuyOne, OperationActionName_BossTrial,
                            OperationActionName_ActLoginNew, OperationActionName_ActTask,
                            OperationActionName_BuyCountGift, OperationActionName_FamilyCTGAssist,
+                           OperationActionName_Gubao,
                            ] + FeastOperationActionNameList
 #需要记录开启活动时的世界等级的运营活动
 NeedWorldLVOperationActNameList = [OperationActionName_FairyCeremony, OperationActionName_WishingWell, 
@@ -342,6 +344,7 @@
                                    OperationActionName_BuyOne, OperationActionName_BossTrial,
                                    OperationActionName_ActLoginNew, OperationActionName_ActTask,
                                    OperationActionName_BuyCountGift, OperationActionName_FamilyCTGAssist,
+                                   OperationActionName_Gubao,
                                    ]
 
 #跨服运营活动表名定义
@@ -350,9 +353,10 @@
 CrossActName_LuckyCloudBuy = "CrossActLuckyCloudBuy" # 幸运云购
 CrossActName_BossTrial = "CrossActBossTrial" # Boss历练 - 跨服
 CrossActName_XianXiaMJ = "CrossActXianXiaMJ" # 仙匣秘境 - 跨服
+CrossActName_Gubao = "CrossActGubao" # 古宝养成 - 跨服
 
 #跨服运营活动列表
-CrossActNameList = [CrossActName_CTGBillboard, CrossActName_AllRecharge, CrossActName_LuckyCloudBuy, CrossActName_BossTrial, CrossActName_XianXiaMJ]
+CrossActNameList = [CrossActName_CTGBillboard, CrossActName_AllRecharge, CrossActName_LuckyCloudBuy, CrossActName_BossTrial, CrossActName_XianXiaMJ, CrossActName_Gubao]
 #需要锁定活动分区分配直到活动结束的跨服运营活动,即使热更分区配置,也不会改变正在活动中的分区设定,直到活动结束
 CrossActLockServerGroupIDList = [CrossActName_CTGBillboard, CrossActName_AllRecharge]
 
@@ -838,9 +842,10 @@
     Def_BT_BossTrialSubmitFamily,             #提交boss凭证仙盟榜 (boss历练活动)
     Def_BT_BossTrialSubmitFamilyBak,          #提交boss凭证仙盟榜 (boss历练活动 - 上一期)
     Def_BT_XianXiaMJScore,                    #仙匣秘境积分榜 (仙匣秘境活动)
+    Def_BT_GubaoScore,                        #古宝养成积分榜 (古宝养成活动)
     
     Def_BT_Max, #排行榜最大类型
-) = range(0, 38 + 2) 
+) = range(0, 39 + 2) 
 
 ''' 跨服排行榜类型, 从 150 开始
 与本服榜单存储的是不一样的数据库表格,理论上类型可以和本服榜单类型重复,为了做下区分防误导,跨服榜单从 150 开始
@@ -861,7 +866,8 @@
 Def_CBT_BossTrialSubmitFamily, # boss凭证 - 仙盟榜  160
 Def_CBT_BossTrialSubmitFamilyBak, # boss凭证 - 仙盟榜 上一期  161
 Def_CBT_XianXiaMJScore, # 仙匣秘境积分 - 个人榜  162
-) = range(150, 162 + 1)
+Def_CBT_GubaoScore, # 古宝养成积分 - 个人榜  163
+) = range(150, 163 + 1)
 
 # 跨服榜单最大数据名次,没有设置的默认100
 CrossBillboard_MaxDataCount = {
@@ -872,6 +878,7 @@
                                Def_CBT_BossTrialSubmit:1000,
                                Def_CBT_BossTrialSubmitBak:1000,
                                Def_CBT_XianXiaMJScore:1000,
+                               Def_CBT_GubaoScore:1000,
                                }
 
 #职业对应战力排行榜类型
@@ -1641,6 +1648,7 @@
 ClientServerMsg_ChangeFuncTeam = "ChangeFuncTeam"   # 修改功能队伍
 ClientServerMsg_FuncTeamMemOP = "FuncTeamMemOP"   # 功能队伍成员操作
 ClientServerMsg_QueryFuncTeam = "QueryFuncTeam"   # 查询功能队伍
+ClientServerMsg_GubaoScore = "GubaoScore" # 古宝养成积分
 
 #跨服广播类型定义
 CrossNotify_CrossAct = "CrossAct"
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 3a93736..3f076e2 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -4130,6 +4130,11 @@
 Def_PDict_XianXiaMJAwardItemTimes = "ActXXMJItemTimes_%s_%s_%s"  # 奖池物品累计产出次数,有限制次数的才记录,参数:(活动编号, 库类型, 物品ID)
 Def_PDict_XianXiaMJScore = "XianXiaMJScore_%s"  # 抽奖积分,参数:(活动编号)
 
+#古宝养成活动
+Def_PDict_CA_GubaoID = "CA_GubaoID"  # 玩家身上的活动ID,唯一标识,取活动开始日期time值
+Def_PDict_ActGubaoID = "ActGubaoID_%s"  # 玩家身上的活动ID,唯一标识,取活动开始日期time值,参数:(活动编号)
+Def_PDict_ActGubaoScore = "ActGubaoScore_%s"  # 养成积分,参数:(活动编号)
+
 #天帝礼包活动
 Def_PDict_GodGiftID = "ActGodGiftID_%s"  # 玩家身上的活动ID,唯一标识,取活动开始日期time值,参数:(活动编号)
 Def_PDict_GodGiftWorldLV = "ActGodGiftWorldLV_%s" #玩家身上的活动世界等级,参数:(活动编号)
@@ -4160,6 +4165,7 @@
 Def_PDict_ActTaskTempID = "ActTaskTempID_%s"  # 任务活动模板ID,参数:(活动编号)
 Def_PDict_ActTaskValue = "ActTaskValue_%s_%s"  # 任务活动当前任务进度值,参数:(活动编号, 任务类型)
 Def_PDict_ActTaskAward = "ActTaskAward_%s_%s"  # 任务活动奖励记录,按位记录任务ID是否已领取,参数:(活动编号,key编号)
+Def_PDict_ActTaskRound = "ActTaskRound_%s"  # 任务轮次,参数:(活动编号)
 
 #购买次数礼包活动
 Def_PDict_BuyCountGiftID = "BuyCountGiftID_%s"  # 玩家身上的活动ID,唯一标识,取活动开始日期time,参数(活动编号)
@@ -6204,7 +6210,8 @@
 ActTaskType_CrossDemonLandBoss, # 击杀魔化之地boss 5
 ActTaskType_XianXiaMJLottery, # 仙匣秘境寻宝x次 6
 ActTaskType_XianXiaMJLayer, # 仙匣秘境达到x层 7
-) = range(1, 1 + 7)
+ActTaskType_TreasureGubao, # 古宝寻宝x次 8
+) = range(1, 1 + 8)
 
 # 套装枚举,普通套装,强化套装
 (EquipSuitType_Normal,
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index 0aceafa..897ab27 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -35624,6 +35624,273 @@
 
 
 #------------------------------------------------------
+# AA 81 古宝养成活动信息 #tagMCActGubaoInfo
+
+class  tagMCActGubaoItem(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("ItemID", c_int),    
+                  ("ItemCount", c_ushort),    
+                  ("IsBind", c_ubyte),    
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.ItemID = 0
+        self.ItemCount = 0
+        self.IsBind = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCActGubaoItem)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 81 古宝养成活动信息 //tagMCActGubaoInfo:
+                                ItemID:%d,
+                                ItemCount:%d,
+                                IsBind:%d
+                                '''\
+                                %(
+                                self.ItemID,
+                                self.ItemCount,
+                                self.IsBind
+                                )
+        return DumpString
+
+
+class  tagMCActGubaoBillard(Structure):
+    Rank = 0    #(DWORD Rank)// 名次,1-代表第一名;支持夸段,如1,3 代表第1名,第2~3名
+    Count = 0    #(BYTE Count)// 奖励物品数
+    AwardItemList = list()    #(vector<tagMCActGubaoItem> AwardItemList)// 奖励物品列表
+    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 = tagMCActGubaoItem()
+            _pos = temAwardItemList.ReadData(_lpData, _pos)
+            self.AwardItemList.append(temAwardItemList)
+        return _pos
+
+    def Clear(self):
+        self.Rank = 0
+        self.Count = 0
+        self.AwardItemList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 1
+        for i in range(self.Count):
+            length += self.AwardItemList[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())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Rank:%d,
+                                Count:%d,
+                                AwardItemList:%s
+                                '''\
+                                %(
+                                self.Rank,
+                                self.Count,
+                                "..."
+                                )
+        return DumpString
+
+
+class  tagMCActGubaoInfo(Structure):
+    Head = tagHead()
+    ActNum = 0    #(BYTE ActNum)// 活动编号
+    StartDate = ""    #(char StartDate[10])// 开始日期 y-m-d
+    EndtDate = ""    #(char EndtDate[10])// 结束日期 y-m-d
+    JoinStartTime = ""    #(char JoinStartTime[5])// 参与开始时间点 mm:ss
+    JoinEndTime = ""    #(char JoinEndTime[5])// 参与结束时间点 mm:ss
+    LimitLV = 0    #(WORD LimitLV)// 限制等级
+    PersonalBillCount = 0    #(BYTE PersonalBillCount)
+    PersonalBillboardInfoList = list()    #(vector<tagMCActGubaoBillard> PersonalBillboardInfoList)// 个人榜单奖励信息列表,如果没有代表本次活动没有该榜奖励
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x81
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.ActNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.StartDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
+        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.LimitLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.PersonalBillCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.PersonalBillCount):
+            temPersonalBillboardInfoList = tagMCActGubaoBillard()
+            _pos = temPersonalBillboardInfoList.ReadData(_lpData, _pos)
+            self.PersonalBillboardInfoList.append(temPersonalBillboardInfoList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x81
+        self.ActNum = 0
+        self.StartDate = ""
+        self.EndtDate = ""
+        self.JoinStartTime = ""
+        self.JoinEndTime = ""
+        self.LimitLV = 0
+        self.PersonalBillCount = 0
+        self.PersonalBillboardInfoList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        length += 10
+        length += 10
+        length += 5
+        length += 5
+        length += 2
+        length += 1
+        for i in range(self.PersonalBillCount):
+            length += self.PersonalBillboardInfoList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.ActNum)
+        data = CommFunc.WriteString(data, 10, self.StartDate)
+        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.LimitLV)
+        data = CommFunc.WriteBYTE(data, self.PersonalBillCount)
+        for i in range(self.PersonalBillCount):
+            data = CommFunc.WriteString(data, self.PersonalBillboardInfoList[i].GetLength(), self.PersonalBillboardInfoList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                ActNum:%d,
+                                StartDate:%s,
+                                EndtDate:%s,
+                                JoinStartTime:%s,
+                                JoinEndTime:%s,
+                                LimitLV:%d,
+                                PersonalBillCount:%d,
+                                PersonalBillboardInfoList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.ActNum,
+                                self.StartDate,
+                                self.EndtDate,
+                                self.JoinStartTime,
+                                self.JoinEndTime,
+                                self.LimitLV,
+                                self.PersonalBillCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCActGubaoInfo=tagMCActGubaoInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActGubaoInfo.Head.Cmd,m_NAtagMCActGubaoInfo.Head.SubCmd))] = m_NAtagMCActGubaoInfo
+
+
+#------------------------------------------------------
+# AA 82 古宝养成活动玩家信息 #tagMCActGubaoPlayerInfo
+
+class  tagMCActGubaoPlayerInfo(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("ActNum", c_ubyte),    # 活动编号
+                  ("Score", c_int),    # 当前积分
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xAA
+        self.SubCmd = 0x82
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.Cmd = 0xAA
+        self.SubCmd = 0x82
+        self.ActNum = 0
+        self.Score = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCActGubaoPlayerInfo)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 82 古宝养成活动玩家信息 //tagMCActGubaoPlayerInfo:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                ActNum:%d,
+                                Score:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.ActNum,
+                                self.Score
+                                )
+        return DumpString
+
+
+m_NAtagMCActGubaoPlayerInfo=tagMCActGubaoPlayerInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActGubaoPlayerInfo.Cmd,m_NAtagMCActGubaoPlayerInfo.SubCmd))] = m_NAtagMCActGubaoPlayerInfo
+
+
+#------------------------------------------------------
 # AA 54 骑宠盛宴活动信息 #tagMCActHorsePetFeastInfo
 
 class  tagMCActHorsePetFeastTime(Structure):
@@ -37911,6 +38178,7 @@
     LimitLV = 0    #(WORD LimitLV)// 限制等级
     TaskCount = 0    #(BYTE TaskCount)
     TaskList = list()    #(vector<tagMCActTask> TaskList)// 任务列表
+    RoundMax = 0    #(BYTE RoundMax)// 最大可循环轮次,当小于等于1时代表不循环
     data = None
 
     def __init__(self):
@@ -37933,6 +38201,7 @@
             temTaskList = tagMCActTask()
             _pos = temTaskList.ReadData(_lpData, _pos)
             self.TaskList.append(temTaskList)
+        self.RoundMax,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         return _pos
 
     def Clear(self):
@@ -37948,6 +38217,7 @@
         self.LimitLV = 0
         self.TaskCount = 0
         self.TaskList = list()
+        self.RoundMax = 0
         return
 
     def GetLength(self):
@@ -37962,6 +38232,7 @@
         length += 1
         for i in range(self.TaskCount):
             length += self.TaskList[i].GetLength()
+        length += 1
 
         return length
 
@@ -37977,6 +38248,7 @@
         data = CommFunc.WriteBYTE(data, self.TaskCount)
         for i in range(self.TaskCount):
             data = CommFunc.WriteString(data, self.TaskList[i].GetLength(), self.TaskList[i].GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.RoundMax)
         return data
 
     def OutputString(self):
@@ -37989,7 +38261,8 @@
                                 ResetType:%d,
                                 LimitLV:%d,
                                 TaskCount:%d,
-                                TaskList:%s
+                                TaskList:%s,
+                                RoundMax:%d
                                 '''\
                                 %(
                                 self.Head.OutputString(),
@@ -38000,7 +38273,8 @@
                                 self.ResetType,
                                 self.LimitLV,
                                 self.TaskCount,
-                                "..."
+                                "...",
+                                self.RoundMax
                                 )
         return DumpString
 
@@ -38017,6 +38291,7 @@
     ActNum = 0    #(BYTE ActNum)// 活动编号
     AwardCount = 0    #(BYTE AwardCount)
     AwardRecordList = list()    #(vector<DWORD> AwardRecordList)// 任务ID领奖记录值列表,根据任务ID位判断是否已领取,一个记录值存31位 [记录值0, 记录值1, ...]
+    RoundNum = 0    #(BYTE RoundNum)// 当前轮次,从1开始
     data = None
 
     def __init__(self):
@@ -38033,6 +38308,7 @@
         for i in range(self.AwardCount):
             value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
             self.AwardRecordList.append(value)
+        self.RoundNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         return _pos
 
     def Clear(self):
@@ -38043,6 +38319,7 @@
         self.ActNum = 0
         self.AwardCount = 0
         self.AwardRecordList = list()
+        self.RoundNum = 0
         return
 
     def GetLength(self):
@@ -38051,6 +38328,7 @@
         length += 1
         length += 1
         length += 4 * self.AwardCount
+        length += 1
 
         return length
 
@@ -38061,6 +38339,7 @@
         data = CommFunc.WriteBYTE(data, self.AwardCount)
         for i in range(self.AwardCount):
             data = CommFunc.WriteDWORD(data, self.AwardRecordList[i])
+        data = CommFunc.WriteBYTE(data, self.RoundNum)
         return data
 
     def OutputString(self):
@@ -38068,13 +38347,15 @@
                                 Head:%s,
                                 ActNum:%d,
                                 AwardCount:%d,
-                                AwardRecordList:%s
+                                AwardRecordList:%s,
+                                RoundNum:%d
                                 '''\
                                 %(
                                 self.Head.OutputString(),
                                 self.ActNum,
                                 self.AwardCount,
-                                "..."
+                                "...",
+                                self.RoundNum
                                 )
         return DumpString
 
@@ -40931,6 +41212,231 @@
 
 
 #------------------------------------------------------
+# AA 83 古宝养成跨服活动信息 #tagMCCrossActGubaoInfo
+
+class  tagMCCrossActGubaoItem(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("ItemID", c_int),    
+                  ("ItemCount", c_ushort),    
+                  ("IsBind", c_ubyte),    
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.ItemID = 0
+        self.ItemCount = 0
+        self.IsBind = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCCrossActGubaoItem)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 83 古宝养成跨服活动信息 //tagMCCrossActGubaoInfo:
+                                ItemID:%d,
+                                ItemCount:%d,
+                                IsBind:%d
+                                '''\
+                                %(
+                                self.ItemID,
+                                self.ItemCount,
+                                self.IsBind
+                                )
+        return DumpString
+
+
+class  tagMCCrossActGubaoBillard(Structure):
+    Rank = 0    #(DWORD Rank)// 名次,1-代表第一名;支持夸段,如1,3 代表第1名,第2~3名
+    Count = 0    #(BYTE Count)// 奖励物品数
+    AwardItemList = list()    #(vector<tagMCCrossActGubaoItem> AwardItemList)// 奖励物品列表
+    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 = tagMCCrossActGubaoItem()
+            _pos = temAwardItemList.ReadData(_lpData, _pos)
+            self.AwardItemList.append(temAwardItemList)
+        return _pos
+
+    def Clear(self):
+        self.Rank = 0
+        self.Count = 0
+        self.AwardItemList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 1
+        for i in range(self.Count):
+            length += self.AwardItemList[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())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Rank:%d,
+                                Count:%d,
+                                AwardItemList:%s
+                                '''\
+                                %(
+                                self.Rank,
+                                self.Count,
+                                "..."
+                                )
+        return DumpString
+
+
+class  tagMCCrossActGubaoInfo(Structure):
+    Head = tagHead()
+    ServerInfoLen = 0    #(BYTE ServerInfoLen)
+    ServerIDRangeInfo = ""    #(String ServerIDRangeInfo)//开放该活动的服务器ID范围列表,json格式 [[IDA, IDB], ...], [] 为全服
+    GroupValue1 = 0    #(BYTE GroupValue1)// 活动榜单分组值1,用于查询对应榜单
+    StartDate = ""    #(char StartDate[10])// 开始日期 y-m-d
+    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<tagMCCrossActGubaoBillard> PersonalBillboardInfoList)// 个人榜单奖励信息列表,如果没有代表本次活动没有该榜奖励
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x83
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.ServerInfoLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.ServerIDRangeInfo,_pos = CommFunc.ReadString(_lpData, _pos,self.ServerInfoLen)
+        self.GroupValue1,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.StartDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
+        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 = tagMCCrossActGubaoBillard()
+            _pos = temPersonalBillboardInfoList.ReadData(_lpData, _pos)
+            self.PersonalBillboardInfoList.append(temPersonalBillboardInfoList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x83
+        self.ServerInfoLen = 0
+        self.ServerIDRangeInfo = ""
+        self.GroupValue1 = 0
+        self.StartDate = ""
+        self.EndtDate = ""
+        self.JoinStartTime = ""
+        self.JoinEndTime = ""
+        self.RankLimitPersonal = 0
+        self.PersonalBillCount = 0
+        self.PersonalBillboardInfoList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        length += len(self.ServerIDRangeInfo)
+        length += 1
+        length += 10
+        length += 10
+        length += 5
+        length += 5
+        length += 2
+        length += 1
+        for i in range(self.PersonalBillCount):
+            length += self.PersonalBillboardInfoList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.ServerInfoLen)
+        data = CommFunc.WriteString(data, self.ServerInfoLen, self.ServerIDRangeInfo)
+        data = CommFunc.WriteBYTE(data, self.GroupValue1)
+        data = CommFunc.WriteString(data, 10, self.StartDate)
+        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())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                ServerInfoLen:%d,
+                                ServerIDRangeInfo:%s,
+                                GroupValue1:%d,
+                                StartDate:%s,
+                                EndtDate:%s,
+                                JoinStartTime:%s,
+                                JoinEndTime:%s,
+                                RankLimitPersonal:%d,
+                                PersonalBillCount:%d,
+                                PersonalBillboardInfoList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.ServerInfoLen,
+                                self.ServerIDRangeInfo,
+                                self.GroupValue1,
+                                self.StartDate,
+                                self.EndtDate,
+                                self.JoinStartTime,
+                                self.JoinEndTime,
+                                self.RankLimitPersonal,
+                                self.PersonalBillCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCCrossActGubaoInfo=tagMCCrossActGubaoInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCCrossActGubaoInfo.Head.Cmd,m_NAtagMCCrossActGubaoInfo.Head.SubCmd))] = m_NAtagMCCrossActGubaoInfo
+
+
+#------------------------------------------------------
 # AA 80 仙匣秘境跨服活动信息 #tagMCCrossActXianXiaMJInfo
 
 class  tagMCCrossActXianXiaMJItem(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index 7e76b2d..3eb511a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -1560,6 +1560,22 @@
                         ("list", "MemAwardItemList", 0),
                         ),
 
+                "ActGubao":(
+                        ("DWORD", "CfgID", 1),
+                        ("char", "StartDate", 0),
+                        ("char", "EndDate", 0),
+                        ("char", "JoinStartTime", 0),
+                        ("char", "JoinEndTime", 0),
+                        ("WORD", "LVLimit", 0),
+                        ("WORD", "PersonalTemplateID", 0),
+                        ),
+
+                "ActGubaoBillTemp":(
+                        ("DWORD", "TemplateID", 1),
+                        ("BYTE", "Rank", 0),
+                        ("list", "AwardItemList", 0),
+                        ),
+
                 "ActXianXiaMJ":(
                         ("DWORD", "CfgID", 1),
                         ("char", "StartDate", 0),
@@ -2023,6 +2039,7 @@
                         ("BYTE", "IsDayReset", 0),
                         ("BYTE", "ResetType", 0),
                         ("BYTE", "TemplateID", 0),
+                        ("BYTE", "RoundMax", 0),
                         ),
 
                 "ActTaskTemp":(
@@ -4674,6 +4691,32 @@
     def GetAwardItemList(self): return self.attrTuple[2] # 奖励物品列表[[物品ID,个数,是否拍品], ...] 仙盟榜时为盟主奖励,如果没有配置,则统一取成员奖励 list
     def GetMemAwardItemList(self): return self.attrTuple[3] # 仙盟榜成员奖励物品信息列表[[物品ID,个数,是否拍品], ...] list
 
+# 古宝养成活动时间表
+class IPY_ActGubao():
+    
+    def __init__(self):
+        self.attrTuple = None
+        return
+        
+    def GetCfgID(self): return self.attrTuple[0] # 配置ID DWORD
+    def GetStartDate(self): return self.attrTuple[1] # 开启日期 char
+    def GetEndDate(self): return self.attrTuple[2] # 结束日期 char
+    def GetJoinStartTime(self): return self.attrTuple[3] # 参与开始时间点 char
+    def GetJoinEndTime(self): return self.attrTuple[4] # 参与结束时间点 char
+    def GetLVLimit(self): return self.attrTuple[5] # 限制等级 WORD
+    def GetPersonalTemplateID(self): return self.attrTuple[6] # 个人排行模板编号 WORD
+
+# 古宝养成榜单模版表
+class IPY_ActGubaoBillTemp():
+    
+    def __init__(self):
+        self.attrTuple = None
+        return
+        
+    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
+
 # 仙匣秘境活动时间表
 class IPY_ActXianXiaMJ():
     
@@ -5402,7 +5445,8 @@
     def GetLVLimit(self): return self.attrTuple[3] # 限制等级 WORD
     def GetIsDayReset(self): return self.attrTuple[4] # 是否每天重置 BYTE
     def GetResetType(self): return self.attrTuple[5] # 重置类型,0-0点重置;1-5点重置 BYTE
-    def GetTemplateID(self): return self.attrTuple[6] # 登录奖励模板编号 BYTE
+    def GetTemplateID(self): return self.attrTuple[6] # 登录奖励模板编号 BYTE
+    def GetRoundMax(self): return self.attrTuple[7] # 任务最大轮次 BYTE
 
 # 任务活动模板表
 class IPY_ActTaskTemp():
@@ -6288,6 +6332,8 @@
         self.__LoadFileData("ActGarbageTask", onlyCheck)
         self.__LoadFileData("ActBossTrial", onlyCheck)
         self.__LoadFileData("ActBossTrialTemplate", onlyCheck)
+        self.__LoadFileData("ActGubao", onlyCheck)
+        self.__LoadFileData("ActGubaoBillTemp", onlyCheck)
         self.__LoadFileData("ActXianXiaMJ", onlyCheck)
         self.__LoadFileData("ActXianXiaMJBillTemp", onlyCheck)
         self.__LoadFileData("ActXianXiaMJAward", onlyCheck)
@@ -7572,6 +7618,20 @@
         self.CheckLoadData("ActBossTrialTemplate")
         return self.ipyActBossTrialTemplateCache[index]
 
+    def GetActGubaoCount(self):
+        self.CheckLoadData("ActGubao")
+        return self.ipyActGubaoLen
+    def GetActGubaoByIndex(self, index):
+        self.CheckLoadData("ActGubao")
+        return self.ipyActGubaoCache[index]
+
+    def GetActGubaoBillTempCount(self):
+        self.CheckLoadData("ActGubaoBillTemp")
+        return self.ipyActGubaoBillTempLen
+    def GetActGubaoBillTempByIndex(self, index):
+        self.CheckLoadData("ActGubaoBillTemp")
+        return self.ipyActGubaoBillTempCache[index]
+
     def GetActXianXiaMJCount(self):
         self.CheckLoadData("ActXianXiaMJ")
         return self.ipyActXianXiaMJLen
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
index de11f9c..d5fe7da 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -113,6 +113,7 @@
 import PlayerActRechargePrize
 import PlayerActGarbageSorting
 import PlayerActXianXiaMJ
+import PlayerActGubao
 import PlayerActGodGift
 import PlayerActFamilyCTGAssist
 import PlayerActRechargeRebateGold
@@ -888,6 +889,8 @@
     PlayerActGarbageSorting.OnPlayerLogin(curPlayer)
     # 仙匣秘境活动
     PlayerActXianXiaMJ.OnPlayerLogin(curPlayer)
+    # 古宝养成活动
+    PlayerActGubao.OnPlayerLogin(curPlayer)
     # 天帝礼包活动
     PlayerActGodGift.OnPlayerLogin(curPlayer)
     # 多日连充活动
@@ -1076,6 +1079,8 @@
     PlayerActBossTrial.OnMixFirstLogin(curPlayer)
     # 仙匣秘境
     PlayerActXianXiaMJ.OnMixFirstLogin(curPlayer)
+    # 古宝养成
+    PlayerActGubao.OnMixFirstLogin(curPlayer)
     # 重置玩家改名次数
     #UpdatePlayerName.ResetChangeNameCnt(curPlayer)
     return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActGubao.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActGubao.py
new file mode 100644
index 0000000..1628339
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActGubao.py
@@ -0,0 +1,303 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Player.PlayerActGubao
+#
+# @todo:古宝养成活动
+# @author hxp
+# @date 2024-08-12
+# @version 1.0
+#
+# 详细描述: 古宝养成活动
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2024-08-12 19:30"""
+#-------------------------------------------------------------------------------
+
+import PyGameData
+import ShareDefine
+import PlayerControl
+import IpyGameDataPY
+import CrossRealmPlayer
+import PlayerBillboard
+import ChPyNetSendPack
+import NetPackCommon
+import GameWorld
+import ChConfig
+
+def OnMixFirstLogin(curPlayer):
+    
+    for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_Gubao, {}).values():
+        actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)
+        if not actInfo.get(ShareDefine.ActKey_State):
+            continue
+        score = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActGubaoScore % actNum)
+        if not score:
+            continue
+        GameWorld.Log("古宝养成合服首登同步积分榜单: actNum=%s,score=%s" % (actNum, score), curPlayer.GetPlayerID())
+        PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_GubaoScore, score, autoSort=True)
+        break
+    
+    return
+
+def OnPlayerLogin(curPlayer):
+    
+    for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_Gubao, {}).values():
+        actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)
+        isReset = __CheckPlayerGubaoAction(curPlayer, actNum)
+        if not isReset:
+            # 活动中同步活动信息
+            if actInfo.get(ShareDefine.ActKey_State):
+                Sync_GubaoActionInfo(curPlayer, actNum)
+                Sync_GubaoPlayerInfo(curPlayer, actNum)
+                
+    if not __CheckPlayerCrossActGubao(curPlayer):
+        Sync_CrossActGubaoActionInfo(curPlayer)
+        
+    return
+
+def RefreshGubaoActionInfo(actNum):
+    ## 收到GameServer同步的活动信息,刷新活动信息
+    playerManager = GameWorld.GetPlayerManager()
+    for index in xrange(playerManager.GetPlayerCount()):
+        curPlayer = playerManager.GetPlayerByIndex(index)
+        if curPlayer.GetID() == 0:
+            continue
+        __CheckPlayerGubaoAction(curPlayer, actNum)
+    return
+
+def __CheckPlayerGubaoAction(curPlayer, actNum):
+    ## 检查玩家活动数据信息
+    
+    playerID = curPlayer.GetPlayerID()
+    actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_Gubao, actNum)
+    actID = actInfo.get(ShareDefine.ActKey_ID, 0)
+    state = actInfo.get(ShareDefine.ActKey_State, 0)
+    cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)
+    
+    playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActGubaoID % actNum) # 玩家身上的活动ID
+    
+    # 活动ID 相同的话不处理
+    if actID == playerActID:
+        GameWorld.DebugLog("古宝养成活动ID不变,不处理!actNum=%s,actID=%s" % (actNum, actID), playerID)
+        return
+    
+    GameWorld.DebugLog("古宝养成重置! actNum=%s,actID=%s,playerActID=%s,state=%s,cfgID=%s" 
+                       % (actNum, actID, playerActID, state, cfgID), playerID)
+    
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActGubaoID % actNum, actID)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActGubaoScore % actNum, 0)
+    
+    if state:
+        Sync_GubaoActionInfo(curPlayer, actNum)
+        Sync_GubaoPlayerInfo(curPlayer, actNum)
+    return True
+
+def RefreshCrossActGubaoInfo():
+    ## 收到GameServer同步的活动信息,刷新活动信息
+    playerManager = GameWorld.GetPlayerManager()
+    for index in xrange(playerManager.GetPlayerCount()):
+        curPlayer = playerManager.GetPlayerByIndex(index)
+        if curPlayer.GetID() == 0:
+            continue
+        __CheckPlayerCrossActGubao(curPlayer)
+        
+    return
+
+def __CheckPlayerCrossActGubao(curPlayer):
+    
+    playerID = curPlayer.GetPlayerID()
+    
+    actInfo = CrossRealmPlayer.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_Gubao)
+    cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)
+    actID = actInfo.get(ShareDefine.ActKey_ID, 0)
+    state = actInfo.get(ShareDefine.ActKey_State, 0)
+    dayIndex = actInfo.get(ShareDefine.ActKey_DayIndex, 0)
+    
+    playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CA_GubaoID) # 玩家身上的活动ID
+    
+    # 活动ID 相同的话不处理
+    if actID == playerActID:
+        GameWorld.DebugLog("跨服古宝养成活动ID不变,不处理!cfgID=%s,dayIndex=%s,actID=%s" % (cfgID, dayIndex, actID), playerID)   
+        return
+    GameWorld.DebugLog("跨服古宝养成活动重置! cfgID=%s,actID=%s,playerActID=%s,state=%s" % (cfgID, actID, playerActID, state), playerID)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CA_GubaoID, actID)
+    
+    if not state:
+        CrossRealmPlayer.NotifyCrossActEnd(curPlayer, ShareDefine.CrossActName_Gubao)
+        
+    Sync_CrossActGubaoActionInfo(curPlayer)
+    return True
+
+def OnGubaoCost(curPlayer, costPieceInfo, costItemList):
+    
+    playerID = curPlayer.GetPlayerID()
+    for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_Gubao, {}).values():
+        actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)
+        if not actInfo.get(ShareDefine.ActKey_State):
+            continue
+        
+        crossActInfo = CrossRealmPlayer.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_Gubao)
+        if crossActInfo.get(ShareDefine.ActKey_State, 0):
+            if crossActInfo.get(ShareDefine.ActKey_StateJoin) != ShareDefine.ActStateJoin_Start:
+                GameWorld.Log("跨服古宝养成非参与活动中: actNum=%s" % actNum, playerID)
+                continue
+        else:
+            if actInfo.get(ShareDefine.ActKey_StateJoin) != ShareDefine.ActStateJoin_Start:
+                GameWorld.Log("古宝养成非参与活动中: actNum=%s" % actNum, playerID)
+                continue
+            
+        addGubaoScore = 0
+        pieceQualityScoreDict = IpyGameDataPY.GetFuncEvalCfg("GubaoAct", 1, {})
+        for pieceID, pieceCount in costPieceInfo.items():
+            ipyData = IpyGameDataPY.GetIpyGameData("Gubao", pieceID)
+            if not ipyData:
+                continue
+            quality = ipyData.GetGubaoQuality()
+            if str(quality) not in pieceQualityScoreDict:
+                continue
+            qualityScore = pieceQualityScoreDict[str(quality)] * pieceCount
+            addGubaoScore += qualityScore
+            GameWorld.DebugLog("古宝活动碎片积分统计: actNum=%s,pieceID=%s,quality=%s,pieceCount=%s,qualityScore=%s, %s" 
+                               % (actNum, pieceID, quality, pieceCount, qualityScore, addGubaoScore))
+            
+        otherAddScore = IpyGameDataPY.GetFuncCfg("GubaoAct", 2)
+        for itemID, costCount in costItemList:
+            otherScore = costCount * otherAddScore
+            addGubaoScore += otherScore
+            GameWorld.DebugLog("古宝活动其他积分统计: actNum=%s,itemID=%s,costCount=%s,otherScore=%s, %s" 
+                               % (actNum, itemID, costCount, otherScore, addGubaoScore))
+            
+        if addGubaoScore <= 0:
+            continue
+        
+        AddPlayerScore(curPlayer, actNum, addGubaoScore)
+        
+    return
+
+def AddPlayerScore(curPlayer, actNum, addScore):
+    if addScore <= 0:
+        return 0
+    score = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActGubaoScore % actNum)
+    updScore = score + addScore
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActGubaoScore % actNum, updScore)
+    GameWorld.DebugLog("古宝活动增加积分: actNum=%s,addScore=%s,updScore=%s" % (actNum, addScore, updScore))
+    Sync_GubaoPlayerInfo(curPlayer, actNum)
+    PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_GubaoScore, updScore, autoSort=True)
+    SendToGameServer_Gubao(curPlayer, "AddGubaoScore", [addScore, updScore])
+    return updScore
+
+def SendToGameServer_Gubao(curPlayer, msgType, dataMsg=""):
+    playerID = curPlayer.GetPlayerID()
+    msgList = str([msgType, dataMsg])
+    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "ActGubao", msgList, len(msgList))
+    GameWorld.Log("古宝养成发送GameServer: %s, %s" % (msgType, dataMsg), playerID)
+    return
+
+def Sync_GubaoActionInfo(curPlayer, actNum):
+    ## 通知活动信息
+    
+    actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_Gubao, actNum)
+    if not actInfo.get(ShareDefine.ActKey_State):
+        return
+    
+    cfgID = actInfo.get(ShareDefine.ActKey_CfgID)
+    ipyData = IpyGameDataPY.GetIpyGameData("ActGubao", cfgID)
+    if not ipyData:
+        return
+    
+    personalTempID = ipyData.GetPersonalTemplateID()
+    personalTempIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActGubaoBillTemp", personalTempID) if personalTempID else []
+    
+    startDateStr, endDateStr = GameWorld.GetOperationActionDateStr(ipyData)
+    
+    clientPack = ChPyNetSendPack.tagMCActGubaoInfo()
+    clientPack.ActNum = actNum
+    clientPack.StartDate = startDateStr
+    clientPack.EndtDate = endDateStr
+    clientPack.JoinStartTime = ipyData.GetJoinStartTime()
+    clientPack.JoinEndTime = ipyData.GetJoinEndTime()
+    clientPack.LimitLV = ipyData.GetLVLimit()
+    
+    clientPack.PersonalBillboardInfoList = __GetTempRankBillPackList(personalTempIpyDataList)
+    clientPack.PersonalBillCount = len(clientPack.PersonalBillboardInfoList)
+    NetPackCommon.SendFakePack(curPlayer, clientPack)
+    return
+
+def Sync_GubaoPlayerInfo(curPlayer, actNum):
+    
+    actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_Gubao, actNum)
+    if not actInfo.get(ShareDefine.ActKey_State):
+        return
+    
+    clientPack = ChPyNetSendPack.tagMCActGubaoPlayerInfo()
+    clientPack.ActNum = actNum
+    clientPack.Score = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActGubaoScore % actNum)
+    NetPackCommon.SendFakePack(curPlayer, clientPack)
+    return
+
+def Sync_CrossActGubaoActionInfo(curPlayer):
+    ## 通知活动信息
+    actInfo = CrossRealmPlayer.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_Gubao)
+    if not actInfo:
+        return
+    
+    if not actInfo.get(ShareDefine.ActKey_State):
+        return
+    
+    ipyDataDict = actInfo.get(ShareDefine.ActKey_IpyDataInfo, {})
+    if not ipyDataDict:
+        return
+    
+    personalTempID = ipyDataDict.get("PersonalTemplateID", 0)
+    personalTempIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActGubaoBillTemp", personalTempID) if personalTempID else []
+    
+    clientPack = ChPyNetSendPack.tagMCCrossActGubaoInfo()
+    clientPack.ServerIDRangeInfo = str(actInfo.get(ShareDefine.ActKey_ServerIDRangeList, []))
+    clientPack.ServerInfoLen = len(clientPack.ServerIDRangeInfo)
+    clientPack.GroupValue1 = ipyDataDict.get("ZoneID", 0)
+    clientPack.StartDate = ipyDataDict.get("StartDate", "")
+    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)
+    
+    NetPackCommon.SendFakePack(curPlayer, clientPack)
+    return
+
+def __GetTempRankBillPackList(ipyDataList):
+    packBillList = []
+    if not ipyDataList:
+        return packBillList
+    for tempIpyData in ipyDataList:
+        rankInfo = ChPyNetSendPack.tagMCActGubaoBillard()
+        rankInfo.Rank = tempIpyData.GetRank()
+        
+        rankInfo.AwardItemList = []
+        awardItemList = tempIpyData.GetAwardItemList()
+        for itemID, itemCount, isAuctionItem in awardItemList:
+            item = ChPyNetSendPack.tagMCActGubaoItem()
+            item.Clear()
+            item.ItemID = itemID
+            item.ItemCount = itemCount
+            item.IsBind = isAuctionItem
+            rankInfo.AwardItemList.append(item)
+        rankInfo.Count = len(rankInfo.AwardItemList)
+        
+#        rankInfo.MemAwardItemList = []
+#        memAwardItemList = tempIpyData.GetMemAwardItemList()
+#        for itemID, itemCount, isAuctionItem in memAwardItemList:
+#            item = ChPyNetSendPack.tagMCActGubaoItem()
+#            item.Clear()
+#            item.ItemID = itemID
+#            item.ItemCount = itemCount
+#            item.IsBind = isAuctionItem
+#            rankInfo.MemAwardItemList.append(item)
+#        rankInfo.MemCount = len(rankInfo.MemAwardItemList)
+        
+        packBillList.append(rankInfo)
+    return packBillList
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActTask.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActTask.py
index 27088cf..62a8904 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActTask.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActTask.py
@@ -72,6 +72,7 @@
         __ResetTaskValueByTemplateID(curPlayer, actNum, lastTempID)
         
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActTaskID % actNum, actID)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActTaskRound % actNum, 0)
     
     if state:
         ipyData = IpyGameDataPY.GetIpyGameData("ActTask", cfgID)
@@ -98,6 +99,7 @@
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActTaskAward % (actNum, keyNum), 0)
         
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActTaskTempID % actNum, templateID)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActTaskRound % actNum, 1)
     return
 
 def __GetTaskAwardRecordKeyNumMax(templateID, defKeyNum=2):
@@ -161,6 +163,7 @@
         ipyData = IpyGameDataPY.GetIpyGameData("ActTask", cfgID)
         if not ipyData:
             continue
+        roundMax = ipyData.GetRoundMax()
         templateID = ipyData.GetTemplateID()
         
         taskIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActTaskTemp", templateID)
@@ -176,6 +179,8 @@
                 needValueMax = needValue
                 
         curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActTaskValue % (actNum, taskType))
+        if roundMax > 1:
+            needValueMax *= roundMax
         if curValue >= needValueMax:
             continue
         
@@ -205,6 +210,7 @@
     ipyData = IpyGameDataPY.GetIpyGameData("ActTask", cfgID)
     if not ipyData:
         return
+    roundMax = ipyData.GetRoundMax()
     templateID = ipyData.GetTemplateID()
     
     taskIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActTaskTemp", templateID)
@@ -240,13 +246,48 @@
     
     GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_ActTaskAward, awardIndex, 1, True, [actNum])
     
-    Sync_ActTaskPlayerInfo(curPlayer, actNum)
-    
-    GameWorld.DebugLog("领取任务活动奖励! actNum=%s,cfgID=%s,taskID=%s,awardItemList=%s" % (actNum, cfgID, taskID, awardItemList))
+    roundNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActTaskRound % actNum)
+    GameWorld.DebugLog("领取任务活动奖励! actNum=%s,cfgID=%s,roundNum=%s,taskID=%s,awardItemList=%s" % (actNum, cfgID, roundNum, taskID, awardItemList))
     
     for itemID, itemCount, isAuctionItem in awardItemList:
         ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, [IPY_GameWorld.rptItem], event=["ActTask", False, {}])
         
+    # 检查进入下一轮
+    if roundMax > 1 and roundNum < roundMax:
+        roundFinish = True
+        taskMaxValueInfo = {}
+        for taskIpyData in taskIpyDataList:
+            rTaskID = taskIpyData.GetTaskID()
+            rTaskType = taskIpyData.GetTaskType()
+            rNeedValue = taskIpyData.GetNeedValue()
+            if rNeedValue > taskMaxValueInfo.get(rTaskType, 0):
+                taskMaxValueInfo[rTaskType] = rNeedValue
+            rAwardIndex = rTaskID
+            if not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_ActTaskAward, rAwardIndex, True, [actNum]):
+                roundFinish = False
+                GameWorld.DebugLog("还有任务未领取,不进入下一轮次! actNum=%s,cfgID=%s,roundNum=%s,rTaskID=%s" % (actNum, cfgID, roundNum, rTaskID))
+                break
+            
+        if roundFinish:
+            nextRound = roundNum + 1
+            GameWorld.DebugLog("本轮任务领取完毕,进入下一轮! nextRound=%s" % (nextRound))
+            for rTaskType, rMaxValue in taskMaxValueInfo.items():
+                curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActTaskValue % (actNum, taskType))
+                updValue = max(0, curValue - rMaxValue)
+                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActTaskValue % (actNum, taskType), updValue)
+                GameWorld.DebugLog("    更新新一轮任务值! rTaskType=%s,rMaxValue=%s,curValue=%s,updValue=%s" 
+                                   % (rTaskType, rMaxValue, curValue, updValue))
+            Sync_ActTaskPlayerValueInfo(curPlayer, actNum, taskMaxValueInfo.keys())
+            
+            # 任务领奖记录
+            taskAwardKeyNum = __GetTaskAwardRecordKeyNumMax(templateID, 10)
+            for keyNum in range(taskAwardKeyNum + 1):
+                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActTaskAward % (actNum, keyNum), 0)
+            GameWorld.DebugLog("    重置新一轮领奖记录! taskAwardKeyNum=%s" % (taskAwardKeyNum))
+            
+            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActTaskRound % actNum, nextRound)
+            
+    Sync_ActTaskPlayerInfo(curPlayer, actNum)
     return
 
 def Sync_ActTaskPlayerInfo(curPlayer, actNum):
@@ -256,6 +297,7 @@
     
     clientPack = ChPyNetSendPack.tagMCActTaskPlayerInfo()
     clientPack.ActNum = actNum
+    clientPack.RoundNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActTaskRound % actNum)
     clientPack.AwardRecordList = []
     for keyNum in range(keyNumMax + 1):
         clientPack.AwardRecordList.append(curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActTaskAward % (actNum, keyNum)))
@@ -305,6 +347,7 @@
     actPack.IsDayReset = ipyData.GetIsDayReset()
     actPack.ResetType = ipyData.GetResetType()
     actPack.LimitLV = ipyData.GetLVLimit()
+    actPack.RoundMax = ipyData.GetRoundMax()
     
     actPack.TaskList = []
     for taskIpyData in taskIpyDataList:
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
index 017d7a7..7555dab 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -82,6 +82,7 @@
 import PlayerActTotalRecharge
 import PlayerActGarbageSorting
 import PlayerActXianXiaMJ
+import PlayerActGubao
 import PlayerActGodGift
 import PlayerActFamilyCTGAssist
 import PlayerActRechargeRebateGold
@@ -1420,6 +1421,9 @@
             elif actionName == ShareDefine.OperationActionName_XianXiaMJ:
                 PlayerActXianXiaMJ.RefreshXianXiaMJActionInfo(actNum)
                 
+            elif actionName == ShareDefine.OperationActionName_Gubao:
+                PlayerActGubao.RefreshGubaoActionInfo(actNum)
+                
             elif actionName == ShareDefine.OperationActionName_GodGift:
                 PlayerActGodGift.RefreshGodGiftActionInfo(actNum)
                 
@@ -1539,6 +1543,9 @@
             elif actionName == ShareDefine.CrossActName_XianXiaMJ:
                 PlayerActXianXiaMJ.RefreshCrossActXianXiaMJInfo()
                 
+            elif actionName == ShareDefine.CrossActName_Gubao:
+                PlayerActGubao.RefreshCrossActGubaoInfo()
+                
             return
         
         if key == ShareDefine.Def_Notify_WorldKey_CrossZoneName:
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGubao.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGubao.py
index 6329808..0ecab99 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGubao.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGubao.py
@@ -31,6 +31,7 @@
 import ItemControler
 import PlayerDienstgrad
 import PlayerGatherTheSoul
+import PlayerActGubao
 import PlayerCoat
 
 GubaoEffType_FamilyWar = 48 # 参与仙盟联赛每X次+XXX属性    x次
@@ -158,6 +159,8 @@
     
     RefreshGubaoAttr(curPlayer)
     Sync_GubaoInfo(curPlayer, [gubaoID])
+    
+    PlayerActGubao.OnGubaoCost(curPlayer, needPieceInfo, realNeedItemList)
     return
 
 #// B2 17 古宝升星 #tagCMGubaoStarUp
@@ -252,6 +255,8 @@
     GameWorld.Log("古宝升星: gubaoID=%s,updStar=%s" % (gubaoID, updStar), playerID)
     RefreshGubaoAttr(curPlayer)
     Sync_GubaoInfo(curPlayer, [gubaoID])
+    
+    PlayerActGubao.OnGubaoCost(curPlayer, needPieceInfo, realNeedItemList)
     return
 
 #// B2 18 古宝升级 #tagCMGubaoLVUp
@@ -313,6 +318,8 @@
     GameWorld.Log("古宝升级: gubaoID=%s,gubaoType=%s,quality=%s,updLV=%s" % (gubaoID, gubaoType, quality, updLV), playerID)
     RefreshGubaoAttr(curPlayer)
     Sync_GubaoInfo(curPlayer, [gubaoID])
+    
+    PlayerActGubao.OnGubaoCost(curPlayer, needPieceInfo, realNeedItemList)
     return
 
 def GetGubaoTotalLVStar(curPlayer):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py
index 06b10f3..079d084 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py
@@ -30,6 +30,7 @@
 import PlayerFeastTravel
 import PlayerFairyCeremony
 import PlayerNewFairyCeremony
+import PlayerActTask
 import ItemCommon
 import ChConfig
 
@@ -41,7 +42,8 @@
 TreasureType_Rune, # 符印寻宝 2
 TreasureType_Jueshi, # 绝世君宝 3
 TreasureType_GatherTheSoul, # 聚魂猎魔 4
-) = range(1, 1 + 4)
+TreasureType_Gubao, # 古宝寻宝 5
+) = range(1, 1 + 5)
 
 def DoTreasureOpen(curPlayer):
     ## 寻宝开启
@@ -393,7 +395,9 @@
         PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_JSTreasure, treasureCount)
     elif treasureType == TreasureType_GatherTheSoul:
         pass
-    
+    elif treasureType == TreasureType_Gubao:
+        PlayerActTask.AddActTaskValue(curPlayer, ChConfig.ActTaskType_TreasureGubao, treasureCount)
+        
     # 给物品
     mailItemList = []
     itemControl = ItemControler.PlayerItemControler(curPlayer)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index c5b9ab0..531117f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -294,6 +294,7 @@
 OperationActionName_ActTask = "ActTask" # 活动任务
 OperationActionName_BuyCountGift = "ActBuyCountGift" # 购买次数礼包活动
 OperationActionName_FamilyCTGAssist = "ActFamilyCTGAssist" # 仙盟充值协助
+OperationActionName_Gubao = "ActGubao" # 古宝养成活动
 #节日活动类型列表 - 该类型无视开服天,日期到了就开启
 FeastOperationActionNameList = [OperationActionName_FeastWeekParty, OperationActionName_FeastRedPacket,
                                 OperationActionName_RechargeRebateGold, OperationActionName_GrowupBuy,
@@ -316,6 +317,7 @@
                            OperationActionName_BuyOne, OperationActionName_BossTrial,
                            OperationActionName_ActLoginNew, OperationActionName_ActTask,
                            OperationActionName_BuyCountGift, OperationActionName_FamilyCTGAssist,
+                           OperationActionName_Gubao,
                            ] + FeastOperationActionNameList
 #需要记录开启活动时的世界等级的运营活动
 NeedWorldLVOperationActNameList = [OperationActionName_FairyCeremony, OperationActionName_WishingWell, 
@@ -342,6 +344,7 @@
                                    OperationActionName_BuyOne, OperationActionName_BossTrial,
                                    OperationActionName_ActLoginNew, OperationActionName_ActTask,
                                    OperationActionName_BuyCountGift, OperationActionName_FamilyCTGAssist,
+                                   OperationActionName_Gubao,
                                    ]
 
 #跨服运营活动表名定义
@@ -350,9 +353,10 @@
 CrossActName_LuckyCloudBuy = "CrossActLuckyCloudBuy" # 幸运云购
 CrossActName_BossTrial = "CrossActBossTrial" # Boss历练 - 跨服
 CrossActName_XianXiaMJ = "CrossActXianXiaMJ" # 仙匣秘境 - 跨服
+CrossActName_Gubao = "CrossActGubao" # 古宝养成 - 跨服
 
 #跨服运营活动列表
-CrossActNameList = [CrossActName_CTGBillboard, CrossActName_AllRecharge, CrossActName_LuckyCloudBuy, CrossActName_BossTrial, CrossActName_XianXiaMJ]
+CrossActNameList = [CrossActName_CTGBillboard, CrossActName_AllRecharge, CrossActName_LuckyCloudBuy, CrossActName_BossTrial, CrossActName_XianXiaMJ, CrossActName_Gubao]
 #需要锁定活动分区分配直到活动结束的跨服运营活动,即使热更分区配置,也不会改变正在活动中的分区设定,直到活动结束
 CrossActLockServerGroupIDList = [CrossActName_CTGBillboard, CrossActName_AllRecharge]
 
@@ -838,9 +842,10 @@
     Def_BT_BossTrialSubmitFamily,             #提交boss凭证仙盟榜 (boss历练活动)
     Def_BT_BossTrialSubmitFamilyBak,          #提交boss凭证仙盟榜 (boss历练活动 - 上一期)
     Def_BT_XianXiaMJScore,                    #仙匣秘境积分榜 (仙匣秘境活动)
+    Def_BT_GubaoScore,                        #古宝养成积分榜 (古宝养成活动)
     
     Def_BT_Max, #排行榜最大类型
-) = range(0, 38 + 2) 
+) = range(0, 39 + 2) 
 
 ''' 跨服排行榜类型, 从 150 开始
 与本服榜单存储的是不一样的数据库表格,理论上类型可以和本服榜单类型重复,为了做下区分防误导,跨服榜单从 150 开始
@@ -861,7 +866,8 @@
 Def_CBT_BossTrialSubmitFamily, # boss凭证 - 仙盟榜  160
 Def_CBT_BossTrialSubmitFamilyBak, # boss凭证 - 仙盟榜 上一期  161
 Def_CBT_XianXiaMJScore, # 仙匣秘境积分 - 个人榜  162
-) = range(150, 162 + 1)
+Def_CBT_GubaoScore, # 古宝养成积分 - 个人榜  163
+) = range(150, 163 + 1)
 
 # 跨服榜单最大数据名次,没有设置的默认100
 CrossBillboard_MaxDataCount = {
@@ -872,6 +878,7 @@
                                Def_CBT_BossTrialSubmit:1000,
                                Def_CBT_BossTrialSubmitBak:1000,
                                Def_CBT_XianXiaMJScore:1000,
+                               Def_CBT_GubaoScore:1000,
                                }
 
 #职业对应战力排行榜类型
@@ -1641,6 +1648,7 @@
 ClientServerMsg_ChangeFuncTeam = "ChangeFuncTeam"   # 修改功能队伍
 ClientServerMsg_FuncTeamMemOP = "FuncTeamMemOP"   # 功能队伍成员操作
 ClientServerMsg_QueryFuncTeam = "QueryFuncTeam"   # 查询功能队伍
+ClientServerMsg_GubaoScore = "GubaoScore" # 古宝养成积分
 
 #跨服广播类型定义
 CrossNotify_CrossAct = "CrossAct"

--
Gitblit v1.8.0