| | |
| | | # @change: "2014-12-09 17:30" xmnathan 修改玩家M->S自定义封包发送
|
| | | # @change: "2014-12-19 19:30" hxp Debug下封包错误抛出异常
|
| | | #-------------------------------------------------------------------------------
|
| | | """Version = 2014-12-19 19:30"""
|
| | | #"""Version = 2014-12-19 19:30"""
|
| | | #-------------------------------------------------------------------------------
|
| | | #---导入---
|
| | | import IPY_GameWorld
|
| | |
| | | import traceback
|
| | | import ChGameToMapPyPack
|
| | | from PyMongoDB.DBCommon import CommonDefine
|
| | | import ChServerToServerPyPack
|
| | | from PyMongoDB.Protocol import MergeServerRecvProtocol
|
| | | import ShareDefine
|
| | | import CrossPlayer
|
| | | import DBDataMgr
|
| | | import CrossMsg
|
| | | #-------------------------------------------------------------------------------
|
| | | #---全局变量---
|
| | |
|
| | |
| | | return SendPackDict[head]
|
| | |
|
| | | #-------------------------------------------------------------------------------
|
| | |
|
| | | def ReadRecPyPackData(packBuff):
|
| | | ## 根据收到的py包buff读取对应的包结构实例
|
| | | try:
|
| | | if len(packBuff) <= 1:
|
| | | return
|
| | | headData = packBuff[1] + packBuff[0]
|
| | | curPackHead = CommFunc.ReadWORD(headData, 0)[0]
|
| | | clientPack = RecievePackDict.get(curPackHead)
|
| | | if not clientPack:
|
| | | return
|
| | | clientPack.ReadData(packBuff)
|
| | | # 截断字符串
|
| | | for key in dir(clientPack):
|
| | | value = getattr(clientPack, key)
|
| | | if isinstance(value, str):
|
| | | setattr(clientPack, key, value.rstrip(chr(0x0)))
|
| | | return clientPack
|
| | | except Exception:
|
| | | GameWorld.RaiseException("!!!python自定义封包解包失败\r\n%s" % traceback.format_exc())
|
| | | return
|
| | | |
| | | ## 接收万能封包
|
| | | # @param index 玩家索引
|
| | | # @param tick 时间戳
|
| | |
| | | Log("SendFakePack: clientPack Len = %s > %s"%(clientPack.GetLength(), len(innerPackData)))
|
| | | #curPlayer.SendFakePack(innerPackData, len(innerPackData))
|
| | | curPlayer.SendFakePack(clientPack.GetBuffer(), clientPack.GetLength())
|
| | | return
|
| | |
|
| | | def SendFackPackOnline(clientPack, parseFunc=None, *args):
|
| | | ## 发送给全服在线玩家
|
| | |
| | | #-------------------------------------------------------------------------------
|
| | | #---Py封包注册信息
|
| | | PyPackTable = ReadPyPackTable("PyNetPack")
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
| | | # 向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:
|
| | | GameWorld.GetGameWorld().SetCurGameWorldIndex(0) # 需要设置,不然获取不到 GetMap 等虚拟分线相关接口
|
| | | |
| | | #没有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
|
| | | |
| | | def GetSSPackDirType(serverType):
|
| | | ## 根据服务器类型获取发送的目标类型
|
| | | if serverType in [ShareDefine.serverType_Cross, ShareDefine.serverType_CrossCenter]:
|
| | | return ShareDefine.dirType_Cross
|
| | | if serverType in [ShareDefine.serverType_Main, ShareDefine.serverType_Child]:
|
| | | return ShareDefine.dirType_Main
|
| | | if serverType == ShareDefine.serverType_Battle:
|
| | | return ShareDefine.dirType_Battle
|
| | | return ShareDefine.dirType_All
|
| | |
|
| | | def SendCrossServerToServerPack(pack, serverList=None, dirType=None, serverType=None):
|
| | | '''发送跨服包:服务器与服务器间的通信
|
| | | @param pack 自定义封包实例
|
| | | @param serverList 服务器列表 格式如 [(1,10),50,(55,100)] 约定内部必须用元组 同其他跨服配表规则一致
|
| | | @param DirType 0全广播,1通知主服务器排除合服子服,2通知服务器包含合服子服, 3通知跨服服务器 |
| | | @param serverType 可只传入来源的服务器类型,适用于一对一通讯的回包
|
| | | '''
|
| | | if dirType == None and serverType == None:
|
| | | return
|
| | | if dirType == None:
|
| | | dirType = GetSSPackDirType(serverType)
|
| | | if serverList == None:
|
| | | serverList = []
|
| | | recvPack = MergeServerRecvProtocol.tagLPStringData()
|
| | | recvPack.Type = CommonDefine.gstCrossServerToServerPack
|
| | | recvPack.DirType = dirType
|
| | | recvPack.ServerList = str(serverList)
|
| | | recvPack.ServerLen = len(recvPack.ServerList)
|
| | | recvPack.Data = pack.GetBuffer()
|
| | | recvPack.DataLen = len(recvPack.Data)
|
| | | SendPyPackToServersRoute(recvPack.GetBuffer(), recvPack.GetLength())
|
| | | return
|
| | |
|
| | |
|