ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossPlayerData.py
@@ -23,6 +23,8 @@
import PyGameData
import PlayerDienstgrad
import IpyGameDataPY
import PlayerHorse
import PlayerPet
import traceback
# 发送格式: 类型+(数量)+数据
@@ -32,7 +34,24 @@
MergeData_Item,     # 对比处理 只算属性的背包 装备 宠物 
MergeData_Skill,    # 只处理ID
MergeData_Buff,     # 即时发送
) = range(0, 4)
CrossData_PetState, # 即时发送 宠物出战
CrossData_HorseChange, # 即时发送 骑乘坐骑变更
CrossData_RideHorse, # 即时发送 上下马
) = range(0, 7)
## 写数据类型定义
(
WDT_BYTE,
WDT_WORD,
WDT_DWORD,
WDT_String,
) = range(4)
CrossDataInfo = {
                 CrossData_PetState:[[WDT_DWORD, WDT_BYTE, WDT_BYTE], lambda curObj, valueList:PlayerPet.CrossServer_DoChangePetState(curObj, valueList)],
                 CrossData_HorseChange:[[WDT_DWORD], lambda curObj, valueList:PlayerHorse.CrossServer_ChangeHorse(curObj, valueList)],
                 CrossData_RideHorse:[[WDT_BYTE], lambda curObj, valueList:PlayerHorse.CrossServer_RideHorse(curObj, valueList)],
                 }
# 影响跨服战力属性列表
CrossFightPowerAttrList = [
@@ -107,6 +126,9 @@
        elif dataType == MergeData_Player:
            __ReadMainServerSyncPlayerData(curPlayer, curPlayer.GetMergePlayerData(), pos)
            
        else:
            __ReadCrossData(curPlayer, dataType, curPlayer.GetMergePlayerData(), pos)
    except BaseException:
        errorMsg = str(traceback.format_exc())
        GameWorld.ErrLog('接收跨服变更玩家数据错误 - > %s' % errorMsg, curPlayer.GetPlayerID())
@@ -117,6 +139,68 @@
## ----------------------------------------------------------------------------------------------
def SendDataToCrossServer(curPlayer, dataType, dataList):
    ## 通用的根据类型向跨服发送数据
    if dataType not in CrossDataInfo:
        return
    if not IsNeedProcessCrossPlayer(curPlayer):
        return
    dataInfo = CrossDataInfo[dataType][0]
    if len(dataList) != len(dataInfo):
        return
    data = ''
    data = CommFunc.WriteBYTE(data, dataType)
    for i, wDType in enumerate(dataInfo):
        value = dataList[i]
        if wDType == WDT_BYTE:
            data = CommFunc.WriteBYTE(data, value)
        elif wDType == WDT_WORD:
            data = CommFunc.WriteWORD(data, value)
        elif wDType == WDT_DWORD:
            data = CommFunc.WriteDWORD(data, value)
        elif wDType == WDT_String:
            sLen = len(value)
            data = CommFunc.WriteBYTE(data, sLen)
            data = CommFunc.WriteString(data, sLen, value)
    #直接用字节流会报错
    data = base64.b64encode(data)
    curPlayer.SendMergePlayerData(data)
    GameWorld.DebugLog("发送数据到跨服服务器: dataType=%s,dataList=%s" % (dataType, dataList), curPlayer.GetPlayerID())
    return
def __ReadCrossData(curPlayer, dataType, pdata, pos):
    if dataType not in CrossDataInfo:
        return
    dataInfo, callFunc = CrossDataInfo[dataType]
    if not callFunc:
        return
    dataList = []
    pdata = base64.b64decode(pdata)
    for wDType in dataInfo:
        if wDType == WDT_BYTE:
            value, pos = CommFunc.ReadBYTE(pdata, pos)
        elif wDType == WDT_WORD:
            value, pos = CommFunc.ReadWORD(pdata, pos)
        elif wDType == WDT_DWORD:
            value, pos = CommFunc.ReadDWORD(pdata, pos)
        elif wDType == WDT_String:
            sLen, pos = CommFunc.ReadBYTE(pdata, pos)
            value, pos = CommFunc.ReadString(pdata, pos, sLen)
        else:
            continue
        dataList.append(value)
    GameWorld.DebugLog("收到主服数据: dataType=%s,dataList=%s" % (dataType, dataList), curPlayer.GetPlayerID())
    callFunc(curPlayer, dataList)
    return
def IsNeedProcessCrossPlayer(curPlayer):
    ## 是否需要处理同步跨服中的玩家数据
    if GameWorld.IsCrossServer():