hch
2025-10-14 47813c8aef184ab6bc6f4556d2a18303a2a31d47
15 卡牌服务端搭建 - 跨服支持PY自定义封包通信
7个文件已修改
3个文件已添加
608 ■■■■ 已修改文件
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyCrossServerPack.ini 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChServerToServerPyPack.py 152 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/CrossServerPackLogic.py 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NetPackCommon.py 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/DBCommon/CommonDefine.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/LogicProcess/UserCtrlDB.py 217 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/Protocol/MergeServerRecvProtocol.py 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/Protocol/RecvPackProtocol.py 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/Protocol/SendPackProtocol.py 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/RecvPackToMapDB.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyCrossServerPack.ini
New file
@@ -0,0 +1,16 @@
;RegType 为0表示是封包注册, 为1表示是类名注册(py类名不使用)
;服务器间的跨服包,既是发包也是收包
;跨服PY包注册
[CrossServerPackLogic]
ScriptName = CrossServerPackLogic.py
Writer = alee
Releaser = alee
RegType = 0
RegisterPackCount = 1
PacketCMD_1=0xC2
PacketSubCMD_1=0x01
PacketCallFunc_1=OnTest
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChServerToServerPyPack.py
New file
@@ -0,0 +1,152 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#作者 :
import CommFunc
import binascii
import copy
from struct import *
from ctypes import *
#插件头
#
#
ChNetPackDict={}
class  BString:
    NameLen = 0        # (BYTE NameLen )
    Name = ""        # (String Name )     //size = NameLen
    data = None
    def __init__(self):
        self.Clear()
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        self.NameLen, _pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.Name, _pos = CommFunc.ReadString(_lpData, _pos, self.NameLen)
        return _pos
    def Clear(self):
        self.NameLen = 0
        self.Name = ""
        return
    def GetLength(self):
        length = 0
        length += 1
        length += self.Name.Length()
        return  length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteBYTE(data, self.NameLen)
        data = CommFunc.WriteString(data, self.NameLen, self.Name)
        return data
    def OutputString(self):
        DumpString = ''':
                            NameLen:%d,
                            Name:%s
                            '''\
                            %(
                            self.NameLen,
                            self.Name
                            )
        return  DumpString
class  tagHead:
    Cmd = 0     # (BYTE Cmd )
    SubCmd = 0      # (BYTE SubCmd )
    def __init__(self):
        self.Clear()
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        self.Cmd, _pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.SubCmd, _pos = CommFunc.ReadBYTE(_lpData, _pos)
        return _pos
    def Clear(self):
        self.Cmd = 0
        self.SubCmd = 0
        return
    def GetLength(self):
        length = 0
        length += 1
        length += 1
        return  length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteBYTE(data, self.Cmd)
        data = CommFunc.WriteBYTE(data, self.SubCmd)
        return data
    def OutputString(self):
        DumpString = ''':
                            Cmd:%d,
                            SubCmd:%d
                            '''\
                            %(
                            self.Cmd,
                            self.SubCmd
                            )
        return  DumpString
#------------------------------------------------------
# C2 01 跨服服务器间的测试包 #tagSSTest
class  tagSSTest(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("Data", c_int),    #测试
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xC2
        self.SubCmd = 0x01
        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 = 0xC2
        self.SubCmd = 0x01
        self.Data = 0
        return
    def GetLength(self):
        return sizeof(tagSSTest)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// C2 01 跨服服务器间的测试包 //tagSSTest:
                                Cmd:%s,
                                SubCmd:%s,
                                Data:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.Data
                                )
        return DumpString
m_NAtagSSTest=tagSSTest()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagSSTest.Cmd,m_NAtagSSTest.SubCmd))] = m_NAtagSSTest
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/CrossServerPackLogic.py
New file
@@ -0,0 +1,22 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#
#
##@package CrossServerPackLogic.py
# @todo: 跨服服务器间封包逻辑
# 跨服服务器间的封包 既是收包也是发包
import GameWorld
import ChServerToServerPyPack
import NetPackCommon
def OnTest(netPack):
    GameWorld.Log("收到跨服包 " + str(netPack.Data))
