From a6fe9b060edf315f6abde7443e48db5dea439f47 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 28 五月 2025 09:59:08 +0800
Subject: [PATCH] 16 卡牌服务端(功能队伍数据基础;不含功能逻辑;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/Collections/CollectionDefine.py              |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBGameRec.py                             |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py                                         |  411 ++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py                                     |  953 +++++++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py                                          |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBFamily.py                              |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/LogicProcess/UserCtrlDB.py                   |   12 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBDataMgr.py                                        |    8 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/Collections/DataServerPlayerData.py          |  422 ++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_CrossBattlefield.py |   11 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini                                                 |   28 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py                                       |   35 
 PySysDB/PySysDBPY.h                                                                                                        |   14 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBFuncTeam.py                            |  397 ++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyZhenbaoge.py                        |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py                           |    6 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBStruct.py                                         |  250 ++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFuncTeam.py                               | 1104 +++++++++++++++++
 18 files changed, 3,607 insertions(+), 54 deletions(-)

diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index c2255da..36eac91 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -12,6 +12,20 @@
 	char		Word;	//屏蔽词
 };
 
+//功能队伍设定表
+
+struct tagFuncTeamSet
+{
+	DWORD		_FuncMapID;	//功能地图ID
+	BYTE		NeedName;	//需要队伍名
+	BYTE		MemberMax;	//最大人员数
+	BYTE		ApplyMax;	//最大接受申请数
+	BYTE		ReqApplyMax;	//最大申请数
+	BYTE		SortType;	//队伍列表排序方案
+	BYTE		SortReverse;	//是否倒序
+	BYTE		OPLimitInAct;	//活动期间限制队伍操作
+};
+
 //称号表 #tagDienstgrad
 
 struct	tagDienstgrad
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
index 65dfcbd..d32fa65 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
@@ -58,6 +58,34 @@
 PacketSubCMD_1=0x30
 PacketCallFunc_1=OnViewBillboard
 
+;功能组队
+[PlayerFuncTeam]
+ScriptName = Player\PlayerFuncTeam.py
+Writer = hxp
+Releaser = hxp
+RegType = 0
+RegisterPackCount = 5
+
+PacketCMD_1=0xB9
+PacketSubCMD_1=0x20
+PacketCallFunc_1=OnCreateFuncTeam
+
+PacketCMD_2=0xB9
+PacketSubCMD_2=0x21
+PacketCallFunc_2=OnChangeFuncTeam
+
+PacketCMD_3=0xB9
+PacketSubCMD_3=0x22
+PacketCallFunc_3=OnFuncTeamMemOP
+
+PacketCMD_4=0xB9
+PacketSubCMD_4=0x23
+PacketCallFunc_4=OnQueryFuncTeam
+
+PacketCMD_5=0xB9
+PacketSubCMD_5=0x24
+PacketCallFunc_5=OnQueryPlayerFuncTeam
+
 ;法器
 [PlayerFaQi]
 ScriptName = Player\PlayerFaQi.py
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
index 715a43d..6cefeb0 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -22932,6 +22932,82 @@
 
 
 #------------------------------------------------------
+# B9 21 修改功能队伍 #tagCMChangeFuncTeam
+
+class  tagCMChangeFuncTeam(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("TeamID", c_int),    
+                  ("FuncMapID", c_int),    # 功能地图ID或自定义的活动功能ID
+                  ("MinLV", c_ushort),    #最低等级限制
+                  ("MinFightPower", c_int),    #最低战力限制,求余亿
+                  ("MinFightPowerEx", c_int),    #最低战力限制,整除亿
+                  ("ServerOnly", c_ubyte),    #是否仅本服玩家可加入,0-否,1-是
+                  ("NeedCheck", c_ubyte),    #是否需要审核
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xB9
+        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 = 0xB9
+        self.SubCmd = 0x21
+        self.TeamID = 0
+        self.FuncMapID = 0
+        self.MinLV = 0
+        self.MinFightPower = 0
+        self.MinFightPowerEx = 0
+        self.ServerOnly = 0
+        self.NeedCheck = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagCMChangeFuncTeam)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// B9 21 修改功能队伍 //tagCMChangeFuncTeam:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                TeamID:%d,
+                                FuncMapID:%d,
+                                MinLV:%d,
+                                MinFightPower:%d,
+                                MinFightPowerEx:%d,
+                                ServerOnly:%d,
+                                NeedCheck:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.TeamID,
+                                self.FuncMapID,
+                                self.MinLV,
+                                self.MinFightPower,
+                                self.MinFightPowerEx,
+                                self.ServerOnly,
+                                self.NeedCheck
+                                )
+        return DumpString
+
+
+m_NAtagCMChangeFuncTeam=tagCMChangeFuncTeam()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMChangeFuncTeam.Cmd,m_NAtagCMChangeFuncTeam.SubCmd))] = m_NAtagCMChangeFuncTeam
+
+
+#------------------------------------------------------
 # B9 04 修改队伍相关审核状态 #tagCMChangeTeamCheckState
 
 class  tagCMChangeTeamCheckState(Structure):
@@ -22988,6 +23064,341 @@
 
 
 #------------------------------------------------------
