From 4c115be5ce3f4be8766b2e10d1982807b787f132 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 18 七月 2024 17:46:34 +0800
Subject: [PATCH] 10223 【越南】【砍树】【主干】【港台】秘境寻宝(仙匣秘境层支持配置物品数、支持消耗道具寻宝;增加本服榜;增加跨服活动榜;任务活动支持仙匣秘境寻宝x次、x层任务类型;充值购买次数礼包活动支持配置额外的活动商城类型,支持配置每日重置的购买次数奖励;)

---
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py             |    7 
 ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py                                     |   82 ++
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActXianXiaMJ.py                         |  295 +++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActBuyCountGift.py |   27 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py                  |   11 
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py                                |    9 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py              |  583 ++++++++++++++-
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py                                   |  583 ++++++++++++++-
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py                            |    4 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActTask.py         |   37 +
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py                      |    4 
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActBossTrial.py                         |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py                |   61 +
 ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py                                          |    1 
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossActionControl.py                 |    9 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py              |    2 
 PySysDB/PySysDBPY.h                                                                                 |   23 
 ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py                                       |   11 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py    |    4 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActXianXiaMJ.py    |  376 +++++++--
 PySysDB/PySysDBG.h                                                                                  |   34 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                     |    9 
 22 files changed, 1,937 insertions(+), 237 deletions(-)

diff --git a/PySysDB/PySysDBG.h b/PySysDB/PySysDBG.h
index 75a33f3..cc8d22e 100644
--- a/PySysDB/PySysDBG.h
+++ b/PySysDB/PySysDBG.h
@@ -618,10 +618,36 @@
 	BYTE		ActNum;	//活动分组编号, 活动类型 * 10 + 不同界面编号
 	char		StartDate;	//开启日期
 	char		EndDate;	//结束日期
-	dict		NotifyInfoStart;	//全服提示信息 - 相对开始时间
-	dict		NotifyInfoEnd;	//全服提示信息 - 相对结束时间
-	list		NotifyInfoLoop;	//全服提示信息 - 循环广播[间隔分钟, 广播key]
-	BYTE		ResetType;	//重置类型,0-0点重置;1-5点重置
+	char		JoinStartTime;	//参与开始时间点
+	char		JoinEndTime;	//参与结束时间点
+	BYTE		IsDayReset;	//是否每天重置
+	WORD		PersonalTemplateID;	//个人排行模板编号
+};
+
+//仙匣秘境活动跨服表
+
+struct tagCrossActXianXiaMJ
+{
+	DWORD		_CfgID;	//配置ID
+	char		ActGroupName;	//活动组名(同组活动的名字需相同)
+	BYTE		ZoneID;		//组内分组编号
+	list		ServerIDRangeList;	//活动的账号服务器ID范围列表 [[serverIDA, serverIDB], ...]
+	char		StartDate;	//开启日期
+	char		EndDate;	//结束日期
+	char		JoinStartTime;	//参与开始时间点
+	char		JoinEndTime;	//参与结束时间点
+	BYTE		IsDayReset;	//是否每天重置
+	WORD		RankLimitPersonal;	//个人上榜积分限制
+	WORD		PersonalTemplateID;	//个人排行模板编号
+};
+
+//仙匣秘境榜单模版表
+
+struct tagActXianXiaMJBillTemp
+{
+	DWORD		_TemplateID;	//模板编号
+	BYTE		Rank;	//名次
+	list		AwardItemList;	//奖励物品列表[[物品ID,个数,是否拍品], ...]
 };
 
 //天帝礼包活动时间表
diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index e7f5b18..7299ac6 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -1906,10 +1906,25 @@
 	DWORD		_CfgID;	//配置ID
 	char		StartDate;	//开启日期
 	char		EndDate;	//结束日期
-	BYTE		ResetType;	//重置类型,0-0点重置;1-5点重置
+	char		JoinStartTime;	//参与开始时间点
+	char		JoinEndTime;	//参与结束时间点
+	BYTE		IsDayReset;	//是否每天重置
 	WORD		LVLimit;	//限制等级
+	DWORD		UseItemID;	//消耗物品ID
 	list		UseMoneyInfo;	//消耗货币信息
 	BYTE		TemplateID;	//模板ID
+	WORD		PersonalTemplateID;	//个人排行模板编号
+	WORD		LotteryAddScore;	//每次抽奖加积分
+	WORD		LayerAddScore;	//每次跨层加积分
+};
+
+//仙匣秘境榜单模版表
+
+struct tagActXianXiaMJBillTemp
+{
+	DWORD		_TemplateID;	//模板编号
+	BYTE		Rank;	//名次
+	list		AwardItemList;	//奖励物品列表[[物品ID,个数,是否拍品], ...]
 };
 
 //仙匣秘境奖池表
@@ -1918,8 +1933,8 @@
 {
 	DWORD		_TemplateID;	//奖池模板编号
 	BYTE		AwardLibType;	//奖励库类型
-	BYTE		AwardItemCount;	//选择个数
-	BYTE		UnlockAwardLimitTimes;	//抽X次后可产出(本层)
+	list		AwardItemCountList;	//层选择个数列表  层1物品数|层2|…
+	list		UnlockAwardLimitTimesList;	//层抽X次后可产出(本层) 层1限制|层2|…
 	BYTE		AwardLibWeight;	//产出该库外权重
 	dict		LibItemInfo;	//本库物品随机库内权重(先随机库外权重,若产出再随机库内权重)
 	dict		ItemLayerLimitInfo;	//物品产出奖池层限制 {物品ID:大于等于X层可产出, ...}
@@ -2504,6 +2519,8 @@
 	BYTE		ResetType;	//重置类型,0-0点重置;1-5点重置
 	list		CTGIDList;	//充值ID列表 [ctgID, ...]
 	dict		CTGCountAwardInfo;	//累计充值次数额外奖励
+	list		CTGCountDayResetList;	//每日重置累充次数列表
+	DWORD		ActShopType;	//商城类型
 };
 
 //任务活动时间表
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py b/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
index b5baf5d..c25488b 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
@@ -614,6 +614,7 @@
             ShareDefine.Def_BT_BossTrialSubmitBak       : 200,           #boss凭证 (boss历练活动 - 上一期)
             ShareDefine.Def_BT_BossTrialSubmitFamily    : 100,           #boss凭证仙盟 (boss历练活动)
             ShareDefine.Def_BT_BossTrialSubmitFamilyBak : 100,           #boss凭证仙盟 (boss历练活动 - 上一期)
+            ShareDefine.Def_BT_XianXiaMJScore           : 200,           #仙匣秘境积分榜 (仙匣秘境活动)
             }
 
 #排行榜保存类型(和BillboardType匹配), 默认保存, 如果不保存,可配置进去
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index b0e0ae9..5d17e1a 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -32670,6 +32670,7 @@
     CTGIDList = list()    #(vector<WORD> CTGIDList)// CTGID列表;总购买次数前端自己统计,直接取CTGID对应的累计购买次数累加
     GiftCount = 0    #(BYTE GiftCount)
     BuyCountGiftList = list()    #(vector<tagMCActBuyCountGift> BuyCountGiftList)// 购买次数礼包列表
+    ShopType = 0    #(WORD ShopType)// 开放商店类型,可能为0不开放
     data = None
 
     def __init__(self):
@@ -32696,6 +32697,7 @@
             temBuyCountGiftList = tagMCActBuyCountGift()
             _pos = temBuyCountGiftList.ReadData(_lpData, _pos)
             self.BuyCountGiftList.append(temBuyCountGiftList)
+        self.ShopType,_pos = CommFunc.ReadWORD(_lpData, _pos)
         return _pos
 
     def Clear(self):
@@ -32713,6 +32715,7 @@
         self.CTGIDList = list()
         self.GiftCount = 0
         self.BuyCountGiftList = list()
+        self.ShopType = 0
         return
 
     def GetLength(self):
@@ -32729,6 +32732,7 @@
         length += 1
         for i in range(self.GiftCount):
             length += self.BuyCountGiftList[i].GetLength()
+        length += 2
 
         return length
 
@@ -32747,6 +32751,7 @@
         data = CommFunc.WriteBYTE(data, self.GiftCount)
         for i in range(self.GiftCount):
             data = CommFunc.WriteString(data, self.BuyCountGiftList[i].GetLength(), self.BuyCountGiftList[i].GetBuffer())
+        data = CommFunc.WriteWORD(data, self.ShopType)
         return data
 
     def OutputString(self):
@@ -32761,7 +32766,8 @@
                                 CTGIDCount:%d,
                                 CTGIDList:%s,
                                 GiftCount:%d,
-                                BuyCountGiftList:%s
+                                BuyCountGiftList:%s,
+                                ShopType:%d
                                 '''\
                                 %(
                                 self.Head.OutputString(),
@@ -32774,7 +32780,8 @@
                                 self.CTGIDCount,
                                 "...",
                                 self.GiftCount,
-                                "..."
+                                "...",
+                                self.ShopType
                                 )
         return DumpString
 
@@ -38352,6 +38359,7 @@
                   ("ItemCount", c_ushort),    
                   ("PosNum", c_ubyte),    # 被抽中时的位置编号,1~99,前端自定义展示位置编号,0代表未被抽中;
                   ("TotalTimesNow", c_ubyte),    #当前已产出次数,不限制次数时不记录,即同样为0
+                  ("LotteryScore", c_int),    #当前抽奖积分
                   ]
 
     def __init__(self):
@@ -38374,6 +38382,7 @@
         self.ItemCount = 0
         self.PosNum = 0
         self.TotalTimesNow = 0
+        self.LotteryScore = 0
         return
 
     def GetLength(self):
@@ -38391,7 +38400,8 @@
                                 ItemID:%d,
                                 ItemCount:%d,
                                 PosNum:%d,
-                                TotalTimesNow:%d
+                                TotalTimesNow:%d,
+                                LotteryScore:%d
                                 '''\
                                 %(
                                 self.Cmd,
@@ -38401,7 +38411,8 @@
                                 self.ItemID,
                                 self.ItemCount,
                                 self.PosNum,
-                                self.TotalTimesNow
+                                self.TotalTimesNow,
+                                self.LotteryScore
                                 )
         return DumpString
 
@@ -38413,7 +38424,260 @@
 #------------------------------------------------------
 # AA 58 仙匣秘境活动信息 #tagMCActXianXiaMJInfo
 