def SendTest():
    pack = ChServerToServerPyPack.tagSSTest()
    pack.Data = 12
    #0全广播,1通知主服务器排除合服子服,2通知服务器包含合服子服, 3通知跨服服务器
    NetPackCommon.SendCrossServerToServerPack(1, "[501]", pack.GetBuffer())
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NetPackCommon.py
@@ -32,6 +32,8 @@
import ChGameToMapPyPack
from PyMongoDB.DBCommon import CommonDefine
import ObjPool
import ChServerToServerPyPack
from PyMongoDB.Protocol import MergeServerRecvProtocol
#-------------------------------------------------------------------------------
#---全局变量---
@@ -251,8 +253,6 @@
#-------------------------------------------------------------------------------
#-------------------------------------------------------------------------------
#GameServer Py封包注册信息
@@ -334,4 +334,75 @@
# 向ServersRoute发送数据
def SendPyPackToServersRoute(data, datalen):
    GameWorld.GetGameWorld().SendPyPackToServersRoute(datalen, data)
    return
    return
#-------------------------------------------------------------------------------
# Py跨服服务器间的封包
#跨服服务器间的封包既是发包也是收包
PyCrossServerPackTable = {}
PyCrossServerPackTable = ReadPyPackTable("PyCrossServerPack")
# 收包字典
RecCrossServerPyPackDict = ChServerToServerPyPack.ChNetPackDict
## 接收跨服之间封包
#  @param tick 时间戳
#  @return 无返回值
#  @remarks
def RecCrossServerNetPack(netPackBuffer):
    try:
        #没有PY封包头
        if len(netPackBuffer) <= 1:
            return
        headData = netPackBuffer[1] + netPackBuffer[0]
        curPackHead = CommFunc.ReadWORD(headData, 0)[0]
        curPackData = RecCrossServerPyPackDict.get(curPackHead)
        if not curPackData:
            return
        curPackData.ReadData(netPackBuffer)
        # 截断字符串
        for key in dir(curPackData):
            value = getattr(curPackData, key)
            if isinstance(value, str):
                setattr(curPackData, key, value.rstrip(chr(0x0)))
        # 取此包头注册信息
        curPackHeadRegDict = PyCrossServerPackTable.get(curPackHead)
        # 无此封包注册信息
        if curPackHeadRegDict == None:
            #Log("RevieveFakePack: No Register curPackHead = %s"%curPackHead)
            return
        curPackHeadRegDict["CallFunc"](curPackData)
    except Exception:
        GameWorld.RaiseException("!!!python自定义跨服封包解析失败\r\n%s" % traceback.format_exc())
        return
## 发送跨服包:服务器与服务器间的通信
#  @param DirType  0全广播,1通知主服务器排除合服子服,2通知服务器包含合服子服, 3通知跨服服务器
#  @param clientPack 要包装的封包
#  @return 无返回值
#  @remarks
def SendCrossServerToServerPack(dirType, serverList, packBuffer):
    recvPack = MergeServerRecvProtocol.tagLPStringData()
    recvPack.Type = CommonDefine.gstCrossServerToServerPack
    recvPack.DirType = dirType
    recvPack.ServerList = str(serverList)
    recvPack.ServerLen = len(recvPack.ServerList)
    recvPack.Data = packBuffer
    recvPack.DataLen = len(packBuffer)
    SendPyPackToServersRoute(recvPack.GetBuffer(), recvPack.GetLength())
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/DBCommon/CommonDefine.py
@@ -229,7 +229,7 @@
gstMergeRegisterPlayer = 119                #报名跨服战
gstMergeQueryRegisterResult = 120           #查询报名结果,即查询帐号密码
gstGeneralDBOper = 121                      #通用数据库操作包
gstBroadcastMergeClient = 122               #广播跨服客户端
gstCrossServerToServerPack = 122            #跨服使用 服务器之间的封包
gstDiapatchFamilyID = 123                   #分配家族ID
gstMergerChildToCenter = 124
gstQueryRecharge= 125                       # 查询新的充值订单
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/LogicProcess/UserCtrlDB.py
@@ -466,6 +466,13 @@
        
        mylog.debug("begin process request type = %d"%requestType)
        
        if requestType == CommonDefine.gstCrossServerToServerPack:
            oFuncGrade = self.GetFuncGrade('gstCrossServerToServerPack')
            oFuncGrade.Start()
            self.OnCrossServerToServerPack(db, pack)
            oFuncGrade.End()
            return True
        if requestType == CommonDefine.gstGMToolCommand:
            oFuncGrade = self.GetFuncGrade('gstGMToolCommand')
            oFuncGrade.Start()
