From fd569f371890909dc35c09d1275d9204b39d77f9 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 19 四月 2024 11:41:09 +0800
Subject: [PATCH] 10054 【后端】任务系统(支持功能开启任务条件;支持任务分组如主线、支线等;)

---
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py | 1539 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 1,516 insertions(+), 23 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index e7c4a6d..f880c1f 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -7722,6 +7722,566 @@
 
 
 #------------------------------------------------------
+# B0 34 福地结算奖励信息 #tagGCMineAreaAwardInfo
+
+class  tagGCMineAreaAwardInfo(Structure):
+    Head = tagHead()
+    AwardType = 0    #(BYTE AwardType)// 0-通知有奖励,前端下次进入福地可请求进行结算;1-结算奖励结果通知
+    AwardLen = 0    #(BYTE AwardLen)
+    AwardInfo = ""    #(String AwardInfo)//奖励信息 [物品ID,个数,是否拍品], ...]
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xB0
+        self.Head.SubCmd = 0x34
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.AwardType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.AwardLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.AwardInfo,_pos = CommFunc.ReadString(_lpData, _pos,self.AwardLen)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xB0
+        self.Head.SubCmd = 0x34
+        self.AwardType = 0
+        self.AwardLen = 0
+        self.AwardInfo = ""
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        length += 1
+        length += len(self.AwardInfo)
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.AwardType)
+        data = CommFunc.WriteBYTE(data, self.AwardLen)
+        data = CommFunc.WriteString(data, self.AwardLen, self.AwardInfo)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                AwardType:%d,
+                                AwardLen:%d,
+                                AwardInfo:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.AwardType,
+                                self.AwardLen,
+                                self.AwardInfo
+                                )
+        return DumpString
+
+
+m_NAtagGCMineAreaAwardInfo=tagGCMineAreaAwardInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCMineAreaAwardInfo.Head.Cmd,m_NAtagGCMineAreaAwardInfo.Head.SubCmd))] = m_NAtagGCMineAreaAwardInfo
+
+
+#------------------------------------------------------
+# B0 33 福地详细信息 #tagGCMineAreaInfo
+
+class  tagGCMineItem(Structure):
+    Index = 0    #(BYTE Index)// 矿物所在福地位置索引,0~n
+    MineID = 0    #(WORD MineID)// 矿物ID,对应福地采集表中ID,0代表该索引位置没有矿物
+    MineType = 0    #(BYTE MineType)// 矿物类型:0-常规;1-超级
+    UpdTime = 0    #(DWORD UpdTime)// 最后一次更新时间戳
+    PosLen = 0    #(BYTE PosLen)
+    Position = ""    #(String Position)// 最后一次更新时所在位置百分比,0~100,支持小数,下0上100,可认为分为100格,速度为 x格/秒
+    SpeedLen = 0    #(BYTE SpeedLen)
+    MoveSpeed = ""    #(String MoveSpeed)// 移动速度,x格/秒,支持小数
+    EndTime = 0    #(DWORD EndTime)// 拉取结束时间戳
+    WorkerCount = 0    #(BYTE WorkerCount)// 工人个数,为0时代表福地玩家没有使用工人拉回
+    RobPlayerID = 0    #(DWORD RobPlayerID)// 抢夺玩家ID,为0时代表没人抢夺
+    RobWorkerCount = 0    #(BYTE RobWorkerCount)// 抢夺工人个数
+    RobPlayerName = ""    #(char RobPlayerName[33])
+    RobFace = 0    #(DWORD RobFace)
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.Index,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.MineID,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.MineType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.UpdTime,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.PosLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.Position,_pos = CommFunc.ReadString(_lpData, _pos,self.PosLen)
+        self.SpeedLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.MoveSpeed,_pos = CommFunc.ReadString(_lpData, _pos,self.SpeedLen)
+        self.EndTime,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.WorkerCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.RobPlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.RobWorkerCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.RobPlayerName,_pos = CommFunc.ReadString(_lpData, _pos,33)
+        self.RobFace,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        return _pos
+
+    def Clear(self):
+        self.Index = 0
+        self.MineID = 0
+        self.MineType = 0
+        self.UpdTime = 0
+        self.PosLen = 0
+        self.Position = ""
+        self.SpeedLen = 0
+        self.MoveSpeed = ""
+        self.EndTime = 0
+        self.WorkerCount = 0
+        self.RobPlayerID = 0
+        self.RobWorkerCount = 0
+        self.RobPlayerName = ""
+        self.RobFace = 0
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 1
+        length += 2
+        length += 1
+        length += 4
+        length += 1
+        length += len(self.Position)
+        length += 1
+        length += len(self.MoveSpeed)
+        length += 4
+        length += 1
+        length += 4
+        length += 1
+        length += 33
+        length += 4
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteBYTE(data, self.Index)
+        data = CommFunc.WriteWORD(data, self.MineID)
+        data = CommFunc.WriteBYTE(data, self.MineType)
+        data = CommFunc.WriteDWORD(data, self.UpdTime)
+        data = CommFunc.WriteBYTE(data, self.PosLen)
+        data = CommFunc.WriteString(data, self.PosLen, self.Position)
+        data = CommFunc.WriteBYTE(data, self.SpeedLen)
+        data = CommFunc.WriteString(data, self.SpeedLen, self.MoveSpeed)
+        data = CommFunc.WriteDWORD(data, self.EndTime)
+        data = CommFunc.WriteBYTE(data, self.WorkerCount)
+        data = CommFunc.WriteDWORD(data, self.RobPlayerID)
+        data = CommFunc.WriteBYTE(data, self.RobWorkerCount)
+        data = CommFunc.WriteString(data, 33, self.RobPlayerName)
+        data = CommFunc.WriteDWORD(data, self.RobFace)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Index:%d,
+                                MineID:%d,
+                                MineType:%d,
+                                UpdTime:%d,
+                                PosLen:%d,
+                                Position:%s,
+                                SpeedLen:%d,
+                                MoveSpeed:%s,
+                                EndTime:%d,
+                                WorkerCount:%d,
+                                RobPlayerID:%d,
+                                RobWorkerCount:%d,
+                                RobPlayerName:%s,
+                                RobFace:%d
+                                '''\
+                                %(
+                                self.Index,
+                                self.MineID,
+                                self.MineType,
+                                self.UpdTime,
+                                self.PosLen,
+                                self.Position,
+                                self.SpeedLen,
+                                self.MoveSpeed,
+                                self.EndTime,
+                                self.WorkerCount,
+                                self.RobPlayerID,
+                                self.RobWorkerCount,
+                                self.RobPlayerName,
+                                self.RobFace
+                                )
+        return DumpString
+
+
+class  tagGCMineArea(Structure):
+    PlayerID = 0    #(DWORD PlayerID)// 福地所属玩家ID,可能是自己或其他玩家ID,当ID小于10000时为假人
+    PlayerName = ""    #(char PlayerName[33])// 可能为空,如自己或假人
+    Face = 0    #(DWORD Face)
+    MineCount = 0    #(BYTE MineCount)
+    MineItemList = list()    #(vector<tagGCMineItem> MineItemList)// 矿物列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.PlayerName,_pos = CommFunc.ReadString(_lpData, _pos,33)
+        self.Face,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.MineCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.MineCount):
+            temMineItemList = tagGCMineItem()
+            _pos = temMineItemList.ReadData(_lpData, _pos)
+            self.MineItemList.append(temMineItemList)
+        return _pos
+
+    def Clear(self):
+        self.PlayerID = 0
+        self.PlayerName = ""
+        self.Face = 0
+        self.MineCount = 0
+        self.MineItemList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 33
+        length += 4
+        length += 1
+        for i in range(self.MineCount):
+            length += self.MineItemList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.PlayerID)
+        data = CommFunc.WriteString(data, 33, self.PlayerName)
+        data = CommFunc.WriteDWORD(data, self.Face)
+        data = CommFunc.WriteBYTE(data, self.MineCount)
+        for i in range(self.MineCount):
+            data = CommFunc.WriteString(data, self.MineItemList[i].GetLength(), self.MineItemList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                PlayerID:%d,
+                                PlayerName:%s,
+                                Face:%d,
+                                MineCount:%d,
+                                MineItemList:%s
+                                '''\
+                                %(
+                                self.PlayerID,
+                                self.PlayerName,
+                                self.Face,
+                                self.MineCount,
+                                "..."
+                                )
+        return DumpString
+
+
+class  tagGCMineAreaInfo(Structure):
+    Head = tagHead()
+    QueryType = 0    #(BYTE QueryType)// 查询同步类型:0-后端主动同步;1-查看指定福地;2-查看道友福地列表;3-查看周围随机福地列表
+    QueryValue = 0    #(DWORD QueryValue)// 查询值,类型1时-发送目标玩家ID;3时-发送是否重新随机
+    AreaCount = 0    #(BYTE AreaCount)
+    AreaList = list()    #(vector<tagGCMineArea> AreaList)// 福地列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xB0
+        self.Head.SubCmd = 0x33
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.QueryType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.QueryValue,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.AreaCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.AreaCount):
+            temAreaList = tagGCMineArea()
+            _pos = temAreaList.ReadData(_lpData, _pos)
+            self.AreaList.append(temAreaList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xB0
+        self.Head.SubCmd = 0x33
+        self.QueryType = 0
+        self.QueryValue = 0
+        self.AreaCount = 0
+        self.AreaList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        length += 4
+        length += 1
+        for i in range(self.AreaCount):
+            length += self.AreaList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.QueryType)
+        data = CommFunc.WriteDWORD(data, self.QueryValue)
+        data = CommFunc.WriteBYTE(data, self.AreaCount)
+        for i in range(self.AreaCount):
+            data = CommFunc.WriteString(data, self.AreaList[i].GetLength(), self.AreaList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                QueryType:%d,
+                                QueryValue:%d,
+                                AreaCount:%d,
+                                AreaList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.QueryType,
+                                self.QueryValue,
+                                self.AreaCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagGCMineAreaInfo=tagGCMineAreaInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCMineAreaInfo.Head.Cmd,m_NAtagGCMineAreaInfo.Head.SubCmd))] = m_NAtagGCMineAreaInfo
+
+
+#------------------------------------------------------
+# B0 35 福地记录信息 #tagGCMineAreaRecordInfo
+
+class  tagGCMineAreaRecord(Structure):
+    RecordType = 0    #(BYTE RecordType)// 记录类型;1-自己拉物品;2-物品被人抢
+    TagPlayerID = 0    #(DWORD TagPlayerID)// 目标玩家ID,等于自己玩家ID时代表拉自己的,反之为抢别人的
+    RecordTime = 0    #(DWORD RecordTime)// 记录时间戳
+    MineID = 0    #(WORD MineID)// 矿物ID,对应福地采集表中ID
+    TagPlayerName = ""    #(char TagPlayerName[33])
+    TagFace = 0    #(DWORD TagFace)
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.RecordType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.TagPlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.RecordTime,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.MineID,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.TagPlayerName,_pos = CommFunc.ReadString(_lpData, _pos,33)
+        self.TagFace,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        return _pos
+
+    def Clear(self):
+        self.RecordType = 0
+        self.TagPlayerID = 0
+        self.RecordTime = 0
+        self.MineID = 0
+        self.TagPlayerName = ""
+        self.TagFace = 0
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 1
+        length += 4
+        length += 4
+        length += 2
+        length += 33
+        length += 4
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteBYTE(data, self.RecordType)
+        data = CommFunc.WriteDWORD(data, self.TagPlayerID)
+        data = CommFunc.WriteDWORD(data, self.RecordTime)
+        data = CommFunc.WriteWORD(data, self.MineID)
+        data = CommFunc.WriteString(data, 33, self.TagPlayerName)
+        data = CommFunc.WriteDWORD(data, self.TagFace)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                RecordType:%d,
+                                TagPlayerID:%d,
+                                RecordTime:%d,
+                                MineID:%d,
+                                TagPlayerName:%s,
+                                TagFace:%d
+                                '''\
+                                %(
+                                self.RecordType,
+                                self.TagPlayerID,
+                                self.RecordTime,
+                                self.MineID,
+                                self.TagPlayerName,
+                                self.TagFace
+                                )
+        return DumpString
+
+
+class  tagGCMineAreaRecordInfo(Structure):
+    Head = tagHead()
+    RecordCount = 0    #(BYTE RecordCount)
+    AreaRecordList = list()    #(vector<tagGCMineAreaRecord> AreaRecordList)
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xB0
+        self.Head.SubCmd = 0x35
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.RecordCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.RecordCount):
+            temAreaRecordList = tagGCMineAreaRecord()
+            _pos = temAreaRecordList.ReadData(_lpData, _pos)
+            self.AreaRecordList.append(temAreaRecordList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xB0
+        self.Head.SubCmd = 0x35
+        self.RecordCount = 0
+        self.AreaRecordList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        for i in range(self.RecordCount):
+            length += self.AreaRecordList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.RecordCount)
+        for i in range(self.RecordCount):
+            data = CommFunc.WriteString(data, self.AreaRecordList[i].GetLength(), self.AreaRecordList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                RecordCount:%d,
+                                AreaRecordList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.RecordCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagGCMineAreaRecordInfo=tagGCMineAreaRecordInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCMineAreaRecordInfo.Head.Cmd,m_NAtagGCMineAreaRecordInfo.Head.SubCmd))] = m_NAtagGCMineAreaRecordInfo
+
+
+#------------------------------------------------------
+# B0 32 福地物品拉预览结果 #tagGCMineItemPullPreviewRet
+
+class  tagGCMineItemPullPreviewRet(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("PlayerID", c_int),    # 福地所属玩家ID,0默认自己
+                  ("ItemIndex", c_ubyte),    # 物品所在位置索引0~n
+                  ("WorkerCount", c_ubyte),    # 上工人人数
+                  ("NeedSeconds", c_int),    # 预计需要时间,秒
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xB0
+        self.SubCmd = 0x32
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.Cmd = 0xB0
+        self.SubCmd = 0x32
+        self.PlayerID = 0
+        self.ItemIndex = 0
+        self.WorkerCount = 0
+        self.NeedSeconds = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagGCMineItemPullPreviewRet)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// B0 32 福地物品拉预览结果 //tagGCMineItemPullPreviewRet:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                PlayerID:%d,
+                                ItemIndex:%d,
+                                WorkerCount:%d,
+                                NeedSeconds:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.PlayerID,
+                                self.ItemIndex,
+                                self.WorkerCount,
+                                self.NeedSeconds
+                                )
+        return DumpString
+
+
+m_NAtagGCMineItemPullPreviewRet=tagGCMineItemPullPreviewRet()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCMineItemPullPreviewRet.Cmd,m_NAtagGCMineItemPullPreviewRet.SubCmd))] = m_NAtagGCMineItemPullPreviewRet
+
+
+#------------------------------------------------------
 # B0 04 使用协助感谢礼盒预览 #tagGCUseAssistThanksGiftPreview
 
 class  tagGCAssistPlayerInfo(Structure):
@@ -9037,6 +9597,7 @@
     OnlineType = 0    #(BYTE OnlineType)//在线状态, 0 不在线 1在线
     IsInTeam = 0    #(BYTE IsInTeam)//是否有队伍
     ServerGroupID = 0    #(DWORD ServerGroupID)//服务器组ID
+    Face = 0    #(DWORD Face)//基本脸型
     data = None
 
     def __init__(self):
@@ -9056,6 +9617,7 @@
         self.OnlineType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.IsInTeam,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.ServerGroupID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Face,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         return _pos
 
     def Clear(self):
@@ -9071,6 +9633,7 @@
         self.OnlineType = 0
         self.IsInTeam = 0
         self.ServerGroupID = 0
+        self.Face = 0
         return
 
     def GetLength(self):
@@ -9083,6 +9646,7 @@
         length += 2
         length += 1
         length += 1
+        length += 4
         length += 4
 
         return length
@@ -9098,6 +9662,7 @@
         data = CommFunc.WriteBYTE(data, self.OnlineType)
         data = CommFunc.WriteBYTE(data, self.IsInTeam)
         data = CommFunc.WriteDWORD(data, self.ServerGroupID)
+        data = CommFunc.WriteDWORD(data, self.Face)
         return data
 
     def OutputString(self):
@@ -9110,7 +9675,8 @@
                                 RealmLV:%d,
                                 OnlineType:%d,
                                 IsInTeam:%d,
-                                ServerGroupID:%d
+                                ServerGroupID:%d,
+                                Face:%d
                                 '''\
                                 %(
                                 self.Head.OutputString(),
@@ -9121,7 +9687,8 @@
                                 self.RealmLV,
                                 self.OnlineType,
                                 self.IsInTeam,
-                                self.ServerGroupID
+                                self.ServerGroupID,
+                                self.Face
                                 )
         return DumpString
 