-class  tagMCActXianXiaMJAwardItem(Structure):
+class  tagMCActXianXiaMJItem(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(tagMCActXianXiaMJItem)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 58 仙匣秘境活动信息 //tagMCActXianXiaMJInfo:
+                                ItemID:%d,
+                                ItemCount:%d,
+                                IsBind:%d
+                                '''\
+                                %(
+                                self.ItemID,
+                                self.ItemCount,
+                                self.IsBind
+                                )
+        return DumpString
+
+
+class  tagMCActXianXiaMJBillard(Structure):
+    Rank = 0    #(DWORD Rank)// 名次,1-代表第一名;支持夸段,如1,3 代表第1名,第2~3名
+    Count = 0    #(BYTE Count)// 奖励物品数
+    AwardItemList = list()    #(vector<tagMCActXianXiaMJItem> 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 = tagMCActXianXiaMJItem()
+            _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  tagMCActXianXiaMJInfo(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
+    IsDayReset = 0    #(BYTE IsDayReset)// 是否每天重置
+    LimitLV = 0    #(WORD LimitLV)// 限制等级
+    UseItemID = 0    #(DWORD UseItemID)//消耗物品ID,默认1个;消耗物品或货币二选一即可,或都配则先消耗道具,不足则消耗货币
+    MoneyType = 0    #(BYTE MoneyType)//消耗货币类型
+    MoneyValue = 0    #(WORD MoneyValue)//消耗货币值
+    LotteryAddScore = 0    #(WORD LotteryAddScore)//每次抽奖加积分
+    LayerAddScore = 0    #(WORD LayerAddScore)//每次跨层加积分
+    PersonalBillCount = 0    #(BYTE PersonalBillCount)
+    PersonalBillboardInfoList = list()    #(vector<tagMCActXianXiaMJBillard> PersonalBillboardInfoList)// 个人榜单奖励信息列表,如果没有代表本次活动没有该榜奖励
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x58
+        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.IsDayReset,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.LimitLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.UseItemID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.MoneyType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.MoneyValue,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.LotteryAddScore,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.LayerAddScore,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.PersonalBillCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.PersonalBillCount):
+            temPersonalBillboardInfoList = tagMCActXianXiaMJBillard()
+            _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 = 0x58
+        self.ActNum = 0
+        self.StartDate = ""
+        self.EndtDate = ""
+        self.JoinStartTime = ""
+        self.JoinEndTime = ""
+        self.IsDayReset = 0
+        self.LimitLV = 0
+        self.UseItemID = 0
+        self.MoneyType = 0
+        self.MoneyValue = 0
+        self.LotteryAddScore = 0
+        self.LayerAddScore = 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 += 1
+        length += 2
+        length += 4
+        length += 1
+        length += 2
+        length += 2
+        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.WriteBYTE(data, self.IsDayReset)
+        data = CommFunc.WriteWORD(data, self.LimitLV)
+        data = CommFunc.WriteDWORD(data, self.UseItemID)
+        data = CommFunc.WriteBYTE(data, self.MoneyType)
+        data = CommFunc.WriteWORD(data, self.MoneyValue)
+        data = CommFunc.WriteWORD(data, self.LotteryAddScore)
+        data = CommFunc.WriteWORD(data, self.LayerAddScore)
+        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,
+                                IsDayReset:%d,
+                                LimitLV:%d,
+                                UseItemID:%d,
+                                MoneyType:%d,
+                                MoneyValue:%d,
+                                LotteryAddScore:%d,
+                                LayerAddScore:%d,
+                                PersonalBillCount:%d,
+                                PersonalBillboardInfoList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.ActNum,
+                                self.StartDate,
+                                self.EndtDate,
+                                self.JoinStartTime,
+                                self.JoinEndTime,
+                                self.IsDayReset,
+                                self.LimitLV,
+                                self.UseItemID,
+                                self.MoneyType,
+                                self.MoneyValue,
+                                self.LotteryAddScore,
+                                self.LayerAddScore,
+                                self.PersonalBillCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCActXianXiaMJInfo=tagMCActXianXiaMJInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActXianXiaMJInfo.Head.Cmd,m_NAtagMCActXianXiaMJInfo.Head.SubCmd))] = m_NAtagMCActXianXiaMJInfo
+
+
+#------------------------------------------------------
+# AA 79 仙匣秘境层信息 #tagMCActXianXiaMJLayerInfo
+
+class  tagMCActXianXiaMJLayerItem(Structure):
     _pack_ = 1
     _fields_ = [
                   ("ItemLibType", c_ubyte),    #物品库类型;9-固定为大奖库,非9-策划自定义库
@@ -38445,13 +38709,13 @@
         return
 
     def GetLength(self):
-        return sizeof(tagMCActXianXiaMJAwardItem)
+        return sizeof(tagMCActXianXiaMJLayerItem)
 
     def GetBuffer(self):
         return string_at(addressof(self), self.GetLength())
 
     def OutputString(self):
-        DumpString = '''// AA 58 仙匣秘境活动信息 //tagMCActXianXiaMJInfo:
+        DumpString = '''// AA 79 仙匣秘境层信息 //tagMCActXianXiaMJLayerInfo:
                                 ItemLibType:%d,
                                 ItemID:%d,
                                 ItemCount:%d,
@@ -38472,48 +38736,38 @@
         return DumpString
 
 
-class  tagMCActXianXiaMJInfo(Structure):
+class  tagMCActXianXiaMJLayerInfo(Structure):
     Head = tagHead()
     ActNum = 0    #(BYTE ActNum)// 活动编号
-    StartDate = ""    #(char StartDate[10])// 开始日期 y-m-d
-    EndtDate = ""    #(char EndtDate[10])// 结束日期 y-m-d
-    LimitLV = 0    #(WORD LimitLV)// 限制等级
-    ResetType = 0    #(BYTE ResetType)// 重置类型,0-0点重置;1-5点开,5点重置;2-5点开,0点重置
-    MoneyType = 0    #(BYTE MoneyType)//消耗货币类型
-    MoneyValue = 0    #(WORD MoneyValue)//消耗货币值
-    LayerNum = 0    #(BYTE LayerNum)//当前奖池第几层
+    LayerNum = 0    #(WORD LayerNum)//当前奖池第几层
+    LotteryScore = 0    #(DWORD LotteryScore)//当前抽奖积分
     AwardItemCount = 0    #(BYTE AwardItemCount)
-    AwardItemList = list()    #(vector<tagMCActXianXiaMJAwardItem> AwardItemList)// 奖池物品列表,已生成的,包含已选择的大奖物品
+    AwardItemList = list()    #(vector<tagMCActXianXiaMJLayerItem> AwardItemList)// 奖池物品列表,已生成的,包含已选择的大奖物品
     SuperItemCount = 0    #(BYTE SuperItemCount)
-    SuperItemList = list()    #(vector<tagMCActXianXiaMJAwardItem> SuperItemList)// 大奖物品待选择库,由玩家从库中选择放入奖池的物品;
+    SuperItemList = list()    #(vector<tagMCActXianXiaMJLayerItem> SuperItemList)// 大奖物品待选择库,由玩家从库中选择放入奖池的物品;
     SuperItemCanChooseCount = 0    #(BYTE SuperItemCanChooseCount)// 大奖物品可选择个数
     data = None
 
     def __init__(self):
         self.Clear()
         self.Head.Cmd = 0xAA
-        self.Head.SubCmd = 0x58
+        self.Head.SubCmd = 0x79
         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.LimitLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
-        self.ResetType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        self.MoneyType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        self.MoneyValue,_pos = CommFunc.ReadWORD(_lpData, _pos)
-        self.LayerNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.LayerNum,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.LotteryScore,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.AwardItemCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         for i in range(self.AwardItemCount):
-            temAwardItemList = tagMCActXianXiaMJAwardItem()
+            temAwardItemList = tagMCActXianXiaMJLayerItem()
             _pos = temAwardItemList.ReadData(_lpData, _pos)
             self.AwardItemList.append(temAwardItemList)
         self.SuperItemCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         for i in range(self.SuperItemCount):
-            temSuperItemList = tagMCActXianXiaMJAwardItem()
+            temSuperItemList = tagMCActXianXiaMJLayerItem()
             _pos = temSuperItemList.ReadData(_lpData, _pos)
             self.SuperItemList.append(temSuperItemList)
         self.SuperItemCanChooseCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
@@ -38523,15 +38777,10 @@
         self.Head = tagHead()
         self.Head.Clear()
         self.Head.Cmd = 0xAA
-        self.Head.SubCmd = 0x58
+        self.Head.SubCmd = 0x79
         self.ActNum = 0
-        self.StartDate = ""
-        self.EndtDate = ""
-        self.LimitLV = 0
-        self.ResetType = 0
-        self.MoneyType = 0
-        self.MoneyValue = 0
         self.LayerNum = 0
+        self.LotteryScore = 0
         self.AwardItemCount = 0
         self.AwardItemList = list()
         self.SuperItemCount = 0
@@ -38543,13 +38792,8 @@
         length = 0
         length += self.Head.GetLength()
         length += 1
-        length += 10
-        length += 10
         length += 2
-        length += 1
-        length += 1
-        length += 2
-        length += 1
+        length += 4
         length += 1
         for i in range(self.AwardItemCount):
             length += self.AwardItemList[i].GetLength()
@@ -38564,13 +38808,8 @@
         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.WriteWORD(data, self.LimitLV)
-        data = CommFunc.WriteBYTE(data, self.ResetType)
-        data = CommFunc.WriteBYTE(data, self.MoneyType)
-        data = CommFunc.WriteWORD(data, self.MoneyValue)
-        data = CommFunc.WriteBYTE(data, self.LayerNum)
+        data = CommFunc.WriteWORD(data, self.LayerNum)
+        data = CommFunc.WriteDWORD(data, self.LotteryScore)
         data = CommFunc.WriteBYTE(data, self.AwardItemCount)
         for i in range(self.AwardItemCount):
             data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer())
@@ -38584,13 +38823,8 @@
         DumpString = '''
                                 Head:%s,
                                 ActNum:%d,
-                                StartDate:%s,
-                                EndtDate:%s,
-                                LimitLV:%d,
-                                ResetType:%d,
-                                MoneyType:%d,
-                                MoneyValue:%d,
                                 LayerNum:%d,
+                                LotteryScore:%d,
                                 AwardItemCount:%d,
                                 AwardItemList:%s,
                                 SuperItemCount:%d,
@@ -38600,13 +38834,8 @@
                                 %(
                                 self.Head.OutputString(),
                                 self.ActNum,
-                                self.StartDate,
-                                self.EndtDate,
-                                self.LimitLV,
-                                self.ResetType,
-                                self.MoneyType,
-                                self.MoneyValue,
                                 self.LayerNum,
+                                self.LotteryScore,
                                 self.AwardItemCount,
                                 "...",
                                 self.SuperItemCount,
@@ -38616,8 +38845,8 @@
         return DumpString
 
 
-m_NAtagMCActXianXiaMJInfo=tagMCActXianXiaMJInfo()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActXianXiaMJInfo.Head.Cmd,m_NAtagMCActXianXiaMJInfo.Head.SubCmd))] = m_NAtagMCActXianXiaMJInfo
+m_NAtagMCActXianXiaMJLayerInfo=tagMCActXianXiaMJLayerInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActXianXiaMJLayerInfo.Head.Cmd,m_NAtagMCActXianXiaMJLayerInfo.Head.SubCmd))] = m_NAtagMCActXianXiaMJLayerInfo
 
 
 #------------------------------------------------------
@@ -39825,6 +40054,238 @@
 
 
 #------------------------------------------------------
