10223 【越南】【砍树】【主干】【港台】秘境寻宝(仙匣秘境层支持配置物品数、支持消耗道具寻宝;增加本服榜;增加跨服活动榜;任务活动支持仙匣秘境寻宝x次、x层任务类型;充值购买次数礼包活动支持配置额外的活动商城类型,支持配置每日重置的购买次数奖励;)
21个文件已修改
1个文件已添加
2154 ■■■■ 已修改文件
PySysDB/PySysDBG.h 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/PySysDBPY.h 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py 583 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossActionControl.py 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActBossTrial.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActXianXiaMJ.py 295 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 583 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py 59 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActBuyCountGift.py 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActTask.py 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActXianXiaMJ.py 358 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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,个数,是否拍品], ...]
};
//天帝礼包活动时间表
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;    //商城类型
};
//任务活动时间表
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匹配), 默认保存, 如果不保存,可配置进去
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):
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:
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)
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)
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
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))
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActXianXiaMJ.py
New file
@@ -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
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)
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)
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"
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,
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):
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
@@ -5251,6 +5282,8 @@
    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 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
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
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)
    
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):
    ## 增加任务活动进度值
    
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,9 +100,14 @@
                       % (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)
    
    if state:
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJWorldLV % actNum, actWorldLV)
        Sync_XianXiaMJActionInfo(curPlayer, actNum)
    __InitFirstLayerData(curPlayer, actNum, actInfo)
    return True
@@ -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
#
@@ -140,6 +226,7 @@
    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 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
    
    layerInfoValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJAwardLayerInfo % actNum)
    playCount, layerNum = layerInfoValue / 100, layerInfoValue % 100
    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,8 +599,13 @@
        return
    itemID, itemCount, num, isAddTimes = randItemInfo
    
    # 扣除抽奖消耗环保值
    # 扣除消耗
    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
@@ -499,20 +617,25 @@
        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()
@@ -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
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:
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"