@@ -9196,6 +9763,7 @@
     LV = 0    #(WORD LV)//等级
     RealmLV = 0    #(WORD RealmLV)//境界
     OnlineType = 0    #(BYTE OnlineType)//0不在线 1在线 2脱机在线
+    Face = 0    #(DWORD Face)//基本脸型
     data = None
 
     def __init__(self):
@@ -9210,6 +9778,7 @@
         self.LV,_pos = CommFunc.ReadWORD(_lpData, _pos)
         self.RealmLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
         self.OnlineType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.Face,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         return _pos
 
     def Clear(self):
@@ -9219,6 +9788,7 @@
         self.LV = 0
         self.RealmLV = 0
         self.OnlineType = 0
+        self.Face = 0
         return
 
     def GetLength(self):
@@ -9229,6 +9799,7 @@
         length += 2
         length += 2
         length += 1
+        length += 4
 
         return length
 
@@ -9240,6 +9811,7 @@
         data = CommFunc.WriteWORD(data, self.LV)
         data = CommFunc.WriteWORD(data, self.RealmLV)
         data = CommFunc.WriteBYTE(data, self.OnlineType)
+        data = CommFunc.WriteDWORD(data, self.Face)
         return data
 
     def OutputString(self):
@@ -9249,7 +9821,8 @@
                                 Job:%d,
                                 LV:%d,
                                 RealmLV:%d,