@@ -488,26 +495,6 @@
            oFuncGrade.End()
            return True
        
        if requestType == CommonDefine.gstMergeQueryRegisterResult:
            oFuncGrade = self.GetFuncGrade('gstMergeQueryRegisterResult')
            oFuncGrade.Start()
            self.OnMergeQueryRegisterResult(db, pack)
            oFuncGrade.End()
            return True
        if requestType == CommonDefine.gstMergeRegisterPlayer:
            oFuncGrade = self.GetFuncGrade('gstMergeRegisterPlayer')
            oFuncGrade.Start()
            self.OnMergeRegisterPlayerByCache(db, pack)
            oFuncGrade.End()
            return True
        if requestType == CommonDefine.gstMergePlayerData:
            oFuncGrade = self.GetFuncGrade('gstMergePlayerData')
            oFuncGrade.Start()
            self.OnMergeChildToCenterPlayerData(db, pack)
            oFuncGrade.End()
            return True
        
        if requestType == CommonDefine.gstQueryNewGuyCardState:
            oFuncGrade = self.GetFuncGrade("gstQueryNewGuyCardState")
@@ -855,14 +842,7 @@
            self.OnInsertImpeach(db, pack) 
            oFuncGrade.End()    
            return True                                                        
        if requestType == CommonDefine.gstMergerChildToCenter:
            oFuncGrade = self.GetFuncGrade("gstMergerChildToCenter")
            oFuncGrade.Start()
            self.OnMergerChildToCenter(db, pack)
            oFuncGrade.End()
            return True
        
        if requestType == CommonDefine.gstPrepareCreateRole:
            oFuncGrade = self.GetFuncGrade("gstPrepareCreateRole")
@@ -936,6 +916,22 @@
        ProjSpecialProcess.GMCmdPlayerLogin(curPlayer)
        return
    
    def OnCrossServerToServerPack(self, db, pack):
        if CommonDefine.IsDebug():
            import binascii
            mylog.debug('buf = %s'%binascii.b2a_hex(pack.getBuffer()))
        try:
            recvPack = MergeServerRecvProtocol.tagLPStringData()
            recvPack.ReadData(pack.getBuffer())
            NetPackCommon.RecCrossServerNetPack(recvPack.Data)
        except:
            msg = error.formatMsg('error', error.ERROR_NO_172, "LogicProcessThread::OnCrossServerToServerPack Catch a unexpetcted exception, error = %s"%traceback.format_exc())
            mylog.error(msg)
    def OnGMToolCommand(self, db, pack):
        if CommonDefine.IsDebug():
@@ -947,7 +943,6 @@
        except:
            msg = error.formatMsg('error', error.ERROR_NO_172, "LogicProcessThread::OnGMToolCommand Catch a unexpetcted exception, error = %s"%traceback.format_exc())
            mylog.error(msg)
    def OnGeneralDBOper(self, db, pack):