+# B9 20 创建功能队伍 #tagCMCreateFuncTeam
+
+class  tagCMCreateFuncTeam(Structure):
+    Head = tagHead()
+    FuncMapID = 0    #(DWORD FuncMapID)// 功能地图ID或自定义的活动功能ID
+    FuncMapEx = 0    #(DWORD FuncMapEx)// 功能地图扩展,如不同的层级
+    NameLen = 0    #(BYTE NameLen)
+    TeamName = ""    #(String TeamName)// 队伍名称,可为空
+    MinLV = 0    #(WORD MinLV)//最低等级限制
+    MinFightPower = 0    #(DWORD MinFightPower)//最低战力限制,求余亿
+    MinFightPowerEx = 0    #(DWORD MinFightPowerEx)//最低战力限制,整除亿
+    ServerOnly = 0    #(BYTE ServerOnly)//是否仅本服玩家可加入,0-否,1-是
+    NeedCheck = 0    #(BYTE NeedCheck)//是否需要审核
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xB9
+        self.Head.SubCmd = 0x20
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.FuncMapID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FuncMapEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.NameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.TeamName,_pos = CommFunc.ReadString(_lpData, _pos,self.NameLen)
+        self.MinLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.MinFightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.MinFightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.ServerOnly,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.NeedCheck,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xB9
+        self.Head.SubCmd = 0x20
+        self.FuncMapID = 0
+        self.FuncMapEx = 0
+        self.NameLen = 0
+        self.TeamName = ""
+        self.MinLV = 0
+        self.MinFightPower = 0
+        self.MinFightPowerEx = 0
+        self.ServerOnly = 0
+        self.NeedCheck = 0
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 4
+        length += 4
+        length += 1
+        length += len(self.TeamName)
+        length += 2
+        length += 4
+        length += 4
+        length += 1
+        length += 1
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.FuncMapID)
+        data = CommFunc.WriteDWORD(data, self.FuncMapEx)
+        data = CommFunc.WriteBYTE(data, self.NameLen)
+        data = CommFunc.WriteString(data, self.NameLen, self.TeamName)
+        data = CommFunc.WriteWORD(data, self.MinLV)
+        data = CommFunc.WriteDWORD(data, self.MinFightPower)
+        data = CommFunc.WriteDWORD(data, self.MinFightPowerEx)
+        data = CommFunc.WriteBYTE(data, self.ServerOnly)
+        data = CommFunc.WriteBYTE(data, self.NeedCheck)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                FuncMapID:%d,
+                                FuncMapEx:%d,
+                                NameLen:%d,
+                                TeamName:%s,
+                                MinLV:%d,
+                                MinFightPower:%d,
+                                MinFightPowerEx:%d,
+                                ServerOnly:%d,
+                                NeedCheck:%d
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.FuncMapID,
+                                self.FuncMapEx,
+                                self.NameLen,
+                                self.TeamName,
+                                self.MinLV,
+                                self.MinFightPower,
+                                self.MinFightPowerEx,
+                                self.ServerOnly,
+                                self.NeedCheck
+                                )
+        return DumpString
+
+
+m_NAtagCMCreateFuncTeam=tagCMCreateFuncTeam()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMCreateFuncTeam.Head.Cmd,m_NAtagCMCreateFuncTeam.Head.SubCmd))] = m_NAtagCMCreateFuncTeam
+
+
+#------------------------------------------------------
+# B9 22 功能队伍成员操作 #tagCMFuncTeamMemOP
+
+class  tagCMFuncTeamMemOP(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("TeamID", c_int),    
+                  ("FuncMapID", c_int),    # 功能地图ID或自定义的活动功能ID
+                  ("OPType", c_ubyte),    # 1-申请加入;2-申请取消;3-同意入队;4-拒绝入队;5-退出队伍;6-踢出队伍;7-转让队长;8-解散队伍;
+                  ("OPData", c_int),    # 可选
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xB9
+        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 = 0xB9
+        self.SubCmd = 0x22
+        self.TeamID = 0
+        self.FuncMapID = 0
+        self.OPType = 0
+        self.OPData = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagCMFuncTeamMemOP)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// B9 22 功能队伍成员操作 //tagCMFuncTeamMemOP:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                TeamID:%d,
+                                FuncMapID:%d,
+                                OPType:%d,
+                                OPData:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.TeamID,
+                                self.FuncMapID,
+                                self.OPType,
+                                self.OPData
+                                )
+        return DumpString
+
+
+m_NAtagCMFuncTeamMemOP=tagCMFuncTeamMemOP()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMFuncTeamMemOP.Cmd,m_NAtagCMFuncTeamMemOP.SubCmd))] = m_NAtagCMFuncTeamMemOP
+
+
+#------------------------------------------------------
+# B9 23 查找功能队伍列表 #tagCMQueryFuncTeam
+
+class  tagCMQueryFuncTeam(Structure):
+    Head = tagHead()
+    FuncMapID = 0    #(DWORD FuncMapID)// 功能地图ID或自定义的活动功能ID
+    FuncMapEx = 0    #(DWORD FuncMapEx)// 功能地图扩展,如不同的层级,0代表所有
+    StartIndex = 0    #(DWORD StartIndex)// 查看的起始索引, 默认0
+    QueryCnt = 0    #(BYTE QueryCnt)// 查看条数,默认20,最大不超过100
+    HaveSpace = 0    #(BYTE HaveSpace)// 是否只查看有空位置的队伍
+    IDLimitType = 0    #(BYTE IDLimitType)// ID限制类型:1-同仙盟队长;2-同ServerGroupID队长;3-同ServerID队长
+    SearchLen = 0    #(BYTE SearchLen)
+    SearchMsg = ""    #(String SearchMsg)// 指定搜索时有用,可搜索指定队伍ID或模糊搜索队伍名称,搜索时返回最多QueryCnt个数的队伍
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xB9
+        self.Head.SubCmd = 0x23
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.FuncMapID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FuncMapEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.StartIndex,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.QueryCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.HaveSpace,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.IDLimitType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.SearchLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.SearchMsg,_pos = CommFunc.ReadString(_lpData, _pos,self.SearchLen)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xB9
+        self.Head.SubCmd = 0x23
+        self.FuncMapID = 0
+        self.FuncMapEx = 0
+        self.StartIndex = 0
+        self.QueryCnt = 0
+        self.HaveSpace = 0
+        self.IDLimitType = 0
+        self.SearchLen = 0
+        self.SearchMsg = ""
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 4
+        length += 4
+        length += 4
+        length += 1
+        length += 1
+        length += 1
+        length += 1
+        length += len(self.SearchMsg)
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.FuncMapID)
+        data = CommFunc.WriteDWORD(data, self.FuncMapEx)
+        data = CommFunc.WriteDWORD(data, self.StartIndex)
+        data = CommFunc.WriteBYTE(data, self.QueryCnt)
+        data = CommFunc.WriteBYTE(data, self.HaveSpace)
+        data = CommFunc.WriteBYTE(data, self.IDLimitType)
+        data = CommFunc.WriteBYTE(data, self.SearchLen)
+        data = CommFunc.WriteString(data, self.SearchLen, self.SearchMsg)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                FuncMapID:%d,
+                                FuncMapEx:%d,
+                                StartIndex:%d,
+                                QueryCnt:%d,
+                                HaveSpace:%d,
+                                IDLimitType:%d,
+                                SearchLen:%d,
+                                SearchMsg:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.FuncMapID,
+                                self.FuncMapEx,
+                                self.StartIndex,
+                                self.QueryCnt,
+                                self.HaveSpace,
+                                self.IDLimitType,
+                                self.SearchLen,
+                                self.SearchMsg
+                                )
+        return DumpString
+
+
+m_NAtagCMQueryFuncTeam=tagCMQueryFuncTeam()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMQueryFuncTeam.Head.Cmd,m_NAtagCMQueryFuncTeam.Head.SubCmd))] = m_NAtagCMQueryFuncTeam
+
+
+#------------------------------------------------------
+# B9 24 查找玩家功能队伍 #tagCMQueryPlayerFuncTeam
+
+class  tagCMQueryPlayerFuncTeam(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("FuncMapID", c_int),    # 功能地图ID或自定义的活动功能ID
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xB9
+        self.SubCmd = 0x24
+        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 = 0xB9
+        self.SubCmd = 0x24
+        self.FuncMapID = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagCMQueryPlayerFuncTeam)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// B9 24 查找玩家功能队伍 //tagCMQueryPlayerFuncTeam:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                FuncMapID:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.FuncMapID
+                                )
+        return DumpString
+
+
+m_NAtagCMQueryPlayerFuncTeam=tagCMQueryPlayerFuncTeam()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMQueryPlayerFuncTeam.Cmd,m_NAtagCMQueryPlayerFuncTeam.SubCmd))] = m_NAtagCMQueryPlayerFuncTeam
+
+
+#------------------------------------------------------
 # C1 22 跨服排位竞猜 #tagCMChampionshipGuess
 
 class  tagCMChampionshipGuess(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index f9a9d9a..e62228e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -60394,6 +60394,959 @@
 
 
 #------------------------------------------------------
+# B9 23 功能队伍解散 #tagMCFuncTeamDissolve
+
+class  tagMCFuncTeamDissolve(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("TeamID", c_int),    
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xB9
+        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 = 0xB9
+        self.SubCmd = 0x23
+        self.TeamID = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCFuncTeamDissolve)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// B9 23 功能队伍解散 //tagMCFuncTeamDissolve:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                TeamID:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.TeamID
+                                )
+        return DumpString
+
+
+m_NAtagMCFuncTeamDissolve=tagMCFuncTeamDissolve()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCFuncTeamDissolve.Cmd,m_NAtagMCFuncTeamDissolve.SubCmd))] = m_NAtagMCFuncTeamDissolve
+
+
+#------------------------------------------------------
+# B9 22 功能队伍列表 #tagMCFuncTeamList
+
+class  tagMCFuncTeamMem(Structure):
+    ServerID = 0    #(DWORD ServerID)
+    PlayerID = 0    #(DWORD PlayerID)
+    NameLen = 0    #(BYTE NameLen)
+    Name = ""    #(String Name)// 玩家名,size = NameLen
+    LV = 0    #(WORD LV)// 玩家等级
+    Job = 0    #(BYTE Job)// 玩家职业
+    RealmLV = 0    #(WORD RealmLV)// 玩家境界
+    Face = 0    #(DWORD Face)//基本脸型
+    FacePic = 0    #(DWORD FacePic)//头像框
+    FightPower = 0    #(DWORD FightPower)// 战力,求余亿
+    FightPowerEx = 0    #(DWORD FightPowerEx)// 战力,整除亿
+    Value1 = 0    #(DWORD Value1)//值1
+    Value2 = 0    #(DWORD Value2)//值2
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.ServerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.NameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.Name,_pos = CommFunc.ReadString(_lpData, _pos,self.NameLen)
+        self.LV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.Job,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.RealmLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.Face,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FacePic,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Value1,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Value2,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        return _pos
+
+    def Clear(self):
+        self.ServerID = 0
+        self.PlayerID = 0
+        self.NameLen = 0
+        self.Name = ""
+        self.LV = 0
+        self.Job = 0
+        self.RealmLV = 0
+        self.Face = 0
+        self.FacePic = 0
+        self.FightPower = 0
+        self.FightPowerEx = 0
+        self.Value1 = 0
+        self.Value2 = 0
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 4
+        length += 1
+        length += len(self.Name)
+        length += 2
+        length += 1
+        length += 2
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.ServerID)
+        data = CommFunc.WriteDWORD(data, self.PlayerID)
+        data = CommFunc.WriteBYTE(data, self.NameLen)
+        data = CommFunc.WriteString(data, self.NameLen, self.Name)
+        data = CommFunc.WriteWORD(data, self.LV)
+        data = CommFunc.WriteBYTE(data, self.Job)
+        data = CommFunc.WriteWORD(data, self.RealmLV)
+        data = CommFunc.WriteDWORD(data, self.Face)
+        data = CommFunc.WriteDWORD(data, self.FacePic)
+        data = CommFunc.WriteDWORD(data, self.FightPower)
+        data = CommFunc.WriteDWORD(data, self.FightPowerEx)
+        data = CommFunc.WriteDWORD(data, self.Value1)
+        data = CommFunc.WriteDWORD(data, self.Value2)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                ServerID:%d,
+                                PlayerID:%d,
+                                NameLen:%d,
+                                Name:%s,
+                                LV:%d,
+                                Job:%d,
+                                RealmLV:%d,
+                                Face:%d,
+                                FacePic:%d,
+                                FightPower:%d,
+                                FightPowerEx:%d,
+                                Value1:%d,
+                                Value2:%d
+                                '''\
+                                %(
+                                self.ServerID,
+                                self.PlayerID,
+                                self.NameLen,
+                                self.Name,
+                                self.LV,
+                                self.Job,
+                                self.RealmLV,
+                                self.Face,
+                                self.FacePic,
+                                self.FightPower,
+                                self.FightPowerEx,
+                                self.Value1,
+                                self.Value2
+                                )
+        return DumpString
+
+
+class  tagMCFuncTeam(Structure):
+    TeamID = 0    #(DWORD TeamID)
+    CreateTime = 0    #(DWORD CreateTime)//创建队伍时间戳
+    FuncMapEx = 0    #(DWORD FuncMapEx)//功能地图扩展,如不同的层级
+    NameLen = 0    #(BYTE NameLen)
+    TeamName = ""    #(String TeamName)//队伍名称
+    CaptainID = 0    #(DWORD CaptainID)//队长ID,队伍ServerID直接取队长的ServerID
+    MinLV = 0    #(WORD MinLV)//最低等级限制
+    MinFightPower = 0    #(DWORD MinFightPower)//最低战力限制,求余亿
+    MinFightPowerEx = 0    #(DWORD MinFightPowerEx)//最低战力限制,整除亿
+    ServerOnly = 0    #(BYTE ServerOnly)//是否仅本服玩家可加入,0-否,1-是
+    NeedCheck = 0    #(BYTE NeedCheck)//是否需要审核
+    Value1 = 0    #(DWORD Value1)//值1
+    Value2 = 0    #(DWORD Value2)//值2
+    MemberCount = 0    #(BYTE MemberCount)
+    MemberList = list()    #(vector<tagMCFuncTeamMem> MemberList)// 成员列表
+    ApplyCount = 0    #(WORD ApplyCount)
+    ApplyIDList = list()    #(vector<DWORD> ApplyIDList)// 申请玩家ID列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.TeamID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.CreateTime,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FuncMapEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.NameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.TeamName,_pos = CommFunc.ReadString(_lpData, _pos,self.NameLen)
+        self.CaptainID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.MinLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.MinFightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.MinFightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.ServerOnly,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.NeedCheck,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.Value1,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Value2,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.MemberCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.MemberCount):
+            temMemberList = tagMCFuncTeamMem()
+            _pos = temMemberList.ReadData(_lpData, _pos)
+            self.MemberList.append(temMemberList)
+        self.ApplyCount,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        for i in range(self.ApplyCount):
+            value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
+            self.ApplyIDList.append(value)
+        return _pos
+
+    def Clear(self):
+        self.TeamID = 0
+        self.CreateTime = 0
+        self.FuncMapEx = 0
+        self.NameLen = 0
+        self.TeamName = ""
+        self.CaptainID = 0
+        self.MinLV = 0
+        self.MinFightPower = 0
+        self.MinFightPowerEx = 0
+        self.ServerOnly = 0
+        self.NeedCheck = 0
+        self.Value1 = 0
+        self.Value2 = 0
+        self.MemberCount = 0
+        self.MemberList = list()
+        self.ApplyCount = 0
+        self.ApplyIDList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 4
+        length += 4
+        length += 1
+        length += len(self.TeamName)
+        length += 4
+        length += 2
+        length += 4
+        length += 4
+        length += 1
+        length += 1
+        length += 4
+        length += 4
+        length += 1
+        for i in range(self.MemberCount):
+            length += self.MemberList[i].GetLength()
+        length += 2
+        length += 4 * self.ApplyCount
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.TeamID)
+        data = CommFunc.WriteDWORD(data, self.CreateTime)
+        data = CommFunc.WriteDWORD(data, self.FuncMapEx)
+        data = CommFunc.WriteBYTE(data, self.NameLen)
+        data = CommFunc.WriteString(data, self.NameLen, self.TeamName)
+        data = CommFunc.WriteDWORD(data, self.CaptainID)
+        data = CommFunc.WriteWORD(data, self.MinLV)
+        data = CommFunc.WriteDWORD(data, self.MinFightPower)
+        data = CommFunc.WriteDWORD(data, self.MinFightPowerEx)
+        data = CommFunc.WriteBYTE(data, self.ServerOnly)
+        data = CommFunc.WriteBYTE(data, self.NeedCheck)
+        data = CommFunc.WriteDWORD(data, self.Value1)
+        data = CommFunc.WriteDWORD(data, self.Value2)
+        data = CommFunc.WriteBYTE(data, self.MemberCount)
+        for i in range(self.MemberCount):
+            data = CommFunc.WriteString(data, self.MemberList[i].GetLength(), self.MemberList[i].GetBuffer())
+        data = CommFunc.WriteWORD(data, self.ApplyCount)
+        for i in range(self.ApplyCount):
+            data = CommFunc.WriteDWORD(data, self.ApplyIDList[i])
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                TeamID:%d,
+                                CreateTime:%d,
+                                FuncMapEx:%d,
+                                NameLen:%d,
+                                TeamName:%s,
+                                CaptainID:%d,
+                                MinLV:%d,
+                                MinFightPower:%d,
+                                MinFightPowerEx:%d,
+                                ServerOnly:%d,
+                                NeedCheck:%d,
+                                Value1:%d,
+                                Value2:%d,
+                                MemberCount:%d,
+                                MemberList:%s,
+                                ApplyCount:%d,
+                                ApplyIDList:%s
+                                '''\
+                                %(
+                                self.TeamID,
+                                self.CreateTime,
+                                self.FuncMapEx,
+                                self.NameLen,
+                                self.TeamName,
+                                self.CaptainID,
+                                self.MinLV,
+                                self.MinFightPower,
+                                self.MinFightPowerEx,
+                                self.ServerOnly,
+                                self.NeedCheck,
+                                self.Value1,
+                                self.Value2,
+                                self.MemberCount,
+                                "...",
+                                self.ApplyCount,
+                                "..."
+                                )
+        return DumpString
+
+
+class  tagMCFuncTeamList(Structure):
+    Head = tagHead()
+    FuncMapID = 0    #(DWORD FuncMapID)// 功能地图ID或自定义的活动功能ID
+    FuncMapEx = 0    #(DWORD FuncMapEx)// 功能地图扩展,如不同的层级,0代表所有
+    StartIndex = 0    #(DWORD StartIndex)// 查看的起始索引, 默认0
+    QueryCnt = 0    #(BYTE QueryCnt)// 查看条数,默认20,最大不超过100
+    HaveSpace = 0    #(BYTE HaveSpace)// 是否只查看有空位置的队伍
+    IDLimitType = 0    #(BYTE IDLimitType)// ID限制类型:1-同仙盟队长;2-同ServerGroupID队长;3-同ServerID队长
+    SearchLen = 0    #(BYTE SearchLen)
+    SearchMsg = ""    #(String SearchMsg)// 指定搜索时有用,可搜索指定队伍ID或模糊搜索队伍名称,搜索时返回最多QueryCnt个数的队伍
+    LoopIndex = 0    #(DWORD LoopIndex)// 服务器检索到的索引,列表下拉时下一个查询包的StartIndex从这个LoopIndex开始
+    TeamCount = 0    #(BYTE TeamCount)// 如果返回的队伍数小于QueryCnt,代表服务器已经没有满足条件的队伍了,列表再下拉时不再发查询包
+    TeamList = list()    #(vector<tagMCFuncTeam> TeamList)
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xB9
+        self.Head.SubCmd = 0x22
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.FuncMapID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FuncMapEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.StartIndex,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.QueryCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.HaveSpace,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.IDLimitType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.SearchLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.SearchMsg,_pos = CommFunc.ReadString(_lpData, _pos,self.SearchLen)
+        self.LoopIndex,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.TeamCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.TeamCount):
+            temTeamList = tagMCFuncTeam()
+            _pos = temTeamList.ReadData(_lpData, _pos)
+            self.TeamList.append(temTeamList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xB9
+        self.Head.SubCmd = 0x22
+        self.FuncMapID = 0
+        self.FuncMapEx = 0
+        self.StartIndex = 0
+        self.QueryCnt = 0
+        self.HaveSpace = 0
+        self.IDLimitType = 0
+        self.SearchLen = 0
+        self.SearchMsg = ""
+        self.LoopIndex = 0
+        self.TeamCount = 0
+        self.TeamList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 4
+        length += 4
+        length += 4
+        length += 1
+        length += 1
+        length += 1
+        length += 1
+        length += len(self.SearchMsg)
+        length += 4
+        length += 1
+        for i in range(self.TeamCount):
+            length += self.TeamList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.FuncMapID)
+        data = CommFunc.WriteDWORD(data, self.FuncMapEx)
+        data = CommFunc.WriteDWORD(data, self.StartIndex)
+        data = CommFunc.WriteBYTE(data, self.QueryCnt)
+        data = CommFunc.WriteBYTE(data, self.HaveSpace)
+        data = CommFunc.WriteBYTE(data, self.IDLimitType)
+        data = CommFunc.WriteBYTE(data, self.SearchLen)
+        data = CommFunc.WriteString(data, self.SearchLen, self.SearchMsg)
+        data = CommFunc.WriteDWORD(data, self.LoopIndex)
+        data = CommFunc.WriteBYTE(data, self.TeamCount)
+        for i in range(self.TeamCount):
+            data = CommFunc.WriteString(data, self.TeamList[i].GetLength(), self.TeamList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                FuncMapID:%d,
+                                FuncMapEx:%d,
+                                StartIndex:%d,
+                                QueryCnt:%d,
+                                HaveSpace:%d,
+                                IDLimitType:%d,
+                                SearchLen:%d,
+                                SearchMsg:%s,
+                                LoopIndex:%d,
+                                TeamCount:%d,
+                                TeamList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.FuncMapID,
+                                self.FuncMapEx,
+                                self.StartIndex,
+                                self.QueryCnt,
+                                self.HaveSpace,
+                                self.IDLimitType,
+                                self.SearchLen,
+                                self.SearchMsg,
+                                self.LoopIndex,
+                                self.TeamCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCFuncTeamList=tagMCFuncTeamList()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCFuncTeamList.Head.Cmd,m_NAtagMCFuncTeamList.Head.SubCmd))] = m_NAtagMCFuncTeamList
+
+
+#------------------------------------------------------
+# B9 20 功能队伍刷新 #tagMCFuncTeamRefresh
+
+class  tagMCFuncTeamRefreshApply(Structure):
+    ServerID = 0    #(DWORD ServerID)
+    PlayerID = 0    #(DWORD PlayerID)
+    NameLen = 0    #(BYTE NameLen)
+    Name = ""    #(String Name)// 玩家名,size = NameLen
+    LV = 0    #(WORD LV)// 玩家等级
+    Job = 0    #(BYTE Job)// 玩家职业
+    RealmLV = 0    #(WORD RealmLV)// 玩家境界
+    Face = 0    #(DWORD Face)//基本脸型
+    FacePic = 0    #(DWORD FacePic)//头像框
+    FightPower = 0    #(DWORD FightPower)// 战力,求余亿
+    FightPowerEx = 0    #(DWORD FightPowerEx)// 战力,整除亿
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.ServerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.NameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.Name,_pos = CommFunc.ReadString(_lpData, _pos,self.NameLen)
+        self.LV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.Job,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.RealmLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.Face,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FacePic,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        return _pos
+
+    def Clear(self):
+        self.ServerID = 0
+        self.PlayerID = 0
+        self.NameLen = 0
+        self.Name = ""
+        self.LV = 0
+        self.Job = 0
+        self.RealmLV = 0
+        self.Face = 0
+        self.FacePic = 0
+        self.FightPower = 0
+        self.FightPowerEx = 0
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 4
+        length += 1
+        length += len(self.Name)
+        length += 2
+        length += 1
+        length += 2
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.ServerID)
+        data = CommFunc.WriteDWORD(data, self.PlayerID)
+        data = CommFunc.WriteBYTE(data, self.NameLen)
+        data = CommFunc.WriteString(data, self.NameLen, self.Name)
+        data = CommFunc.WriteWORD(data, self.LV)
+        data = CommFunc.WriteBYTE(data, self.Job)
+        data = CommFunc.WriteWORD(data, self.RealmLV)
+        data = CommFunc.WriteDWORD(data, self.Face)
+        data = CommFunc.WriteDWORD(data, self.FacePic)
+        data = CommFunc.WriteDWORD(data, self.FightPower)
+        data = CommFunc.WriteDWORD(data, self.FightPowerEx)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                ServerID:%d,
+                                PlayerID:%d,
+                                NameLen:%d,
+                                Name:%s,
+                                LV:%d,
+                                Job:%d,
+                                RealmLV:%d,
+                                Face:%d,
+                                FacePic:%d,
+                                FightPower:%d,
+                                FightPowerEx:%d
+                                '''\
+                                %(
+                                self.ServerID,
+                                self.PlayerID,
+                                self.NameLen,
+                                self.Name,
+                                self.LV,
+                                self.Job,
+                                self.RealmLV,
+                                self.Face,
+                                self.FacePic,
+                                self.FightPower,
+                                self.FightPowerEx
+                                )
+        return DumpString
+
+
+class  tagMCFuncTeamRefreshMem(Structure):
+    ServerID = 0    #(DWORD ServerID)
+    PlayerID = 0    #(DWORD PlayerID)
+    NameLen = 0    #(BYTE NameLen)
+    Name = ""    #(String Name)// 玩家名,size = NameLen
+    LV = 0    #(WORD LV)// 玩家等级
+    Job = 0    #(BYTE Job)// 玩家职业
+    RealmLV = 0    #(WORD RealmLV)// 玩家境界
+    Face = 0    #(DWORD Face)//基本脸型
+    FacePic = 0    #(DWORD FacePic)//头像框
+    FightPower = 0    #(DWORD FightPower)// 战力,求余亿
+    FightPowerEx = 0    #(DWORD FightPowerEx)// 战力,整除亿
+    OfflineValue = 0    #(DWORD OfflineValue)// 离线值:0-在线;1-离线;>1-上次离线时间戳,可用于计算离线多久了;当取不到玩家信息时用1代表已离线;
+    Value1 = 0    #(DWORD Value1)//值1
+    Value2 = 0    #(DWORD Value2)//值2
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.ServerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.NameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.Name,_pos = CommFunc.ReadString(_lpData, _pos,self.NameLen)
+        self.LV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.Job,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.RealmLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.Face,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FacePic,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.OfflineValue,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Value1,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Value2,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        return _pos
+
+    def Clear(self):
+        self.ServerID = 0
+        self.PlayerID = 0
+        self.NameLen = 0
+        self.Name = ""
+        self.LV = 0
+        self.Job = 0
+        self.RealmLV = 0
+        self.Face = 0
+        self.FacePic = 0
+        self.FightPower = 0
+        self.FightPowerEx = 0
+        self.OfflineValue = 0
+        self.Value1 = 0
+        self.Value2 = 0
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 4
+        length += 1
+        length += len(self.Name)
+        length += 2
+        length += 1
+        length += 2
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.ServerID)
+        data = CommFunc.WriteDWORD(data, self.PlayerID)
+        data = CommFunc.WriteBYTE(data, self.NameLen)
+        data = CommFunc.WriteString(data, self.NameLen, self.Name)
+        data = CommFunc.WriteWORD(data, self.LV)
+        data = CommFunc.WriteBYTE(data, self.Job)
+        data = CommFunc.WriteWORD(data, self.RealmLV)
+        data = CommFunc.WriteDWORD(data, self.Face)
+        data = CommFunc.WriteDWORD(data, self.FacePic)
+        data = CommFunc.WriteDWORD(data, self.FightPower)
+        data = CommFunc.WriteDWORD(data, self.FightPowerEx)
+        data = CommFunc.WriteDWORD(data, self.OfflineValue)
+        data = CommFunc.WriteDWORD(data, self.Value1)
+        data = CommFunc.WriteDWORD(data, self.Value2)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                ServerID:%d,
+                                PlayerID:%d,
+                                NameLen:%d,
+                                Name:%s,
+                                LV:%d,
+                                Job:%d,
+                                RealmLV:%d,
+                                Face:%d,
+                                FacePic:%d,
+                                FightPower:%d,
+                                FightPowerEx:%d,
+                                OfflineValue:%d,
+                                Value1:%d,
+                                Value2:%d
+                                '''\
+                                %(
+                                self.ServerID,
+                                self.PlayerID,
+                                self.NameLen,
+                                self.Name,
+                                self.LV,
+                                self.Job,
+                                self.RealmLV,
+                                self.Face,
+                                self.FacePic,
+                                self.FightPower,
+                                self.FightPowerEx,
+                                self.OfflineValue,
+                                self.Value1,
+                                self.Value2
+                                )
+        return DumpString
+
+
+class  tagMCFuncTeamRefresh(Structure):
+    Head = tagHead()
+    TeamID = 0    #(DWORD TeamID)
+    CreateTime = 0    #(DWORD CreateTime)//创建队伍时间戳
+    FuncMapID = 0    #(DWORD FuncMapID)// 功能地图ID或自定义的活动功能ID
+    FuncMapEx = 0    #(DWORD FuncMapEx)// 功能地图扩展,如不同的层级
+    NameLen = 0    #(BYTE NameLen)
+    TeamName = ""    #(String TeamName)// 队伍名称
+    CaptainID = 0    #(DWORD CaptainID)//队长ID,队伍ServerID直接取队长的ServerID
+    MinLV = 0    #(WORD MinLV)//最低等级限制
+    MinFightPower = 0    #(DWORD MinFightPower)//最低战力限制,求余亿
+    MinFightPowerEx = 0    #(DWORD MinFightPowerEx)//最低战力限制,整除亿
+    ServerOnly = 0    #(BYTE ServerOnly)//是否仅本服玩家可加入,0-否,1-是
+    NeedCheck = 0    #(BYTE NeedCheck)//是否需要审核
+    Value1 = 0    #(DWORD Value1)//值1
+    Value2 = 0    #(DWORD Value2)//值2
+    MemberCount = 0    #(BYTE MemberCount)
+    MemberList = list()    #(vector<tagMCFuncTeamRefreshMem> MemberList)// 成员列表
+    ApplyCount = 0    #(WORD ApplyCount)
+    ApplyIDList = list()    #(vector<DWORD> ApplyIDList)// 申请玩家ID列表
+    ApplyInfoList = list()    #(vector<tagMCFuncTeamRefreshApply> ApplyInfoList)// 申请玩家明细列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xB9
+        self.Head.SubCmd = 0x20
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.TeamID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.CreateTime,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FuncMapID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FuncMapEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.NameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.TeamName,_pos = CommFunc.ReadString(_lpData, _pos,self.NameLen)
+        self.CaptainID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.MinLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.MinFightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.MinFightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.ServerOnly,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.NeedCheck,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.Value1,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Value2,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.MemberCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.MemberCount):
+            temMemberList = tagMCFuncTeamRefreshMem()
+            _pos = temMemberList.ReadData(_lpData, _pos)
+            self.MemberList.append(temMemberList)
+        self.ApplyCount,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        for i in range(self.ApplyCount):
+            value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
+            self.ApplyIDList.append(value)
+        for i in range(self.ApplyCount):
+            temApplyInfoList = tagMCFuncTeamRefreshApply()
+            _pos = temApplyInfoList.ReadData(_lpData, _pos)
+            self.ApplyInfoList.append(temApplyInfoList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xB9
+        self.Head.SubCmd = 0x20
+        self.TeamID = 0
+        self.CreateTime = 0
+        self.FuncMapID = 0
+        self.FuncMapEx = 0
+        self.NameLen = 0
+        self.TeamName = ""
+        self.CaptainID = 0
+        self.MinLV = 0
+        self.MinFightPower = 0
+        self.MinFightPowerEx = 0
+        self.ServerOnly = 0
+        self.NeedCheck = 0
+        self.Value1 = 0
+        self.Value2 = 0
+        self.MemberCount = 0
+        self.MemberList = list()
+        self.ApplyCount = 0
+        self.ApplyIDList = list()
+        self.ApplyInfoList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 1
+        length += len(self.TeamName)
+        length += 4
+        length += 2
+        length += 4
+        length += 4
+        length += 1
+        length += 1
+        length += 4
+        length += 4
+        length += 1
+        for i in range(self.MemberCount):
+            length += self.MemberList[i].GetLength()
+        length += 2
+        length += 4 * self.ApplyCount
+        for i in range(self.ApplyCount):
+            length += self.ApplyInfoList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.TeamID)
+        data = CommFunc.WriteDWORD(data, self.CreateTime)
+        data = CommFunc.WriteDWORD(data, self.FuncMapID)
+        data = CommFunc.WriteDWORD(data, self.FuncMapEx)
+        data = CommFunc.WriteBYTE(data, self.NameLen)
+        data = CommFunc.WriteString(data, self.NameLen, self.TeamName)
+        data = CommFunc.WriteDWORD(data, self.CaptainID)
+        data = CommFunc.WriteWORD(data, self.MinLV)
+        data = CommFunc.WriteDWORD(data, self.MinFightPower)
+        data = CommFunc.WriteDWORD(data, self.MinFightPowerEx)
+        data = CommFunc.WriteBYTE(data, self.ServerOnly)
+        data = CommFunc.WriteBYTE(data, self.NeedCheck)
+        data = CommFunc.WriteDWORD(data, self.Value1)
+        data = CommFunc.WriteDWORD(data, self.Value2)
+        data = CommFunc.WriteBYTE(data, self.MemberCount)
+        for i in range(self.MemberCount):
+            data = CommFunc.WriteString(data, self.MemberList[i].GetLength(), self.MemberList[i].GetBuffer())
+        data = CommFunc.WriteWORD(data, self.ApplyCount)
+        for i in range(self.ApplyCount):
+            data = CommFunc.WriteDWORD(data, self.ApplyIDList[i])
+        for i in range(self.ApplyCount):
+            data = CommFunc.WriteString(data, self.ApplyInfoList[i].GetLength(), self.ApplyInfoList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                TeamID:%d,
+                                CreateTime:%d,
+                                FuncMapID:%d,
+                                FuncMapEx:%d,
+                                NameLen:%d,
+                                TeamName:%s,
+                                CaptainID:%d,
+                                MinLV:%d,
+                                MinFightPower:%d,
+                                MinFightPowerEx:%d,
+                                ServerOnly:%d,
+                                NeedCheck:%d,
+                                Value1:%d,
+                                Value2:%d,
+                                MemberCount:%d,
+                                MemberList:%s,
+                                ApplyCount:%d,
+                                ApplyIDList:%s,
+                                ApplyInfoList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.TeamID,
+                                self.CreateTime,
+                                self.FuncMapID,
+                                self.FuncMapEx,
+                                self.NameLen,
+                                self.TeamName,
+                                self.CaptainID,
+                                self.MinLV,
+                                self.MinFightPower,
+                                self.MinFightPowerEx,
+                                self.ServerOnly,
+                                self.NeedCheck,
+                                self.Value1,
+                                self.Value2,
+                                self.MemberCount,
+                                "...",
+                                self.ApplyCount,
+                                "...",
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCFuncTeamRefresh=tagMCFuncTeamRefresh()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCFuncTeamRefresh.Head.Cmd,m_NAtagMCFuncTeamRefresh.Head.SubCmd))] = m_NAtagMCFuncTeamRefresh
+
+
+#------------------------------------------------------
+# B9 21 查找玩家功能队伍结果 #tagMCQueryPlayerFuncTeamRet
+
+class  tagMCQueryPlayerFuncTeamRet(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("FuncMapID", c_int),    # 功能地图ID或自定义的活动功能ID
+                  ("TeamID", c_int),    # 玩家所属队伍ID,目前只同步0的情况,如果玩家有队伍统一B920封包同步处理
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xB9
+        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 = 0xB9
+        self.SubCmd = 0x21
+        self.FuncMapID = 0
+        self.TeamID = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCQueryPlayerFuncTeamRet)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// B9 21 查找玩家功能队伍结果 //tagMCQueryPlayerFuncTeamRet:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                FuncMapID:%d,
+                                TeamID:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.FuncMapID,
+                                self.TeamID
+                                )
+        return DumpString
+
+
+m_NAtagMCQueryPlayerFuncTeamRet=tagMCQueryPlayerFuncTeamRet()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCQueryPlayerFuncTeamRet.Cmd,m_NAtagMCQueryPlayerFuncTeamRet.SubCmd))] = m_NAtagMCQueryPlayerFuncTeamRet
+
+
+#------------------------------------------------------
 # C1 09 跨服排位玩家信息 #tagMCChampionshipPlayerInfo
 
 class  tagMCChampionshipPlayerInfo(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBDataMgr.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBDataMgr.py
index c4ed296..99dc267 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBDataMgr.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBDataMgr.py
@@ -24,6 +24,7 @@
 import DBPlayerViewCache
 import DBEventTrig
 import DBBillboard
+import DBFuncTeam
 import DBGameRec
 import DBFamily
 import DBMail
@@ -220,6 +221,7 @@
         self.MailMgr = DBMail.MailMgr()
         self.FamilyMgr = DBFamily.FamilyMgr()
         self.GameRecMgr = DBGameRec.GameRecMgr()
+        self.FuncTeamMgr = DBFuncTeam.FuncTeamMgr()
         return
     
     def GetSaveData(self):
@@ -230,6 +232,7 @@
         buff += self.MailMgr.GetSaveData()
         buff += self.FamilyMgr.GetSaveData()
         buff += self.GameRecMgr.GetSaveData()
+        buff += self.FuncTeamMgr.GetSaveData()
         return buff
     
     def LoadGameData(self, gameBuffer, pos):
@@ -240,6 +243,7 @@
         pos = self.MailMgr.LoadPyGameData(gameBuffer, pos, dataslen)
         pos = self.FamilyMgr.LoadPyGameData(gameBuffer, pos, dataslen)
         pos = self.GameRecMgr.LoadPyGameData(gameBuffer, pos, dataslen)
+        pos = self.FuncTeamMgr.LoadPyGameData(gameBuffer, pos, dataslen)
         return pos
     
 def GetDBDataMgr():
@@ -284,3 +288,7 @@
     dbDataMgr = GetDBDataMgr()
     return dbDataMgr.GameRecMgr
 
+def GetFuncTeamMgr():
+    ## 功能队伍数据管理器
+    dbDataMgr = GetDBDataMgr()
+    return dbDataMgr.FuncTeamMgr
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBStruct.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBStruct.py
index b6b8e0c..9cecba1 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBStruct.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBStruct.py
@@ -2029,11 +2029,259 @@
         return output
 
 
+# 功能队伍表 #tagDBFuncTeam
+class tagDBFuncTeam(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('TeamID', ctypes.c_ulong),
+        ('TeamName', ctypes.c_char * 33),
+        ('ZoneID', ctypes.c_ubyte),
+        ('FuncMapID', ctypes.c_ulong),
+        ('FuncMapEx', ctypes.c_ulong),
+        ('CreateTime', ctypes.c_ulong),
+        ('CaptainID', ctypes.c_ulong),
+        ('MinLV', ctypes.c_ushort),
+        ('MinFightPower', ctypes.c_ulong),
+        ('MinFightPowerEx', ctypes.c_ulong),
+        ('ServerOnly', ctypes.c_ubyte),
+        ('NeedCheck', ctypes.c_ubyte),
+        ('ApplyIDLen', ctypes.c_ushort),
+        ('ApplyIDList', ctypes.c_char_p),
+        ('Value1', ctypes.c_ulong),
+        ('Value2', ctypes.c_ulong),
+        ('Value3', ctypes.c_ulong),
+        ('Value4', ctypes.c_ulong),
+        ('Value5', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+    def clear(self):
+        self.TeamID = 0
+        self.TeamName = ''
+        self.ZoneID = 0
+        self.FuncMapID = 0
+        self.FuncMapEx = 0
+        self.CreateTime = 0
+        self.CaptainID = 0
+        self.MinLV = 0
+        self.MinFightPower = 0
+        self.MinFightPowerEx = 0
+        self.ServerOnly = 0
+        self.NeedCheck = 0
+        self.ApplyIDLen = 0
+        self.ApplyIDList = ''
+        self.Value1 = 0
+        self.Value2 = 0
+        self.Value3 = 0
+        self.Value4 = 0
+        self.Value5 = 0
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            return -1
+        if len(buf) < pos + self.getLength():
+            return -1
+        self.clear()
+        self.TeamID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.TeamName, pos = CommFunc.ReadString(buf, pos, 33)
+        self.ZoneID, pos = CommFunc.ReadBYTE(buf, pos)
+        self.FuncMapID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.FuncMapEx, pos = CommFunc.ReadDWORD(buf, pos)
+        self.CreateTime, pos = CommFunc.ReadDWORD(buf, pos)
+        self.CaptainID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.MinLV, pos = CommFunc.ReadWORD(buf, pos)
+        self.MinFightPower, pos = CommFunc.ReadDWORD(buf, pos)
+        self.MinFightPowerEx, pos = CommFunc.ReadDWORD(buf, pos)
+        self.ServerOnly, pos = CommFunc.ReadBYTE(buf, pos)
+        self.NeedCheck, pos = CommFunc.ReadBYTE(buf, pos)
+        self.ApplyIDLen, pos = CommFunc.ReadWORD(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.ApplyIDLen)
+        self.ApplyIDList = ctypes.c_char_p(tmp)
+        self.Value1, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Value2, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Value3, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Value4, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Value5, pos = CommFunc.ReadDWORD(buf, pos)
+        return self.getLength()
+
+    def getBuffer(self):
+        buf = ''
+        buf = CommFunc.WriteDWORD(buf, self.TeamID)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 33, self.TeamName)
+        buf = CommFunc.WriteBYTE(buf, self.ZoneID)
+        buf = CommFunc.WriteDWORD(buf, self.FuncMapID)
+        buf = CommFunc.WriteDWORD(buf, self.FuncMapEx)
+        buf = CommFunc.WriteDWORD(buf, self.CreateTime)
+        buf = CommFunc.WriteDWORD(buf, self.CaptainID)
+        buf = CommFunc.WriteWORD(buf, self.MinLV)
+        buf = CommFunc.WriteDWORD(buf, self.MinFightPower)
+        buf = CommFunc.WriteDWORD(buf, self.MinFightPowerEx)
+        buf = CommFunc.WriteBYTE(buf, self.ServerOnly)
+        buf = CommFunc.WriteBYTE(buf, self.NeedCheck)
+        buf = CommFunc.WriteWORD(buf, self.ApplyIDLen)
+        buf = CommFunc.WriteString(buf, self.ApplyIDLen, self.ApplyIDList)
+        buf = CommFunc.WriteDWORD(buf, self.Value1)
+        buf = CommFunc.WriteDWORD(buf, self.Value2)
+        buf = CommFunc.WriteDWORD(buf, self.Value3)
+        buf = CommFunc.WriteDWORD(buf, self.Value4)
+        buf = CommFunc.WriteDWORD(buf, self.Value5)
+        return buf
+
+    def getLength(self):
+        length = 0
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_char) * 33
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ushort)
+        length += self.ApplyIDLen
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        return length
+
+    def outputString(self):
+        output = '''// 功能队伍表 #tagDBFuncTeam:
+            TeamID = %s,
+            TeamName = %s,
+            ZoneID = %s,
+            FuncMapID = %s,
+            FuncMapEx = %s,
+            CreateTime = %s,
+            CaptainID = %s,
+            MinLV = %s,
+            MinFightPower = %s,
+            MinFightPowerEx = %s,
+            ServerOnly = %s,
+            NeedCheck = %s,
+            ApplyIDLen = %s,
+            ApplyIDList = %s,
+            Value1 = %s,
+            Value2 = %s,
+            Value3 = %s,
+            Value4 = %s,
+            Value5 = %s,
+            ADOResult = %s,
+            '''%(
+                self.TeamID,
+                self.TeamName,
+                self.ZoneID,
+                self.FuncMapID,
+                self.FuncMapEx,
+                self.CreateTime,
+                self.CaptainID,
+                self.MinLV,
+                self.MinFightPower,
+                self.MinFightPowerEx,
+                self.ServerOnly,
+                self.NeedCheck,
+                self.ApplyIDLen,
+                self.ApplyIDList,
+                self.Value1,
+                self.Value2,
+                self.Value3,
+                self.Value4,
+                self.Value5,
+                self.ADOResult,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetTeamName(self,Str):
+        if len(Str)<=33:
+            self.TeamName = Str
+        else:
+            self.TeamName = Str[:33]
+            
+
+# 功能队伍成员表 #tagDBFuncTeamMem
+class tagDBFuncTeamMem(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('TeamID', ctypes.c_ulong),
+        ('PlayerID', ctypes.c_ulong),
+        ('Value1', ctypes.c_ulong),
+        ('Value2', ctypes.c_ulong),
+        ('Value3', ctypes.c_ulong),
+        ('Value4', ctypes.c_ulong),
+        ('Value5', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            return -1
+        if len(buf) < pos + self.getLength():
+            return -1
+        self.clear()
+        self.TeamID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Value1, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Value2, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Value3, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Value4, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Value5, pos = CommFunc.ReadDWORD(buf, pos)
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBFuncTeamMem)
+
+    def outputString(self):
+        output = '''// 功能队伍成员表 #tagDBFuncTeamMem:
+            TeamID = %s,
+            PlayerID = %s,
+            Value1 = %s,
+            Value2 = %s,
+            Value3 = %s,
+            Value4 = %s,
+            Value5 = %s,
+            ADOResult = %s,
+            '''%(
+                self.TeamID,
+                self.PlayerID,
+                self.Value1,
+                self.Value2,
+                self.Value3,
+                self.Value4,
+                self.Value5,
+                self.ADOResult,
+            )
+        return output
+
+
 
 #服务器世界数据表版本号
 GAMEWORLD_DATA_VERSION_NO = ctypes.c_ulong (\
     sizeof(tagDBEventTrig) + sizeof(tagDBFamily) + sizeof(tagDBFamilyMem) + sizeof(tagDBFamilyAction) + 
     sizeof(tagDBPlayerViewCache) + sizeof(tagDBMailPersonal) + sizeof(tagDBMailServer) + sizeof(tagDBMailItem) + 
-    sizeof(tagDBMailPlayerRec) + sizeof(tagDBBillboard) + sizeof(tagDBGameRec)
+    sizeof(tagDBMailPlayerRec) + sizeof(tagDBBillboard) + sizeof(tagDBGameRec) + sizeof(tagDBFuncTeam) + sizeof(tagDBFuncTeamMem)
     ).value
     
\ No newline at end of file
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBFamily.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBFamily.py
index b7b2bfe..582d745 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBFamily.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBFamily.py
@@ -366,7 +366,7 @@
                 continue
             familyFightPowerTotal += member.GetFightPowerTotal()
         self.SetFightPowerTotal(familyFightPowerTotal)
-        GameWorld.DebugLog("刷新仙盟总战力! familyID=%s" % self.GetID())
+        #GameWorld.DebugLog("刷新仙盟总战力! familyID=%s" % self.GetID())
         self.__memFightPowerChange = False
         return familyFightPowerTotal
     
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBFuncTeam.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBFuncTeam.py
new file mode 100644
index 0000000..4d9a285
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBFuncTeam.py
@@ -0,0 +1,397 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package DB.StructData.DBFuncTeam
+#
+# @todo:功能队伍表
+# @author hxp
+# @date 2025-05-28
+# @version 1.0
+#
+# 详细描述: 功能队伍表
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2025-05-28 10:00"""
+#-------------------------------------------------------------------------------
+
+import DBStruct
+import GameWorld
+import IpyGameDataPY
+import PlayerViewCache
+import DBDataMgr
+import CommFunc
+import ChConfig
+
+import time
+
+class FuncTeamMem():
+    ## 功能队伍成员
+    
+    def __init__(self, dbData=None):
+        self.__dbData = DBStruct.tagDBFuncTeamMem() if not dbData else dbData
+        return
+    
+    def GetTeamID(self): return self.__dbData.TeamID
+    def SetTeamID(self, teamID): self.__dbData.TeamID = teamID
+    def GetPlayerID(self): return self.__dbData.PlayerID
+    def SetPlayerID(self, playerID): self.__dbData.PlayerID = playerID
+    def GetValue1(self): return self.__dbData.Value1
+    def SetValue1(self, value1): self.__dbData.Value1 = value1
+    def GetValue2(self): return self.__dbData.Value2
+    def SetValue2(self, value2): self.__dbData.Value2 = value2
+    def GetValue3(self): return self.__dbData.Value3
+    def SetValue3(self, value3): self.__dbData.Value3 = value3
+    def GetValue4(self): return self.__dbData.Value4
+    def SetValue4(self, value4): self.__dbData.Value4 = value4
+    def GetValue5(self): return self.__dbData.Value5
+    def SetValue5(self, value5): self.__dbData.Value5 = value5
+    def GetBuffer(self): return self.__dbData.getBuffer()
+    
+    def GetFightPower(self):
+        viewCache = PlayerViewCache.FindViewCache(self.GetPlayerID())
+        return viewCache.GetFightPowerTotal() if viewCache else 0
+    
+class FuncTeam():
+    ## 功能队伍
+    
+    def __init__(self, dbData=None):
+        self.__dbData = DBStruct.tagDBFuncTeam() if not dbData else dbData
+        self.__memberList = []
+        try:
+            self.__applyIDList = eval(self.__dbData.ApplyIDList)
+        except:
+            self.__applyIDList = []  
+        return
+    
+    def GetTeamID(self): return self.__dbData.TeamID
+    def SetTeamID(self, teamID): self.__dbData.TeamID = teamID
+    def GetTeamName(self): return self.__dbData.TeamName
+    def SetTeamName(self, teamName): self.__dbData.SetTeamName(teamName)
+    def GetZoneID(self): return self.__dbData.ZoneID
+    def SetZoneID(self, zoneID): self.__dbData.ZoneID = zoneID
+    def GetFuncMapID(self): return self.__dbData.FuncMapID
+    def SetFuncMapID(self, funcMapID): self.__dbData.FuncMapID = funcMapID
+    def GetFuncMapEx(self): return self.__dbData.FuncMapEx
+    def SetFuncMapEx(self, funcMapEx): self.__dbData.FuncMapEx = funcMapEx
+    def GetCreateTime(self): return self.__dbData.CreateTime
+    def SetCreateTime(self, createTime): self.__dbData.CreateTime = createTime
+    def GetCaptainID(self): return self.__dbData.CaptainID
+    def SetCaptainID(self, captainID): self.__dbData.CaptainID = captainID
+    def GetMinLV(self): return self.__dbData.MinLV
+    def SetMinLV(self, minLV): self.__dbData.MinLV = minLV
+    def GetMinFightPower(self): return self.__dbData.MinFightPower
+    def GetMinFightPowerEx(self): return self.__dbData.MinFightPowerEx
+    def SetMinFightPowerTotal(self, minFightPower):
+        self.__dbData.MinFightPower = minFightPower % ChConfig.Def_PerPointValue
+        self.__dbData.MinFightPowerEx = minFightPower / ChConfig.Def_PerPointValue
+        return
+    def GetServerOnly(self): return self.__dbData.ServerOnly
+    def SetServerOnly(self, serverOnly): self.__dbData.ServerOnly = serverOnly
+    def GetNeedCheck(self): return self.__dbData.NeedCheck
+    def SetNeedCheck(self, needCheck): self.__dbData.NeedCheck = needCheck
+    def GetValue1(self): return self.__dbData.Value1
+    def SetValue1(self, value1): self.__dbData.Value1 = value1
+    def GetValue2(self): return self.__dbData.Value2
+    def SetValue2(self, value2): self.__dbData.Value2 = value2
+    def GetValue3(self): return self.__dbData.Value3
+    def SetValue3(self, value3): self.__dbData.Value3 = value3
+    def GetValue4(self): return self.__dbData.Value4
+    def SetValue4(self, value4): self.__dbData.Value4 = value4
+    def GetValue5(self): return self.__dbData.Value5
+    def SetValue5(self, value5): self.__dbData.Value5 = value5
+    def GetBuffer(self):
+        self.__dbData.ApplyIDList = str(self.__applyIDList).replace(" ", "")
+        self.__dbData.ApplyIDLen = len(self.__dbData.ApplyIDList)
+        return self.__dbData.getBuffer()
+    
+    def InitTeamMemInstance(self, dbData):
+        '''初始化功能数据实例,创建或加载数据时通用,功能一般不调用
+        @param dbData: 实例对应绑定的dbData
+        @return: 成功返回实例对象,失败返回None
+        '''
+        
+        teamMem = FuncTeamMem(dbData)
+        self.__memberList.append(teamMem)
+        
+        DBDataMgr.GetFuncTeamMgr().UpdPlayerTeamID(teamMem.GetPlayerID(), self.GetFuncMapID(), self.GetTeamID())
+        return teamMem
+    
+    def AddTeamMember(self, playerID):
+        teamMem = None
+        self.DelApplyID(playerID) # 加入的同时从申请列表中移除
+        mem = self.GetMemberByID(playerID)
+        if mem:
+            teamMem = mem
+            return teamMem
+        
+        dbData = DBStruct.tagDBFuncTeamMem()
+        dbData.TeamID = self.GetTeamID()
+        dbData.PlayerID = playerID
+        
+        teamMem = self.InitTeamMemInstance(dbData)
+        return teamMem
+    
+    def GetMemberCount(self): return len(self.__memberList)
+    def GetMemberAt(self, index):
+        mem = None
+        if 0 <= index < len(self.__memberList):
+            mem = self.__memberList[index]
+        elif False:
+            mem = FuncTeamMem()
+        return mem
+    def GetMemberIDList(self): return [mem.GetPlayerID() for mem in self.__memberList]
+    def GetMemberByID(self, playerID):
+        for mem in self.__memberList:
+            if mem.GetPlayerID() == playerID:
+                return mem
+        return
+    
+    def GetMemFightPowerTotal(self):
+        ## 队员总战力
+        totalFightPower = 0
+        for mem in self.__memberList:
+            totalFightPower += mem.GetFightPower()
+        return totalFightPower
+    
+    def DelTeamMember(self, playerID):
+        for mem in self.__memberList[::-1]:
+            if mem.GetPlayerID() == playerID:
+                self.__memberList.remove(mem)
+                
+                DBDataMgr.GetFuncTeamMgr().UpdPlayerTeamID(playerID, self.GetFuncMapID(), 0)
+                break
+        return
+    
+    def GetApplyIDList(self): return self.__applyIDList
+    
+    def AddApplyID(self, playerID):
+        if playerID not in self.__applyIDList:
+            self.__applyIDList.append(playerID)
+        return
+    
+    def DelApplyID(self, playerID):
+        if playerID in self.__applyIDList:
+            self.__applyIDList.remove(playerID)
+        return
+    
+    def DelApplyIDAll(self):
+        self.__applyIDList = []
+        return
+    
+class FuncTeamMgr():
+    ## 功能队伍管理
+    
+    def __init__(self):
+        self.__funcTeamDict = {} # {teamID:FuncTeam, ...}
+        self.__funcTeamListDict = {} # {funcMapID:{zoneID:[FuncTeam, ...], ...}, ...}
+        self.__playerFuncTeamIDDict = {} # {playerID:{funcMapID:teamID, ...}, ...} # 
+        self.__loopTeamID = 0 # 递增,直到超过上限后,再从头开始
+        return
+    
+    def __GetNewTeamID(self):
+        ## 获取新队伍ID
+        idMin, idMax = 100, 9999 # 非跨服队伍ID范围,存储本服,合服清空
+        if GameWorld.IsCrossServer():
+            idMin, idMax = 10000, 99999 # 跨服队伍ID范围,存储跨服,合服不影响
+            
+        teamMax = idMax - idMin + 1
+        if len(self.__funcTeamDict) >= teamMax:
+            GameWorld.ErrLog("功能队伍ID已满!")
+            return
+        
+        if not self.__loopTeamID and self.__funcTeamDict:
+            self.__loopTeamID = max(self.__funcTeamDict)
+            
+        newTeamID = 0
+        doCount = 0
+        while doCount < teamMax:
+            doCount += 1
+            if not self.__loopTeamID or self.__loopTeamID >= idMax or self.__loopTeamID < idMin:
+                self.__loopTeamID = idMin
+            else:
+                self.__loopTeamID += 1
+            if self.__loopTeamID not in self.__funcTeamDict:
+                newTeamID = self.__loopTeamID
+                break
+        return newTeamID
+    
+    def __InitTeamInstance(self, dbData):
+        '''初始化功能数据实例,创建或加载数据时通用,功能一般不调用
+        @param dbData: 实例对应绑定的dbData
+        @return: 成功返回实例对象,失败返回None
+        '''
+        team = FuncTeam(dbData)
+        teamID = team.GetTeamID()
+        zoneID = team.GetZoneID()
+        funcMapID = team.GetFuncMapID()
+        funcTeamList = self.__getFuncTeamList(funcMapID, zoneID)
+        if team not in funcTeamList:
+            funcTeamList.append(team)
+            
+        self.__funcTeamDict[teamID] = team
+        return team
+    
+    def __getFuncTeamList(self, funcMapID, zoneID):
+        if funcMapID not in self.__funcTeamListDict:
+            self.__funcTeamListDict[funcMapID] = {}
+        funcZoneTeamDict = self.__funcTeamListDict[funcMapID]
+        if zoneID not in funcZoneTeamDict:
+            funcZoneTeamDict[zoneID] = []
+        funcTeamList = funcZoneTeamDict[zoneID]
+        return funcTeamList
+    
+    def CreateFuncTeam(self, playerID, funcMapID, funcMapEx, teamName="", zoneID=0):
+        funcTeam = None
+        teamID = self.__GetNewTeamID()
+        if not teamID:
+            return funcTeam
+        
+        dbData = DBStruct.tagDBFuncTeam()
+        dbData.TeamID = teamID
+        dbData.TeamName = teamName
+        dbData.ZoneID = zoneID
+        dbData.FuncMapID = funcMapID
+        dbData.FuncMapEx = funcMapEx
+        dbData.CreateTime = int(time.time())
+        dbData.CaptainID = playerID
+        
+        funcTeam = self.__InitTeamInstance(dbData)
+        funcTeam.AddTeamMember(playerID)
+        return funcTeam
+    
+    def SortTeam(self, funcMapID, zoneID, sortReason=""):
+        ipyData = IpyGameDataPY.GetIpyGameData("FuncTeamSet", funcMapID)
+        if not ipyData:
+            return
+        sortType = ipyData.GetSortType()
+        sortReverse = ipyData.GetSortReverse()
+        
+        teamList = self.__getFuncTeamList(funcMapID, zoneID)
+        if not teamList:
+            return
+        
+        # 按创建时间
+        if sortType == 0:
+            if not sortReason or sortReason == "create":
+                teamList.sort(key=lambda t: (t.GetCreateTime()), reverse=sortReverse)
+                #GameWorld.DebugLog("按时间排序: zoneID=%s,funcMapID=%s,sortReason=%s" % (zoneID, funcMapID, sortReason))
+        # 按队员总战力
+        elif sortType == 1:
+            if not sortReason or sortReason == "member":
+                teamList.sort(key=lambda t: (t.GetMemFightPowerTotal()), reverse=sortReverse)
+                #GameWorld.DebugLog("按战力排序: zoneID=%s,funcMapID=%s,sortReason=%s" % (zoneID, funcMapID, sortReason))
+        return
+    
+    def GetFuncTeam(self, teamID):
+        funcTeam = None
+        if teamID in self.__funcTeamDict:
+            funcTeam = self.__funcTeamDict[teamID]
+        if not funcTeam and False:
+            # 不会执行,仅为了.提示代码用
+            funcTeam = FuncTeam()
+        return funcTeam
+    
+    def DelTeam(self, teamID):
+        ## 删除队伍
+        funcTeam = self.GetFuncTeam(teamID)
+        if not funcTeam:
+            return
+        
+        zoneID = funcTeam.GetZoneID()
+        funcMapID = funcTeam.GetFuncMapID()
+        for index in range(funcTeam.GetMemberCount()):
+            mem = funcTeam.GetMemberAt(index)
+            self.UpdPlayerTeamID(mem.GetPlayerID(), funcMapID, 0)
+            
+        # 移除实例
+        teamList = self.__getFuncTeamList(funcMapID, zoneID)
+        if funcTeam in teamList:
+            teamList.remove(funcTeam)
+                        
+        self.__funcTeamDict.pop(teamID, None)
+        return
+    
+    def UpdPlayerTeamID(self, playerID, funcMapID, teamID):
+        if playerID not in self.__playerFuncTeamIDDict:
+            self.__playerFuncTeamIDDict[playerID] = {}
+        teamIDDict = self.__playerFuncTeamIDDict[playerID]
+        if not teamID:
+            teamIDDict.pop(funcMapID, 0)
+            if not teamIDDict:
+                self.__playerFuncTeamIDDict.pop(playerID, None)
+        else:
+            teamIDDict[funcMapID] = teamID
+        return
+    
+    def GetPlayerTeamID(self, playerID, funcMapID):
+        if playerID not in self.__playerFuncTeamIDDict:
+            return 0
+        teamIDDict = self.__playerFuncTeamIDDict[playerID]
+        return teamIDDict.get(funcMapID, 0)
+    #def GetPlayerTeamIDDict(self, playerID): return self.playerFuncTeamIDDict.get(playerID, {})
+    
+    def IsTeamPlayer(self, playerID):
+        if playerID in self.__playerFuncTeamIDDict:
+            return True
+        for zoneTeamInfo in self.__funcTeamListDict.values():
+            for funcTeamList in zoneTeamInfo.values():
+                for funcTeam in funcTeamList:
+                    if playerID in funcTeam.GetApplyIDList():
+                        return True
+        return False
+    
+    # 保存数据 存数据库和realtimebackup
+    def GetSaveData(self):
+        
+        teamCnt, teamSavaData = 0, ""
+        memCnt, memSavaData = 0, ""
+        for zoneTeamInfo in self.__funcTeamListDict.values():
+            for funcTeamList in zoneTeamInfo.values():
+                for funcTeam in funcTeamList:
+                    teamSavaData += funcTeam.GetBuffer()
+                    teamCnt += 1
+                    for index in range(funcTeam.GetMemberCount()):
+                        mem = funcTeam.GetMemberAt(index)
+                        memSavaData += mem.GetBuffer()
+                        memCnt += 1
+                    
+        saveData = ""
+        
+        saveData += CommFunc.WriteDWORD("", teamCnt) + teamSavaData
+        GameWorld.Log("Save DBFuncTeam count :%s len=%s" % (teamCnt, len(teamSavaData)))
+        
+        saveData += CommFunc.WriteDWORD("", memCnt) + memSavaData
+        GameWorld.Log("Save DBFuncTeamMem count :%s len=%s" % (memCnt, len(memSavaData)))
+        
+        return saveData
+    
+    # 从数据库载入数据
+    def LoadPyGameData(self, datas, pos, dataslen):
+        
+        # 队伍
+        cnt, pos = CommFunc.ReadDWORD(datas, pos)
+        GameWorld.Log("Load DBFuncTeam count :%s" % cnt)
+        for _ in xrange(cnt):
+            dbData = DBStruct.tagDBFuncTeam()
+            pos += dbData.readData(datas, pos, dataslen)
+            self.__InitTeamInstance(dbData)
+            
+        # 成员
+        cnt, pos = CommFunc.ReadDWORD(datas, pos)
+        GameWorld.Log("Load DBFuncTeamMem count :%s" % cnt)
+        for _ in xrange(cnt):
+            dbData = DBStruct.tagDBFuncTeamMem()
+            pos += dbData.readData(datas, pos, dataslen)
+            
+            team = self.GetFuncTeam(dbData.TeamID)
+            if not team:
+                continue
+            team.InitTeamMemInstance(dbData)
+            
+        # 排序
+        for funcMapID, zoneTeamInfo in self.__funcTeamListDict.items():
+            for zoneID in zoneTeamInfo.keys():
+                self.SortTeam(funcMapID, zoneID)
+        return pos
+    
\ No newline at end of file
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBGameRec.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBGameRec.py
index adf6e3e..ca7a4f9 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBGameRec.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBGameRec.py
@@ -364,7 +364,7 @@
         
         for _ in xrange(cnt):
             dbData = DBStruct.tagDBGameRec()
-            dbData.readData(datas, pos, dataslen)
+            pos += dbData.readData(datas, pos, dataslen)
             recType = dbData.RecType
             recID = dbData.RecID
             recTypeIDMgr = self.GetRecTypeIDMgr(recType, recID)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_CrossBattlefield.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_CrossBattlefield.py
index 1448a6f..7be08cf 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_CrossBattlefield.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_CrossBattlefield.py
@@ -25,11 +25,11 @@
 import GameWorldProcess
 import NPCCustomRefresh
 import DataRecordPack
-import PlayerFuncTeam
 import PlayerControl
 import ShareDefine
 import SkillCommon
 import SkillShell
+import DBDataMgr
 import BuffSkill
 import ChConfig
 import AICommon
@@ -898,9 +898,10 @@
         faction = callFaction # 召集阵营为固定阵营
         
     # 队伍同阵营
-    teamID = PlayerFuncTeam.GetPlayerTeamID(playerID, ChConfig.Def_FBMapID_CrossBattlefield)
-    if not faction and teamID:
-        memIDList = PlayerFuncTeam.GetMemberIDList(teamID)
+    teamID = DBDataMgr.GetFuncTeamMgr().GetPlayerTeamID(playerID, ChConfig.Def_FBMapID_CrossBattlefield)
+    funcTeam = DBDataMgr.GetFuncTeamMgr().GetFuncTeam(teamID)
+    if not faction and teamID and funcTeam:
+        memIDList = funcTeam.GetMemberIDList()
         for memID in memIDList:
             memBattleObj = GetBattlePlayerObj(memID)
             if memBattleObj.faction:
@@ -1780,7 +1781,7 @@
             
             isCallOpen = 1 if playerID in worldObj.callOpenPlayerInfo else 0 # 是否召集进入的
             isCalled = 1 if (playerID in allCallPlayerIDList and not isCallOpen) else 0 # 是否被召集的
-            teamID = PlayerFuncTeam.GetPlayerTeamID(playerID, ChConfig.Def_FBMapID_CrossBattlefield)
+            teamID = DBDataMgr.GetFuncTeamMgr().GetPlayerTeamID(playerID, ChConfig.Def_FBMapID_CrossBattlefield)
             killCnt, ckillCntInfo, killBossCnt, killScoreKing, killGuardCnt, auraScore, superItemAwardCnt, \
                 factionBuffCollCnt, personBuffCollCnt, crystalCollCnt, wallCollCnt = \
                 battleObj.killCount, battleObj.ckillCntInfo, battleObj.killBossCnt, battleObj.killScoreKing, battleObj.killGuardCnt, \
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index 333ae0e..ce61680 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -45,6 +45,17 @@
                         ("char", "Word", 0),
                         ),
 
+                "FuncTeamSet":(
+                        ("DWORD", "FuncMapID", 1),
+                        ("BYTE", "NeedName", 0),
+                        ("BYTE", "MemberMax", 0),
+                        ("BYTE", "ApplyMax", 0),
+                        ("BYTE", "ReqApplyMax", 0),
+                        ("BYTE", "SortType", 0),
+                        ("BYTE", "SortReverse", 0),
+                        ("BYTE", "OPLimitInAct", 0),
+                        ),
+
                 "Dienstgrad":(
                         ("DWORD", "ID", 1),
                         ("WORD", "Type", 0),
@@ -2650,6 +2661,22 @@
         
     def GetID(self): return self.attrTuple[0] # WORD
     def GetWord(self): return self.attrTuple[1] # 屏蔽词 char
+
+# 功能队伍设定表
+class IPY_FuncTeamSet():
+    
+    def __init__(self):
+        self.attrTuple = None
+        return
+        
+    def GetFuncMapID(self): return self.attrTuple[0] # 功能地图ID DWORD
+    def GetNeedName(self): return self.attrTuple[1] # 需要队伍名 BYTE
+    def GetMemberMax(self): return self.attrTuple[2] # 最大人员数 BYTE
+    def GetApplyMax(self): return self.attrTuple[3] # 最大接受申请数 BYTE
+    def GetReqApplyMax(self): return self.attrTuple[4] # 最大申请数 BYTE
+    def GetSortType(self): return self.attrTuple[5] # 队伍列表排序方案 BYTE
+    def GetSortReverse(self): return self.attrTuple[6] # 是否倒序 BYTE
+    def GetOPLimitInAct(self): return self.attrTuple[7] # 活动期间限制队伍操作 BYTE
 
 # 称号表
 class IPY_Dienstgrad():
@@ -6637,6 +6664,7 @@
             self.ipyConfigEx = {}
         self.__LoadFileData("DirtyList", onlyCheck)
         self.__LoadFileData("DirtyName", onlyCheck)
+        self.__LoadFileData("FuncTeamSet", onlyCheck)
         self.__LoadFileData("Dienstgrad", onlyCheck)
         self.__LoadFileData("TitleStarUp", onlyCheck)
         self.__LoadFileData("PlayerFace", onlyCheck)
@@ -7131,6 +7159,13 @@
         self.CheckLoadData("DirtyName")
         return self.ipyDirtyNameCache[index]
 
+    def GetFuncTeamSetCount(self):
+        self.CheckLoadData("FuncTeamSet")
+        return self.ipyFuncTeamSetLen
+    def GetFuncTeamSetByIndex(self, index):
+        self.CheckLoadData("FuncTeamSet")
+        return self.ipyFuncTeamSetCache[index]
+
     def GetDienstgradCount(self):
         self.CheckLoadData("Dienstgrad")
         return self.ipyDienstgradLen
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
index f2043a7..c9466dd 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -126,7 +126,6 @@
 import PyGameData
 import PlayerGuaji
 import PlayerXiangong
-import PlayerFuncTeam
 import PlayerMineArea
 import PlayerBillboard
 import PlayerViewCache
@@ -1237,11 +1236,6 @@
         if key == ShareDefine.Def_Notify_WorldKey_LuckyCloudBuyInfo:
             PyGameData.g_luckyCloudBuyInfo = eval(msgValue)
             PlayerLuckyCloudBuy.OnLuckyCloudBuyChange()
-            return
-        
-        # 功能队伍
-        if key == ShareDefine.Def_Notify_WorldKey_FuncTeamMemIDInfo:
-            PlayerFuncTeam.OnFuncTeamMemIDRefresh(eval(msgValue))
             return
         
         if key == ShareDefine.Def_Notify_WorldKey_CrossBattlefieldCallTeamInfo:
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyZhenbaoge.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyZhenbaoge.py
index d5ff2bc..690a7cc 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyZhenbaoge.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyZhenbaoge.py
@@ -100,7 +100,7 @@
     SetFAItemList(gActionData, itemList)
     
     PlayerFamily.SendFamilyAction(gActionData)
-    GameWorld.DebugLog("珍宝阁重置! familyID=%s,itemList=%s" % (familyID, itemList), familyID)    
+    #GameWorld.DebugLog("珍宝阁重置! familyID=%s,itemList=%s" % (familyID, itemList), familyID)    
     return
 
 def GetZhenbaogeActionData(familyID, playerID):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFuncTeam.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFuncTeam.py
index e1bc7c2..5ef3994 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFuncTeam.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFuncTeam.py
@@ -6,51 +6,1081 @@
 #
 # @todo:功能队伍表
 # @author hxp
-# @date 2024-08-02
+# @date 2025-05-28
 # @version 1.0
 #
-# 详细描述: 功能队伍表
+# 详细描述: 功能队伍表,支持跨服
 #
 #-------------------------------------------------------------------------------
-#"""Version = 2024-08-02 16:30"""
+#"""Version = 2025-05-28 10:00"""
 #-------------------------------------------------------------------------------
 
-import PyGameData
+import GameWorld
+import ShareDefine
+import IpyGameDataPY
+#import CrossBattlefield
+import CrossRealmPlayer
+import PlayerViewCache
+import ChPyNetSendPack
+#import CrossRealmMsg
+import PlayerControl
+import NetPackCommon
+import DBDataMgr
+import DirtyList
+import ChConfig
 
-def OnFuncTeamMemIDRefresh(msgList):
-    ## 功能队伍成员ID刷新
-    teamIDList, delTeamIDList, teamMemIDInfoDict = msgList
+# 队伍操作
+Def_FuncTeamOPList = (
+Def_FuncTeamOP_JoinApply, # 申请加入 1
+Def_FuncTeamOP_JoinCancel, # 申请取消 2
+Def_FuncTeamOP_JoinAgree, # 同意入队 3
+Def_FuncTeamOP_JoinRefuse, # 拒绝入队 4
+Def_FuncTeamOP_Exit, # 退出队伍 5
+Def_FuncTeamOP_Kick, # 踢出队伍 6
+Def_FuncTeamOP_Transfer, # 转让队长 7
+Def_FuncTeamOP_Dissolve, # 解散队伍 8
+) = range(1, 1 + 8)
+
+def IsOPLimitInAct(curPlayer, funcMapID):
+    ## 活动期间是否限制队伍操作
+    ipyData = IpyGameDataPY.GetIpyGameData("FuncTeamSet", funcMapID)
+    if not ipyData:
+        return
+    if not ipyData.GetOPLimitInAct():
+        return
+    isInAct = False
+    if funcMapID == ChConfig.Def_FBMapID_CrossBattlefield:
+        isInAct = CrossBattlefield.GetCrossBattlefieldState()
+    if isInAct:
+        GameWorld.ErrLog("活动期间无法操作队伍! funcMapID=%s" % funcMapID, curPlayer.GetPlayerID())
+    return isInAct
+
+def GetFuncTeamZoneID(funcMapID):
+    zoneID = 0
+    if funcMapID == ChConfig.Def_FBMapID_CrossBattlefield:
+        zoneID = CrossBattlefield.GetCrossBattlefieldZoneID(GameWorld.GetServerGroupID())
+    return zoneID
+
+#// B9 20 创建功能队伍 #tagCMCreateFuncTeam
+#
+#struct    tagCMCreateFuncTeam
+#{
+#    tagHead        Head;
+#    DWORD        FuncMapID;    // 功能地图ID或自定义的活动功能ID
+#    DWORD        FuncMapEx;    // 功能地图扩展,如不同的层级
+#    BYTE        NameLen;
+#    char        TeamName[NameLen];    // 队伍名称,可为空
+#    WORD        MinLV;        //最低等级限制
+#    DWORD        MinFightPower;    //最低战力限制,求余亿
+#    DWORD        MinFightPowerEx;    //最低战力限制,整除亿
+#    BYTE        ServerOnly;    //是否仅本服玩家可加入,0-否,1-是
+#    BYTE        NeedCheck;     //是否需要审核
+#};
+def OnCreateFuncTeam(index, clientData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    playerID = curPlayer.GetPlayerID()
+    funcMapID = clientData.FuncMapID
+    funcMapEx = clientData.FuncMapEx
+    teamName = clientData.TeamName
+    minLV = clientData.MinLV
+    minFightPower = clientData.MinFightPower
+    minFightPowerEx = clientData.MinFightPowerEx
+    serverOnly = clientData.ServerOnly
+    needCheck = clientData.NeedCheck
     
-    # 没有指定时,全部刷新
-    if not teamIDList:
-        PyGameData.g_funcTeamPlayerDict = {}
-        
-    for key, refreshDict in teamMemIDInfoDict.items():
-        if key not in PyGameData.g_funcTeamPlayerDict:
-            PyGameData.g_funcTeamPlayerDict[key] = {}
-        infoDict = PyGameData.g_funcTeamPlayerDict[key]
-        infoDict.update(refreshDict)
-        
-    for teamInfoDict in PyGameData.g_funcTeamPlayerDict.values():
-        for delTeamID in delTeamIDList[::-1]:
-            if delTeamID not in teamInfoDict:
-                continue
-            teamInfoDict.pop(delTeamID, None)
-            delTeamIDList.remove(delTeamID)
-            
+    if IsOPLimitInAct(curPlayer, funcMapID):
+        return
+    
+    zoneID = GetFuncTeamZoneID(funcMapID)
+    if not zoneID:
+        return
+    
+    teamInfo = {"funcMapID":funcMapID, "funcMapEx":funcMapEx, "teamName":teamName, "minLV":minLV, 
+               "minFightPower":minFightPower, "minFightPowerEx":minFightPowerEx, 
+               "serverOnly":serverOnly, "needCheck":needCheck}
+    dataMsg = {"zoneID":zoneID, "playerID":playerID, "teamInfo":teamInfo, "cacheBase":PlayerViewCache.GetSyncCrossCacheBase(curPlayer)}
+    CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_CreateFuncTeam, dataMsg)
     return
 
-def GetPlayerTeamID(playerID, funcMapID):
-    for key, infoDict in PyGameData.g_funcTeamPlayerDict.items():
-        if funcMapID != key[1]:
-            continue
-        for teamID, memIDList in infoDict.items():
-            if playerID in memIDList:
-                return teamID
-    return 0
+#// B9 21 修改功能队伍 #tagCMChangeFuncTeam
+#
+#struct    tagCMChangeFuncTeam
+#{
+#    tagHead        Head;
+#    DWORD        TeamID;
+#    DWORD        FuncMapID;    // 功能地图ID或自定义的活动功能ID
+#    WORD        MinLV;        //最低等级限制
+#    DWORD        MinFightPower;    //最低战力限制,求余亿
+#    DWORD        MinFightPowerEx;    //最低战力限制,整除亿
+#    BYTE        ServerOnly;    //是否仅本服玩家可加入,0-否,1-是
+#    BYTE        NeedCheck;     //是否需要审核
+#};
+def OnChangeFuncTeam(index, clientData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    playerID = curPlayer.GetPlayerID()
+    teamID = clientData.TeamID
+    funcMapID = clientData.FuncMapID
+    minLV = clientData.MinLV
+    minFightPower = clientData.MinFightPower
+    minFightPowerEx = clientData.MinFightPowerEx
+    serverOnly = clientData.ServerOnly
+    needCheck = clientData.NeedCheck
+    
+    if IsOPLimitInAct(curPlayer, funcMapID):
+        return
+    
+    zoneID = GetFuncTeamZoneID(funcMapID)
+    if not zoneID:
+        return
+    
+    teamInfo = {"teamID":teamID, "funcMapID":funcMapID, "minLV":minLV, 
+               "minFightPower":minFightPower, "minFightPowerEx":minFightPowerEx, 
+               "serverOnly":serverOnly, "needCheck":needCheck}
+    dataMsg = {"zoneID":zoneID, "playerID":playerID, "teamInfo":teamInfo, "cacheBase":PlayerViewCache.GetSyncCrossCacheBase(curPlayer)}
+    CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_ChangeFuncTeam, dataMsg)
+    return
 
-def GetMemberIDList(teamID):
-    for infoDict in PyGameData.g_funcTeamPlayerDict.values():
-        if teamID in infoDict:
-            return infoDict[teamID]
-    return []
+#// B9 22 功能队伍成员操作 #tagCMFuncTeamMemOP
+#
+#struct    tagCMFuncTeamMemOP
+#{
+#    tagHead        Head;
+#    DWORD        TeamID;
+#    DWORD        FuncMapID;    // 功能地图ID或自定义的活动功能ID
+#    BYTE        OPType;        // 1-申请加入;2-申请取消;3-同意入队;4-拒绝入队;5-退出队伍;6-踢出队伍;7-转让队长;8-解散队伍;
+#    DWORD        OPData;        // 可选
+#};
+def OnFuncTeamMemOP(index, clientData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    playerID = curPlayer.GetPlayerID()
+    teamID = clientData.TeamID
+    funcMapID = clientData.FuncMapID
+    opType = clientData.OPType
+    opData = clientData.OPData
+    
+    if opType not in Def_FuncTeamOPList:
+        return
+    
+    if IsOPLimitInAct(curPlayer, funcMapID):
+        return
+    
+    zoneID = GetFuncTeamZoneID(funcMapID)
+    if not zoneID:
+        return
+    
+    dataMsg = {"zoneID":zoneID, "playerID":playerID, "teamID":teamID, "funcMapID":funcMapID, 
+               "opType":opType, "opData":opData}
+    dataMsg["cacheBase"] = PlayerViewCache.GetSyncCrossCacheBase(curPlayer)
+    CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_FuncTeamMemOP, dataMsg)
+    return
+
+#// B9 23 查找功能队伍列表 #tagCMQueryFuncTeam
+#
+#struct    tagCMQueryFuncTeam
+#{
+#    tagHead        Head;
+#    DWORD        FuncMapID;    // 功能地图ID或自定义的活动功能ID
+#    DWORD        FuncMapEx;    // 功能地图扩展,如不同的层级,0代表所有
+#    DWORD        StartIndex;    // 查看的起始索引, 默认0
+#    BYTE        QueryCnt;    // 查看条数,默认20,最大不超过100
+#    BYTE        HaveSpace;    // 是否只查看有空位置的队伍
+#    BYTE        IDLimitType;    // ID限制类型:1-同仙盟队长;2-同ServerGroupID队长;3-同ServerID队长
+#    BYTE        SearchLen;
+#    char        SearchMsg[SearchLen];    // 指定搜索时有用,可搜索指定队伍ID或模糊搜索队伍名称,搜索时返回最多QueryCnt个数的队伍
+#};
+def OnQueryFuncTeam(index, clientData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    playerID = curPlayer.GetPlayerID()
+    funcMapID = clientData.FuncMapID
+    funcMapEx = clientData.FuncMapEx
+    startIndex = clientData.StartIndex
+    queryCnt = clientData.QueryCnt
+    haveSpace = clientData.HaveSpace
+    idLimitType = clientData.IDLimitType
+    searchMsg = clientData.SearchMsg
+    
+    zoneID = GetFuncTeamZoneID(funcMapID)
+    if not zoneID:
+        return
+    
+    dataMsg = {"zoneID":zoneID, "playerID":playerID, "funcMapID":funcMapID, "funcMapEx":funcMapEx, 
+               "startIndex":startIndex, "queryCnt":queryCnt, "haveSpace":haveSpace, "idLimitType":idLimitType, 
+               "searchMsg":searchMsg}
+    dataMsg["cacheBase"] = PlayerViewCache.GetSyncCrossCacheBase(curPlayer)
+    CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_QueryFuncTeam, dataMsg)
+    return
+
+#// B9 24 查找玩家功能队伍 #tagCMQueryPlayerFuncTeam
+#
+#struct    tagCMQueryPlayerFuncTeam
+#{
+#    tagHead        Head;
+#    DWORD        FuncMapID;    // 功能地图ID或自定义的活动功能ID
+#};
+def OnQueryPlayerFuncTeam(index, clientData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    playerID = curPlayer.GetPlayerID()
+    funcMapID = clientData.FuncMapID
+    
+    zoneID = GetFuncTeamZoneID(funcMapID)
+    if not zoneID:
+        return
+    
+    dataMsg = {"zoneID":zoneID, "playerID":playerID, "funcMapID":funcMapID}
+    dataMsg["cacheBase"] = PlayerViewCache.GetSyncCrossCacheBase(curPlayer)
+    CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_QueryFuncTeam, dataMsg)
+    return
+
+def CrossServerMsg_FuncTeamInfo(msgData):
+    ## 子服收到跨服信息 - 队伍刷新信息
+    infoType = msgData["infoType"]
+    playerID = msgData["playerID"]
+    funcMapID = msgData["funcMapID"]
+    teamInfo = msgData["teamInfo"]
+    teamID = msgData.get("teamID", 0)
+    syncPlayerIDList = msgData.get("syncPlayerIDList", [])
+    notifyMark = msgData.get("notifyMark", "")
+    
+    curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
+    if curPlayer:
+        if notifyMark:
+            PlayerControl.NotifyCode(curPlayer, notifyMark)
+            
+    if infoType == "QueryPlayerFuncTeam":
+        if curPlayer:
+            if teamInfo:
+                Sync_FuncTeamRefresh(teamInfo, [playerID])
+            else:
+                clientPack = ChPyNetSendPack.tagGCQueryPlayerFuncTeamRet()
+                clientPack.FuncMapID = funcMapID
+                clientPack.TeamID = 0
+                NetPackCommon.SendFakePack(curPlayer, clientPack)
+        return
+    
+    if not teamInfo:
+        # 操作后没有队伍信息了,解散
+        if infoType == "FuncTeamMemOP":
+            Sync_FuncTeamDissolve(teamID, syncPlayerIDList)
+        return
+    
+    Sync_FuncTeamRefresh(teamInfo, syncPlayerIDList)
+    return
+
+def CrossServerMsg_FuncTeamDel(msgData):
+    ## 子服收到跨服信息 - 队伍删除
+    #"zoneID":zoneID, "funcMapID":funcMapID, "delTeamDict":delTeamDict
+    #zoneID = msgData["zoneID"]
+    #funcMapID = msgData["funcMapID"]
+    delTeamDict = msgData["delTeamDict"]
+    for teamID, syncPlayerIDList in delTeamDict.items():
+        Sync_FuncTeamDissolve(teamID, syncPlayerIDList)
+    return
+
+def CrossServerMsg_FuncTeamList(msgData):
+    ## 子服收到跨服信息 - 队伍列表
+    queryInfo = msgData["queryInfo"]
+    loopIndex = msgData["loopIndex"]
+    teamInfoList = msgData["teamInfoList"]
+    
+    playerID = queryInfo["playerID"]
+    curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
+    if not curPlayer:
+        return
+    
+    clientPack = ChPyNetSendPack.tagGCFuncTeamList()
+    clientPack.FuncMapID = queryInfo["funcMapID"]
+    clientPack.FuncMapEx = queryInfo["funcMapEx"]
+    clientPack.StartIndex = queryInfo["startIndex"]
+    clientPack.QueryCnt = queryInfo["queryCnt"]
+    clientPack.HaveSpace = queryInfo["haveSpace"]
+    clientPack.IDLimitType = queryInfo["idLimitType"]
+    clientPack.SearchMsg = queryInfo["searchMsg"]
+    clientPack.SearchLen = len(clientPack.SearchMsg)
+    clientPack.LoopIndex = loopIndex
+    
+    for teamInfo in teamInfoList:
+        team = ChPyNetSendPack.tagGCFuncTeam()
+        team.TeamID = teamInfo["TeamID"]
+        team.CreateTime = teamInfo["CreateTime"]
+        team.FuncMapEx = teamInfo["FuncMapEx"]
+        team.TeamName = teamInfo["TeamName"]
+        team.NameLen = len(team.TeamName)
+        team.CaptainID = teamInfo["CaptainID"]
+        team.MinLV = teamInfo["MinLV"]
+        team.MinFightPower = teamInfo["MinFightPower"] % ChConfig.Def_PerPointValue
+        team.MinFightPowerEx = teamInfo["MinFightPower"] / ChConfig.Def_PerPointValue
+        team.ServerOnly = teamInfo["ServerOnly"]
+        team.NeedCheck = teamInfo["NeedCheck"]
+        team.Value1 = teamInfo["Value1"]
+        team.Value2 = teamInfo["Value2"]
+        
+        memberList = []
+        for memberInfo in teamInfo["MemberList"]:
+            mem = ChPyNetSendPack.tagGCFuncTeamMem()
+            mem.ServerID = memberInfo.get("ServerID", 0)
+            mem.PlayerID = memberInfo["PlayerID"]
+            mem.Name = memberInfo.get("Name", "")
+            mem.NameLen = len(mem.Name)
+            mem.LV = memberInfo.get("LV", 0)
+            mem.Job = memberInfo.get("Job", 0)
+            mem.RealmLV = memberInfo.get("RealmLV", 0)
+            mem.Face = memberInfo.get("Face", 0)
+            mem.FacePic = memberInfo.get("FacePic", 0)
+            mem.FightPower = memberInfo.get("FightPower", 0) % ChConfig.Def_PerPointValue
+            mem.FightPowerEx = memberInfo.get("FightPower", 0) / ChConfig.Def_PerPointValue
+            mem.Value1 = memberInfo["Value1"]
+            mem.Value2 = memberInfo["Value2"]
+            memberList.append(mem)
+            
+        team.MemberList = memberList
+        team.MemberCount = len(team.MemberList)
+        team.ApplyIDList = teamInfo["ApplyIDList"]
+        team.ApplyCount = len(team.ApplyIDList)
+        
+        clientPack.TeamList.append(team)
+    clientPack.TeamCount = len(clientPack.TeamList)
+    NetPackCommon.SendFakePack(curPlayer, clientPack)
+    return
+
+def Sync_FuncTeamRefresh(teamInfo, syncPlayerIDList):
+    ## 功能队伍刷新
+    if not teamInfo or not syncPlayerIDList:
+        return
+    
+    syncPlayerList = []
+    playerManager = GameWorld.GetPlayerManager()
+    for playerID in syncPlayerIDList:
+        player = playerManager.FindPlayerByID(playerID)
+        if player == None or not player.GetInitOK():
+            continue
+        syncPlayerList.append(player)
+        
+    if not syncPlayerList:
+        return
+    
+    clientPack = ChPyNetSendPack.tagGCFuncTeamRefresh()
+    clientPack.TeamID = teamInfo["TeamID"]
+    clientPack.CreateTime = teamInfo["CreateTime"]
+    clientPack.FuncMapID = teamInfo["FuncMapID"]
+    clientPack.FuncMapEx = teamInfo["FuncMapEx"]
+    clientPack.TeamName = teamInfo["TeamName"]
+    clientPack.NameLen = len(clientPack.TeamName)
+    clientPack.CaptainID = teamInfo["CaptainID"]
+    clientPack.MinLV = teamInfo["MinLV"]
+    clientPack.MinFightPower = teamInfo["MinFightPower"] % ChConfig.Def_PerPointValue
+    clientPack.MinFightPowerEx = teamInfo["MinFightPower"] / ChConfig.Def_PerPointValue
+    clientPack.ServerOnly = teamInfo["ServerOnly"]
+    clientPack.NeedCheck = teamInfo["NeedCheck"]
+    clientPack.Value1 = teamInfo["Value1"]
+    clientPack.Value2 = teamInfo["Value2"]
+    
+    memberInfoList = teamInfo["MemberList"]
+    applyInfoList = teamInfo["ApplyList"]
+    
+    memberList = []
+    for memberInfo in memberInfoList:
+        mem = ChPyNetSendPack.tagGCFuncTeamRefreshMem()
+        mem.ServerID = memberInfo.get("ServerID", 0)
+        mem.PlayerID = memberInfo["PlayerID"]
+        mem.Name = memberInfo.get("Name", "")
+        mem.NameLen = len(mem.Name)
+        mem.LV = memberInfo.get("LV", 0)
+        mem.Job = memberInfo.get("Job", 0)
+        mem.RealmLV = memberInfo.get("RealmLV", 0)
+        mem.Face = memberInfo.get("Face", 0)
+        mem.FacePic = memberInfo.get("FacePic", 0)
+        mem.FightPower = memberInfo.get("FightPower", 0) % ChConfig.Def_PerPointValue
+        mem.FightPowerEx = memberInfo.get("FightPower", 0) / ChConfig.Def_PerPointValue
+        mem.OfflineValue = memberInfo.get("OfflineValue", 0)
+        mem.Value1 = memberInfo["Value1"]
+        mem.Value2 = memberInfo["Value2"]
+        memberList.append(mem)
+        
+    applyList, applyIDList = [], []
+    for applyInfo in applyInfoList:
+        applyP = ChPyNetSendPack.tagGCFuncTeamRefreshApply()
+        applyP.ServerID = applyInfo["ServerID"]
+        applyP.PlayerID = applyInfo["PlayerID"]
+        applyP.Name = applyInfo["Name"]
+        applyP.NameLen = len(applyP.Name)
+        applyP.LV = applyInfo["LV"]
+        applyP.Job = applyInfo["Job"]
+        applyP.RealmLV = applyInfo["RealmLV"]
+        applyP.Face = applyInfo.get("Face", 0)
+        applyP.FacePic = applyInfo.get("FacePic", 0)
+        applyP.FightPower = applyInfo["FightPower"] % ChConfig.Def_PerPointValue
+        applyP.FightPowerEx = applyInfo["FightPower"] / ChConfig.Def_PerPointValue
+        applyList.append(applyP)
+        applyIDList.append(applyInfo["PlayerID"])
+        
+    clientPack.MemberList = memberList
+    clientPack.MemberCount = len(clientPack.MemberList)
+    clientPack.ApplyIDList = applyIDList
+    clientPack.ApplyInfoList = applyList
+    clientPack.ApplyCount = len(clientPack.ApplyInfoList)
+    
+    for player in syncPlayerList:
+        NetPackCommon.SendFakePack(player, clientPack)
+    return
+
+def Sync_FuncTeamDissolve(teamID, syncPlayerIDList):
+    ## 功能队伍解散
+    if not teamID or not syncPlayerIDList:
+        return
+    
+    syncPlayerList = []
+    playerManager = GameWorld.GetPlayerManager()
+    for playerID in syncPlayerIDList:
+        player = playerManager.FindPlayerByID(playerID)
+        if player == None or not player.GetInitOK():
+            continue
+        syncPlayerList.append(player)
+        
+    if not syncPlayerList:
+        return
+    
+    clientPack = ChPyNetSendPack.tagGCFuncTeamDissolve()
+    clientPack.TeamID = teamID
+    for player in syncPlayerList:
+        NetPackCommon.SendFakePack(player, clientPack)
+    return
+
+##--------------------------------------------------------------------------------------------------
+
+def GetFuncTeamMapIDZoneInfo(funcMapID, serverGroupID):
+    ## 获取功能队伍分区信息
+    
+    funcZoneID = 0
+    serverGroupList = []
+    
+    if funcMapID == ChConfig.Def_FBMapID_CrossBattlefield:
+        zoneIpyData = CrossBattlefield.GetCrossBattlefieldZoneIpyData(serverGroupID)
+        if not zoneIpyData:
+            return
+        funcZoneID = zoneIpyData.GetZoneID()
+        serverGroupList = zoneIpyData.GetServerGroupIDList() # 只通知该分区服务器
+        
+    return funcZoneID, serverGroupList
+
+def ClientServerMsg_CreateFuncTeam(serverGroupID, msgData):
+    ## 收到子服 - 功能队伍创建
+    
+    zoneID = msgData["zoneID"]
+    playerID = msgData["playerID"]
+    teamInfo = msgData["teamInfo"]
+    cacheBase = msgData["cacheBase"]
+    
+    funcMapID = teamInfo["funcMapID"]
+    
+    zoneInfo = GetFuncTeamMapIDZoneInfo(funcMapID, serverGroupID)
+    if not zoneInfo:
+        return
+    funcZoneID, _ = zoneInfo
+    
+    if zoneID != funcZoneID:
+        GameWorld.ErrLog("功能队伍分区不一致,无法创建! funcMapID=%s,zoneID=%s != %s" % (funcMapID, zoneID, funcZoneID), playerID)
+        return
+    
+    canCreate, notifyMark = CheckCanCreateFuncTeam(playerID, teamInfo, zoneID)
+    
+    # 某些功能创建前检查
+    if funcMapID == ChConfig.Def_FBMapID_CrossBattlefield:
+        pass
+    
+    newTeam = None
+    teamID = 0
+    newTeamInfo = {}
+    if canCreate:
+        PlayerViewCache.UpdCrossCacheBase(playerID, cacheBase)
+        funcTeamMgr = DBDataMgr.GetFuncTeamMgr()
+        newTeam = funcTeamMgr.CreateFuncTeam(playerID, teamInfo, zoneID)
+        
+    if newTeam:
+        teamID = newTeam.GetTeamID()
+        newTeamInfo = newTeam.GetSyncDict(True)
+        
+        # 某些功能创建后处理
+        if funcMapID == ChConfig.Def_FBMapID_CrossBattlefield:
+            pass
+        
+    else:
+        if not notifyMark:
+            notifyMark = "CreatTeamFail"
+            
+    serverGroupList = [serverGroupID] # 创建仅通知指定服即可
+    syncPlayerIDList = [playerID]
+    sendMsg = {"infoType":"CreateFuncTeam", "zoneID":zoneID, "playerID":playerID, "funcMapID":funcMapID, 
+               "teamInfo":newTeamInfo, "teamID":teamID, "syncPlayerIDList":syncPlayerIDList, "notifyMark":notifyMark}
+    CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_FuncTeamInfo, sendMsg, serverGroupList)
+    return
+
+def CheckCanCreateFuncTeam(playerID, teamInfo, zoneID=0, checkInTeam=True):
+    ## 检查可否创建功能队伍 - 本服跨服通用
+    # @param checkInTeam: 是否检查已经在队伍中,如果功能只允许单个队伍,则需要检查,反之可设置为不检查
+    # @return: 是否可创建, 不可创建提示信息
+    
+    funcMapID = teamInfo["funcMapID"]
+    ipyData = IpyGameDataPY.GetIpyGameData("FuncTeamSet", funcMapID)
+    if not ipyData:
+        return False, ""
+    
+    needName = ipyData.GetNeedName()
+    if needName:
+        teamName = teamInfo["teamName"]
+        if not teamName or len(teamName) > 33:
+            # 队伍名不合法
+            return False, "TeamNameLenError"
+        
+        if DirtyList.IsWordForbidden(teamName):
+            return False, "TeamNameUnallow"
+        
+    funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager()
+    teamList = funcTeamMgr.GetFuncTeamList(zoneID, funcMapID)
+    for funcTeam in teamList:
+        if needName:
+            if teamName == funcTeam.GetTeamName():
+                # 队伍名已存在
+                return False, "TeamNameExist"
+        
+        if checkInTeam:
+            if funcTeam.GetMemberByID(playerID):
+                # 已经在队伍中
+                return False, "AlreadyHaveTeam"
+            
+    return True, ""
+
+def ClientServerMsg_ChangeFuncTeam(serverGroupID, msgData):
+    ## 收到子服 - 功能队伍修改
+    
+    zoneID = msgData["zoneID"]
+    playerID = msgData["playerID"]
+    teamInfo = msgData["teamInfo"]
+    cacheBase = msgData.get("cacheBase", {})
+    
+    teamID = teamInfo["teamID"]
+    funcMapID = teamInfo["funcMapID"]
+    
+    zoneInfo = GetFuncTeamMapIDZoneInfo(funcMapID, serverGroupID)
+    if not zoneInfo:
+        return
+    funcZoneID, serverGroupList = zoneInfo
+    
+    if zoneID != funcZoneID:
+        GameWorld.ErrLog("功能队伍分区不一致,无法修改! funcMapID=%s,zoneID=%s != %s" % (funcMapID, zoneID, funcZoneID), playerID)
+        return
+    
+    funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager()
+    funcTeam = funcTeamMgr.GetFuncTeam(teamID)
+    if not funcTeam:
+        GameWorld.ErrLog("功能队伍不存在! funcMapID=%s,teamID=%s" % (funcMapID, teamID), playerID)
+        return
+    
+    if playerID != funcTeam.GetCaptainID():
+        GameWorld.DebugLog("非功能队伍队长,无法修改! funcMapID=%s,teamID=%s,CaptainID=%s" % (funcMapID, teamID, funcTeam.GetCaptainID()), playerID)
+        return
+    
+    if cacheBase:
+        PlayerViewCache.UpdCrossCacheBase(playerID, cacheBase)
+        
+    funcTeam.SetMinFightPower(teamInfo["minFightPower"] + teamInfo["minFightPowerEx"] * ChConfig.Def_PerPointValue)
+    funcTeam.SetMinLV(teamInfo["minLV"])
+    funcTeam.SetServerOnly(teamInfo["serverOnly"])
+    funcTeam.SetNeedCheck(teamInfo["needCheck"])
+    
+    if not funcTeam.GetNeedCheck():
+        pass
+    
+    teamID = funcTeam.GetTeamID()
+    teamInfo = funcTeam.GetSyncDict(True)
+    syncPlayerIDList = funcTeam.GetSyncPlayerIDList()
+    sendMsg = {"infoType":"ChangeFuncTeam", "zoneID":zoneID, "playerID":playerID, "funcMapID":funcMapID, 
+               "teamInfo":teamInfo, "teamID":teamID, "syncPlayerIDList":syncPlayerIDList}
+    CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_FuncTeamInfo, sendMsg, serverGroupList)
+    return
+
+def ClientServerMsg_FuncTeamMemOP(serverGroupID, msgData):
+    ## 收到子服 - 功能队伍操作
+    
+    zoneID = msgData["zoneID"]
+    playerID = msgData["playerID"] # 操作的玩家ID
+    teamID = msgData["teamID"]
+    funcMapID = msgData["funcMapID"]
+    opType = msgData["opType"]
+    opData = msgData["opData"]
+    cacheBase = msgData.get("cacheBase", {})
+    
+    zoneInfo = GetFuncTeamMapIDZoneInfo(funcMapID, serverGroupID)
+    if not zoneInfo:
+        return
+    funcZoneID, serverGroupList = zoneInfo
+    
+    if zoneID != funcZoneID:
+        GameWorld.ErrLog("功能队伍分区不一致,无法操作! funcMapID=%s,zoneID=%s != %s" % (funcMapID, zoneID, funcZoneID), playerID)
+        return
+    
+    if cacheBase:
+        PlayerViewCache.UpdCrossCacheBase(playerID, cacheBase)
+        
+    isOK = False
+    syncDict = {}
+    teamInfo = {}
+    
+    funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager()
+    funcTeam = funcTeamMgr.GetFuncTeam(teamID)
+    if not funcTeam:
+        GameWorld.ErrLog("功能队伍不存在! funcMapID=%s,teamID=%s,opType=%s" % (funcMapID, teamID, opType), playerID)
+        syncDict["notifyMark"] = "TeamNotExist"
+        syncPlayerIDList = [playerID]
+    else:
+        # 仅队长可操作
+        if opType in [Def_FuncTeamOP_JoinAgree, Def_FuncTeamOP_JoinRefuse, Def_FuncTeamOP_Kick, 
+                      Def_FuncTeamOP_Transfer, Def_FuncTeamOP_Dissolve]:
+            if playerID != funcTeam.GetCaptainID():
+                GameWorld.ErrLog("仅队长可操作! funcMapID=%s,teamID=%s,opType=%s,CaptainID=%s" 
+                                 % (funcMapID, teamID, opType, funcTeam.GetCaptainID()), playerID)
+                return
+            
+        syncPlayerIDList = funcTeam.GetSyncPlayerIDList()
+        
+        # 申请加入
+        if opType == Def_FuncTeamOP_JoinApply:
+            isOK = __DoFuncTeamOP_JoinApply(zoneID, funcMapID, teamID, playerID, opType, opData, cacheBase, syncDict)
+            if playerID not in syncPlayerIDList:
+                syncPlayerIDList.append(playerID)
+                
+        # 申请取消
+        elif opType == Def_FuncTeamOP_JoinCancel:
+            isOK = __DoFuncTeamOP_JoinCancel(zoneID, funcMapID, teamID, playerID, opType, opData, cacheBase, syncDict)
+            if playerID not in syncPlayerIDList:
+                syncPlayerIDList.append(playerID)
+                
+        # 同意入队
+        elif opType == Def_FuncTeamOP_JoinAgree:
+            isOK = __DoFuncTeamOP_JoinAgree(zoneID, funcMapID, teamID, playerID, opType, opData, cacheBase, syncDict)
+            
+        # 拒绝入队
+        elif opType == Def_FuncTeamOP_JoinRefuse:
+            isOK = __DoFuncTeamOP_JoinRefuse(zoneID, funcMapID, teamID, playerID, opType, opData, cacheBase, syncDict)
+            
+        # 退出队伍
+        elif opType == Def_FuncTeamOP_Exit:
+            isOK = __DoFuncTeamOP_Exit(zoneID, funcMapID, teamID, playerID, opType, opData, cacheBase, syncDict)
+            
+        # 踢出队伍
+        elif opType == Def_FuncTeamOP_Kick:
+            isOK = __DoFuncTeamOP_Kick(zoneID, funcMapID, teamID, playerID, opType, opData, cacheBase, syncDict)
+            
+        # 转让队长
+        elif opType == Def_FuncTeamOP_Transfer:
+            isOK = __DoFuncTeamOP_Transfer(zoneID, funcMapID, teamID, playerID, opType, opData, cacheBase, syncDict)
+                
+        # 解散队伍
+        elif opType == Def_FuncTeamOP_Dissolve:
+            isOK = __DoFuncTeamOP_Dissolve(zoneID, funcMapID, teamID, playerID, opType, opData, cacheBase, syncDict)
+            
+    if not isOK and not syncDict:
+        # 没有执行成功 且 没有需要回复的信息,则不需要回发子服
+        return
+    
+    funcTeam = funcTeamMgr.GetFuncTeam(teamID)
+    if funcTeam:
+        teamInfo = funcTeam.GetSyncDict(True)
+        
+    sendMsg = {"infoType":"FuncTeamMemOP", "zoneID":zoneID, "playerID":playerID, "funcMapID":funcMapID, 
+               "teamInfo":teamInfo, "teamID":teamID, "syncPlayerIDList":syncPlayerIDList, "opType":opType}
+    sendMsg.update(syncDict)
+    CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_FuncTeamInfo, sendMsg, serverGroupList)
+    return
+
+def DelTeam(teamID):
+    funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager()
+    funcTeam = funcTeamMgr.GetFuncTeam(teamID)
+    if not funcTeam:
+        GameWorld.ErrLog("删除功能队伍时不存在! teamID=%s" % teamID)
+        return
+    zoneID = funcTeam.GetZoneID()
+    funcMapID = funcTeam.GetFuncMapID()
+    syncPlayerIDList = funcTeam.GetSyncPlayerIDList()
+    
+    funcTeamMgr.DelTeam(teamID)
+    
+    if not funcTeamMgr.IsLockBatch():
+        sendMsg = {"zoneID":zoneID, "funcMapID":funcMapID, "delTeamDict":{teamID:syncPlayerIDList}}
+        CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_FuncTeamDel, sendMsg)
+        
+    return syncPlayerIDList
+
+def DelTeamByFunc(delFuncMapID):
+    GameWorld.Log("清空功能队伍! delFuncMapID=%s" % delFuncMapID)
+    funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager()
+    funcTeamMgr.LockBatch()
+    delTeamIDList = []
+    for key, teamList in funcTeamMgr.funcTeamListDict.items():
+        zoneID, funcMapID = key
+        if funcMapID != delFuncMapID:
+            continue
+        delTeamDict = {}
+        for funcTeam in teamList[::-1]:
+            teamID = funcTeam.GetTeamID()
+            syncPlayerIDList = DelTeam(teamID)
+            if syncPlayerIDList:
+                delTeamDict[teamID] = syncPlayerIDList
+            delTeamIDList.append(teamID)
+             
+        # 按分区处理后一次性同步子服
+        zoneIpyData = CrossRealmPlayer.GetCrossZoneIpyDataByZoneID(funcMapID, zoneID)
+        serverGroupIDList = zoneIpyData.GetServerGroupIDList() if zoneIpyData else []
+        sendMsg = {"zoneID":zoneID, "funcMapID":funcMapID, "delTeamDict":delTeamDict}
+        CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_FuncTeamDel, sendMsg, serverGroupIDList)
+    funcTeamMgr.UnLockBatch()
+    
+    delCount = len(delTeamIDList)
+    funcTeamMgr.SyncMapFuncTeamMemIDInfo(delTeamIDList)
+    return delCount
+
+def DelTealAll():
+    delCount = 0
+    ipyDataMgr = IpyGameDataPY.IPY_Data()
+    for index in range(ipyDataMgr.GetFuncTeamSetCount()):
+        ipyData = ipyDataMgr.GetFuncTeamSetByIndex(index)
+        delCount += DelTeamByFunc(ipyData.GetFuncMapID())
+    return delCount
+
+def SendFuncTeamToClientServer(teamID):
+    ## 同步队伍明细到子服
+    funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager()
+    funcTeam = funcTeamMgr.GetFuncTeam(teamID)
+    if not funcTeam:
+        return
+    funcMapID = funcTeam.GetFuncMapID()
+    teamInfo = funcTeam.GetSyncDict(True)
+    syncPlayerIDList = funcTeam.GetSyncPlayerIDList()
+    
+    sendMsg = {"infoType":"", "playerID":0, "funcMapID":funcMapID, 
+               "teamInfo":teamInfo, "teamID":teamID, "syncPlayerIDList":syncPlayerIDList}
+    CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_FuncTeamInfo, sendMsg)
+    return
+
+def __DoFuncTeamOP_JoinApply(zoneID, funcMapID, teamID, playerID, opType, opData, cacheBase, syncDict):
+    ## 申请加入
+    
+    funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager()
+    playerTeamID = funcTeamMgr.GetPlayerTeamID(playerID, funcMapID)
+    if playerTeamID:
+        GameWorld.Log("已经有功能队伍了,不能再申请! funcMapID=%s,playerTeamID=%s" % (funcMapID, playerTeamID), playerID)
+        return
+    
+    funcTeam = funcTeamMgr.GetFuncTeam(teamID)
+    if not funcTeam:
+        return
+    
+    if funcTeam.GetMemberByID(playerID):
+        GameWorld.Log("已在功能队伍中! funcMapID=%s,teamID=%s" % (funcMapID, teamID), playerID)
+        return
+    
+    if playerID in funcTeam.GetApplyIDList():
+        GameWorld.Log("已在功能队伍申请列表中! funcMapID=%s,teamID=%s" % (funcMapID, teamID), playerID)
+        return
+    
+    ipyData = IpyGameDataPY.GetIpyGameData("FuncTeamSet", funcMapID)
+    if not ipyData:
+        return
+    
+    memberMax = ipyData.GetMemberMax()
+    applyMax = ipyData.GetApplyMax()
+    reqApplyMax = ipyData.GetReqApplyMax()
+    
+    if len(funcTeam.GetMemberList()) >= memberMax:
+        GameWorld.DebugLog("功能队伍成员已满! funcMapID=%s,teamID=%s,memberMax=%s" % (funcMapID, teamID, memberMax), playerID)
+        syncDict["notifyMark"] = "TeamMemFull"
+        return
+    
+    if applyMax and len(funcTeam.GetApplyIDList()) >= applyMax:
+        GameWorld.DebugLog("功能队伍申请队列已满! funcMapID=%s,teamID=%s,applyMax=%s" % (funcMapID, teamID, applyMax), playerID)
+        syncDict["notifyMark"] = "TeamApplyFull"
+        return
+    
+    minLV = funcTeam.GetMinLV()
+    if minLV and minLV > cacheBase.get("LV", 0):
+        GameWorld.DebugLog("功能队伍最低等级限制,无法申请! funcMapID=%s,teamID=%s,minLV=%s" % (funcMapID, teamID, minLV), playerID)
+        syncDict["notifyMark"] = "TeamLVLimit"
+        return
+    
+    minFightPower = funcTeam.GetMinFightPower()
+    if minFightPower and minFightPower > cacheBase.get("FightPower", 0):
+        GameWorld.DebugLog("功能队伍最低战力限制,无法申请! funcMapID=%s,teamID=%s,minFightPower=%s" % (funcMapID, teamID, minFightPower), playerID)
+        syncDict["notifyMark"] = "TeamFightPowerLimit"
+        return
+    
+    minServerOnly = funcTeam.GetServerOnly()
+    if minServerOnly:
+        # 待扩展,看是取ServerID,还是 ServerGroupID,需注意GroupID合服后可能不一致的问题
+        pass
+    
+    if reqApplyMax:
+        applyTeamIDList = []
+        teamList = funcTeamMgr.GetFuncTeamList(zoneID, funcMapID)
+        for fTeam in teamList:
+            if playerID in fTeam.GetApplyIDList():
+                applyTeamIDList.append(fTeam.GetTeamID())
+        if len(applyTeamIDList) >= reqApplyMax:
+            GameWorld.DebugLog("玩家申请加入队伍数已满,无法申请! funcMapID=%s,applyTeamCount=%s, %s" 
+                               % (funcMapID, len(applyTeamIDList), applyTeamIDList), playerID)
+            syncDict["notifyMark"] = "TeamReqJoinApplyFull"
+            return
+        
+    if funcTeam.GetNeedCheck():
+        syncDict["notifyMark"] = "TeamReqJoinApplyOK"
+        funcTeam.AddApplyID(playerID)
+    else:
+        funcTeam.AddTeamMember(playerID)
+        
+    return True
+
+def __DoFuncTeamOP_JoinCancel(zoneID, funcMapID, teamID, playerID, opType, opData, cacheBase, syncDict):
+    ## 申请取消
+    
+    funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager()
+    funcTeam = funcTeamMgr.GetFuncTeam(teamID)
+    if not funcTeam:
+        return
+    
+    funcTeam.DelApplyID(playerID)
+    
+    return True
+
+def __DoFuncTeamOP_JoinAgree(zoneID, funcMapID, teamID, playerID, opType, opData, cacheBase, syncDict):
+    ## 同意入队
+    # @param opData: 目标玩家ID,为0时一键同意
+    
+    ipyData = IpyGameDataPY.GetIpyGameData("FuncTeamSet", funcMapID)
+    if not ipyData:
+        return
+    
+    funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager()
+    funcTeam = funcTeamMgr.GetFuncTeam(teamID)
+    if not funcTeam:
+        return
+    
+    applyIDList = funcTeam.GetApplyIDList()
+    if not applyIDList:
+        return
+        
+    memberMax = ipyData.GetMemberMax()
+    joinPlayerIDList = []
+    tagPlayerID = opData
+    if tagPlayerID:
+        if tagPlayerID not in applyIDList:
+            GameWorld.Log("目标玩家不在功能队伍申请列表中! funcMapID=%s,teamID=%s,tagPlayerID=%s not in applyIDList=%s" 
+                          % (funcMapID, teamID, tagPlayerID, applyIDList), playerID)
+            return
+        
+        tagPlayerTeamID = funcTeamMgr.GetPlayerTeamID(tagPlayerID, funcMapID)
+        if tagPlayerTeamID:
+            GameWorld.DebugLog("目标玩家已加入其他功能队伍! funcMapID=%s,tagPlayerID=%s,tagPlayerTeamID=%s" 
+                               % (funcMapID, tagPlayerID, tagPlayerTeamID), playerID)
+            syncDict["notifyMark"] = "PlayerInOtherTeam"
+        else:
+            joinPlayerIDList = [tagPlayerID]
+    else:
+        joinPlayerIDList = [] + applyIDList # 一键同意按申请顺序,如需按战力再做优化
+        
+    for joinPlayerID in joinPlayerIDList:
+        if len(funcTeam.GetMemberList()) >= memberMax:
+            GameWorld.DebugLog("功能队伍成员已满! funcMapID=%s,teamID=%s,memberMax=%s" % (funcMapID, teamID, memberMax), playerID)
+            break
+        tagPlayerTeamID = funcTeamMgr.GetPlayerTeamID(joinPlayerID, funcMapID)
+        if tagPlayerTeamID:
+            GameWorld.DebugLog("目标玩家已加入其他功能队伍! funcMapID=%s,joinPlayerID=%s,tagPlayerTeamID=%s" 
+                               % (funcMapID, joinPlayerID, tagPlayerTeamID), playerID)
+            continue
+        funcTeam.AddTeamMember(joinPlayerID)
+        
+    return True
+
+def __DoFuncTeamOP_JoinRefuse(zoneID, funcMapID, teamID, playerID, opType, opData, cacheBase, syncDict):
+    ## 拒绝入队
+    # @param opData: 目标玩家ID,为0时一键拒绝
+    
+    funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager()
+    funcTeam = funcTeamMgr.GetFuncTeam(teamID)
+    if not funcTeam:
+        return
+    
+    tagPlayerID = opData
+    if tagPlayerID:
+        funcTeam.DelApplyID(tagPlayerID)
+    else:
+        funcTeam.DelApplyIDAll() # 一键拒绝
+        
+    return True
+
+def __DoFuncTeamOP_Exit(zoneID, funcMapID, teamID, playerID, opType, opData, cacheBase, syncDict):
+    ## 退出队伍
+    
+    funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager()
+    funcTeam = funcTeamMgr.GetFuncTeam(teamID)
+    if not funcTeam:
+        return
+    
+    # 队长退出,直接解散
+    if playerID == funcTeam.GetCaptainID():
+        return __DoFuncTeamOP_Dissolve(zoneID, funcMapID, teamID, playerID, opType, opData, cacheBase, syncDict)
+    
+    funcTeam.DelTeamMember(playerID)
+    
+    return True
+
+def __DoFuncTeamOP_Kick(zoneID, funcMapID, teamID, playerID, opType, opData, cacheBase, syncDict):
+    ## 踢出队伍
+    
+    funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager()
+    funcTeam = funcTeamMgr.GetFuncTeam(teamID)
+    if not funcTeam:
+        return
+    
+    tagPlayerID = opData
+    if not tagPlayerID:
+        GameWorld.DebugLog("需指定踢出队伍目标队员! opData=%s" % opData, playerID)
+        return
+    
+    if tagPlayerID == funcTeam.GetCaptainID():
+        GameWorld.DebugLog("不能踢队长! opData=%s" % opData, playerID)
+        return
+    
+    funcTeam.DelTeamMember(tagPlayerID)
+    
+    return True
+
+def __DoFuncTeamOP_Transfer(zoneID, funcMapID, teamID, playerID, opType, opData, cacheBase, syncDict):
+    ## 转让队长
+    
+    funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager()
+    funcTeam = funcTeamMgr.GetFuncTeam(teamID)
+    if not funcTeam:
+        return
+    
+    memberIDList = funcTeam.GetMemberIDList()
+    tagPlayerID = opData
+    if tagPlayerID not in memberIDList:
+        GameWorld.Log("目标玩家不是队员,无法转让队长! funcMapID=%s,teamID=%s,tagPlayerID=%s not in %s" 
+                      % (funcMapID, teamID, tagPlayerID, memberIDList), playerID)
+        return
+    
+    funcTeam.SetCaptainID(tagPlayerID)
+    
+    return True
+
+def __DoFuncTeamOP_Dissolve(zoneID, funcMapID, teamID, playerID, opType, opData, cacheBase, syncDict):
+    ## 解散队伍
+    funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager()
+    funcTeamMgr.DelTeam(teamID)
+    return True
+
+def ClientServerMsg_QueryFuncTeam(serverGroupID, msgData):
+    ## 收到子服 - 查找队伍列表
+    
+    zoneID = msgData["zoneID"]
+    playerID = msgData["playerID"]
+    funcMapID = msgData["funcMapID"]
+    cacheBase = msgData.get("cacheBase", {})
+    
+    zoneInfo = GetFuncTeamMapIDZoneInfo(funcMapID, serverGroupID)
+    if not zoneInfo:
+        return
+    funcZoneID, _ = zoneInfo
+    
+    if zoneID != funcZoneID:
+        GameWorld.ErrLog("功能队伍分区不一致,无法查询! funcMapID=%s,zoneID=%s != %s" % (funcMapID, zoneID, funcZoneID), playerID)
+        return
+    
+    if cacheBase:
+        PlayerViewCache.UpdCrossCacheBase(playerID, cacheBase)
+        
+    # 非列表查询,返回玩家相关队伍
+    if "startIndex" not in msgData:
+        syncPlayerIDList = [playerID]
+        serverGroupList = [serverGroupID]
+        
+        funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager()
+        # 申请的队伍
+        funcTeamList = funcTeamMgr.GetFuncTeamList(zoneID, funcMapID)
+        for funcTeam in funcTeamList:
+            if playerID not in funcTeam.GetApplyIDList():
+                continue
+            teamID = funcTeam.GetTeamID()
+            teamInfo = funcTeam.GetSyncDict(True)
+            sendMsg = {"infoType":"QueryPlayerFuncTeam", "zoneID":zoneID, "playerID":playerID, "funcMapID":funcMapID, 
+                       "teamInfo":teamInfo, "teamID":teamID, "syncPlayerIDList":syncPlayerIDList}
+            CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_FuncTeamInfo, sendMsg, serverGroupList)
+            
+        # 玩家所属队伍
+        teamID = funcTeamMgr.GetPlayerTeamID(playerID, funcMapID)
+        funcTeam = funcTeamMgr.GetFuncTeam(teamID)
+        teamInfo = funcTeam.GetSyncDict(True) if funcTeam else {}
+        sendMsg = {"infoType":"QueryPlayerFuncTeam", "zoneID":zoneID, "playerID":playerID, "funcMapID":funcMapID, 
+                   "teamInfo":teamInfo, "teamID":teamID, "syncPlayerIDList":syncPlayerIDList}
+        CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_FuncTeamInfo, sendMsg, serverGroupList)
+        return
+    
+    # 列表查询
+    funcMapEx = msgData["funcMapEx"]
+    startIndex = msgData["startIndex"]
+    queryCnt = msgData["queryCnt"]
+    haveSpace = msgData["haveSpace"]
+    idLimitType = msgData["idLimitType"]
+    searchMsg = msgData["searchMsg"]
+    if queryCnt <= 0:
+        queryCnt = 20
+    queryCnt = min(100, queryCnt) # 默认20,最大100
+    
+    ipyData = IpyGameDataPY.GetIpyGameData("FuncTeamSet", funcMapID)
+    if not ipyData:
+        return
+    memberMax = ipyData.GetMemberMax()
+    
+    idLimitTypeDict = {1:"FamilyID", 2:"ServerGroupID", 3:"AccID"}
+    loopIndex = startIndex
+    teamInfoList = []
+    funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager()
+    teamList = funcTeamMgr.GetFuncTeamList(zoneID, funcMapID)
+    for index in xrange(startIndex, len(teamList)):
+        loopIndex = index + 1
+        funcTeam = teamList[index]
+        if searchMsg:
+            # 精确匹配队伍名、队伍ID的插入在最前面
+            if searchMsg == funcTeam.GetTeamName() or searchMsg == str(funcTeam.GetTeamID()):
+                teamInfoList.insert(0, funcTeam.GetSyncDict(False))
+            elif searchMsg in funcTeam.GetTeamName():
+                teamInfoList.append(funcTeam.GetSyncDict(False))
+            else:
+                continue
+        else:
+            if funcMapEx != 0 and funcMapEx != funcTeam.GetFuncMapEx():
+                continue
+            if haveSpace and len(funcTeam.GetMemberList()) >= memberMax:
+                #GameWorld.DebugLog("已满员,不加入列表查看 teamID=%s" % funcTeam.GetTeamID())
+                continue
+            if idLimitType in idLimitTypeDict:
+                limitAttrName = idLimitTypeDict[idLimitType]
+                curIDValue = cacheBase.get(limitAttrName, 0)
+                captainID = funcTeam.GetCaptainID()
+                cacheDict = PlayerViewCache.GetCachePropDataDict(PlayerViewCache.FindViewCache(captainID))
+                teamIDValue = cacheDict.get(limitAttrName, 0)
+                if limitAttrName == "AccID":
+                    curIDValue = GameWorld.GetAccIDServerID(str(curIDValue))
+                    teamIDValue = GameWorld.GetAccIDServerID(str(teamIDValue))
+                    
+                if not curIDValue or curIDValue != teamIDValue:
+                    #GameWorld.DebugLog("没有或不同ID限制,不加入列表查看! idLimitType=%s,curIDValue=%s != %s, teamID=%s, captainID=%s" 
+                    #                   % (idLimitType, curIDValue, teamIDValue, funcTeam.GetTeamID(), captainID))
+                    continue
+            teamInfoList.append(funcTeam.GetSyncDict(False))
+            
+        if len(teamInfoList) >= queryCnt:
+            break
+        
+    serverGroupList = [serverGroupID] # 仅通知查询服即可
+    sendMsg = {"teamInfoList":teamInfoList, "loopIndex":loopIndex, "queryInfo":msgData}
+    CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_FuncTeamList, sendMsg, serverGroupList)
+    return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
index 84f5472..3682eb3 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
@@ -57,8 +57,6 @@
 g_teamPlayerDict = {} # 地图队伍对应玩家ID列表,含离线玩家 {teamID:[playerID, ...], ...}
 g_teamPlayerInfoDict = {} # 地图队伍对应玩家ID信息 {teamID:{playerID:{k:v, ...}, ...}
 
-g_funcTeamPlayerDict = {} # 功能队伍玩家ID列表 {(zoneID, funcMapID): {teamID:[playerID, ...], ...}, ...}
-
 g_unLoginOKPlayerMailInfo = {} # GameServer 未登录成功前需要发送的邮件缓存,防止登录失败不存db导致重复发送邮件 {playerID:[[待发送邮件内容信息], ...], ...}
 g_disconnectPlayer = {} # 在本地图离线的玩家信息 {playerID:[tick, posX, posY], ...}
 g_lastExitFBType = {} # 最后一个离开副本信息 {fbIndex:[exitType, tick], ...} exitType: 1-掉线,2-主动退出
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/Collections/CollectionDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/Collections/CollectionDefine.py
index 30ab5fd..7ba59e3 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/Collections/CollectionDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/Collections/CollectionDefine.py
@@ -5,6 +5,8 @@
 #-------------------------------------------------------------------------------
 #
 #卡牌服务器表
+UCN_DBFuncTeamMem="tagDBFuncTeamMem"
+UCN_DBFuncTeam="tagDBFuncTeam"
 UCN_DBGameRec="tagDBGameRec"
 UCN_DBFamilyAction="tagDBFamilyAction"
 UCN_DBFamilyMem="tagDBFamilyMem"
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/Collections/DataServerPlayerData.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/Collections/DataServerPlayerData.py
index 0252ce3..41fd29e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/Collections/DataServerPlayerData.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/Collections/DataServerPlayerData.py
@@ -28915,3 +28915,425 @@
         return output
 
 
+# 功能队伍表 #tagDBFuncTeam
+class tagDBFuncTeam(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('TeamID', ctypes.c_ulong),
+        ('TeamName', ctypes.c_char * 33),
+        ('ZoneID', ctypes.c_ubyte),
+        ('FuncMapID', ctypes.c_ulong),
+        ('FuncMapEx', ctypes.c_ulong),
+        ('CreateTime', ctypes.c_ulong),
+        ('CaptainID', ctypes.c_ulong),
+        ('MinLV', ctypes.c_ushort),
+        ('MinFightPower', ctypes.c_ulong),
+        ('MinFightPowerEx', ctypes.c_ulong),
+        ('ServerOnly', ctypes.c_ubyte),
+        ('NeedCheck', ctypes.c_ubyte),
+        ('ApplyIDLen', ctypes.c_ushort),
+        ('ApplyIDList', ctypes.c_char_p),
+        ('Value1', ctypes.c_ulong),
+        ('Value2', ctypes.c_ulong),
+        ('Value3', ctypes.c_ulong),
+        ('Value4', ctypes.c_ulong),
+        ('Value5', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+    def clear(self):
+        self.TeamID = 0
+        self.TeamName = ''
+        self.ZoneID = 0
+        self.FuncMapID = 0
+        self.FuncMapEx = 0
+        self.CreateTime = 0
+        self.CaptainID = 0
+        self.MinLV = 0
+        self.MinFightPower = 0
+        self.MinFightPowerEx = 0
+        self.ServerOnly = 0
+        self.NeedCheck = 0
+        self.ApplyIDLen = 0
+        self.ApplyIDList = ''
+        self.Value1 = 0
+        self.Value2 = 0
+        self.Value3 = 0
+        self.Value4 = 0
+        self.Value5 = 0
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+        self.clear()
+        self.TeamID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.TeamName, pos = CommFunc.ReadString(buf, pos, 33)
+        self.ZoneID, pos = CommFunc.ReadBYTE(buf, pos)
+        self.FuncMapID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.FuncMapEx, pos = CommFunc.ReadDWORD(buf, pos)
+        self.CreateTime, pos = CommFunc.ReadDWORD(buf, pos)
+        self.CaptainID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.MinLV, pos = CommFunc.ReadWORD(buf, pos)
+        self.MinFightPower, pos = CommFunc.ReadDWORD(buf, pos)
+        self.MinFightPowerEx, pos = CommFunc.ReadDWORD(buf, pos)
+        self.ServerOnly, pos = CommFunc.ReadBYTE(buf, pos)
+        self.NeedCheck, pos = CommFunc.ReadBYTE(buf, pos)
+        self.ApplyIDLen, pos = CommFunc.ReadWORD(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.ApplyIDLen)
+        self.ApplyIDList = ctypes.c_char_p(tmp)
+        self.Value1, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Value2, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Value3, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Value4, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Value5, pos = CommFunc.ReadDWORD(buf, pos)
+        return self.getLength()
+
+    def getBuffer(self):
+        buf = ''
+        buf = CommFunc.WriteDWORD(buf, self.TeamID)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 33, self.TeamName)
+        buf = CommFunc.WriteBYTE(buf, self.ZoneID)
+        buf = CommFunc.WriteDWORD(buf, self.FuncMapID)
+        buf = CommFunc.WriteDWORD(buf, self.FuncMapEx)
+        buf = CommFunc.WriteDWORD(buf, self.CreateTime)
+        buf = CommFunc.WriteDWORD(buf, self.CaptainID)
+        buf = CommFunc.WriteWORD(buf, self.MinLV)
+        buf = CommFunc.WriteDWORD(buf, self.MinFightPower)
+        buf = CommFunc.WriteDWORD(buf, self.MinFightPowerEx)
+        buf = CommFunc.WriteBYTE(buf, self.ServerOnly)
+        buf = CommFunc.WriteBYTE(buf, self.NeedCheck)
+        buf = CommFunc.WriteWORD(buf, self.ApplyIDLen)
+        buf = CommFunc.WriteString(buf, self.ApplyIDLen, self.ApplyIDList)
+        buf = CommFunc.WriteDWORD(buf, self.Value1)
+        buf = CommFunc.WriteDWORD(buf, self.Value2)
+        buf = CommFunc.WriteDWORD(buf, self.Value3)
+        buf = CommFunc.WriteDWORD(buf, self.Value4)
+        buf = CommFunc.WriteDWORD(buf, self.Value5)
+        return buf
+
+    def getLength(self):
+        length = 0
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_char) * 33
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ushort)
+        length += self.ApplyIDLen
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        return length
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'TeamID'] = self.TeamID
+        rec[u'TeamName'] = fix_incomingText(self.TeamName)
+        rec[u'ZoneID'] = self.ZoneID
+        rec[u'FuncMapID'] = self.FuncMapID
+        rec[u'FuncMapEx'] = self.FuncMapEx
+        rec[u'CreateTime'] = self.CreateTime
+        rec[u'CaptainID'] = self.CaptainID
+        rec[u'MinLV'] = self.MinLV
+        rec[u'MinFightPower'] = self.MinFightPower
+        rec[u'MinFightPowerEx'] = self.MinFightPowerEx
+        rec[u'ServerOnly'] = self.ServerOnly
+        rec[u'NeedCheck'] = self.NeedCheck
+        rec[u'ApplyIDLen'] = self.ApplyIDLen
+        rec[u'ApplyIDList'] = fix_incomingText(self.ApplyIDList)
+        rec[u'Value1'] = self.Value1
+        rec[u'Value2'] = self.Value2
+        rec[u'Value3'] = self.Value3
+        rec[u'Value4'] = self.Value4
+        rec[u'Value5'] = self.Value5
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.TeamID = rec.get(u'TeamID', 0)
+        self.TeamName = fix_outgoingText(rec.get(u'TeamName', u''))
+        self.ZoneID = rec.get(u'ZoneID', 0)
+        self.FuncMapID = rec.get(u'FuncMapID', 0)
+        self.FuncMapEx = rec.get(u'FuncMapEx', 0)
+        self.CreateTime = rec.get(u'CreateTime', 0)
+        self.CaptainID = rec.get(u'CaptainID', 0)
+        self.MinLV = rec.get(u'MinLV', 0)
+        self.MinFightPower = rec.get(u'MinFightPower', 0)
+        self.MinFightPowerEx = rec.get(u'MinFightPowerEx', 0)
+        self.ServerOnly = rec.get(u'ServerOnly', 0)
+        self.NeedCheck = rec.get(u'NeedCheck', 0)
+        self.ApplyIDLen = rec.get(u'ApplyIDLen', 0)
+        self.ApplyIDList = fix_outgoingText(rec.get(u'ApplyIDList', u''))
+        self.Value1 = rec.get(u'Value1', 0)
+        self.Value2 = rec.get(u'Value2', 0)
+        self.Value3 = rec.get(u'Value3', 0)
+        self.Value4 = rec.get(u'Value4', 0)
+        self.Value5 = rec.get(u'Value5', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+#Can not implement adoInsertStr method:No key defined!
+#Can not implement adoUpdateStr method:No key defined!
+#Can not implement adoUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+#Can not implement adoQueryIndexStr method:No key defined!
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+#Can not implement adoDeleteByIndexStr method:No key defined!
+    def outputString(self):
+        output = '''// 功能队伍表 #tagDBFuncTeam:
+            TeamID = %s,
+            TeamName = %s,
+            ZoneID = %s,
+            FuncMapID = %s,
+            FuncMapEx = %s,
+            CreateTime = %s,
+            CaptainID = %s,
+            MinLV = %s,
+            MinFightPower = %s,
+            MinFightPowerEx = %s,
+            ServerOnly = %s,
+            NeedCheck = %s,
+            ApplyIDLen = %s,
+            ApplyIDList = %s,
+            Value1 = %s,
+            Value2 = %s,
+            Value3 = %s,
+            Value4 = %s,
+            Value5 = %s,
+            ADOResult = %s,
+            '''%(
+                self.TeamID,
+                self.TeamName,
+                self.ZoneID,
+                self.FuncMapID,
+                self.FuncMapEx,
+                self.CreateTime,
+                self.CaptainID,
+                self.MinLV,
+                self.MinFightPower,
+                self.MinFightPowerEx,
+                self.ServerOnly,
+                self.NeedCheck,
+                self.ApplyIDLen,
+                self.ApplyIDList,
+                self.Value1,
+                self.Value2,
+                self.Value3,
+                self.Value4,
+                self.Value5,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.TeamID,
+                self.TeamName,
+                self.ZoneID,
+                self.FuncMapID,
+                self.FuncMapEx,
+                self.CreateTime,
+                self.CaptainID,
+                self.MinLV,
+                self.MinFightPower,
+                self.MinFightPowerEx,
+                self.ServerOnly,
+                self.NeedCheck,
+                self.ApplyIDLen,
+                self.ApplyIDList,
+                self.Value1,
+                self.Value2,
+                self.Value3,
+                self.Value4,
+                self.Value5,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetTeamName(self,Str):
+        if len(Str)<=33:
+            self.TeamName = Str
+        else:
+            self.TeamName = Str[:33]
+            
+
+# 功能队伍成员表 #tagDBFuncTeamMem
+class tagDBFuncTeamMem(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('TeamID', ctypes.c_ulong),
+        ('PlayerID', ctypes.c_ulong),
+        ('Value1', ctypes.c_ulong),
+        ('Value2', ctypes.c_ulong),
+        ('Value3', ctypes.c_ulong),
+        ('Value4', ctypes.c_ulong),
+        ('Value5', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+        self.clear()
+        self.TeamID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Value1, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Value2, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Value3, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Value4, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Value5, pos = CommFunc.ReadDWORD(buf, pos)
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBFuncTeamMem)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'TeamID'] = self.TeamID
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'Value1'] = self.Value1
+        rec[u'Value2'] = self.Value2
+        rec[u'Value3'] = self.Value3
+        rec[u'Value4'] = self.Value4
+        rec[u'Value5'] = self.Value5
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.TeamID = rec.get(u'TeamID', 0)
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.Value1 = rec.get(u'Value1', 0)
+        self.Value2 = rec.get(u'Value2', 0)
+        self.Value3 = rec.get(u'Value3', 0)
+        self.Value4 = rec.get(u'Value4', 0)
+        self.Value5 = rec.get(u'Value5', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+#Can not implement adoInsertStr method:No key defined!
+#Can not implement adoUpdateStr method:No key defined!
+#Can not implement adoUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+#Can not implement adoQueryIndexStr method:No key defined!
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+#Can not implement adoDeleteByIndexStr method:No key defined!
+    def outputString(self):
+        output = '''// 功能队伍成员表 #tagDBFuncTeamMem:
+            TeamID = %s,
+            PlayerID = %s,
+            Value1 = %s,
+            Value2 = %s,
+            Value3 = %s,
+            Value4 = %s,
+            Value5 = %s,
+            ADOResult = %s,
+            '''%(
+                self.TeamID,
+                self.PlayerID,
+                self.Value1,
+                self.Value2,
+                self.Value3,
+                self.Value4,
+                self.Value5,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.TeamID,
+                self.PlayerID,
+                self.Value1,
+                self.Value2,
+                self.Value3,
+                self.Value4,
+                self.Value5,
+            )
+        return output
+
+
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/LogicProcess/UserCtrlDB.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/LogicProcess/UserCtrlDB.py
index 40cb8db..38349a0 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/LogicProcess/UserCtrlDB.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/LogicProcess/UserCtrlDB.py
@@ -3434,6 +3434,16 @@
         data += DBGameRec.adoQueryAll(collection)
         mylog.info("tagDBGameRec ok")
         
+        collection = db[UCN_DBFuncTeam]
+        DBFuncTeam = DataServerPlayerData.tagDBFuncTeam()
+        data += DBFuncTeam.adoQueryAll(collection)
+        mylog.info("tagDBFuncTeam ok")
+        
+        collection = db[UCN_DBFuncTeamMem]
+        DBFuncTeamMem = DataServerPlayerData.tagDBFuncTeamMem()
+        data += DBFuncTeamMem.adoQueryAll(collection)
+        mylog.info("tagDBFuncTeamMem ok")
+        
         mylog.info('readGameWorldData len:%s' % len(data))
         return data
     
@@ -3456,6 +3466,8 @@
             gameDataReadPos = self.savegameServerWorldData(saveData, gameDataReadPos, UCN_DBFamilyMem, DataServerPlayerData.tagDBFamilyMem, db)
             gameDataReadPos = self.savegameServerWorldData(saveData, gameDataReadPos, UCN_DBFamilyAction, DataServerPlayerData.tagDBFamilyAction, db)
             gameDataReadPos = self.savegameServerWorldData(saveData, gameDataReadPos, UCN_DBGameRec, DataServerPlayerData.tagDBGameRec, db)
+            gameDataReadPos = self.savegameServerWorldData(saveData, gameDataReadPos, UCN_DBFuncTeam, DataServerPlayerData.tagDBFuncTeam, db)
+            gameDataReadPos = self.savegameServerWorldData(saveData, gameDataReadPos, UCN_DBFuncTeamMem, DataServerPlayerData.tagDBFuncTeamMem, db)
             
             mylog.info('saveGameWorldData ok!')
             

--
Gitblit v1.8.0