-                                OnlineType:%d
+                                OnlineType:%d,
+                                Face:%d
                                 '''\
                                 %(
                                 self.PlayerID,
@@ -9257,7 +9830,8 @@
                                 self.Job,
                                 self.LV,
                                 self.RealmLV,
-                                self.OnlineType
+                                self.OnlineType,
+                                self.Face
                                 )
         return DumpString
 
@@ -16324,7 +16898,7 @@
 class  tagMCCoinToGoldCount(Structure):
     _pack_ = 1
     _fields_ = [
-                  ("RecordID", c_ubyte),    
+                  ("RecordID", c_ushort),    
                   ("TodayPayCount", c_ushort),    # 今日已购买次数
                   ("TotalPayCount", c_int),    # 累计总购买次数
                   ("WeekPayCount", c_ushort),    # 周总购买次数
@@ -16374,7 +16948,7 @@
 
 class  tagMCCoinToGoldCountInfo(Structure):
     Head = tagHead()
-    RecordCount = 0    #(BYTE RecordCount)
+    RecordCount = 0    #(WORD RecordCount)
     CTGCountInfoList = list()    #(vector<tagMCCoinToGoldCount> CTGCountInfoList)
     data = None
 
@@ -16387,7 +16961,7 @@
     def ReadData(self, _lpData, _pos=0, _Len=0):
         self.Clear()
         _pos = self.Head.ReadData(_lpData, _pos)
-        self.RecordCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.RecordCount,_pos = CommFunc.ReadWORD(_lpData, _pos)
         for i in range(self.RecordCount):
             temCTGCountInfoList = tagMCCoinToGoldCount()
             _pos = temCTGCountInfoList.ReadData(_lpData, _pos)
@@ -16406,7 +16980,7 @@
     def GetLength(self):
         length = 0
         length += self.Head.GetLength()
-        length += 1
+        length += 2
         for i in range(self.RecordCount):
             length += self.CTGCountInfoList[i].GetLength()
 
@@ -16415,7 +16989,7 @@
     def GetBuffer(self):
         data = ''
         data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
-        data = CommFunc.WriteBYTE(data, self.RecordCount)
+        data = CommFunc.WriteWORD(data, self.RecordCount)
         for i in range(self.RecordCount):
             data = CommFunc.WriteString(data, self.CTGCountInfoList[i].GetLength(), self.CTGCountInfoList[i].GetBuffer())
         return data
@@ -16446,7 +17020,7 @@
     OrderLen = 0    #(BYTE OrderLen)
     OrderID = ""    #(String OrderID)// 订单id
     Coin = 0    #(DWORD Coin)// 充值的点卷
-    RecordID = 0    #(BYTE RecordID)// ctgID
+    RecordID = 0    #(WORD RecordID)// ctgID
     OrderInfoLen = 0    #(BYTE OrderInfoLen)
     OrderInfo = ""    #(String OrderInfo)
     data = None
@@ -16463,7 +17037,7 @@
         self.OrderLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.OrderID,_pos = CommFunc.ReadString(_lpData, _pos,self.OrderLen)
         self.Coin,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        self.RecordID,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.RecordID,_pos = CommFunc.ReadWORD(_lpData, _pos)
         self.OrderInfoLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.OrderInfo,_pos = CommFunc.ReadString(_lpData, _pos,self.OrderInfoLen)
         return _pos
@@ -16487,7 +17061,7 @@
         length += 1
         length += len(self.OrderID)
         length += 4
-        length += 1
+        length += 2
         length += 1
         length += len(self.OrderInfo)
 
@@ -16499,7 +17073,7 @@
         data = CommFunc.WriteBYTE(data, self.OrderLen)
         data = CommFunc.WriteString(data, self.OrderLen, self.OrderID)
         data = CommFunc.WriteDWORD(data, self.Coin)
-        data = CommFunc.WriteBYTE(data, self.RecordID)
+        data = CommFunc.WriteWORD(data, self.RecordID)
         data = CommFunc.WriteBYTE(data, self.OrderInfoLen)
         data = CommFunc.WriteString(data, self.OrderInfoLen, self.OrderInfo)
         return data
@@ -16630,6 +17204,8 @@
     ExAttr19 = 0    #(DWORD ExAttr19)//预留的扩展属性字段,用来存放项目特定的属性
     ExAttr20 = 0    #(DWORD ExAttr20)//预留的扩展属性字段,用来存放项目特定的属性
     HPEx = 0    #(DWORD HPEx)//当前血量 超过E的记录
+    Face = 0    #(DWORD Face)//基本脸型
+    RoleType = 0    #(DWORD RoleType)//角色类型(各项目可自定义含义,如种族,与职业区分)
     data = None
 
     def __init__(self):
@@ -16736,6 +17312,8 @@
         self.ExAttr19,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.ExAttr20,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.HPEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Face,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.RoleType,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         return _pos
 
     def Clear(self):
@@ -16838,6 +17416,8 @@
         self.ExAttr19 = 0
         self.ExAttr20 = 0
         self.HPEx = 0
+        self.Face = 0
+        self.RoleType = 0
         return
 
     def GetLength(self):
@@ -16930,6 +17510,8 @@
         length += 4
         length += 4
         length += 15
+        length += 4
+        length += 4
         length += 4
         length += 4
         length += 4
@@ -17039,6 +17621,8 @@
         data = CommFunc.WriteDWORD(data, self.ExAttr19)
         data = CommFunc.WriteDWORD(data, self.ExAttr20)
         data = CommFunc.WriteDWORD(data, self.HPEx)
+        data = CommFunc.WriteDWORD(data, self.Face)
+        data = CommFunc.WriteDWORD(data, self.RoleType)
         return data
 
     def OutputString(self):
@@ -17138,7 +17722,9 @@
                                 ExAttr18:%d,
                                 ExAttr19:%d,
                                 ExAttr20:%d,
-                                HPEx:%d
+                                HPEx:%d,
+                                Face:%d,
+                                RoleType:%d
                                 '''\
                                 %(
                                 self.Head.OutputString(),
@@ -17236,7 +17822,9 @@
                                 self.ExAttr18,
                                 self.ExAttr19,
                                 self.ExAttr20,
-                                self.HPEx
+                                self.HPEx,
+                                self.Face,
+                                self.RoleType
                                 )
         return DumpString
 
