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