@@ -1218,114 +1213,6 @@
                     + gmIPData + rolePetData + petSkillData + roleNormalDictData + roleDienstgradData+battleFormationData
        
    # 查询返回0/1 代表是否成功
    def OnMergeQueryRegisterResult(self, db, pack):
        g_mergeRegisterPlayerDict = PyGameData.g_mergeRegisterPlayerDict
        buf = pack.getBuffer()
        #len = pack.getLength()
        recvPack = MergeServerRecvProtocol.tagLPQueryRegisterResult()
        pos = 0
        recvPack.ReadData(buf, pos)
        accID = recvPack.AccID.strip(chr(0))
        mylog.debug('accID = %s.'%(accID))
        clientSessionID = pack.getSessionID()
        client = MergeProxyClientMgr.getMergeProxyClientMgr().findClientBySessionID(clientSessionID)
        if not client:
            mylog.warning('client not found!sessionID = %s'%(clientSessionID))
            return
        sendPack = MergeServerSendProtocol.tagMPQueryRegisterResult()
        sendPack.Type = CommonDefine.dgMergeQueryNewAccount
        if g_mergeRegisterPlayerDict.get(accID, []):
            sendPack.Result = 0
            self.packSend(pack.getSessionID(), pack.getPackHead().sessionID, 0, CommonDefine.atMergeLogic, MMORPGPack.stNoSense,
                          MMORPGPack.stNoSense, sendPack.GetBuffer())
            mylog.warning('query failed!spec = %s'%accID)
            return
        sendPack.Result = 1
        sendPack.Account = accID
        sendPack.AccountLen = len(accID)
        sendPack.Pwd = ""
        sendPack.PwdLen = 0
        self.packSend(pack.getSessionID(), pack.getPackHead().sessionID, 0, CommonDefine.atMergeLogic, MMORPGPack.stNoSense,
                          MMORPGPack.stNoSense, sendPack.GetBuffer())
    def OnMergeRegisterPlayerByCache(self, db, pack):
        ''' 缓存跨服玩家上传数据信息
            目前账号、玩家ID、角色名均已确保唯一,故无需再重新生成新的账号及角色信息
            直接接收更新缓存即可,玩家登陆跨服服务器时直接从缓存数据中解析角色数据,从而节省db存取步骤
        '''
        g_mergeRegisterPlayerDict = PyGameData.g_mergeRegisterPlayerDict
        try:
            buf = pack.getBuffer()
            recvPack = MergeServerRecvProtocol.tagLPRegisterPlayer()
            pos = 0
            recvPack.ReadData(buf, pos)
            #mylog.debug('pack = %s'%(binascii.b2a_hex(buf)))
            loginResultPack = MergeServerSendProtocol.tagMPRegisterPlayerResult()
            loginResultPack.Type = CommonDefine.dgMergeRegisterResult
            #玩家地图数据,和下线保存包 SavePlayerMapServerDataEx 一致
            playerData = recvPack.Data
            playerRec = DataServerPlayerData.tagDBPlayer()
            pos = 0
            dbPlayerReadLen = playerRec.readData(playerData, pos, len(playerData))
            if -1 == dbPlayerReadLen:
                #数据异常,长度不足
                #回复失败
                loginResultPack.Result = 0
                loginResultPack.ErrorMsg = 'Player data length not enough!'
                loginResultPack.ErrorMsgLen = len(loginResultPack.ErrorMsg)
                self.packSend(pack.getSessionID(), pack.getPackHead().sessionID, 0, CommonDefine.atMergeLogic, MMORPGPack.stNoSense,
                              MMORPGPack.stNoSense, loginResultPack.GetBuffer())
                mylog.warning('player data too short!')
                return
            if playerRec.PlayerID == 0:
                loginResultPack.Result = 0
                loginResultPack.ErrorMsg = 'Player data error!'
                loginResultPack.ErrorMsgLen = len(loginResultPack.ErrorMsg)
                self.packSend(pack.getSessionID(), pack.getPackHead().sessionID, 0, CommonDefine.atMergeLogic, MMORPGPack.stNoSense,
                              MMORPGPack.stNoSense, loginResultPack.GetBuffer())
                mylog.warning('player data error!')
                return
            clientSessionID = pack.getSessionID()
            client = MergeProxyClientMgr.getMergeProxyClientMgr().findClientBySessionID(clientSessionID)
            if not client:
                mylog.warning('client not found!sessionID = %s'%(clientSessionID))
                return
            groupID = client.groupID
            playerID = playerRec.PlayerID
            accID = playerRec.AccID.lower().strip(chr(0))
            playerName = playerRec.PlayerName.strip()
            #成功,返回新帐号密码
            loginResultPack.Result = 1
            loginResultPack.Account = accID
            loginResultPack.AccountLen = len(accID)
            loginResultPack.Pwd = ""
            loginResultPack.PwdLen = 0
            self.packSend(pack.getSessionID(), pack.getPackHead().sessionID, 0, CommonDefine.atMergeLogic, MMORPGPack.stNoSense,
                              MMORPGPack.stNoSense, loginResultPack.GetBuffer())
            mylog.info('player %s accID=%s, playerID=%s, %s register PK ok!'%(groupID, accID, playerID, playerName))
            g_mergeRegisterPlayerDict[accID] = [time(), 0, recvPack, groupID] # 更新跨服玩家数据缓存
        except Exception, e:
            msg = error.formatMsg('error', error.ERROR_NO_175, "OnMergeRegisterPlayer error %s!traceback = %s, pack = %s"%(e, traceback.format_exc(), binascii.b2a_hex(buf)))
            mylog.error(msg)
        except:
            msg = error.formatMsg('error', error.ERROR_NO_176, "OnMergeRegisterPlayer error!traceback = %s, pack = %s"%(traceback.format_exc(), binascii.b2a_hex(buf)))
            mylog.error(msg)
        return
    
    def OnFinishRecharge(self, db, pack):
        # map完成兑换,假设此处没有回复,则此单变成丢单,暂由人工维护