@@ -25218,6 +25806,8 @@
                   ("SubCmd", c_ubyte),
                   ("IsPass", c_ubyte),    #是否通关副本
                   ("XXZLAwardState", c_int),    #修仙之路领奖状态;按二进制位存储每个任务ID是否已领取
+                  ("RealmLVUpAwardState", c_int),    #渡劫条件领奖状态;按二进制位存储是否已领取,0-等级;1-副本关卡;2-仙树等级;3-砍树次数
+                  ("RealmLVUpCutTreeCnt", c_int),    #渡劫条件已砍树次数
                   ]
 
     def __init__(self):
@@ -25236,6 +25826,8 @@
         self.SubCmd = 0x11
         self.IsPass = 0
         self.XXZLAwardState = 0
+        self.RealmLVUpAwardState = 0
+        self.RealmLVUpCutTreeCnt = 0
         return
 
     def GetLength(self):
@@ -25249,13 +25841,17 @@
                                 Cmd:%s,
                                 SubCmd:%s,
                                 IsPass:%d,
-                                XXZLAwardState:%d
+                                XXZLAwardState:%d,
+                                RealmLVUpAwardState:%d,
+                                RealmLVUpCutTreeCnt:%d
                                 '''\
                                 %(
                                 self.Cmd,
                                 self.SubCmd,
                                 self.IsPass,
-                                self.XXZLAwardState
+                                self.XXZLAwardState,
+                                self.RealmLVUpAwardState,
+                                self.RealmLVUpCutTreeCnt
                                 )
         return DumpString
 
@@ -29521,7 +30117,7 @@
 class  tagRefreshType(Structure):
     _pack_ = 1
     _fields_ = [
-                  ("RefreshType", c_ubyte),    
+                  ("RefreshType", c_ushort),    
                   ("Value", c_int),    
                   ("ValueEx", c_int),    
                   ]
@@ -32440,7 +33036,7 @@
 
 
 class  tagMCActGrowupBuyCTGInfo(Structure):
-    CTGID = 0    #(BYTE CTGID)// 充值表ID
+    CTGID = 0    #(WORD CTGID)// 充值表ID
     GainItemCount = 0    #(BYTE GainItemCount)// 获得物品数
     GainItemList = list()    #(vector<tagMCActGrowupBuyCTGItem> GainItemList)// 获得物品列表,替换充值表中的 GainItemList 字段信息
     data = None
@@ -32451,7 +33047,7 @@
 
     def ReadData(self, _lpData, _pos=0, _Len=0):
         self.Clear()
-        self.CTGID,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.CTGID,_pos = CommFunc.ReadWORD(_lpData, _pos)
         self.GainItemCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         for i in range(self.GainItemCount):
             temGainItemList = tagMCActGrowupBuyCTGItem()
@@ -32467,7 +33063,7 @@
 
     def GetLength(self):
         length = 0
-        length += 1
+        length += 2
         length += 1
         for i in range(self.GainItemCount):
             length += self.GainItemList[i].GetLength()
@@ -32476,7 +33072,7 @@
 
     def GetBuffer(self):
         data = ''
-        data = CommFunc.WriteBYTE(data, self.CTGID)
+        data = CommFunc.WriteWORD(data, self.CTGID)
         data = CommFunc.WriteBYTE(data, self.GainItemCount)
         for i in range(self.GainItemCount):
             data = CommFunc.WriteString(data, self.GainItemList[i].GetLength(), self.GainItemList[i].GetBuffer())
@@ -37069,6 +37665,66 @@
 
 
 #------------------------------------------------------
+# AA 03 每日打包直购礼包 #tagMCDailyPackBuyGiftInfo
+
+class  tagMCDailyPackBuyGiftInfo(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("PackBuyTime", c_int),    # 打包购买的时间戳,如果有该值,代表已经一次性打包购买了,可根据次时间戳算出当前是第几天
+                  ("BuyStateToday", c_int),    # 今日礼包购买状态,按礼包索引二进制位计算代表是否已购买,仅非打包购买状态下有用
+                  ("AwardState", c_int),    # 今日礼包领奖状态,按礼包索引二进制位计算代表是否已领取
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xAA
+        self.SubCmd = 0x03
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.Cmd = 0xAA
+        self.SubCmd = 0x03
+        self.PackBuyTime = 0
+        self.BuyStateToday = 0
+        self.AwardState = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCDailyPackBuyGiftInfo)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 03 每日打包直购礼包 //tagMCDailyPackBuyGiftInfo:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                PackBuyTime:%d,
+                                BuyStateToday:%d,
+                                AwardState:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.PackBuyTime,
+                                self.BuyStateToday,
+                                self.AwardState
+                                )
+        return DumpString
+
+
+m_NAtagMCDailyPackBuyGiftInfo=tagMCDailyPackBuyGiftInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCDailyPackBuyGiftInfo.Cmd,m_NAtagMCDailyPackBuyGiftInfo.SubCmd))] = m_NAtagMCDailyPackBuyGiftInfo
+
+
+#------------------------------------------------------
 # AA 24 每日免费直购礼包信息 #tagMCDayFreeGoldGiftState
 
 class  tagMCDayFreeGoldGiftState(Structure):
@@ -37650,7 +38306,7 @@
     _pack_ = 1
     _fields_ = [
                   ("AwardIndex", c_ubyte),    #游历奖励索引
-                  ("GetAwardCount", c_ubyte),    #已领取次数;前端判断是否可领取: 总游历值 >=  (已领取次数 + 1)  * 单次所需游历值
+                  ("GetAwardCount", c_int),    #已领取次数;前端判断是否可领取: 总游历值 >=  (已领取次数 + 1)  * 单次所需游历值
                   ]
 
     def __init__(self):
@@ -42944,6 +43600,128 @@
 
 
 #------------------------------------------------------
+# B0 30 玩家福地相关信息 #tagMCPlayerMineAreaInfo
+
+class  tagMCPlayerMineAreaInfo(Structure):
+    Head = tagHead()
+    WorkerCount = 0    #(BYTE WorkerCount)// 已雇佣工人数
+    EnergyUsed = 0    #(WORD EnergyUsed)// 今日已消耗体力
+    RefreshCount = 0    #(DWORD RefreshCount)// 今日福地刷新物品次数 - 普通刷新
+    RefreshCountSuper = 0    #(BYTE RefreshCountSuper)// 今日福地刷新物品次数 - 超级刷新
+    TreasureCount = 0    #(BYTE TreasureCount)// 聚宝盆类型个数,对应类型 0~n
+    TreasureState = list()    #(vector<BYTE> TreasureState)// 聚宝盆是否已激活列表,[类型0是否已激活, ...]
+    TreasureAward = list()    #(vector<BYTE> TreasureAward)// 聚宝盆奖励是否已领取列表,[类型0是否已领取, ...]
+    TreasureProgress = list()    #(vector<BYTE> TreasureProgress)// 聚宝盆进度值列表,[类型0进度值, ...],满进度100
+    HelpAwardCount = 0    #(BYTE HelpAwardCount)// 今日已帮助别人奖励次数
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xB0
+        self.Head.SubCmd = 0x30
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.WorkerCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.EnergyUsed,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.RefreshCount,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.RefreshCountSuper,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.TreasureCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.TreasureCount):
+            value,_pos=CommFunc.ReadBYTE(_lpData,_pos)
+            self.TreasureState.append(value)
+        for i in range(self.TreasureCount):
+            value,_pos=CommFunc.ReadBYTE(_lpData,_pos)
+            self.TreasureAward.append(value)
+        for i in range(self.TreasureCount):
+            value,_pos=CommFunc.ReadBYTE(_lpData,_pos)
+            self.TreasureProgress.append(value)
+        self.HelpAwardCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xB0
+        self.Head.SubCmd = 0x30
+        self.WorkerCount = 0
+        self.EnergyUsed = 0
+        self.RefreshCount = 0
+        self.RefreshCountSuper = 0
+        self.TreasureCount = 0
+        self.TreasureState = list()
+        self.TreasureAward = list()
+        self.TreasureProgress = list()
+        self.HelpAwardCount = 0
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        length += 2
+        length += 4
+        length += 1
+        length += 1
+        length += 1 * self.TreasureCount
+        length += 1 * self.TreasureCount
+        length += 1 * self.TreasureCount
+        length += 1
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.WorkerCount)
+        data = CommFunc.WriteWORD(data, self.EnergyUsed)
+        data = CommFunc.WriteDWORD(data, self.RefreshCount)
+        data = CommFunc.WriteBYTE(data, self.RefreshCountSuper)
+        data = CommFunc.WriteBYTE(data, self.TreasureCount)
+        for i in range(self.TreasureCount):
+            data = CommFunc.WriteBYTE(data, self.TreasureState[i])
+        for i in range(self.TreasureCount):
+            data = CommFunc.WriteBYTE(data, self.TreasureAward[i])
+        for i in range(self.TreasureCount):
+            data = CommFunc.WriteBYTE(data, self.TreasureProgress[i])
+        data = CommFunc.WriteBYTE(data, self.HelpAwardCount)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                WorkerCount:%d,
+                                EnergyUsed:%d,
+                                RefreshCount:%d,
+                                RefreshCountSuper:%d,
+                                TreasureCount:%d,
+                                TreasureState:%s,
+                                TreasureAward:%s,
+                                TreasureProgress:%s,
+                                HelpAwardCount:%d
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.WorkerCount,
+                                self.EnergyUsed,
+                                self.RefreshCount,
+                                self.RefreshCountSuper,
+                                self.TreasureCount,
+                                "...",
+                                "...",
+                                "...",
+                                self.HelpAwardCount
+                                )
+        return DumpString
+
+
+m_NAtagMCPlayerMineAreaInfo=tagMCPlayerMineAreaInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCPlayerMineAreaInfo.Head.Cmd,m_NAtagMCPlayerMineAreaInfo.Head.SubCmd))] = m_NAtagMCPlayerMineAreaInfo
+
+
+#------------------------------------------------------
 # B0 07 今日协助活跃令信息 #tagMCTodayAssistMoneyInfo
 
 class  tagMCTodayAssistMoneyInfo(Structure):
@@ -43119,6 +43897,121 @@
 
 m_NAtagMCClothesCoatSkinState=tagMCClothesCoatSkinState()
 ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCClothesCoatSkinState.Head.Cmd,m_NAtagMCClothesCoatSkinState.Head.SubCmd))] = m_NAtagMCClothesCoatSkinState
+
+
+#------------------------------------------------------
+# B1 22 砍树结果 #tagMCCutTreeResult
+
+class  tagMCCutTreeExItem(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("ItemID", c_int),    # 额外奖励物品ID
+                  ("ItemCount", c_ushort),    # 额外奖励物品ID对应个数
+                  ]
+
+    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
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCCutTreeExItem)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// B1 22 砍树结果 //tagMCCutTreeResult:
+                                ItemID:%d,
+                                ItemCount:%d
+                                '''\
+                                %(
+                                self.ItemID,
+                                self.ItemCount
+                                )
+        return DumpString
+
+
+class  tagMCCutTreeResult(Structure):
+    Head = tagHead()
+    EquipCount = 0    #(BYTE EquipCount)// 获得装备数量,默认展示在砍树背包中的装备即可,收到该封包前会先收到0704物品刷新
+    ExItemCount = 0    #(BYTE ExItemCount)// 额外奖励物品数
+    ExItemList = list()    #(vector<tagMCCutTreeExItem> ExItemList)// 额外奖励物品列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xB1
+        self.Head.SubCmd = 0x22
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.EquipCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.ExItemCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.ExItemCount):
+            temExItemList = tagMCCutTreeExItem()
+            _pos = temExItemList.ReadData(_lpData, _pos)
+            self.ExItemList.append(temExItemList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xB1
+        self.Head.SubCmd = 0x22
+        self.EquipCount = 0
+        self.ExItemCount = 0
+        self.ExItemList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        length += 1
+        for i in range(self.ExItemCount):
+            length += self.ExItemList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.EquipCount)
+        data = CommFunc.WriteBYTE(data, self.ExItemCount)
+        for i in range(self.ExItemCount):
+            data = CommFunc.WriteString(data, self.ExItemList[i].GetLength(), self.ExItemList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                EquipCount:%d,
+                                ExItemCount:%d,
+                                ExItemList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.EquipCount,
+                                self.ExItemCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCCutTreeResult=tagMCCutTreeResult()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCCutTreeResult.Head.Cmd,m_NAtagMCCutTreeResult.Head.SubCmd))] = m_NAtagMCCutTreeResult
 
 
 #------------------------------------------------------
