| | |
| | | # @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
|
| | |
| | | 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 时间戳
|
| | |
| | |
|
| | | except Exception:
|
| | | GameWorld.RaiseException("!!!python自定义跨服封包解析失败\r\n%s" % traceback.format_exc())
|
| | | return |
| | | return
|
| | |
|
| | | |
| | | ## 发送跨服包:服务器与服务器间的通信
|
| | | # @param DirType 0全广播,1通知主服务器排除合服子服,2通知服务器包含合服子服, 3通知跨服服务器 |
| | | # @param serverList 服务器列表 格式如 [(1,10),50,(55,100)] 约定内部必须用元组 同其他跨服配表规则一致
|
| | | # @param packBuffer 自定义封包字节字符串
|
| | | def SendCrossServerToServerPack(dirType, serverList, packBuffer):
|
| | | 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 = packBuffer
|
| | | recvPack.DataLen = len(packBuffer)
|
| | |
|
| | | recvPack.Data = pack.GetBuffer()
|
| | | recvPack.DataLen = len(recvPack.Data)
|
| | | SendPyPackToServersRoute(recvPack.GetBuffer(), recvPack.GetLength())
|
| | |
|
| | | return
|
| | |
|
| | |
|