@@ -5715,64 +5602,8 @@
        return True   
    def OnMergerChildToCenter(self,db, pack):
        mylog.debug('OnMergerChildToCenter in')
#        #伪装来源,便于回包
#        pack.getPackHead().srcSvrType = MMORPGPack.stGame
#        pack.getPackHead().type = CommonDefine.dgMergerChildToCenter
        #获取发包参数
        ServerMgr = MongoDBServer.getServerMgr()
        sendViaSessionID = ServerMgr.getClientSessionIDByName("CenterGate",0)
        SessionID = 0
        PoolIndex = -1
        #读取数据
        buf = pack.getBuffer()
        recvPack = MergeServerRecvProtocol.tagLPStringData()
        pos = 0
        recvPack.ReadData(buf, pos)
        #转发数据到GameServer
        sendPack = SendPackProtocol.tagDGMergerChildToGameStringData()
        sendPack.Type = CommonDefine.dgMergerChildToCenter
        sendPack.DataLen = recvPack.DataLen
        sendPack.Data = recvPack.Data
        ServerMgr.packSendBySessionID(sendViaSessionID, SessionID, PoolIndex,
                  CommonDefine.atInner,
                  MMORPGPack.stGame, MMORPGPack.stData,
                  sendPack.GetBuffer())
        mylog.debug('OnMergerChildToCenter sendString toGameServer %s'%recvPack.Data)
        return True
    
    
    def OnMergeChildToCenterPlayerData(self,db, pack):
        mylog.debug('OnMergeChildToCenterPlayerData in')
        #伪装来源,便于回包
        #获取发包参数
        ServerMgr = MongoDBServer.getServerMgr()
        sendViaSessionID = ServerMgr.getClientSessionIDByName("CenterGate",0)
        SessionID = 0
        PoolIndex = -1
        #读取数据
        buf = pack.getBuffer()
        recvPack = MergeServerRecvProtocol.tagLPPlayerData()
        pos = 0
        recvPack.ReadData(buf, pos)
        #转发数据到MapServer
        sendPack = SendPackProtocol.tagDMMergePlayerData()
        sendPack.Type = CommonDefine.dgDBToMapServer
        sendPack.SubType = CommonDefine.gmMergePlayerData
        sendPack.DataLen = recvPack.DataLen
        sendPack.Data = recvPack.Data
        sendPack.PlayerID = recvPack.PlayerID
        ServerMgr.packSendBySessionID(sendViaSessionID, SessionID, PoolIndex,
                  CommonDefine.atInner,
                  MMORPGPack.stRoute, MMORPGPack.stData,
                  sendPack.GetBuffer())
        mylog.debug('OnMergeChildToCenterPlayerData sendString toMapServer %s'%([recvPack.PlayerID, sendPack.DataLen,]))
        return True
    
    
    #导出单玩家数据
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/Protocol/MergeServerRecvProtocol.py
@@ -344,10 +344,14 @@
        return DumpString
    
    