@@ -43762,6 +44655,308 @@
 
 m_NAtagMCYinjiStartTime=tagMCYinjiStartTime()
 ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCYinjiStartTime.Cmd,m_NAtagMCYinjiStartTime.SubCmd))] = m_NAtagMCYinjiStartTime
+
+
+#------------------------------------------------------
+# B1 10 当前任务信息 #tagMCTaskInfo
+
+class  tagMCTask(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("TaskGroup", c_ubyte),    # 任务组,0-主线
+                  ("TaskID", c_int),    # 当前任务ID,可能为0,表示该分组暂时没有任务
+                  ("CurValue", c_int),    # 当前进度值
+                  ("State", c_ubyte),    # 任务状态 1-进行中 2-已完成
+                  ]
+
+    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.TaskGroup = 0
+        self.TaskID = 0
+        self.CurValue = 0
+        self.State = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCTask)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// B1 10 当前任务信息 //tagMCTaskInfo:
+                                TaskGroup:%d,
+                                TaskID:%d,
+                                CurValue:%d,
+                                State:%d
+                                '''\
+                                %(
+                                self.TaskGroup,
+                                self.TaskID,
+                                self.CurValue,
+                                self.State
+                                )
+        return DumpString
+
+
+class  tagMCTaskInfo(Structure):
+    Head = tagHead()
+    TaskCount = 0    #(BYTE TaskCount)
+    TaskList = list()    #(vector<tagMCTask> TaskList)
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xB1
+        self.Head.SubCmd = 0x10
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.TaskCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.TaskCount):
+            temTaskList = tagMCTask()
+            _pos = temTaskList.ReadData(_lpData, _pos)
+            self.TaskList.append(temTaskList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xB1
+        self.Head.SubCmd = 0x10
+        self.TaskCount = 0
+        self.TaskList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        for i in range(self.TaskCount):
+            length += self.TaskList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.TaskCount)
+        for i in range(self.TaskCount):
+            data = CommFunc.WriteString(data, self.TaskList[i].GetLength(), self.TaskList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                TaskCount:%d,
+                                TaskList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.TaskCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCTaskInfo=tagMCTaskInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCTaskInfo.Head.Cmd,m_NAtagMCTaskInfo.Head.SubCmd))] = m_NAtagMCTaskInfo
+
+
+#------------------------------------------------------
+# B1 21 仙树信息 #tagMCTreeInfo
+
+class  tagMCTreeInfo(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("TreeLV", c_ubyte),    # 当前仙树等级
+                  ("LVUPState", c_ubyte),    # 0-非升级中;1-升级中
+                  ("LVUPRemainTime", c_int),    # 升级剩余时间,秒;当升级中且倒计时为0时可发送B223执行升级包进行升级
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xB1
+        self.SubCmd = 0x21
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.Cmd = 0xB1
+        self.SubCmd = 0x21
+        self.TreeLV = 0
+        self.LVUPState = 0
+        self.LVUPRemainTime = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCTreeInfo)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// B1 21 仙树信息 //tagMCTreeInfo:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                TreeLV:%d,
+                                LVUPState:%d,
+                                LVUPRemainTime:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.TreeLV,
+                                self.LVUPState,
+                                self.LVUPRemainTime
+                                )
+        return DumpString
+
+
+m_NAtagMCTreeInfo=tagMCTreeInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCTreeInfo.Cmd,m_NAtagMCTreeInfo.SubCmd))] = m_NAtagMCTreeInfo
+
+
+#------------------------------------------------------
+# B1 20 战令信息 #tagMCZhanlingInfo
+
+class  tagMCZhanling(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("NeedValue", c_int),    # 奖励所需值
+                  ("FreeRewardState", c_ubyte),    # 免费奖励是否已领取
+                  ("ZLRewardState", 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.NeedValue = 0
+        self.FreeRewardState = 0
+        self.ZLRewardState = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCZhanling)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// B1 20 战令信息 //tagMCZhanlingInfo:
+                                NeedValue:%d,
+                                FreeRewardState:%d,
+                                ZLRewardState:%d
+                                '''\
+                                %(
+                                self.NeedValue,
+                                self.FreeRewardState,
+                                self.ZLRewardState
+                                )
+        return DumpString
+
+
+class  tagMCZhanlingInfo(Structure):
+    Head = tagHead()
+    ZhanlingType = 0    #(BYTE ZhanlingType)// 战令类型
+    IsActivite = 0    #(BYTE IsActivite)// 是否已激活
+    RewardCount = 0    #(WORD RewardCount)
+    RewardList = list()    #(vector<tagMCZhanling> RewardList)
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xB1
+        self.Head.SubCmd = 0x20
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.ZhanlingType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.IsActivite,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.RewardCount,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        for i in range(self.RewardCount):
+            temRewardList = tagMCZhanling()
+            _pos = temRewardList.ReadData(_lpData, _pos)
+            self.RewardList.append(temRewardList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xB1
+        self.Head.SubCmd = 0x20
+        self.ZhanlingType = 0
+        self.IsActivite = 0
+        self.RewardCount = 0
+        self.RewardList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        length += 1
+        length += 2
+        for i in range(self.RewardCount):
+            length += self.RewardList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.ZhanlingType)
+        data = CommFunc.WriteBYTE(data, self.IsActivite)
+        data = CommFunc.WriteWORD(data, self.RewardCount)
+        for i in range(self.RewardCount):
+            data = CommFunc.WriteString(data, self.RewardList[i].GetLength(), self.RewardList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                ZhanlingType:%d,
+                                IsActivite:%d,
+                                RewardCount:%d,
+                                RewardList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.ZhanlingType,
+                                self.IsActivite,
+                                self.RewardCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCZhanlingInfo=tagMCZhanlingInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCZhanlingInfo.Head.Cmd,m_NAtagMCZhanlingInfo.Head.SubCmd))] = m_NAtagMCZhanlingInfo
 
 
 #------------------------------------------------------