+# AA 80 仙匣秘境跨服活动信息 #tagMCCrossActXianXiaMJInfo
+
+class  tagMCCrossActXianXiaMJItem(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(tagMCCrossActXianXiaMJItem)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 80 仙匣秘境跨服活动信息 //tagMCCrossActXianXiaMJInfo:
+                                ItemID:%d,
+                                ItemCount:%d,
+                                IsBind:%d
+                                '''\
+                                %(
+                                self.ItemID,
+                                self.ItemCount,
+                                self.IsBind
+                                )
+        return DumpString
+
+
+class  tagMCCrossActXianXiaMJBillard(Structure):
+    Rank = 0    #(DWORD Rank)// 名次,1-代表第一名;支持夸段,如1,3 代表第1名,第2~3名
+    Count = 0    #(BYTE Count)// 奖励物品数
+    AwardItemList = list()    #(vector<tagMCCrossActXianXiaMJItem> 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 = tagMCCrossActXianXiaMJItem()
+            _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  tagMCCrossActXianXiaMJInfo(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
+    IsDayReset = 0    #(BYTE IsDayReset)// 是否每天重置
+    RankLimitPersonal = 0    #(WORD RankLimitPersonal)// 个人榜上榜积分保底限制;
+    PersonalBillCount = 0    #(BYTE PersonalBillCount)
+    PersonalBillboardInfoList = list()    #(vector<tagMCCrossActXianXiaMJBillard> PersonalBillboardInfoList)// 个人榜单奖励信息列表,如果没有代表本次活动没有该榜奖励
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x80
+        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.IsDayReset,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.RankLimitPersonal,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.PersonalBillCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.PersonalBillCount):
+            temPersonalBillboardInfoList = tagMCCrossActXianXiaMJBillard()
+            _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 = 0x80
+        self.ServerInfoLen = 0
+        self.ServerIDRangeInfo = ""
+        self.GroupValue1 = 0
+        self.StartDate = ""
+        self.EndtDate = ""
+        self.JoinStartTime = ""
+        self.JoinEndTime = ""
+        self.IsDayReset = 0
+        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 += 1
+        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.WriteBYTE(data, self.IsDayReset)
+        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,
+                                IsDayReset:%d,
+                                RankLimitPersonal:%d,
+                                PersonalBillCount:%d,
+                                PersonalBillboardInfoList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.ServerInfoLen,
+                                self.ServerIDRangeInfo,
+                                self.GroupValue1,
+                                self.StartDate,
+                                self.EndtDate,
+                                self.JoinStartTime,
+                                self.JoinEndTime,
+                                self.IsDayReset,
+                                self.RankLimitPersonal,
+                                self.PersonalBillCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCCrossActXianXiaMJInfo=tagMCCrossActXianXiaMJInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCCrossActXianXiaMJInfo.Head.Cmd,m_NAtagMCCrossActXianXiaMJInfo.Head.SubCmd))] = m_NAtagMCCrossActXianXiaMJInfo
+
+
+#------------------------------------------------------
 # AA 25 每日礼包活动信息 #tagMCDailyGiftbagInfo
 
 class  tagMCDailyGiftbagItem(Structure):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossActionControl.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossActionControl.py
index b6912a2..c15a5ac 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossActionControl.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossActionControl.py
@@ -23,6 +23,7 @@
 import IpyGameDataPY
 import CrossActCTGBillboard
 import PlayerActBossTrial
+import PlayerActXianXiaMJ
 import CrossRealmMsg
 import PyGameData
 import PlayerFB
@@ -622,8 +623,11 @@
                 if actName == ShareDefine.CrossActName_CTGBillboard:
                     CrossActCTGBillboard.OnActIDChange(cfgID, dbTemplateID, state)
                     
-                if actName == ShareDefine.CrossActName_BossTrial:
+                elif actName == ShareDefine.CrossActName_BossTrial:
                     PlayerActBossTrial.OnCrossActIDChange(cfgID, zoneID, ipyData, state)
+                    
+                elif actName == ShareDefine.CrossActName_XianXiaMJ:
+                    PlayerActXianXiaMJ.OnCrossActIDChange(cfgID, zoneID, ipyData, state)
                     
                 else:
                     actChangeList.append([actName, ipyData, state, cfgID, groupName, zoneID, dbActID, actID, forceReset, dbTemplateID])
@@ -649,6 +653,9 @@
                     if actName == ShareDefine.CrossActName_BossTrial:
                         PlayerActBossTrial.OnCrossActJoinEnd(cfgID, zoneID, ipyData)
                         
+                    elif actName == ShareDefine.CrossActName_XianXiaMJ:
+                        PlayerActXianXiaMJ.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 5bfa98b..4d3f15d 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py
@@ -24,6 +24,7 @@
 import CrossRealmPlayer
 import PlayerCompensation
 import PlayerActBossTrial
+import PlayerActXianXiaMJ
 import CrossActionControl
 import CrossActAllRecharge
 import CrossFamilyFlagwar
@@ -173,6 +174,9 @@
         elif msgType == ShareDefine.ClientServerMsg_BossTrialSubmit:
             PlayerActBossTrial.ClientServerMsg_BossTrialSubmit(serverGroupID, msgData)
             
+        elif msgType == ShareDefine.ClientServerMsg_XianXiaMJScore:
+            PlayerActXianXiaMJ.ClientServerMsg_XianXiaMJScore(serverGroupID, msgData)
+            
         # 需要发送到地图服务器处理的
         elif msgType in [ShareDefine.ClientServerMsg_Reborn, ShareDefine.ClientServerMsg_CollectNPC]:
             MapServer_CrossServerReceiveMsg(msgType, msgData, serverGroupID)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
index c89e50d..224a624 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
@@ -36,6 +36,7 @@
 import PlayerActFamilyCTGAssist
 import PlayerActGarbageSorting
 import PlayerActBossTrial
+import PlayerActXianXiaMJ
 import PlayerUniversalGameRec
 import GameWorldAverageLv
 import PlayerFamilyBoss
@@ -820,6 +821,8 @@
                 if dbActID:
                     if actName == ShareDefine.OperationActionName_BossTrial:
                         PlayerActBossTrial.OnActEnd(actNum, ipyData, dayIndex)
+                    elif actName == ShareDefine.OperationActionName_XianXiaMJ:
+                        PlayerActXianXiaMJ.OnActEnd(actNum, ipyData, dayIndex)
                         
                 if curActID:
                     if actName in ShareDefine.NeedWorldLVOperationActNameList:
@@ -850,6 +853,8 @@
                         PlayerActGarbageSorting.OnActStart(actNum)
                     elif actName == ShareDefine.OperationActionName_BossTrial:
                         PlayerActBossTrial.OnActStart(actNum)
+                    elif actName == ShareDefine.OperationActionName_XianXiaMJ:
+                        PlayerActXianXiaMJ.OnActStart(actNum)
                     elif actName == ShareDefine.OperationActionName_FamilyCTGAssist:
                         PlayerActFamilyCTGAssist.OnActStart(actNum)
                 else:
@@ -869,6 +874,8 @@
                 elif stateJoin == ShareDefine.ActStateJoin_End:
                     if actName == ShareDefine.OperationActionName_BossTrial:
                         PlayerActBossTrial.OnActJoinEnd(actNum, ipyData, dayIndex)
+                    elif actName == ShareDefine.OperationActionName_XianXiaMJ:
+                        PlayerActXianXiaMJ.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 f4768b7..3dee8283 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
@@ -514,10 +514,30 @@
                         ("BYTE", "ActNum", 0),
                         ("char", "StartDate", 0),
                         ("char", "EndDate", 0),
-                        ("dict", "NotifyInfoStart", 0),
-                        ("dict", "NotifyInfoEnd", 0),
-                        ("list", "NotifyInfoLoop", 0),
-                        ("BYTE", "ResetType", 0),
+                        ("char", "JoinStartTime", 0),
+                        ("char", "JoinEndTime", 0),
+                        ("BYTE", "IsDayReset", 0),
+                        ("WORD", "PersonalTemplateID", 0),
+                        ),
+
+                "CrossActXianXiaMJ":(
+                        ("DWORD", "CfgID", 1),
+                        ("char", "ActGroupName", 0),
+                        ("BYTE", "ZoneID", 0),
+                        ("list", "ServerIDRangeList", 0),
+                        ("char", "StartDate", 0),
+                        ("char", "EndDate", 0),
+                        ("char", "JoinStartTime", 0),
+                        ("char", "JoinEndTime", 0),
+                        ("BYTE", "IsDayReset", 0),
+                        ("WORD", "RankLimitPersonal", 0),
+                        ("WORD", "PersonalTemplateID", 0),
+                        ),
+
+                "ActXianXiaMJBillTemp":(
+                        ("DWORD", "TemplateID", 1),
+                        ("BYTE", "Rank", 0),
+                        ("list", "AwardItemList", 0),
                         ),
 
                 "ActGodGift":(
@@ -1764,10 +1784,40 @@
     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 GetNotifyInfoStart(self): return self.attrTuple[6] # 全服提示信息 - 相对开始时间 dict
-    def GetNotifyInfoEnd(self): return self.attrTuple[7] # 全服提示信息 - 相对结束时间 dict
-    def GetNotifyInfoLoop(self): return self.attrTuple[8] # 全服提示信息 - 循环广播[间隔分钟, 广播key] list
-    def GetResetType(self): return self.attrTuple[9] # 重置类型,0-0点重置;1-5点重置 BYTE
+    def GetJoinStartTime(self): return self.attrTuple[6] # 参与开始时间点 char
+    def GetJoinEndTime(self): return self.attrTuple[7] # 参与结束时间点 char
+    def GetIsDayReset(self): return self.attrTuple[8] # 是否每天重置 BYTE
+    def GetPersonalTemplateID(self): return self.attrTuple[9] # 个人排行模板编号 WORD
+
+# 仙匣秘境活动跨服表
+class IPY_CrossActXianXiaMJ():
+    
+    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 GetIsDayReset(self): return self.attrTuple[8] # 是否每天重置 BYTE
+    def GetRankLimitPersonal(self): return self.attrTuple[9] # 个人上榜积分限制 WORD
+    def GetPersonalTemplateID(self): return self.attrTuple[10] # 个人排行模板编号 WORD
+
+# 仙匣秘境榜单模版表
+class IPY_ActXianXiaMJBillTemp():
+    
+    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_ActGodGift():
@@ -2650,6 +2700,8 @@
         self.__LoadFileData("ActBossTrialTemplate", onlyCheck)
         self.__LoadFileData("CrossActBossTrial", onlyCheck)
         self.__LoadFileData("ActXianXiaMJ", onlyCheck)
+        self.__LoadFileData("CrossActXianXiaMJ", onlyCheck)
+        self.__LoadFileData("ActXianXiaMJBillTemp", onlyCheck)
         self.__LoadFileData("ActGodGift", onlyCheck)
         self.__LoadFileData("ActHorsePetFeast", onlyCheck)
         self.__LoadFileData("ActBossReborn", onlyCheck)
@@ -3227,6 +3279,20 @@
         self.CheckLoadData("ActXianXiaMJ")
         return self.ipyActXianXiaMJCache[index]
 
+    def GetCrossActXianXiaMJCount(self):
+        self.CheckLoadData("CrossActXianXiaMJ")
+        return self.ipyCrossActXianXiaMJLen
+    def GetCrossActXianXiaMJByIndex(self, index):
+        self.CheckLoadData("CrossActXianXiaMJ")
+        return self.ipyCrossActXianXiaMJCache[index]
+
+    def GetActXianXiaMJBillTempCount(self):
+        self.CheckLoadData("ActXianXiaMJBillTemp")
+        return self.ipyActXianXiaMJBillTempLen
+    def GetActXianXiaMJBillTempByIndex(self, index):
+        self.CheckLoadData("ActXianXiaMJBillTemp")
+        return self.ipyActXianXiaMJBillTempCache[index]
+
     def GetActGodGiftCount(self):
         self.CheckLoadData("ActGodGift")
         return self.ipyActGodGiftLen
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActBossTrial.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActBossTrial.py
index bd6ee23..d79e287 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActBossTrial.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActBossTrial.py
@@ -495,6 +495,7 @@
     
     # 结算时排序并保存榜单数据流向
     billboardObj.SortData()
+    billboardObj.SaveDRData()
     
     GameWorld.Log("结算跨服Boss凭证个人排行奖励: billboardType=%s,zoneID=%s,cfgID=%s,templateID=%s,billboardDataCount=%s" 
                   % (billboardType, zoneID, cfgID, templateID, billboardDataCount))
@@ -542,6 +543,7 @@
     
     # 结算时排序并保存榜单数据流向
     billboardObj.SortData()
+    billboardObj.SaveDRData()
     
     GameWorld.Log("结算跨服Boss凭证仙盟排行奖励: billboardType=%s,zoneID=%s,cfgID=%s,templateID=%s,billboardDataCount=%s" 
                   % (billboardType, zoneID, cfgID, templateID, billboardDataCount))
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActXianXiaMJ.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActXianXiaMJ.py
new file mode 100644
index 0000000..2bbfd3e
--- /dev/null
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActXianXiaMJ.py
@@ -0,0 +1,295 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package PlayerActXianXiaMJ
+#
+# @todo:仙匣秘境
+# @author hxp
+# @date 2024-07-18
+# @version 1.0
+#
+# 详细描述: 仙匣秘境
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2024-07-18 18:00"""
+#-------------------------------------------------------------------------------
+
+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_ActXianXiaMJAward % actNum, 0)
+    PlayerBillboard.ClearBillboardByIndex(ShareDefine.Def_BT_XianXiaMJScore)
+    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) # 兼容活动没有配置参与时间段的在活动结束补触发结算奖励
+    
+    DataRecordPack.DR_BillboardData(ShareDefine.Def_BT_XianXiaMJScore, "XianXiaMJ", {"actNum":actNum, "cfgID":cfgID, "dayIndex":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_ActXianXiaMJAward % actNum)
+    if awardState:
+        #已经结算过该活动
+        GameWorld.Log("仙匣秘境活动已经结算过奖励了! actNum=%s,cfgID=%s,dayIndex=%s" % (actNum, cfgID, dayIndex))
+        return
+    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActXianXiaMJAward % actNum, 1)
+    
+    GameWorld.Log("=== 本服仙匣秘境活动发放榜单奖励! === actNum=%s,cfgID=%s,dayIndex=%s" % (actNum, cfgID, dayIndex))
+    
+    __OnEndAward_Personal(ipyData.GetPersonalTemplateID(), ShareDefine.Def_BT_XianXiaMJScore)
+    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("ActXianXiaMJBillTemp", 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("XianXiaMJPlayer", [playerID], awardItemList, [rank])
+        
+    return
+
+def MapServer_XianXiaMJ(curPlayer, msgList):
+    mapID = curPlayer.GetRealMapID()
+    playerID = curPlayer.GetPlayerID()
+    GameWorld.DebugLog("MapServer_XianXiaMJ mapID=%s,msgList=%s" % (mapID, msgList), playerID)
+    if not msgList:
+        return
+    
+    msgType, dataMsg = msgList
+    ret = None
+    
+    if msgType == "AddLotteryScore":
+        ret = __OnAddLotteryScore(curPlayer, dataMsg)
+        
+    if ret == None:
+        return
+    return msgList + (ret if isinstance(ret, list) else [ret])
+
+def __OnAddLotteryScore(curPlayer, dataMsg):
+    ## 地图增加积分
+    playerID = curPlayer.GetPlayerID()
+    accID = curPlayer.GetAccID()
+    playerName = curPlayer.GetName()
+    job = curPlayer.GetJob()
+    realmLV = curPlayer.GetOfficialRank()
+    _, updLotteryScore = dataMsg
+    
+    #同步跨服
+    playerInfo = {"playerID":playerID, "playerName":playerName, "accID":accID, "job":job, "realmLV":realmLV,
+                  "playerLotteryScore":updLotteryScore}
+    SyncXianXiaMJToCrossServer(curPlayer, playerInfo)
+    return
+
+def SyncXianXiaMJToCrossServer(curPlayer, playerInfo):
+    ## 同步到跨服服务器
+    actInfo = CrossActionControl.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_XianXiaMJ)
+    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_XianXiaMJScore, dataMsg)
+    return
+
+##------------------------------------------ 跨服仙匣秘境活动 ---------------------------------------
+def ClientServerMsg_XianXiaMJScore(serverGroupID, msgData):
+    ## 收到子服 - 同步积分
+    
+    cfgID = msgData["cfgID"]
+    zoneID = msgData["zoneID"]
+    playerInfo = msgData["playerInfo"]
+    
+    actInfo = CrossActionControl.GetCrossActInfoByCfgID(ShareDefine.CrossActName_XianXiaMJ, 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("CrossActXianXiaMJ", cfgID)
+    if not ipyData:
+        return
+    personlLimit = ipyData.GetRankLimitPersonal()
+    
+    playerID = playerInfo["playerID"]
+    playerName = playerInfo["playerName"]
+    job = playerInfo["job"]
+    accID = playerInfo["accID"]
+    realmLV = playerInfo["realmLV"]
+    playerLotteryScore = playerInfo["playerLotteryScore"]
+    
+    groupValue1 = zoneID
+    
+    if playerLotteryScore >= personlLimit:
+        name2, type2, value1, value2 = accID, job, realmLV, 0
+        CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_XianXiaMJScore, groupValue1, playerID, playerName, 
+                                         name2, type2, value1, value2, playerLotteryScore)
+    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_ActXianXiaMJAwardC % zoneID, 0)
+    
+    groupValue1 = zoneID
+    billboardMgr = PyDataManager.GetCrossBillboardManager()
+    billboardObj = billboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_XianXiaMJScore, 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_XianXiaMJScore, 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_ActXianXiaMJAwardC % zoneID)
+    if awardState:
+        #已经结算过该活动
+        GameWorld.Log("跨服仙匣秘境活动已经结算过奖励了! cfgID=%s,zoneID=%s" % (cfgID, zoneID))
+        return
+    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActXianXiaMJAwardC % zoneID, 1)
+    
+    GameWorld.Log("=== 跨服仙匣秘境活动发放榜单奖励! === cfgID=%s,zoneID=%s" % (cfgID, zoneID))
+    
+    PersonalTemplateID = ipyData.GetPersonalTemplateID()
+    
+    __GiveCrossOrderAwardPersonal(cfgID, zoneID, PersonalTemplateID, ShareDefine.Def_CBT_XianXiaMJScore)
+    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()
+    
+    GameWorld.Log("结算跨服仙匣秘境个人排行奖励: billboardType=%s,zoneID=%s,cfgID=%s,templateID=%s,billboardDataCount=%s" 
+                  % (billboardType, zoneID, cfgID, templateID, billboardDataCount))
+    
+    orderIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActXianXiaMJBillTemp", 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("XianXiaMJCrossPlayer", [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 62f2e42..ff108a1 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py
@@ -178,6 +178,10 @@
 Def_ActBossTrialAward = "ActBossTrialAward_%s"
 #跨服boss历练结算状态,参数(zoneID)
 Def_ActBossTrialAwardC = "ActBossTrialAwardC_%s"
+#仙匣秘境结算状态,参数(actNum),跨服活动参数(zoneID)
+Def_ActXianXiaMJAward = "ActXianXiaMJAward_%s"
+#跨服仙匣秘境结算状态,参数(zoneID)
+Def_ActXianXiaMJAwardC = "ActXianXiaMJAwardC_%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 2c85108..f42611d 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
@@ -76,6 +76,7 @@
 import CrossBattlefield
 import CrossFamilyFlagwar
 import CrossActAllRecharge
+import PlayerActXianXiaMJ
 import PlayerActBossTrial
 import PlayerActFamilyCTGAssist
 import ChPyNetSendPack
@@ -703,6 +704,14 @@
         PlayerActBossTrial.MapServer_BossTrial(curPlayer, eval(resultName))
         return
     
+    # 仙匣秘境
+    if callName == "XianXiaMJ":
+        curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(srcPlayerID)
+        if not curPlayer:
+            return
+        PlayerActXianXiaMJ.MapServer_XianXiaMJ(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 d48a9f1..67fab70 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -346,9 +346,10 @@
 CrossActName_AllRecharge = "CrossActAllRecharge" # 全民充值
 CrossActName_LuckyCloudBuy = "CrossActLuckyCloudBuy" # 幸运云购
 CrossActName_BossTrial = "CrossActBossTrial" # Boss历练 - 跨服
+CrossActName_XianXiaMJ = "CrossActXianXiaMJ" # 仙匣秘境 - 跨服
 
 #跨服运营活动列表
-CrossActNameList = [CrossActName_CTGBillboard, CrossActName_AllRecharge, CrossActName_LuckyCloudBuy, CrossActName_BossTrial]
+CrossActNameList = [CrossActName_CTGBillboard, CrossActName_AllRecharge, CrossActName_LuckyCloudBuy, CrossActName_BossTrial, CrossActName_XianXiaMJ]
 #需要锁定活动分区分配直到活动结束的跨服运营活动,即使热更分区配置,也不会改变正在活动中的分区设定,直到活动结束
 CrossActLockServerGroupIDList = [CrossActName_CTGBillboard, CrossActName_AllRecharge]
 
@@ -820,9 +821,10 @@
     Def_BT_BossTrialSubmitBak,                #提交boss凭证榜 (boss历练活动 - 上一期) 35
     Def_BT_BossTrialSubmitFamily,             #提交boss凭证仙盟榜 (boss历练活动)
     Def_BT_BossTrialSubmitFamilyBak,          #提交boss凭证仙盟榜 (boss历练活动 - 上一期)
+    Def_BT_XianXiaMJScore,                    #仙匣秘境积分榜 (仙匣秘境活动)
     
     Def_BT_Max, #排行榜最大类型
-) = range(0, 37 + 2) 
+) = range(0, 38 + 2) 
 
 ''' 跨服排行榜类型, 从 150 开始
 与本服榜单存储的是不一样的数据库表格,理论上类型可以和本服榜单类型重复,为了做下区分防误导,跨服榜单从 150 开始
@@ -842,12 +844,14 @@
 Def_CBT_BossTrialSubmitBak, # boss凭证 - 个人榜 上一期  159
 Def_CBT_BossTrialSubmitFamily, # boss凭证 - 仙盟榜  160
 Def_CBT_BossTrialSubmitFamilyBak, # boss凭证 - 仙盟榜 上一期  161
-) = range(150, 161 + 1)
+Def_CBT_XianXiaMJScore, # 仙匣秘境积分 - 个人榜  162
+) = range(150, 162 + 1)
 
 # 跨服榜单最大数据名次,没有设置的默认100
 CrossBillboard_MaxDataCount = {
                                Def_CBT_BossTrialSubmit:1000,
                                Def_CBT_BossTrialSubmitBak:1000,
+                               Def_CBT_XianXiaMJScore:1000,
                                }
 
 #职业对应战力排行榜类型