#向跨服服务器发送自定义封包#tagLPStringData
#------------------------------------------------------
#服务器与服务器间的自定义跨服封包#tagLPStringData
class  tagLPStringData(Structure):
    Type = 0    #(BYTE Type)//类型
    DirType = 0    #(BYTE DirType)//0全广播,1通知主服务器排除合服子服,2通知服务器包含合服子服, 3通知跨服服务器
    ServerLen = 0    #(DWORD ServerLen)
    ServerList = ""    #(String ServerList)//服务器列表格式可以是 [(1,10),13,16,(22,30)]
    DataLen = 0    #(DWORD DataLen)
    Data = ""    #(String Data)//自定义消息
    data = None
@@ -359,12 +363,18 @@
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        self.Type,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.DirType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.ServerLen,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.ServerList,_pos = CommFunc.ReadString(_lpData, _pos,self.ServerLen)
        self.DataLen,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.Data,_pos = CommFunc.ReadString(_lpData, _pos,self.DataLen)
        return _pos
    def Clear(self):
        self.Type = 0
        self.DirType = 0
        self.ServerLen = 0
        self.ServerList = ""
        self.DataLen = 0
        self.Data = ""
        return
@@ -372,6 +382,9 @@
    def GetLength(self):
        length = 0
        length += 1
        length += 1
        length += 4
        length += len(self.ServerList)
        length += 4
        length += len(self.Data)
@@ -380,6 +393,9 @@
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteBYTE(data, self.Type)
        data = CommFunc.WriteBYTE(data, self.DirType)
        data = CommFunc.WriteDWORD(data, self.ServerLen)
        data = CommFunc.WriteString(data, self.ServerLen, self.ServerList)
        data = CommFunc.WriteDWORD(data, self.DataLen)
        data = CommFunc.WriteString(data, self.DataLen, self.Data)
        return data
@@ -387,17 +403,21 @@
    def OutputString(self):
        DumpString = '''
                                Type:%d,
                                DirType:%d,
                                ServerLen:%d,
                                ServerList:%s,
                                DataLen:%d,
                                Data:%s
                                '''\
                                %(
                                self.Type,
                                self.DirType,
                                self.ServerLen,
                                self.ServerList,
                                self.DataLen,
                                self.Data
                                )
        return DumpString
#------------------------------------------------------
#汇报玩家数据 #tagLPPlayerData
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/Protocol/RecvPackProtocol.py
@@ -937,11 +937,14 @@
        return DumpString
    
    
#------------------------------------------------------
#GM命令#tagGMCommand
class  tagGMCommand(Structure):
    Type = 0    #(BYTE Type)
    ServerID = 0    #(DWORD ServerID)
    DirType = 0    #(BYTE DirType)//0全广播,1通知非跨服服务器,2只通知跨服
    ServerLen = 0    #(DWORD ServerLen)
    ServerList = ""    #(String ServerList)//服务器列表格式可以是 [(1,10),13,16,(22,30)]
    OrderLen = 0    #(BYTE OrderLen)
    OrderId = ""    #(String OrderId)
    CmdLen = 0    #(DWORD CmdLen)
@@ -957,7 +960,9 @@
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        self.Type,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.ServerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.DirType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.ServerLen,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.ServerList,_pos = CommFunc.ReadString(_lpData, _pos,self.ServerLen)
        self.OrderLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.OrderId,_pos = CommFunc.ReadString(_lpData, _pos,self.OrderLen)
        self.CmdLen,_pos = CommFunc.ReadDWORD(_lpData, _pos)