@@ -47063,6 +48258,304 @@
 
 
 #------------------------------------------------------
+# B4 21 回合战斗对象开始行动 #tagMCTurnFightObjAction
+
+class  tagMCTurnFightObjAction(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("TurnNum", c_ubyte),    # 当前轮次
+                  ("ObjID", c_int),    
+                  ("ObjType", c_ubyte),    
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xB4
+        self.SubCmd = 0x21
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.Cmd = 0xB4
+        self.SubCmd = 0x21
+        self.TurnNum = 0
+        self.ObjID = 0
+        self.ObjType = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCTurnFightObjAction)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// B4 21 回合战斗对象开始行动 //tagMCTurnFightObjAction:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                TurnNum:%d,
+                                ObjID:%d,
+                                ObjType:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.TurnNum,
+                                self.ObjID,
+                                self.ObjType
+                                )
+        return DumpString
+
+
+m_NAtagMCTurnFightObjAction=tagMCTurnFightObjAction()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCTurnFightObjAction.Cmd,m_NAtagMCTurnFightObjAction.SubCmd))] = m_NAtagMCTurnFightObjAction
+
+
+#------------------------------------------------------
+# B4 22 回合战斗角色死亡 #tagMCTurnFightObjDead
+
+class  tagMCTurnFightObjDead(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("ObjID", c_int),    
+                  ("ObjType", c_ubyte),    
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xB4
+        self.SubCmd = 0x22
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.Cmd = 0xB4
+        self.SubCmd = 0x22
+        self.ObjID = 0
+        self.ObjType = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCTurnFightObjDead)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// B4 22 回合战斗角色死亡 //tagMCTurnFightObjDead:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                ObjID:%d,
+                                ObjType:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.ObjID,
+                                self.ObjType
+                                )
+        return DumpString
+
+
+m_NAtagMCTurnFightObjDead=tagMCTurnFightObjDead()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCTurnFightObjDead.Cmd,m_NAtagMCTurnFightObjDead.SubCmd))] = m_NAtagMCTurnFightObjDead
+
+
+#------------------------------------------------------
+# B4 23 回合战斗角色复活 #tagMCTurnFightObjReborn
+
+class  tagMCTurnFightObjReborn(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("ObjID", c_int),    
+                  ("ObjType", c_ubyte),    
+                  ("HP", c_int),    # 复活后血量,求余亿部分
+                  ("HPEx", c_int),    # 复活后血量,整除亿部分
+                  ("RebornType", c_ubyte),    # 复活方式:1-灵宠技能复活;2-待扩展
+                  ("RebornValue1", c_int),    # 复活方式对应值1,由复活方式决定其值意义
+                  ("RebornValue2", c_int),    # 复活方式对应值2
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xB4
+        self.SubCmd = 0x23
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.Cmd = 0xB4
+        self.SubCmd = 0x23
+        self.ObjID = 0
+        self.ObjType = 0
+        self.HP = 0
+        self.HPEx = 0
+        self.RebornType = 0
+        self.RebornValue1 = 0
+        self.RebornValue2 = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCTurnFightObjReborn)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// B4 23 回合战斗角色复活 //tagMCTurnFightObjReborn:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                ObjID:%d,
+                                ObjType:%d,
+                                HP:%d,
+                                HPEx:%d,
+                                RebornType:%d,
+                                RebornValue1:%d,
+                                RebornValue2:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.ObjID,
+                                self.ObjType,
+                                self.HP,
+                                self.HPEx,
+                                self.RebornType,
+                                self.RebornValue1,
+                                self.RebornValue2
+                                )
+        return DumpString
+
+
+m_NAtagMCTurnFightObjReborn=tagMCTurnFightObjReborn()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCTurnFightObjReborn.Cmd,m_NAtagMCTurnFightObjReborn.SubCmd))] = m_NAtagMCTurnFightObjReborn
+
+
+#------------------------------------------------------
+# B4 20 回合制战斗状态 #tagMCTurnFightState
+
+class  tagMCTurnFightState(Structure):
+    Head = tagHead()
+    MapID = 0    #(DWORD MapID)// 自定义地图ID,可用于绑定战斗场景功能(如野外关卡,爬塔功能,竞技场等)
+    FuncLineID = 0    #(WORD FuncLineID)
+    PlayerID = 0    #(DWORD PlayerID)// 对应玩家ID,可为0,某些功能可能有用,如竞技场
+    State = 0    #(BYTE State)// 0-起始状态标记;1-准备完毕;2-战斗中;3-战斗结束;4-结算奖励;5-结束状态标记
+    TurnNum = 0    #(BYTE TurnNum)// 当前轮次
+    TurnMax = 0    #(BYTE TurnMax)// 最大轮次
+    Len = 0    #(WORD Len)
+    Msg = ""    #(String Msg)//size = Len
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xB4
+        self.Head.SubCmd = 0x20
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.MapID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FuncLineID,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.State,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.TurnNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.TurnMax,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.Len,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.Msg,_pos = CommFunc.ReadString(_lpData, _pos,self.Len)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xB4
+        self.Head.SubCmd = 0x20
+        self.MapID = 0
+        self.FuncLineID = 0
+        self.PlayerID = 0
+        self.State = 0
+        self.TurnNum = 0
+        self.TurnMax = 0
+        self.Len = 0
+        self.Msg = ""
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 4
+        length += 2
+        length += 4
+        length += 1
+        length += 1
+        length += 1
+        length += 2
+        length += len(self.Msg)
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.MapID)
+        data = CommFunc.WriteWORD(data, self.FuncLineID)
+        data = CommFunc.WriteDWORD(data, self.PlayerID)
+        data = CommFunc.WriteBYTE(data, self.State)
+        data = CommFunc.WriteBYTE(data, self.TurnNum)
+        data = CommFunc.WriteBYTE(data, self.TurnMax)
+        data = CommFunc.WriteWORD(data, self.Len)
+        data = CommFunc.WriteString(data, self.Len, self.Msg)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                MapID:%d,
+                                FuncLineID:%d,
+                                PlayerID:%d,
+                                State:%d,
+                                TurnNum:%d,
+                                TurnMax:%d,
+                                Len:%d,
+                                Msg:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.MapID,
+                                self.FuncLineID,
+                                self.PlayerID,
+                                self.State,
+                                self.TurnNum,
+                                self.TurnMax,
+                                self.Len,
+                                self.Msg
+                                )
+        return DumpString
+
+
+m_NAtagMCTurnFightState=tagMCTurnFightState()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCTurnFightState.Head.Cmd,m_NAtagMCTurnFightState.Head.SubCmd))] = m_NAtagMCTurnFightState
+
+
+#------------------------------------------------------
 # C1 09 跨服排位玩家信息 #tagMCChampionshipPlayerInfo
 
 class  tagMCChampionshipPlayerInfo(Structure):

--
Gitblit v1.8.0