@@ -1608,6 +1612,7 @@
 ClientServerMsg_ActAllRechargeValue = "ActAllRechargeValue" # 跨服全民充值额度
 ClientServerMsg_CrossYaomoBossHurtAward = "CrossYaomoBossHurtAward" # 跨服妖魔boss玩家伤害领奖
 ClientServerMsg_BossTrialSubmit = "BossTrialSubmit" # boss凭证提交
+ClientServerMsg_XianXiaMJScore = "XianXiaMJScore" # 仙匣秘境积分
 
 #跨服广播类型定义
 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 0588c7d..2f70399 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -4097,11 +4097,14 @@
 Def_PDict_GarbageGJSeconds = "ActGSGJSeconds_%s"  # 挂机未处理收益的秒数,参数(活动编号)
 
 #仙匣秘境活动
+Def_PDict_CA_XianXiaMJID = "CA_XianXiaMJID"  # 玩家身上的活动ID,唯一标识,取活动开始日期time值
 Def_PDict_XianXiaMJID = "ActXXMJID_%s"  # 玩家身上的活动ID,唯一标识,取活动开始日期time值,参数:(活动编号)
 Def_PDict_XianXiaMJWorldLV = "ActXXMJWorldLV_%s" #玩家身上的活动世界等级,参数:(活动编号)
-Def_PDict_XianXiaMJAwardLayerInfo = "ActXXMJAwardLayerInfo_%s" # 奖池层级信息: 累计抽奖次数*100+层数,参数:(活动编号)
+Def_PDict_XianXiaMJLayerNum = "ActXianXiaMJLayerNum_%s" # 当前层数,参数:(活动编号)
+Def_PDict_XianXiaMJPlayCount = "ActXianXiaMJPlayCount_%s" # 当前层累计抽奖次数,参数:(活动编号)
 Def_PDict_XianXiaMJAwardItemInfo = "ActXXMJItemInfo_%s_%s_%s"  # 奖池物品ID*100+抽中位置编号,参数:(活动编号, 库类型, 物品编号)
 Def_PDict_XianXiaMJAwardItemTimes = "ActXXMJItemTimes_%s_%s_%s"  # 奖池物品累计产出次数,有限制次数的才记录,参数:(活动编号, 库类型, 物品ID)
+Def_PDict_XianXiaMJScore = "XianXiaMJScore_%s"  # 抽奖积分,参数:(活动编号)
 
 #天帝礼包活动
 Def_PDict_GodGiftID = "ActGodGiftID_%s"  # 玩家身上的活动ID,唯一标识,取活动开始日期time值,参数:(活动编号)
@@ -6103,7 +6106,9 @@
 ActTaskType_Activity, # 累计获得活跃度 3
 ActTaskType_CrossPenglaiBoss, # 击杀蓬莱boss 4
 ActTaskType_CrossDemonLandBoss, # 击杀魔化之地boss 5