@@ -968,7 +973,9 @@
    def Clear(self):
        self.Type = 0
        self.ServerID = 0
        self.DirType = 0
        self.ServerLen = 0
        self.ServerList = ""
        self.OrderLen = 0
        self.OrderId = ""
        self.CmdLen = 0
@@ -980,7 +987,9 @@
    def GetLength(self):
        length = 0
        length += 1
        length += 1
        length += 4
        length += len(self.ServerList)
        length += 1
        length += len(self.OrderId)
        length += 4
@@ -993,7 +1002,9 @@
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteBYTE(data, self.Type)
        data = CommFunc.WriteDWORD(data, self.ServerID)
        data = CommFunc.WriteBYTE(data, self.DirType)
        data = CommFunc.WriteDWORD(data, self.ServerLen)
        data = CommFunc.WriteString(data, self.ServerLen, self.ServerList)
        data = CommFunc.WriteBYTE(data, self.OrderLen)
        data = CommFunc.WriteString(data, self.OrderLen, self.OrderId)
        data = CommFunc.WriteDWORD(data, self.CmdLen)
@@ -1005,7 +1016,9 @@
    def OutputString(self):
        DumpString = '''
                                Type:%d,
                                ServerID:%d,
                                DirType:%d,
                                ServerLen:%d,
                                ServerList:%s,
                                OrderLen:%d,
                                OrderId:%s,
                                CmdLen:%d,
@@ -1015,7 +1028,9 @@
                                '''\
                                %(
                                self.Type,
                                self.ServerID,
                                self.DirType,
                                self.ServerLen,
                                self.ServerList,
                                self.OrderLen,
                                self.OrderId,
                                self.CmdLen,
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/Protocol/SendPackProtocol.py
@@ -414,74 +414,7 @@
        return DumpString
#GM命令执行结果#tagGMCommandResult
class  tagGMCommandResult(Structure):
    Type = 0    #(BYTE Type)
    ResultLen = 0    #(DWORD ResultLen)
    Result = ""    #(String Result)
    UserDataLen = 0    #(DWORD UserDataLen)
    UserData = ""    #(String UserData)
    data = None
    def __init__(self):
        self.Clear()
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        self.Type,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.ResultLen,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.Result,_pos = CommFunc.ReadString(_lpData, _pos,self.ResultLen)
        self.UserDataLen,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.UserData,_pos = CommFunc.ReadString(_lpData, _pos,self.UserDataLen)
        return _pos
    def Clear(self):
        self.Type = 0
        self.ResultLen = 0
        self.Result = ""
        self.UserDataLen = 0
        self.UserData = ""
        return
    def GetLength(self):
        length = 0
        length += 1
        length += 4
        length += len(self.Result)
        length += 4
        length += len(self.UserData)
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteBYTE(data, self.Type)
        data = CommFunc.WriteDWORD(data, self.ResultLen)
        data = CommFunc.WriteString(data, self.ResultLen, self.Result)
        data = CommFunc.WriteDWORD(data, self.UserDataLen)
        data = CommFunc.WriteString(data, self.UserDataLen, self.UserData)
        return data
    def OutputString(self):
        DumpString = '''
                                Type:%d,
                                ResultLen:%d,
                                Result:%s,
                                UserDataLen:%d,
                                UserData:%s
                                '''\
                                %(
                                self.Type,
                                self.ResultLen,
                                self.Result,
                                self.UserDataLen,
                                self.UserData
                                )
        return DumpString
#-----------------------       
#01 22 合服玩家信息#tagServerMergeInfo
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/RecvPackToMapDB.py
@@ -29,7 +29,7 @@
    PyGameData.g_usrCtrlDB.requestLogicProcess(pack)
# 地图自己调用处理DB数据,不一定要符合封包格式,PY根据功能自定义组成封包
# 地图Python调用处理DB数据,不一定要符合封包格式,PY根据功能自定义组成封包
def MapCallDB(packBuff, isBuffer = True):
    pack =  MMORPGPack.MMORPGPacket()
    if isBuffer: