| | |
| | | import PyGameData
|
| | | import PlayerDienstgrad
|
| | | import IpyGameDataPY
|
| | | import PlayerHorse
|
| | | import PlayerPet
|
| | | import traceback
|
| | |
|
| | | # 发送格式: 类型+(数量)+数据
|
| | |
| | | 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 = [
|
| | |
| | | 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())
|
| | |
| | |
|
| | | ## ----------------------------------------------------------------------------------------------
|
| | |
|
| | | 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():
|