-) = range(1, 1 + 5)
+ActTaskType_XianXiaMJLottery, # 仙匣秘境寻宝x次 6
+ActTaskType_XianXiaMJLayer, # 仙匣秘境达到x层 7
+) = range(1, 1 + 7)
 
 # 套装枚举,普通套装,强化套装
 (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 b0e0ae9..5d17e1a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -32670,6 +32670,7 @@
     CTGIDList = list()    #(vector<WORD> CTGIDList)// CTGID列表;总购买次数前端自己统计,直接取CTGID对应的累计购买次数累加
     GiftCount = 0    #(BYTE GiftCount)
     BuyCountGiftList = list()    #(vector<tagMCActBuyCountGift> BuyCountGiftList)// 购买次数礼包列表
+    ShopType = 0    #(WORD ShopType)// 开放商店类型,可能为0不开放
     data = None
 
     def __init__(self):
@@ -32696,6 +32697,7 @@
             temBuyCountGiftList = tagMCActBuyCountGift()
             _pos = temBuyCountGiftList.ReadData(_lpData, _pos)
             self.BuyCountGiftList.append(temBuyCountGiftList)
+        self.ShopType,_pos = CommFunc.ReadWORD(_lpData, _pos)
         return _pos
 
     def Clear(self):
@@ -32713,6 +32715,7 @@
         self.CTGIDList = list()
         self.GiftCount = 0
         self.BuyCountGiftList = list()
+        self.ShopType = 0
         return
 
     def GetLength(self):
@@ -32729,6 +32732,7 @@
         length += 1
         for i in range(self.GiftCount):
             length += self.BuyCountGiftList[i].GetLength()
+        length += 2
 
         return length
 
@@ -32747,6 +32751,7 @@
         data = CommFunc.WriteBYTE(data, self.GiftCount)
         for i in range(self.GiftCount):
             data = CommFunc.WriteString(data, self.BuyCountGiftList[i].GetLength(), self.BuyCountGiftList[i].GetBuffer())
+        data = CommFunc.WriteWORD(data, self.ShopType)
         return data
 
     def OutputString(self):
@@ -32761,7 +32766,8 @@
                                 CTGIDCount:%d,
                                 CTGIDList:%s,
                                 GiftCount:%d,
-                                BuyCountGiftList:%s
+                                BuyCountGiftList:%s,
+                                ShopType:%d
                                 '''\
                                 %(
                                 self.Head.OutputString(),
@@ -32774,7 +32780,8 @@
                                 self.CTGIDCount,
                                 "...",
                                 self.GiftCount,
-                                "..."
+                                "...",
+                                self.ShopType
                                 )
         return DumpString
 
@@ -38352,6 +38359,7 @@
                   ("ItemCount", c_ushort),    
                   ("PosNum", c_ubyte),    # 被抽中时的位置编号,1~99,前端自定义展示位置编号,0代表未被抽中;
                   ("TotalTimesNow", c_ubyte),    #当前已产出次数,不限制次数时不记录,即同样为0
+                  ("LotteryScore", c_int),    #当前抽奖积分
                   ]
 
     def __init__(self):
@@ -38374,6 +38382,7 @@
         self.ItemCount = 0
         self.PosNum = 0
         self.TotalTimesNow = 0
+        self.LotteryScore = 0
         return
 
     def GetLength(self):
@@ -38391,7 +38400,8 @@
                                 ItemID:%d,
                                 ItemCount:%d,
                                 PosNum:%d,
-                                TotalTimesNow:%d
+                                TotalTimesNow:%d,
+                                LotteryScore:%d
                                 '''\
                                 %(
                                 self.Cmd,
@@ -38401,7 +38411,8 @@
                                 self.ItemID,
                                 self.ItemCount,
                                 self.PosNum,
-                                self.TotalTimesNow
+                                self.TotalTimesNow,
+                                self.LotteryScore
                                 )
         return DumpString
 
@@ -38413,7 +38424,260 @@
 #------------------------------------------------------
 # AA 58 仙匣秘境活动信息 #tagMCActXianXiaMJInfo
 
-class  tagMCActXianXiaMJAwardItem(Structure):
+class  tagMCActXianXiaMJItem(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(tagMCActXianXiaMJItem)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 58 仙匣秘境活动信息 //tagMCActXianXiaMJInfo:
+                                ItemID:%d,
+                                ItemCount:%d,
+                                IsBind:%d
+                                '''\
+                                %(
+                                self.ItemID,
+                                self.ItemCount,
+                                self.IsBind
+                                )
+        return DumpString
+
+
+class  tagMCActXianXiaMJBillard(Structure):
+    Rank = 0    #(DWORD Rank)// 名次,1-代表第一名;支持夸段,如1,3 代表第1名,第2~3名
+    Count = 0    #(BYTE Count)// 奖励物品数
+    AwardItemList = list()    #(vector<tagMCActXianXiaMJItem> 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 = tagMCActXianXiaMJItem()
+            _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  tagMCActXianXiaMJInfo(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
+    IsDayReset = 0    #(BYTE IsDayReset)// 是否每天重置
+    LimitLV = 0    #(WORD LimitLV)// 限制等级
+    UseItemID = 0    #(DWORD UseItemID)//消耗物品ID,默认1个;消耗物品或货币二选一即可,或都配则先消耗道具,不足则消耗货币
+    MoneyType = 0    #(BYTE MoneyType)//消耗货币类型
+    MoneyValue = 0    #(WORD MoneyValue)//消耗货币值
+    LotteryAddScore = 0    #(WORD LotteryAddScore)//每次抽奖加积分
+    LayerAddScore = 0    #(WORD LayerAddScore)//每次跨层加积分
+    PersonalBillCount = 0    #(BYTE PersonalBillCount)
+    PersonalBillboardInfoList = list()    #(vector<tagMCActXianXiaMJBillard> PersonalBillboardInfoList)// 个人榜单奖励信息列表,如果没有代表本次活动没有该榜奖励
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x58
+        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.IsDayReset,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.LimitLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.UseItemID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.MoneyType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.MoneyValue,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.LotteryAddScore,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.LayerAddScore,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.PersonalBillCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.PersonalBillCount):
+            temPersonalBillboardInfoList = tagMCActXianXiaMJBillard()
+            _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 = 0x58
+        self.ActNum = 0
+        self.StartDate = ""
+        self.EndtDate = ""
+        self.JoinStartTime = ""
+        self.JoinEndTime = ""
+        self.IsDayReset = 0
+        self.LimitLV = 0
+        self.UseItemID = 0
+        self.MoneyType = 0
+        self.MoneyValue = 0
+        self.LotteryAddScore = 0
+        self.LayerAddScore = 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 += 1
+        length += 2
+        length += 4
+        length += 1
+        length += 2
+        length += 2
+        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.WriteBYTE(data, self.IsDayReset)
+        data = CommFunc.WriteWORD(data, self.LimitLV)
+        data = CommFunc.WriteDWORD(data, self.UseItemID)
+        data = CommFunc.WriteBYTE(data, self.MoneyType)
+        data = CommFunc.WriteWORD(data, self.MoneyValue)
+        data = CommFunc.WriteWORD(data, self.LotteryAddScore)
+        data = CommFunc.WriteWORD(data, self.LayerAddScore)
+        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,
+                                IsDayReset:%d,
+                                LimitLV:%d,
+                                UseItemID:%d,
+                                MoneyType:%d,
+                                MoneyValue:%d,
+                                LotteryAddScore:%d,
+                                LayerAddScore:%d,
+                                PersonalBillCount:%d,
+                                PersonalBillboardInfoList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.ActNum,
+                                self.StartDate,
+                                self.EndtDate,
+                                self.JoinStartTime,
+                                self.JoinEndTime,
+                                self.IsDayReset,
+                                self.LimitLV,
+                                self.UseItemID,
+                                self.MoneyType,
+                                self.MoneyValue,
+                                self.LotteryAddScore,
+                                self.LayerAddScore,
+                                self.PersonalBillCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCActXianXiaMJInfo=tagMCActXianXiaMJInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActXianXiaMJInfo.Head.Cmd,m_NAtagMCActXianXiaMJInfo.Head.SubCmd))] = m_NAtagMCActXianXiaMJInfo
+
+
+#------------------------------------------------------
+# AA 79 仙匣秘境层信息 #tagMCActXianXiaMJLayerInfo
+
+class  tagMCActXianXiaMJLayerItem(Structure):
     _pack_ = 1
     _fields_ = [
                   ("ItemLibType", c_ubyte),    #物品库类型;9-固定为大奖库,非9-策划自定义库
@@ -38445,13 +38709,13 @@
         return
 
     def GetLength(self):
-        return sizeof(tagMCActXianXiaMJAwardItem)
+        return sizeof(tagMCActXianXiaMJLayerItem)
 
     def GetBuffer(self):
         return string_at(addressof(self), self.GetLength())
 
     def OutputString(self):
-        DumpString = '''// AA 58 仙匣秘境活动信息 //tagMCActXianXiaMJInfo:
+        DumpString = '''// AA 79 仙匣秘境层信息 //tagMCActXianXiaMJLayerInfo:
                                 ItemLibType:%d,
                                 ItemID:%d,
                                 ItemCount:%d,
@@ -38472,48 +38736,38 @@
         return DumpString
 
 
-class  tagMCActXianXiaMJInfo(Structure):
+class  tagMCActXianXiaMJLayerInfo(Structure):
     Head = tagHead()
     ActNum = 0    #(BYTE ActNum)// 活动编号
-    StartDate = ""    #(char StartDate[10])// 开始日期 y-m-d
-    EndtDate = ""    #(char EndtDate[10])// 结束日期 y-m-d
-    LimitLV = 0    #(WORD LimitLV)// 限制等级
-    ResetType = 0    #(BYTE ResetType)// 重置类型,0-0点重置;1-5点开,5点重置;2-5点开,0点重置
-    MoneyType = 0    #(BYTE MoneyType)//消耗货币类型
-    MoneyValue = 0    #(WORD MoneyValue)//消耗货币值
-    LayerNum = 0    #(BYTE LayerNum)//当前奖池第几层
+    LayerNum = 0    #(WORD LayerNum)//当前奖池第几层
+    LotteryScore = 0    #(DWORD LotteryScore)//当前抽奖积分
     AwardItemCount = 0    #(BYTE AwardItemCount)
-    AwardItemList = list()    #(vector<tagMCActXianXiaMJAwardItem> AwardItemList)// 奖池物品列表,已生成的,包含已选择的大奖物品
+    AwardItemList = list()    #(vector<tagMCActXianXiaMJLayerItem> AwardItemList)// 奖池物品列表,已生成的,包含已选择的大奖物品
     SuperItemCount = 0    #(BYTE SuperItemCount)
-    SuperItemList = list()    #(vector<tagMCActXianXiaMJAwardItem> SuperItemList)// 大奖物品待选择库,由玩家从库中选择放入奖池的物品;
+    SuperItemList = list()    #(vector<tagMCActXianXiaMJLayerItem> SuperItemList)// 大奖物品待选择库,由玩家从库中选择放入奖池的物品;
     SuperItemCanChooseCount = 0    #(BYTE SuperItemCanChooseCount)// 大奖物品可选择个数
     data = None
 
     def __init__(self):
         self.Clear()
         self.Head.Cmd = 0xAA
-        self.Head.SubCmd = 0x58
+        self.Head.SubCmd = 0x79
         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.LimitLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
-        self.ResetType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        self.MoneyType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        self.MoneyValue,_pos = CommFunc.ReadWORD(_lpData, _pos)
-        self.LayerNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.LayerNum,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.LotteryScore,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.AwardItemCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         for i in range(self.AwardItemCount):
-            temAwardItemList = tagMCActXianXiaMJAwardItem()
+            temAwardItemList = tagMCActXianXiaMJLayerItem()
             _pos = temAwardItemList.ReadData(_lpData, _pos)
             self.AwardItemList.append(temAwardItemList)
         self.SuperItemCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         for i in range(self.SuperItemCount):
-            temSuperItemList = tagMCActXianXiaMJAwardItem()
+            temSuperItemList = tagMCActXianXiaMJLayerItem()
             _pos = temSuperItemList.ReadData(_lpData, _pos)
             self.SuperItemList.append(temSuperItemList)
         self.SuperItemCanChooseCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
@@ -38523,15 +38777,10 @@
         self.Head = tagHead()
         self.Head.Clear()
         self.Head.Cmd = 0xAA
-        self.Head.SubCmd = 0x58
+        self.Head.SubCmd = 0x79
         self.ActNum = 0
-        self.StartDate = ""
-        self.EndtDate = ""
-        self.LimitLV = 0
-        self.ResetType = 0
-        self.MoneyType = 0
-        self.MoneyValue = 0
         self.LayerNum = 0
+        self.LotteryScore = 0
         self.AwardItemCount = 0
         self.AwardItemList = list()
         self.SuperItemCount = 0
@@ -38543,13 +38792,8 @@
         length = 0
         length += self.Head.GetLength()
         length += 1
-        length += 10
-        length += 10
         length += 2
-        length += 1
-        length += 1
-        length += 2
-        length += 1
+        length += 4
         length += 1
         for i in range(self.AwardItemCount):
             length += self.AwardItemList[i].GetLength()
@@ -38564,13 +38808,8 @@
         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.WriteWORD(data, self.LimitLV)
-        data = CommFunc.WriteBYTE(data, self.ResetType)
-        data = CommFunc.WriteBYTE(data, self.MoneyType)
-        data = CommFunc.WriteWORD(data, self.MoneyValue)
-        data = CommFunc.WriteBYTE(data, self.LayerNum)
+        data = CommFunc.WriteWORD(data, self.LayerNum)
+        data = CommFunc.WriteDWORD(data, self.LotteryScore)
         data = CommFunc.WriteBYTE(data, self.AwardItemCount)
         for i in range(self.AwardItemCount):
             data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer())
@@ -38584,13 +38823,8 @@
         DumpString = '''
                                 Head:%s,
                                 ActNum:%d,
-                                StartDate:%s,
-                                EndtDate:%s,
-                                LimitLV:%d,
-                                ResetType:%d,
-                                MoneyType:%d,
-                                MoneyValue:%d,
                                 LayerNum:%d,
+                                LotteryScore:%d,
                                 AwardItemCount:%d,
                                 AwardItemList:%s,
                                 SuperItemCount:%d,
@@ -38600,13 +38834,8 @@
                                 %(
                                 self.Head.OutputString(),
                                 self.ActNum,
-                                self.StartDate,
-                                self.EndtDate,
-                                self.LimitLV,
-                                self.ResetType,
-                                self.MoneyType,
-                                self.MoneyValue,
                                 self.LayerNum,
+                                self.LotteryScore,
                                 self.AwardItemCount,
                                 "...",
                                 self.SuperItemCount,
@@ -38616,8 +38845,8 @@
         return DumpString
 
 
-m_NAtagMCActXianXiaMJInfo=tagMCActXianXiaMJInfo()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActXianXiaMJInfo.Head.Cmd,m_NAtagMCActXianXiaMJInfo.Head.SubCmd))] = m_NAtagMCActXianXiaMJInfo
+m_NAtagMCActXianXiaMJLayerInfo=tagMCActXianXiaMJLayerInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActXianXiaMJLayerInfo.Head.Cmd,m_NAtagMCActXianXiaMJLayerInfo.Head.SubCmd))] = m_NAtagMCActXianXiaMJLayerInfo
 
 
 #------------------------------------------------------
@@ -39825,6 +40054,238 @@
 
 
 #------------------------------------------------------
+# AA 80 仙匣秘境跨服活动信息 #tagMCCrossActXianXiaMJInfo
+
+class  tagMCCrossActXianXiaMJItem(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(tagMCCrossActXianXiaMJItem)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 80 仙匣秘境跨服活动信息 //tagMCCrossActXianXiaMJInfo:
+                                ItemID:%d,
+                                ItemCount:%d,
+                                IsBind:%d
+                                '''\
+                                %(
+                                self.ItemID,
+                                self.ItemCount,
+                                self.IsBind
+                                )
+        return DumpString
+
+
+class  tagMCCrossActXianXiaMJBillard(Structure):
+    Rank = 0    #(DWORD Rank)// 名次,1-代表第一名;支持夸段,如1,3 代表第1名,第2~3名
+    Count = 0    #(BYTE Count)// 奖励物品数
+    AwardItemList = list()    #(vector<tagMCCrossActXianXiaMJItem> 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 = tagMCCrossActXianXiaMJItem()
+            _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  tagMCCrossActXianXiaMJInfo(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
+    IsDayReset = 0    #(BYTE IsDayReset)// 是否每天重置
+    RankLimitPersonal = 0    #(WORD RankLimitPersonal)// 个人榜上榜积分保底限制;
+    PersonalBillCount = 0    #(BYTE PersonalBillCount)
+    PersonalBillboardInfoList = list()    #(vector<tagMCCrossActXianXiaMJBillard> PersonalBillboardInfoList)// 个人榜单奖励信息列表,如果没有代表本次活动没有该榜奖励
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x80
+        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.IsDayReset,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.RankLimitPersonal,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.PersonalBillCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.PersonalBillCount):
+            temPersonalBillboardInfoList = tagMCCrossActXianXiaMJBillard()
+            _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 = 0x80
+        self.ServerInfoLen = 0
+        self.ServerIDRangeInfo = ""
+        self.GroupValue1 = 0
+        self.StartDate = ""
+        self.EndtDate = ""
+        self.JoinStartTime = ""
+        self.JoinEndTime = ""
+        self.IsDayReset = 0
+        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 += 1
+        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.WriteBYTE(data, self.IsDayReset)
+        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,
+                                IsDayReset:%d,
+                                RankLimitPersonal:%d,
+                                PersonalBillCount:%d,
+                                PersonalBillboardInfoList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.ServerInfoLen,
+                                self.ServerIDRangeInfo,
+                                self.GroupValue1,
+                                self.StartDate,
+                                self.EndtDate,
+                                self.JoinStartTime,
+                                self.JoinEndTime,
+                                self.IsDayReset,
+                                self.RankLimitPersonal,
+                                self.PersonalBillCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCCrossActXianXiaMJInfo=tagMCCrossActXianXiaMJInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCCrossActXianXiaMJInfo.Head.Cmd,m_NAtagMCCrossActXianXiaMJInfo.Head.SubCmd))] = m_NAtagMCCrossActXianXiaMJInfo
+
+
+#------------------------------------------------------
 # AA 25 每日礼包活动信息 #tagMCDailyGiftbagInfo
 
 class  tagMCDailyGiftbagItem(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index 2a3b3c0..76fbc2a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -1508,17 +1508,29 @@
                         ("DWORD", "CfgID", 1),
                         ("char", "StartDate", 0),
                         ("char", "EndDate", 0),
-                        ("BYTE", "ResetType", 0),
+                        ("char", "JoinStartTime", 0),
+                        ("char", "JoinEndTime", 0),
+                        ("BYTE", "IsDayReset", 0),
                         ("WORD", "LVLimit", 0),
+                        ("DWORD", "UseItemID", 0),
                         ("list", "UseMoneyInfo", 0),
                         ("BYTE", "TemplateID", 0),
+                        ("WORD", "PersonalTemplateID", 0),
+                        ("WORD", "LotteryAddScore", 0),
+                        ("WORD", "LayerAddScore", 0),
+                        ),
+
+                "ActXianXiaMJBillTemp":(
+                        ("DWORD", "TemplateID", 1),
+                        ("BYTE", "Rank", 0),
+                        ("list", "AwardItemList", 0),
                         ),
 
                 "ActXianXiaMJAward":(
                         ("DWORD", "TemplateID", 1),
                         ("BYTE", "AwardLibType", 0),
-                        ("BYTE", "AwardItemCount", 0),
-                        ("BYTE", "UnlockAwardLimitTimes", 0),
+                        ("list", "AwardItemCountList", 0),
+                        ("list", "UnlockAwardLimitTimesList", 0),
                         ("BYTE", "AwardLibWeight", 0),
                         ("dict", "LibItemInfo", 0),
                         ("dict", "ItemLayerLimitInfo", 0),
@@ -1952,6 +1964,8 @@
                         ("BYTE", "ResetType", 0),
                         ("list", "CTGIDList", 0),
                         ("dict", "CTGCountAwardInfo", 0),
+                        ("list", "CTGCountDayResetList", 0),
+                        ("DWORD", "ActShopType", 0),
                         ),
 
                 "ActTask":(
@@ -4552,10 +4566,27 @@
     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 GetResetType(self): return self.attrTuple[3] # 重置类型,0-0点重置;1-5点重置 BYTE
-    def GetLVLimit(self): return self.attrTuple[4] # 限制等级 WORD
-    def GetUseMoneyInfo(self): return self.attrTuple[5] # 消耗货币信息 list
-    def GetTemplateID(self): return self.attrTuple[6] # 模板ID BYTE
+    def GetJoinStartTime(self): return self.attrTuple[3] # 参与开始时间点 char
+    def GetJoinEndTime(self): return self.attrTuple[4] # 参与结束时间点 char
+    def GetIsDayReset(self): return self.attrTuple[5] # 是否每天重置 BYTE
+    def GetLVLimit(self): return self.attrTuple[6] # 限制等级 WORD
+    def GetUseItemID(self): return self.attrTuple[7] # 消耗物品ID DWORD
+    def GetUseMoneyInfo(self): return self.attrTuple[8] # 消耗货币信息 list
+    def GetTemplateID(self): return self.attrTuple[9] # 模板ID BYTE
+    def GetPersonalTemplateID(self): return self.attrTuple[10] # 个人排行模板编号 WORD
+    def GetLotteryAddScore(self): return self.attrTuple[11] # 每次抽奖加积分 WORD
+    def GetLayerAddScore(self): return self.attrTuple[12] # 每次跨层加积分 WORD
+
+# 仙匣秘境榜单模版表
+class IPY_ActXianXiaMJBillTemp():
+    
+    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_ActXianXiaMJAward():
@@ -4566,8 +4597,8 @@
         
     def GetTemplateID(self): return self.attrTuple[0] # 奖池模板编号 DWORD
     def GetAwardLibType(self): return self.attrTuple[1] # 奖励库类型 BYTE
-    def GetAwardItemCount(self): return self.attrTuple[2] # 选择个数 BYTE
-    def GetUnlockAwardLimitTimes(self): return self.attrTuple[3] # 抽X次后可产出(本层) BYTE
+    def GetAwardItemCountList(self): return self.attrTuple[2] # 层选择个数列表  层1物品数|层2|… list
+    def GetUnlockAwardLimitTimesList(self): return self.attrTuple[3] # 层抽X次后可产出(本层) 层1限制|层2|… list
     def GetAwardLibWeight(self): return self.attrTuple[4] # 产出该库外权重 BYTE
     def GetLibItemInfo(self): return self.attrTuple[5] # 本库物品随机库内权重(先随机库外权重,若产出再随机库内权重) dict
     def GetItemLayerLimitInfo(self): return self.attrTuple[6] # 物品产出奖池层限制 {物品ID:大于等于X层可产出, ...} dict
@@ -5250,7 +5281,9 @@
     def GetIsDayReset(self): return self.attrTuple[4] # 是否每天重置 BYTE
     def GetResetType(self): return self.attrTuple[5] # 重置类型,0-0点重置;1-5点重置 BYTE
     def GetCTGIDList(self): return self.attrTuple[6] # 充值ID列表 [ctgID, ...] list
-    def GetCTGCountAwardInfo(self): return self.attrTuple[7] # 累计充值次数额外奖励 dict
+    def GetCTGCountAwardInfo(self): return self.attrTuple[7] # 累计充值次数额外奖励 dict
+    def GetCTGCountDayResetList(self): return self.attrTuple[8] # 每日重置累充次数列表 list
+    def GetActShopType(self): return self.attrTuple[9] # 商城类型 DWORD
 
 # 任务活动时间表
 class IPY_ActTask():
@@ -6127,6 +6160,7 @@
         self.__LoadFileData("ActBossTrial", onlyCheck)
         self.__LoadFileData("ActBossTrialTemplate", onlyCheck)
         self.__LoadFileData("ActXianXiaMJ", onlyCheck)
+        self.__LoadFileData("ActXianXiaMJBillTemp", onlyCheck)
         self.__LoadFileData("ActXianXiaMJAward", onlyCheck)
         self.__LoadFileData("ActGodGift", onlyCheck)
         self.__LoadFileData("ActGodGiftAward", onlyCheck)
@@ -7415,6 +7449,13 @@
         self.CheckLoadData("ActXianXiaMJ")
         return self.ipyActXianXiaMJCache[index]
 
+    def GetActXianXiaMJBillTempCount(self):
+        self.CheckLoadData("ActXianXiaMJBillTemp")
+        return self.ipyActXianXiaMJBillTempLen
+    def GetActXianXiaMJBillTempByIndex(self, index):
+        self.CheckLoadData("ActXianXiaMJBillTemp")
+        return self.ipyActXianXiaMJBillTempCache[index]
+
     def GetActXianXiaMJAwardCount(self):
         self.CheckLoadData("ActXianXiaMJAward")
         return self.ipyActXianXiaMJAwardLen
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 e86d140..a0826a3 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -1076,6 +1076,8 @@
     
     # boss凭证
     PlayerActBossTrial.OnMixFirstLogin(curPlayer)
+    # 仙匣秘境
+    PlayerActXianXiaMJ.OnMixFirstLogin(curPlayer)
     # 重置玩家改名次数
     #UpdatePlayerName.ResetChangeNameCnt(curPlayer)
     return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActBuyCountGift.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActBuyCountGift.py
index 3a1da3e..b5ce0a0 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActBuyCountGift.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActBuyCountGift.py
@@ -20,6 +20,7 @@
 import PlayerControl
 import IpyGameDataPY
 import ChPyNetSendPack
+import FunctionNPCCommon
 import DataRecordPack
 import NetPackCommon
 import ItemControler
@@ -27,6 +28,27 @@
 import PlayerCoin
 import GameWorld
 import ChConfig
+
+def OnDay(curPlayer):
+    for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_BuyCountGift, {}).values():
+        if not actInfo.get(ShareDefine.ActKey_State):
+            continue
+        actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)
+        cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)
+        ipyData = IpyGameDataPY.GetIpyGameData("ActBuyCountGift", cfgID)
+        if not ipyData:
+            continue
+        CTGCountDayResetList = ipyData.GetCTGCountDayResetList()
+        if not CTGCountDayResetList:
+            continue
+        
+        awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BuyCountGiftAward % actNum)
+        for buyCount in CTGCountDayResetList:
+            awardRecord = GameWorld.SetBitValue(awardRecord, buyCount, 0)
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BuyCountGiftAward % actNum, awardRecord)
+        Sync_BuyCountGiftPlayerInfo(curPlayer, actNum)
+        
+    return
 
 def OnPlayerLogin(curPlayer):
     
@@ -88,6 +110,10 @@
         return
     resetCTGIDList = ipyData.GetCTGIDList()
     PlayerCoin.DoResetCTGCountByIDList(curPlayer, "ActBuyCountGift", resetCTGIDList)
+    
+    shopType = ipyData.GetActShopType()
+    if shopType:
+        FunctionNPCCommon.ResetShopItemBuyCountByShopType(curPlayer, [shopType])
     return
 
 def OnGetBuyCountGiftAward(curPlayer, buyCount, actNum):
@@ -177,6 +203,7 @@
     actInfo.LimitLV = ipyData.GetLVLimit()
     actInfo.IsDayReset = ipyData.GetIsDayReset()
     actInfo.ResetType = ipyData.GetResetType()
+    actInfo.ShopType = ipyData.GetActShopType()
     actInfo.CTGIDList = ipyData.GetCTGIDList()
     actInfo.CTGIDCount = len(actInfo.CTGIDList)
     
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 7599b0b..27088cf 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActTask.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActTask.py
@@ -111,6 +111,43 @@
         return taskIDMax / 31
     return defKeyNum
 
+def UpdActTaskValue(curPlayer, taskType, updValue):
+    ## 更新任务活动进度值
+    
+    playerID = curPlayer.GetPlayerID()
+    for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_ActTask, {}).values():
+        actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)
+        if not actInfo.get(ShareDefine.ActKey_State):
+            continue
+        
+        cfgID = actInfo.get(ShareDefine.ActKey_CfgID)
+        ipyData = IpyGameDataPY.GetIpyGameData("ActTask", cfgID)
+        if not ipyData:
+            continue
+        templateID = ipyData.GetTemplateID()
+        
+        taskIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActTaskTemp", templateID)
+        if not taskIpyDataList:
+            continue
+        
+        needValueMax = 0
+        for taskIpyData in taskIpyDataList:
+            if taskIpyData.GetTaskType() != taskType:
+                continue
+            needValue = taskIpyData.GetNeedValue()
+            if needValue > needValueMax:
+                needValueMax = needValue
+                
+        curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActTaskValue % (actNum, taskType))
+        if updValue == curValue or needValueMax <= 0:
+            continue
+        
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActTaskValue % (actNum, taskType), updValue)
+        GameWorld.DebugLog("更新任务活动任务进度值: actNum=%s,taskType=%s,updValue=%s" % (actNum, taskType, updValue), playerID)
+        Sync_ActTaskPlayerValueInfo(curPlayer, actNum, [taskType])
+        
+    return
+    
 def AddActTaskValue(curPlayer, taskType, addValue):
     ## 增加任务活动进度值
     
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActXianXiaMJ.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActXianXiaMJ.py
index a10a9f0..7a61643 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActXianXiaMJ.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActXianXiaMJ.py
@@ -20,12 +20,31 @@
 import PlayerControl
 import IpyGameDataPY
 import ItemControler
+import CrossRealmPlayer
+import PlayerBillboard
 import ChPyNetSendPack
 import NetPackCommon
+import PlayerActTask
+import ItemCommon
 import GameWorld
 import ChConfig
 
 Def_SuperLibType = 9 # 大奖库类型固定为9
+
+def OnMixFirstLogin(curPlayer):
+    
+    for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_XianXiaMJ, {}).values():
+        actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)
+        if not actInfo.get(ShareDefine.ActKey_State):
+            continue
+        score = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJScore % actNum)
+        if not score:
+            continue
+        GameWorld.Log("仙匣秘境合服首登同步积分榜单: actNum=%s,score=%s" % (actNum, score), curPlayer.GetPlayerID())
+        PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_XianXiaMJScore, score, autoSort=True)
+        break
+    
+    return
 
 def OnPlayerLogin(curPlayer):
     
@@ -36,6 +55,11 @@
             # 活动中同步活动信息
             if actInfo.get(ShareDefine.ActKey_State):
                 Sync_XianXiaMJActionInfo(curPlayer, actNum)
+                Sync_XianXiaMJLayerInfo(curPlayer, actNum)
+                
+    if not __CheckPlayerCrossActXianXiaMJ(curPlayer):
+        Sync_CrossActXianXiaMJActionInfo(curPlayer)
+        
     return
 
 def RefreshXianXiaMJActionInfo(actNum):
@@ -63,8 +87,7 @@
     if actID == playerActID:
         GameWorld.DebugLog("仙匣秘境活动ID不变,不处理!actNum=%s,actID=%s" % (actNum, actID), playerID)
         
-        layerInfoValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJAwardLayerInfo % actNum)
-        layerNum = layerInfoValue % 100
+        layerNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJLayerNum % actNum)
         if state and layerNum <= 0:
             GameWorld.Log("仙匣秘境活动中但首层奖池未刷新初始化,尝试刷新!actNum=%s,actID=%s" % (actNum, actID), playerID)
             __InitFirstLayerData(curPlayer, actNum, actInfo)
@@ -77,10 +100,15 @@
                        % (actNum, actID, playerActID, state, cfgID), playerID)
     
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJID % actNum, actID)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJWorldLV % actNum, actWorldLV)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJAwardLayerInfo % actNum, 0)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJWorldLV % actNum, 0)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJLayerNum % actNum, 0)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJPlayCount % actNum, 0)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJScore % actNum, 0)
     
-    __InitFirstLayerData(curPlayer, actNum, actInfo)
+    if state:
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJWorldLV % actNum, actWorldLV)
+        Sync_XianXiaMJActionInfo(curPlayer, actNum)
+        __InitFirstLayerData(curPlayer, actNum, actInfo)
     return True
 
 def __InitFirstLayerData(curPlayer, actNum, actInfo):
@@ -95,7 +123,7 @@
     if awardIpyDataList:
         for awardIpyData in awardIpyDataList:
             libType = awardIpyData.GetAwardLibType()
-            libItemCount = awardIpyData.GetAwardItemCount()
+            libItemCount = max(awardIpyData.GetAwardItemCountList())
             for num in xrange(libItemCount):
                 PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJAwardItemInfo % (actNum, libType, num), 0)
                 
@@ -105,10 +133,68 @@
                 
         # 活动中,生成新奖池    
         if state:
-            __RefreshXianXiaMJAwardPool(curPlayer, actInfo, awardIpyDataList)
+            __RefreshXianXiaMJAwardPool(curPlayer, actInfo, ipyData, awardIpyDataList)
             
-    Sync_XianXiaMJActionInfo(curPlayer, actNum)
+    Sync_XianXiaMJLayerInfo(curPlayer, actNum)
     return True
+
+def RefreshCrossActXianXiaMJInfo():
+    ## 收到GameServer同步的活动信息,刷新活动信息
+    playerManager = GameWorld.GetPlayerManager()
+    for index in xrange(playerManager.GetPlayerCount()):
+        curPlayer = playerManager.GetPlayerByIndex(index)
+        if curPlayer.GetID() == 0:
+            continue
+        __CheckPlayerCrossActXianXiaMJ(curPlayer)
+        
+    return
+
+def __CheckPlayerCrossActXianXiaMJ(curPlayer):
+    
+    playerID = curPlayer.GetPlayerID()
+    
+    actInfo = CrossRealmPlayer.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_XianXiaMJ)
+    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_XianXiaMJID) # 玩家身上的活动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_XianXiaMJID, actID)
+    
+    if not state:
+        CrossRealmPlayer.NotifyCrossActEnd(curPlayer, ShareDefine.CrossActName_XianXiaMJ)
+        
+    Sync_CrossActXianXiaMJActionInfo(curPlayer)
+    return True
+
+def SendToGameServer_XianXiaMJ(curPlayer, msgType, dataMsg=""):
+    playerID = curPlayer.GetPlayerID()
+    msgList = str([msgType, dataMsg])
+    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "XianXiaMJ", msgList, len(msgList))
+    GameWorld.Log("仙匣秘境发送GameServer: %s, %s" % (msgType, dataMsg), playerID)
+    return
+
+def AddPlayerLotteryScore(curPlayer, actNum, addScore):
+    if addScore <= 0:
+        return 0
+    lotteryScore = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJScore % actNum)
+    updLotteryScore = lotteryScore + addScore
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJScore % actNum, updLotteryScore)
+    PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_XianXiaMJScore, updLotteryScore, autoSort=True)
+    SendToGameServer_XianXiaMJ(curPlayer, "AddLotteryScore", [addScore, updLotteryScore])
+    return updLotteryScore
+
+def GetLayerSetByList(layerNum, setList):
+    if not setList:
+        return 0
+    return setList[layerNum - 1] if len(setList) >= layerNum else setList[-1]
 
 #// AA 16 仙匣秘境活动选择大奖 #tagCMActXianXiaMJSuperItem
 #
@@ -139,7 +225,8 @@
     templateID = ipyData.GetTemplateID()
     if not templateID:
         return
-    
+        
+    layerNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJLayerNum % actNum)
     actWorldLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJWorldLV % actNum)
     awardIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActXianXiaMJAward", templateID)
     if not awardIpyDataList:
@@ -156,10 +243,10 @@
         GameWorld.ErrLog("没有配置仙匣秘境活动大奖库! cfgID=%s,actNum=%s,templateID=%s" % (cfgID, actNum, templateID))
         return
     
-    superLibItemCount = superAwardIpyData.GetAwardItemCount()
+    superLibItemCount = GetLayerSetByList(layerNum, superAwardIpyData.GetAwardItemCountList())
     if len(superItemIDList) != superLibItemCount:
-        GameWorld.ErrLog("仙匣秘境活动选择大奖个数错误! cfgID=%s,actNum=%s,templateID=%s,superLibItemCount=%s,reqSuperItemIDList=%s" 
-                         % (cfgID, actNum, templateID, superLibItemCount, superItemIDList))        
+        GameWorld.ErrLog("仙匣秘境活动选择大奖个数错误! cfgID=%s,actNum=%s,templateID=%s,layerNum=%s,superLibItemCount=%s,reqSuperItemIDList=%s" 
+                         % (cfgID, actNum, templateID, layerNum, superLibItemCount, superItemIDList))        
         return
     
     posNumItemIDList = [] # 已抽中的大奖物品ID
@@ -179,8 +266,6 @@
             
     GameWorld.DebugLog("    已抽中的大奖ID! %s" % posNumItemIDList)
     
-    layerInfoValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJAwardLayerInfo % actNum)
-    layerNum = layerInfoValue % 100
     
     libItemDict = __GetXianXiaMJAwardLibItem(superAwardIpyData.GetLibItemInfo(), actWorldLV)
     layerLimitInfo = superAwardIpyData.GetItemLayerLimitInfo()
@@ -233,7 +318,7 @@
         if not replaceSuperItemIDList:
             break
         
-    Sync_XianXiaMJActionInfo(curPlayer, actNum)
+    Sync_XianXiaMJLayerInfo(curPlayer, actNum)
     return
 
 #// AA 18 仙匣秘境活动奖池刷新 #tagCMActXianXiaMJAwardPoolRefresh
@@ -267,21 +352,19 @@
     if not awardIpyDataList:
         return
     
-    if not __RefreshXianXiaMJAwardPool(curPlayer, actInfo, awardIpyDataList):
+    if not __RefreshXianXiaMJAwardPool(curPlayer, actInfo, ipyData, awardIpyDataList):
         return
     
-    Sync_XianXiaMJActionInfo(curPlayer, actNum)
+    Sync_XianXiaMJLayerInfo(curPlayer, actNum)
     return
 
-def __RefreshXianXiaMJAwardPool(curPlayer, actInfo, awardIpyDataList):
+def __RefreshXianXiaMJAwardPool(curPlayer, actInfo, ipyData, awardIpyDataList):
     ## 刷新奖池物品
     
     cfgID = actInfo.get(ShareDefine.ActKey_CfgID)
     actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)
     actWorldLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJWorldLV % actNum)
-    
-    layerInfoValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJAwardLayerInfo % actNum)
-    layerNum = layerInfoValue % 100
+    layerNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJLayerNum % actNum)
     
     GameWorld.DebugLog("刷新仙匣秘境奖池物品: cfgID=%s,actNum=%s,actWorldLV=%s,layerNum=%s" % (cfgID, actNum, actWorldLV, layerNum))
     
@@ -293,9 +376,13 @@
             if libType != Def_SuperLibType:
                 continue
             superLib = True
-            libItemCount = awardIpyData.GetAwardItemCount()
+            libItemCount = GetLayerSetByList(layerNum, awardIpyData.GetAwardItemCountList())
             for num in xrange(libItemCount):
                 itemInfoValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJAwardItemInfo % (actNum, libType, num))
+                if not itemInfoValue:
+                    GameWorld.ErrLog("未选择大奖!无法刷新奖池! cfgID=%s,actNum=%s,layerNum=%s,num=%s" 
+                                     % (cfgID, actNum, layerNum, num))
+                    return
                 itemID, posNum = itemInfoValue / 100, itemInfoValue % 100
                 if itemID and not posNum:
                     GameWorld.ErrLog("有大奖未抽中!无法刷新奖池! cfgID=%s,actNum=%s,layerNum=%s,num=%s,itemID=%s,posNum=%s" 
@@ -306,16 +393,13 @@
             GameWorld.ErrLog("奖池配置没有大奖库!无法刷新奖池! cfgID=%s,actNum=%s,layerNum=%s,superLib=%s" % (cfgID, actNum, layerNum, superLib))
             return
         
-    layerNum += 1 # 可刷新奖池,默认+1层
-    if layerNum > 99:
-        GameWorld.ErrLog("奖池层数达到上限,无法刷新! cfgID=%s,actNum=%s,layerNum=%s" % (cfgID, actNum, layerNum))
-        return
+    layerNum = min(layerNum + 1, 65530) # 可刷新奖池,默认+1层
     GameWorld.DebugLog("    可刷新奖池!下一层: layerNum=%s" % (layerNum))
     
     refreshLibDict = {}
     for awardIpyData in awardIpyDataList:
         libType = awardIpyData.GetAwardLibType()
-        libItemCount = awardIpyData.GetAwardItemCount()
+        libItemCount = GetLayerSetByList(layerNum, awardIpyData.GetAwardItemCountList())
         libItemDict = __GetXianXiaMJAwardLibItem(awardIpyData.GetLibItemInfo(), actWorldLV)
         layerLimitInfo = awardIpyData.GetItemLayerLimitInfo()
         awardTimesTotalInfo = awardIpyData.GetItemAwardTimesTotalInfo()
@@ -368,9 +452,12 @@
             GameWorld.DebugLog("        随机生成奖品! libType=%s,num=%s,randItemID=%s" % (libType, num, randItemID))
             
     playCount = 0 # 每层重置抽奖次数
-    layerInfoValue = playCount * 100 + layerNum
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJAwardLayerInfo % actNum, layerInfoValue)
-    GameWorld.DebugLog("    刷新完成! playCount=%s,layerNum=%s,layerInfoValue=%s" % (playCount, layerNum, layerInfoValue))
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJLayerNum % actNum, layerNum)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJPlayCount % actNum, playCount)
+    GameWorld.DebugLog("    刷新完成! layerNum=%s,playCount=%s" % (layerNum, playCount))
+    PlayerActTask.UpdActTaskValue(curPlayer, ChConfig.ActTaskType_XianXiaMJLayer, layerNum)
+    if layerNum > 1:
+        AddPlayerLotteryScore(curPlayer, actNum, ipyData.GetLayerAddScore())
     return True
 
 #// AA 17 仙匣秘境活动抽奖 #tagCMActXianXiaMJLottery
@@ -396,6 +483,17 @@
         GameWorld.DebugLog("    非活动中!")
         return
     
+    playerID = curPlayer.GetPlayerID()
+    crossActInfo = CrossRealmPlayer.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_XianXiaMJ)
+    if crossActInfo.get(ShareDefine.ActKey_State, 0):
+        if crossActInfo.get(ShareDefine.ActKey_StateJoin) != ShareDefine.ActStateJoin_Start:
+            GameWorld.Log("跨服仙匣秘境非参与活动中: actNum=%s" % actNum, playerID)
+            return
+    else:
+        if actInfo.get(ShareDefine.ActKey_StateJoin) != ShareDefine.ActStateJoin_Start:
+            GameWorld.Log("仙匣秘境非参与活动中: actNum=%s" % actNum, playerID)
+            return
+        
     cfgID = actInfo.get(ShareDefine.ActKey_CfgID)
     ipyData = IpyGameDataPY.GetIpyGameData("ActXianXiaMJ", cfgID)
     if not ipyData:
@@ -410,21 +508,36 @@
     if not awardIpyDataList:
         return
     
+    checkUseMoney = False
+    costItemID = ipyData.GetUseItemID()
+    costItemCount = 1
+    if costItemID:
+        costItemIndexList, bindCnt, unBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, costItemID, costItemCount)
+        lackCnt = costItemCount - bindCnt - unBindCnt
+        if lackCnt > 0:
+            checkUseMoney = True
+    else:
+        checkUseMoney = True
+        
     costMoneyType, costMoneyValue = ipyData.GetUseMoneyInfo()
-    if not PlayerControl.HaveMoney(curPlayer, costMoneyType, costMoneyValue):
-        GameWorld.DebugLog("    货币不足,无法抽奖! costMoneyType=%s,costMoneyValue(%s) > curMoneyValue(%s)" 
-                           % (costMoneyType, costMoneyValue, PlayerControl.GetMoney(curPlayer, costMoneyType)))
-        return
-    
-    layerInfoValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJAwardLayerInfo % actNum)
-    playCount, layerNum = layerInfoValue / 100, layerInfoValue % 100
+    if checkUseMoney:
+        if not costMoneyType or not costMoneyValue:
+            return
+        if not PlayerControl.HaveMoney(curPlayer, costMoneyType, costMoneyValue):
+            GameWorld.DebugLog("    货币不足,无法抽奖! costMoneyType=%s,costMoneyValue(%s) > curMoneyValue(%s)" 
+                               % (costMoneyType, costMoneyValue, PlayerControl.GetMoney(curPlayer, costMoneyType)))
+            return
+        
+    layerNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJLayerNum % actNum)
+    playCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJPlayCount % actNum)
+    GameWorld.DebugLog("layerNum=%s,playCount=%s" % (layerNum, playCount))
     
     posNumMax = 0
     randLibItemDict = {}
     for awardIpyData in awardIpyDataList:
         libType = awardIpyData.GetAwardLibType()
-        libItemCount = awardIpyData.GetAwardItemCount()
-        unlockLimitTimes = awardIpyData.GetUnlockAwardLimitTimes()
+        libItemCount = GetLayerSetByList(layerNum, awardIpyData.GetAwardItemCountList())
+        unlockLimitTimes = GetLayerSetByList(layerNum, awardIpyData.GetUnlockAwardLimitTimesList())
         libWeight = awardIpyData.GetAwardLibWeight()
         posNumMax += libItemCount
         
@@ -486,9 +599,14 @@
         return
     itemID, itemCount, num, isAddTimes = randItemInfo
     
-    # 扣除抽奖消耗环保值
-    PlayerControl.PayMoney(curPlayer, costMoneyType, costMoneyValue, "ActXianXiaMJ")
-    
+    # 扣除消耗
+    if checkUseMoney:
+        PlayerControl.PayMoney(curPlayer, costMoneyType, costMoneyValue, "ActXianXiaMJ")
+        GameWorld.DebugLog("消耗货币: costMoneyType=%s,costMoneyValue=%s" % (costMoneyType, costMoneyValue))
+    else:
+        GameWorld.DebugLog("消耗道具: costItemID=%s,costItemCount=%s %s" % (costItemID, costItemCount, costItemIndexList))
+        ItemCommon.DelCostItemByBind(curPlayer, costItemIndexList, bindCnt, unBindCnt, costItemCount, "XianXiaMJ")
+        
     # 更新已抽中值
     updItemInfoValue = itemID * 100 + reqPosNum
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJAwardItemInfo % (actNum, libType, num), updItemInfoValue)
@@ -499,21 +617,26 @@
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJAwardItemTimes % (actNum, libType, itemID), totalTimesNow)
         
     playCount += 1
-    layerInfoValue = playCount * 100 + layerNum
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJAwardLayerInfo % actNum, layerInfoValue)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJPlayCount % actNum, playCount)
     
-    GameWorld.DebugLog("    抽中物品: layerNum=%s,libType=%s,itemID=%s,itemCount=%s,num=%s,reqPosNum=%s,updItemInfoValue=%s,totalTimesNow=%s,playCount=%s(%s)" 
-                       % (layerNum, libType, itemID, itemCount, num, reqPosNum, updItemInfoValue, totalTimesNow, playCount, layerInfoValue))
+    GameWorld.DebugLog("    抽中物品: layerNum=%s,libType=%s,itemID=%s,itemCount=%s,num=%s,reqPosNum=%s,updItemInfoValue=%s,totalTimesNow=%s,playCount=%s" 
+                       % (layerNum, libType, itemID, itemCount, num, reqPosNum, updItemInfoValue, totalTimesNow, playCount))
     
     # 给物品
     isAuctionItem = 0
     itemList = [[itemID, itemCount, isAuctionItem]]
     ItemControler.GivePlayerItemOrMail(curPlayer, itemList, event=["tagActXianXiaMJLottery", False, {}])
     
+    # 任务
+    PlayerActTask.AddActTaskValue(curPlayer, ChConfig.ActTaskType_XianXiaMJLottery, 1)
+    
     # 广播
     if libType == Def_SuperLibType:
         PlayerControl.WorldNotify(0, "XianXiaMJ%s" % actNum, [curPlayer.GetPlayerName(), itemID, itemCount])
         
+    # 积分
+    lotteryScore = AddPlayerLotteryScore(curPlayer, actNum, ipyData.GetLotteryAddScore())
+    
     # 通知抽奖结果
     clientPack = ChPyNetSendPack.tagMCActXianXiaMJAwardItemResult()
     clientPack.ActNum = actNum
@@ -522,6 +645,7 @@
     clientPack.ItemCount = itemCount
     clientPack.PosNum = reqPosNum
     clientPack.TotalTimesNow = totalTimesNow
+    clientPack.LotteryScore = lotteryScore
     NetPackCommon.SendFakePack(curPlayer, clientPack)
     return
 
@@ -536,33 +660,67 @@
     ipyData = IpyGameDataPY.GetIpyGameData("ActXianXiaMJ", cfgID)
     if not ipyData:
         return
-    
-    templateID = ipyData.GetTemplateID()
-    if not templateID:
-        return
     costMoneyType, costMoneyValue = ipyData.GetUseMoneyInfo()
     
-    actWorldLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJWorldLV % actNum)
-    startDateStr, endDateStr = GameWorld.GetOperationActionDateStr(ipyData)
+    personalTempID = ipyData.GetPersonalTemplateID()
+    personalTempIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActXianXiaMJBillTemp", personalTempID) if personalTempID else []
     
-    layerInfoValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJAwardLayerInfo % actNum)
-    layerNum = layerInfoValue % 100
+    startDateStr, endDateStr = GameWorld.GetOperationActionDateStr(ipyData)
     
     clientPack = ChPyNetSendPack.tagMCActXianXiaMJInfo()
     clientPack.ActNum = actNum
     clientPack.StartDate = startDateStr
     clientPack.EndtDate = endDateStr
+    clientPack.JoinStartTime = ipyData.GetJoinStartTime()
+    clientPack.JoinEndTime = ipyData.GetJoinEndTime()
+    clientPack.IsDayReset = ipyData.GetIsDayReset()
     clientPack.LimitLV = ipyData.GetLVLimit()
-    clientPack.ResetType = ipyData.GetResetType()
+    clientPack.UseItemID = ipyData.GetUseItemID()
     clientPack.MoneyType = costMoneyType
     clientPack.MoneyValue = costMoneyValue
+    clientPack.LotteryAddScore = ipyData.GetLotteryAddScore()
+    clientPack.LayerAddScore = ipyData.GetLayerAddScore()
+    
+    clientPack.PersonalBillboardInfoList = __GetTempRankBillPackList(personalTempIpyDataList)
+    clientPack.PersonalBillCount = len(clientPack.PersonalBillboardInfoList)
+    NetPackCommon.SendFakePack(curPlayer, clientPack)
+    return
+
+def __GetXianXiaMJAwardLibItem(libItemInfo, actWorldLV):
+    ## 获取奖励库物品信息字典,支持按世界等级范围配置的格式
+    keyList = libItemInfo.keys()
+    if not keyList:
+        return {}
+    if isinstance(keyList[0], tuple) and len(keyList[0]) == 2:
+        return GameWorld.GetDictValueByRangeKey(libItemInfo, actWorldLV, {})
+    return libItemInfo
+
+def Sync_XianXiaMJLayerInfo(curPlayer, actNum):
+    
+    actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_XianXiaMJ, actNum)
+    if not actInfo.get(ShareDefine.ActKey_State):
+        return
+    cfgID = actInfo.get(ShareDefine.ActKey_CfgID)
+    ipyData = IpyGameDataPY.GetIpyGameData("ActXianXiaMJ", cfgID)
+    if not ipyData:
+        return
+    
+    templateID = ipyData.GetTemplateID()
+    if not templateID:
+        return
+    actWorldLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJWorldLV % actNum)
+    layerNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJLayerNum % actNum)
+    
+    clientPack = ChPyNetSendPack.tagMCActXianXiaMJLayerInfo()
+    clientPack.ActNum = actNum
     clientPack.LayerNum = layerNum
+    clientPack.LotteryScore = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJScore % actNum)
     clientPack.AwardItemList = [] # 奖池物品列表
     awardIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActXianXiaMJAward", templateID)
     if awardIpyDataList:
         for awardIpyData in awardIpyDataList:
             libType = awardIpyData.GetAwardLibType()
-            libItemCount = awardIpyData.GetAwardItemCount()
+            libItemCount = GetLayerSetByList(layerNum, awardIpyData.GetAwardItemCountList())
             libItemDict = __GetXianXiaMJAwardLibItem(awardIpyData.GetLibItemInfo(), actWorldLV)
             layerLimitInfo = awardIpyData.GetItemLayerLimitInfo()
             awardTimesTotalInfo = awardIpyData.GetItemAwardTimesTotalInfo()
@@ -577,27 +735,27 @@
                     continue
                 libItemInfo = libItemDict[itemID]
                 
-                awardItem = ChPyNetSendPack.tagMCActXianXiaMJAwardItem()
-                awardItem.ItemLibType = libType
-                awardItem.ItemID = itemID
-                awardItem.ItemCount = libItemInfo[0]
-                awardItem.PosNum = posNum
-                awardItem.TotalTimesMax = awardTimesTotalInfo.get(itemID, 0)
-                awardItem.TotalTimesNow = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJAwardItemTimes % (actNum, libType, itemID))
-                awardItem.LayerLimit = layerLimitInfo.get(itemID, 0)
-                clientPack.AwardItemList.append(awardItem)
+                layerItem = ChPyNetSendPack.tagMCActXianXiaMJLayerItem()
+                layerItem.ItemLibType = libType
+                layerItem.ItemID = itemID
+                layerItem.ItemCount = libItemInfo[0]
+                layerItem.PosNum = posNum
+                layerItem.TotalTimesMax = awardTimesTotalInfo.get(itemID, 0)
+                layerItem.TotalTimesNow = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJAwardItemTimes % (actNum, libType, itemID))
+                layerItem.LayerLimit = layerLimitInfo.get(itemID, 0)
+                clientPack.AwardItemList.append(layerItem)
                 
             # 大奖物品待选择库,全部同步
             if libType == Def_SuperLibType:
                 for itemID, libItemInfo in libItemDict.items():
-                    awardItem = ChPyNetSendPack.tagMCActXianXiaMJAwardItem()
-                    awardItem.ItemLibType = libType
-                    awardItem.ItemID = itemID
-                    awardItem.ItemCount = libItemInfo[0]
-                    awardItem.TotalTimesMax = awardTimesTotalInfo.get(itemID, 0)
-                    awardItem.TotalTimesNow = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJAwardItemTimes % (actNum, libType, itemID))
-                    awardItem.LayerLimit = layerLimitInfo.get(itemID, 0)
-                    clientPack.SuperItemList.append(awardItem)
+                    layerItem = ChPyNetSendPack.tagMCActXianXiaMJLayerItem()
+                    layerItem.ItemLibType = libType
+                    layerItem.ItemID = itemID
+                    layerItem.ItemCount = libItemInfo[0]
+                    layerItem.TotalTimesMax = awardTimesTotalInfo.get(itemID, 0)
+                    layerItem.TotalTimesNow = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJAwardItemTimes % (actNum, libType, itemID))
+                    layerItem.LayerLimit = layerLimitInfo.get(itemID, 0)
+                    clientPack.SuperItemList.append(layerItem)
                 clientPack.SuperItemCount = len(clientPack.SuperItemList)
                 clientPack.SuperItemCanChooseCount = libItemCount
                 
@@ -605,12 +763,68 @@
     NetPackCommon.SendFakePack(curPlayer, clientPack)
     return
 
-def __GetXianXiaMJAwardLibItem(libItemInfo, actWorldLV):
-    ## 获取奖励库物品信息字典,支持按世界等级范围配置的格式
-    keyList = libItemInfo.keys()
-    if not keyList:
-        return {}
-    if isinstance(keyList[0], tuple) and len(keyList[0]) == 2:
-        return GameWorld.GetDictValueByRangeKey(libItemInfo, actWorldLV, {})
-    return libItemInfo
+def Sync_CrossActXianXiaMJActionInfo(curPlayer):
+    ## 通知活动信息
+    actInfo = CrossRealmPlayer.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_XianXiaMJ)
+    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("ActXianXiaMJBillTemp", personalTempID) if personalTempID else []
+    
+    clientPack = ChPyNetSendPack.tagMCCrossActXianXiaMJInfo()
+    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.IsDayReset = ipyDataDict.get("IsDayReset", 0)
+    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.tagMCActXianXiaMJBillard()
+        rankInfo.Rank = tempIpyData.GetRank()
+        
+        rankInfo.AwardItemList = []
+        awardItemList = tempIpyData.GetAwardItemList()
+        for itemID, itemCount, isAuctionItem in awardItemList:
+            item = ChPyNetSendPack.tagMCActXianXiaMJItem()
+            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.tagMCActXianXiaMJItem()
+#            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/PlayerEventCounter.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
index fb77fcb..b0115f6 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -535,6 +535,7 @@
         PlayerVip.VipOnDay(curPlayer)
         
         PlayerCoin.OnDay(curPlayer)
+        PlayerActBuyCountGift.OnDay(curPlayer)
         
         #成就
         PlayerSuccess.SuccOnDay(curPlayer)
@@ -1534,6 +1535,9 @@
             elif actionName == ShareDefine.CrossActName_BossTrial:
                 PlayerActBossTrial.RefreshCrossActBossTrialInfo()
                 
+            elif actionName == ShareDefine.CrossActName_XianXiaMJ:
+                PlayerActXianXiaMJ.RefreshCrossActXianXiaMJInfo()
+                
             return
         
         if key == ShareDefine.Def_Notify_WorldKey_CrossZoneName:
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index d48a9f1..67fab70 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -346,9 +346,10 @@
 CrossActName_AllRecharge = "CrossActAllRecharge" # 全民充值
 CrossActName_LuckyCloudBuy = "CrossActLuckyCloudBuy" # 幸运云购
 CrossActName_BossTrial = "CrossActBossTrial" # Boss历练 - 跨服
+CrossActName_XianXiaMJ = "CrossActXianXiaMJ" # 仙匣秘境 - 跨服
 
 #跨服运营活动列表
-CrossActNameList = [CrossActName_CTGBillboard, CrossActName_AllRecharge, CrossActName_LuckyCloudBuy, CrossActName_BossTrial]
+CrossActNameList = [CrossActName_CTGBillboard, CrossActName_AllRecharge, CrossActName_LuckyCloudBuy, CrossActName_BossTrial, CrossActName_XianXiaMJ]
 #需要锁定活动分区分配直到活动结束的跨服运营活动,即使热更分区配置,也不会改变正在活动中的分区设定,直到活动结束
 CrossActLockServerGroupIDList = [CrossActName_CTGBillboard, CrossActName_AllRecharge]
 
@@ -820,9 +821,10 @@
     Def_BT_BossTrialSubmitBak,                #提交boss凭证榜 (boss历练活动 - 上一期) 35
     Def_BT_BossTrialSubmitFamily,             #提交boss凭证仙盟榜 (boss历练活动)
     Def_BT_BossTrialSubmitFamilyBak,          #提交boss凭证仙盟榜 (boss历练活动 - 上一期)
+    Def_BT_XianXiaMJScore,                    #仙匣秘境积分榜 (仙匣秘境活动)
     
     Def_BT_Max, #排行榜最大类型
-) = range(0, 37 + 2) 
+) = range(0, 38 + 2) 
 
 ''' 跨服排行榜类型, 从 150 开始
 与本服榜单存储的是不一样的数据库表格,理论上类型可以和本服榜单类型重复,为了做下区分防误导,跨服榜单从 150 开始
@@ -842,12 +844,14 @@
 Def_CBT_BossTrialSubmitBak, # boss凭证 - 个人榜 上一期  159
 Def_CBT_BossTrialSubmitFamily, # boss凭证 - 仙盟榜  160
 Def_CBT_BossTrialSubmitFamilyBak, # boss凭证 - 仙盟榜 上一期  161
-) = range(150, 161 + 1)
+Def_CBT_XianXiaMJScore, # 仙匣秘境积分 - 个人榜  162
+) = range(150, 162 + 1)
 
 # 跨服榜单最大数据名次,没有设置的默认100
 CrossBillboard_MaxDataCount = {
                                Def_CBT_BossTrialSubmit:1000,
                                Def_CBT_BossTrialSubmitBak:1000,
+                               Def_CBT_XianXiaMJScore:1000,
                                }
 
 #职业对应战力排行榜类型
@@ -1608,6 +1612,7 @@
 ClientServerMsg_ActAllRechargeValue = "ActAllRechargeValue" # 跨服全民充值额度
 ClientServerMsg_CrossYaomoBossHurtAward = "CrossYaomoBossHurtAward" # 跨服妖魔boss玩家伤害领奖
 ClientServerMsg_BossTrialSubmit = "BossTrialSubmit" # boss凭证提交
+ClientServerMsg_XianXiaMJScore = "XianXiaMJScore" # 仙匣秘境积分
 
 #跨服广播类型定义
 CrossNotify_CrossAct = "CrossAct"

--
Gitblit v1.8.0