15 卡牌服务端搭建 - 跨服支持PY自定义封包通信
| New file |
| | |
| | | ;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
|
| | |
|
| New file |
| | |
| | | #!/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 |
| New file |
| | |
| | | #!/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())
|
| | |
| | | import ChGameToMapPyPack
|
| | | from PyMongoDB.DBCommon import CommonDefine
|
| | | import ObjPool
|
| | | import ChServerToServerPyPack
|
| | | from PyMongoDB.Protocol import MergeServerRecvProtocol
|
| | | #-------------------------------------------------------------------------------
|
| | | #---全局变量---
|
| | |
|
| | |
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | | #-------------------------------------------------------------------------------
|
| | | #-------------------------------------------------------------------------------
|
| | | #GameServer Py封包注册信息
|
| | |
| | | # 向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())
|
| | |
|
| | |
|
| | |
|
| | |
| | | gstMergeRegisterPlayer = 119 #报名跨服战
|
| | | gstMergeQueryRegisterResult = 120 #查询报名结果,即查询帐号密码
|
| | | gstGeneralDBOper = 121 #通用数据库操作包
|
| | | gstBroadcastMergeClient = 122 #广播跨服客户端
|
| | | gstCrossServerToServerPack = 122 #跨服使用 服务器之间的封包
|
| | | gstDiapatchFamilyID = 123 #分配家族ID
|
| | | gstMergerChildToCenter = 124
|
| | | gstQueryRecharge= 125 # 查询新的充值订单
|
| | |
| | |
|
| | | 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()
|
| | |
| | | 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")
|
| | |
| | | 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")
|
| | |
| | | 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():
|
| | |
| | | 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):
|
| | |
| | | + 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完成兑换,假设此处没有回复,则此单变成丢单,暂由人工维护
|
| | |
| | | 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
|
| | |
|
| | |
|
| | | #导出单玩家数据
|
| | |
| | | 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
|
| | |
| | | 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
|
| | |
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += 1
|
| | | length += 1
|
| | | length += 4
|
| | | length += len(self.ServerList)
|
| | | length += 4
|
| | | length += len(self.Data)
|
| | |
|
| | |
| | | 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
|
| | |
| | | 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
|
| | |
| | | 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)
|
| | |
| | | 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)
|
| | |
| | |
|
| | | 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
|
| | |
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += 1
|
| | | length += 1
|
| | | length += 4
|
| | | length += len(self.ServerList)
|
| | | length += 1
|
| | | length += len(self.OrderId)
|
| | | length += 4
|
| | |
| | | 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)
|
| | |
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | Type:%d,
|
| | | ServerID:%d,
|
| | | DirType:%d,
|
| | | ServerLen:%d,
|
| | | ServerList:%s,
|
| | | OrderLen:%d,
|
| | | OrderId:%s,
|
| | | CmdLen:%d,
|
| | |
| | | '''\
|
| | | %(
|
| | | self.Type,
|
| | | self.ServerID,
|
| | | self.DirType,
|
| | | self.ServerLen,
|
| | | self.ServerList,
|
| | | self.OrderLen,
|
| | | self.OrderId,
|
| | | self.CmdLen,
|
| | |
| | | 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
|
| | |
|
| | |
| | | PyGameData.g_usrCtrlDB.requestLogicProcess(pack)
|
| | |
|
| | |
|
| | | # 地图自己调用处理DB数据,不一定要符合封包格式,PY根据功能自定义组成封包
|
| | | # 地图Python调用处理DB数据,不一定要符合封包格式,PY根据功能自定义组成封包
|
| | | def MapCallDB(packBuff, isBuffer = True):
|
| | | pack = MMORPGPack.MMORPGPacket()
|
| | | if isBuffer:
|