hxp
昨天 9d5ec7599f3abe0cebb76ce1df3c3b8c4e0aa51e
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NetPackCommon.py
@@ -18,7 +18,7 @@
# @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
@@ -31,9 +31,12 @@
import traceback
import ChGameToMapPyPack
from PyMongoDB.DBCommon import CommonDefine
import ObjPool
import ChServerToServerPyPack
from PyMongoDB.Protocol import MergeServerRecvProtocol
import ShareDefine
import CrossPlayer
import DBDataMgr
import CrossMsg
#-------------------------------------------------------------------------------
#---全局变量---
@@ -156,6 +159,28 @@
    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 时间戳
@@ -230,7 +255,6 @@
        Log("SendFakePack: clientPack Len = %s > %s"%(clientPack.GetLength(), len(innerPackData)))
    #curPlayer.SendFakePack(innerPackData, len(innerPackData))
    curPlayer.SendFakePack(clientPack.GetBuffer(), clientPack.GetLength())
    ObjPool.GetPoolMgr().release(clientPack)
    return
    
def SendFackPackOnline(clientPack, parseFunc=None, *args):
@@ -353,7 +377,8 @@
def RecCrossServerNetPack(netPackBuffer):
    
    try:
        GameWorld.GetGameWorld().SetCurGameWorldIndex(0) # 需要设置,不然获取不到 GetMap 等虚拟分线相关接口
        #没有PY封包头
        if len(netPackBuffer) <= 1:
            return
@@ -385,23 +410,39 @@
        
    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