|  |  |  | 
|---|
|  |  |  | import GameWorld | 
|---|
|  |  |  | import ShareDefine | 
|---|
|  |  |  | import PlayerControl | 
|---|
|  |  |  | import CrossLuckyCloudBuy | 
|---|
|  |  |  | import IPY_GameServer | 
|---|
|  |  |  | import CrossRealmPlayer | 
|---|
|  |  |  | import PlayerCompensation | 
|---|
|  |  |  | import CrossActionControl | 
|---|
|  |  |  | import CrossBattlefield | 
|---|
|  |  |  | import CrossBillboard | 
|---|
|  |  |  | import GameWorldBoss | 
|---|
|  |  |  | import CrossRealmPK | 
|---|
|  |  |  | import PlayerQuery | 
|---|
|  |  |  | import PlayerTalk | 
|---|
|  |  |  | import PyGameData | 
|---|
|  |  |  | import CrossBoss | 
|---|
|  |  |  | import ChConfig | 
|---|
|  |  |  | import PlayerFB | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import traceback | 
|---|
|  |  |  | import cPickle | 
|---|
|  |  |  | import time | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def SendMsgToCrossServer(msgType, dataMsg): | 
|---|
|  |  |  | ## 发送信息到跨服服务器上 | 
|---|
|  |  |  | 
|---|
|  |  |  | def OnCrossServerReceiveMsg(recvMsg, tick): | 
|---|
|  |  |  | ## 跨服服务器收到信息处理 | 
|---|
|  |  |  | try: | 
|---|
|  |  |  | GameWorld.Log("收到OnCrossServerReceiveMsg" ) | 
|---|
|  |  |  | if not GameWorld.GetGameWorld().GetDictByKey(ChConfig.Def_WorldKey_GameWorldInitOK): | 
|---|
|  |  |  | GameWorld.Log("服务器未启动好,不处理子服信息!") | 
|---|
|  |  |  | return | 
|---|
|  |  |  | 
|---|
|  |  |  | if msgType == ShareDefine.ClientServerMsg_PKMatch: | 
|---|
|  |  |  | CrossRealmPK.ClientServerMsg_PKMatch(serverGroupID, msgData, tick) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | elif msgType == ShareDefine.ClientServerMsg_PKRobotOver: | 
|---|
|  |  |  | CrossRealmPK.ClientServerMsg_PKRobotOver(serverGroupID, msgData, tick) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | elif msgType == ShareDefine.ClientServerMsg_PKCancel: | 
|---|
|  |  |  | CrossRealmPK.ClientServerMsg_PKCancel(msgData, tick) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | elif msgType == ShareDefine.ClientServerMsg_PKBillboard: | 
|---|
|  |  |  | CrossRealmPK.ClientServerMsg_PKBillboard(serverGroupID, msgData) | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | elif msgType == ShareDefine.ClientServerMsg_LuckyCloudBuy: | 
|---|
|  |  |  | CrossLuckyCloudBuy.ClientServerMsg_LuckyCloudBuy(serverGroupID, msgData) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | elif msgType == ShareDefine.ClientServerMsg_QueryBillboard: | 
|---|
|  |  |  | CrossBillboard.ClientServerMsg_QueryBillboard(serverGroupID, msgData) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | elif msgType == ShareDefine.ClientServerMsg_UpdateBillboard: | 
|---|
|  |  |  | CrossBillboard.ClientServerMsg_UpdateBillboard(serverGroupID, msgData) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | elif msgType == ShareDefine.ClientServerMsg_MailContent: | 
|---|
|  |  |  | PlayerCompensation.ClientServerMsg_MailContent(serverGroupID, msgData, tick) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | elif msgType == ShareDefine.ClientServerMsg_ChatCrossWorld: | 
|---|
|  |  |  | PlayerTalk.ClientServerMsg_ChatCrossWorld(serverGroupID, msgData, tick) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | elif msgType == ShareDefine.ClientServerMsg_AddBuff: | 
|---|
|  |  |  | MapServer_CrossAddBuff(msgData) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | elif msgType == ShareDefine.ClientServerMsg_BattlefieldBuyOpen: | 
|---|
|  |  |  | CrossBattlefield.ClientServerMsg_BattlefieldBuyOpen(serverGroupID, msgData) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | elif msgType == ShareDefine.ClientServerMsg_BattlefieldCallJoin: | 
|---|
|  |  |  | CrossBattlefield.ClientServerMsg_BattlefieldCallJoin(serverGroupID, msgData) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | elif msgType == ShareDefine.ClientServerMsg_BattlefieldCallKick: | 
|---|
|  |  |  | CrossBattlefield.ClientServerMsg_BattlefieldCallKick(serverGroupID, msgData) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | elif msgType == ShareDefine.ClientServerMsg_BattlefieldCallChange: | 
|---|
|  |  |  | CrossBattlefield.ClientServerMsg_BattlefieldCallChange(serverGroupID, msgData) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 需要发送到地图服务器处理的 | 
|---|
|  |  |  | elif msgType in [ShareDefine.ClientServerMsg_Reborn, ShareDefine.ClientServerMsg_CollectNPC]: | 
|---|
|  |  |  | MapServer_CrossServerReceiveMsg(msgType, msgData, serverGroupID) | 
|---|
|  |  |  | 
|---|
|  |  |  | GameWorld.ErrLog("没有该信息类型逻辑处理!") | 
|---|
|  |  |  |  | 
|---|
|  |  |  | except: | 
|---|
|  |  |  | GameWorld.ErrLog("OnCrossServerReceiveMsg:%s; except:%s" % (cPickle.loads(recvMsg), traceback.format_exc())) | 
|---|
|  |  |  | if GameWorld.GetGameWorld().GetDebugLevel(): | 
|---|
|  |  |  | raise BaseException(str(traceback.format_exc())) | 
|---|
|  |  |  | GameWorld.RaiseException("跨服服务器接收信息处理报错 \r\n%s" % str(traceback.format_exc())) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def ClientServerMsg_ServerInitOK(serverGroupID, tick): | 
|---|
|  |  |  | 
|---|
|  |  |  | ''' | 
|---|
|  |  |  | CrossRealmPlayer.Sync_CrossCommInitDataToClientServer(serverGroupID) | 
|---|
|  |  |  | CrossRealmPK.Sync_CrossPKInitDataToClientServer(tick, serverGroupID) | 
|---|
|  |  |  | CrossBattlefield.Sync_CrossBattlefieldDataToClientServer(serverGroupID) | 
|---|
|  |  |  | CrossBoss.Sync_CrossBossInitDataToClientServer(serverGroupID) | 
|---|
|  |  |  | CrossActionControl.Sync_CrossActInfoToClientServer(serverGroupID) | 
|---|
|  |  |  | CrossLuckyCloudBuy.Sync_LuckyCloudBuyDataToClientServer(tick, serverGroupID) | 
|---|
|  |  |  | PlayerCompensation.Sync_CrossMailPlayerIDToClientServer(serverGroupID) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def MapServer_CrossServerReceiveMsg(msgType, msgData, serverGroupID): | 
|---|
|  |  |  | 
|---|
|  |  |  | return | 
|---|
|  |  |  | ## ================================================================================================ | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def SendMsgToClientServer(msgType, dataMsg, serverGroupIDList=[]): | 
|---|
|  |  |  | def SendMsgToClientServer(msgType, dataMsg, serverGroupIDList=None): | 
|---|
|  |  |  | ''' 广播信息到子服务器上 | 
|---|
|  |  |  | @param serverGroupIDList: 发送指定的服务器组ID列表,内部已经针对列表中组ID去重, | 
|---|
|  |  |  | 所以外部逻辑可直接添加,不用考虑组ID重复问题,没有指定服务器组ID时,默认广播所有子服 | 
|---|
|  |  |  | 
|---|
|  |  |  | return | 
|---|
|  |  |  | if not dataMsg: | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | srcMsg = {"MsgType":msgType, "Data":dataMsg} | 
|---|
|  |  |  | if serverGroupIDList == None: | 
|---|
|  |  |  | serverGroupIDList = [] | 
|---|
|  |  |  |  | 
|---|
|  |  |  | srcMsg = {"MsgType":msgType, "Data":dataMsg, "CrossServerTime":GameWorld.GetCurrentDataTimeStr()} | 
|---|
|  |  |  | sendMsg = cPickle.dumps(srcMsg, 2) | 
|---|
|  |  |  | if not GameWorld.GetGameWorld().GetDictByKey(ChConfig.Def_WorldKey_GameWorldInitOK): | 
|---|
|  |  |  | GameWorld.ErrLog("跨服服务器未启动好,不允许向子服发送数据! serverGroupIDList=%s, srcMsg=%s" % (serverGroupIDList, srcMsg)) | 
|---|
|  |  |  | 
|---|
|  |  |  | dataMsg = dataPack.GetData() | 
|---|
|  |  |  |  | 
|---|
|  |  |  | try: | 
|---|
|  |  |  | GameWorld.Log("收到OnClientServerReceiveMsg" ) | 
|---|
|  |  |  | if not GameWorld.GetGameWorld().GetDictByKey(ChConfig.Def_WorldKey_GameWorldInitOK): | 
|---|
|  |  |  | GameWorld.Log("服务器未启动好,不处理跨服信息!") | 
|---|
|  |  |  | return | 
|---|
|  |  |  | 
|---|
|  |  |  | msgDict = cPickle.loads(dataMsg) | 
|---|
|  |  |  | msgType = msgDict.get("MsgType", -1) | 
|---|
|  |  |  | msgData = msgDict.get("Data", "") | 
|---|
|  |  |  | crossServerTimeStr = msgDict.get("CrossServerTime", "") | 
|---|
|  |  |  | GameWorld.Log("OnClientServerReceiveMsg: %s" % msgDict) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if crossServerTimeStr: | 
|---|
|  |  |  | curServerTime = int(time.time()) | 
|---|
|  |  |  | crossServerTime = GameWorld.ChangeTimeStrToNum(crossServerTimeStr) | 
|---|
|  |  |  | curServerCrossServerTime = GameWorld.ChangeTimeStrToNum(GameWorld.GetCrossServerTimeStr()) | 
|---|
|  |  |  | diffSeconds = curServerCrossServerTime - crossServerTime# 本服计算误差 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | _, _, syncMapTime = PyGameData.g_crossServerTimeInfo | 
|---|
|  |  |  | PyGameData.g_crossServerTimeInfo = [crossServerTime, curServerTime, syncMapTime] | 
|---|
|  |  |  | if curServerTime - syncMapTime >= 600 or abs(diffSeconds) >= 30 or msgType == ShareDefine.CrossServerMsg_CrossServerTime: # 一定时间同步地图一次 或计算 误差超过30秒 或强制同步时间的 | 
|---|
|  |  |  | GameWorld.DebugLog("同步地图跨服服务器时间时,本服与跨服服务器时间计算误差! diffSeconds=%s" % (diffSeconds)) | 
|---|
|  |  |  | syncMapTime = curServerTime | 
|---|
|  |  |  | PyGameData.g_crossServerTimeInfo = [crossServerTime, curServerTime, syncMapTime] | 
|---|
|  |  |  | GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossServerTime, PyGameData.g_crossServerTimeInfo) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if msgType == ShareDefine.CrossServerMsg_ExitCrossServer: | 
|---|
|  |  |  | CrossRealmPlayer.CrossServerMsg_ExitCrossServer(msgData) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | elif msgType == ShareDefine.CrossServerMsg_PKSyncBillboard: | 
|---|
|  |  |  | CrossRealmPK.CrossServerMsg_PKSyncBillboard(msgData) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | elif msgType == ShareDefine.CrossServerMsg_LuckyCloudBuyLottery: | 
|---|
|  |  |  | CrossLuckyCloudBuy.CrossServerMsg_LuckyCloudBuyLottery(msgData) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | elif msgType == ShareDefine.CrossServerMsg_LuckyCloudBuyNum: | 
|---|
|  |  |  | CrossLuckyCloudBuy.CrossServerMsg_LuckyCloudBuyNum(msgData) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | elif msgType == ShareDefine.CrossServerMsg_BattlefieldState: | 
|---|
|  |  |  | CrossBattlefield.CrossServerMsg_BattlefieldState(msgData) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | elif msgType == ShareDefine.CrossServerMsg_BattlefieldBuy: | 
|---|
|  |  |  | CrossBattlefield.CrossServerMsg_BattlefieldBuy(msgData) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | elif msgType == ShareDefine.CrossServerMsg_BattlefieldOver: | 
|---|
|  |  |  | CrossBattlefield.CrossServerMsg_BattlefieldOver(msgData) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | elif msgType == ShareDefine.CrossServerMsg_SyncBillboard: | 
|---|
|  |  |  | CrossBillboard.CrossServerMsg_SyncBillboard(msgData, tick) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | elif msgType == ShareDefine.CrossServerMsg_CrossBossInfo: | 
|---|
|  |  |  | CrossBoss.CrossServerMsg_CrossBossInfo(msgData) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | elif msgType == ShareDefine.CrossServerMsg_CrossBossState: | 
|---|
|  |  |  | CrossBoss.CrossServerMsg_CrossBossState(msgData) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | elif msgType == ShareDefine.CrossServerMsg_CrossActInfo: | 
|---|
|  |  |  | CrossActionControl.CrossServerMsg_CrossActInfo(msgData) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | elif msgType == ShareDefine.CrossServerMsg_PutInItem: | 
|---|
|  |  |  | CrossRealmPlayer.CrossServerMsg_PutInItem(msgData) | 
|---|
|  |  |  | 
|---|
|  |  |  | elif msgType == ShareDefine.CrossServerMsg_EnterFBRet: | 
|---|
|  |  |  | PlayerFB.CrossServerMsg_EnterFBRet(msgData, tick) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | elif msgType == ShareDefine.CrossServerMsg_SendMail: | 
|---|
|  |  |  | PlayerCompensation.CrossServerMsg_SendMail(msgData) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | elif msgType == ShareDefine.CrossServerMsg_MailPlayerIDList: | 
|---|
|  |  |  | PlayerCompensation.CrossServerMsg_MailPlayerIDList(msgData) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | elif msgType == ShareDefine.CrossServerMsg_MailContent: | 
|---|
|  |  |  | PlayerCompensation.CrossServerMsg_MailContent(msgData) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | elif msgType == ShareDefine.CrossServerMsg_FBPlayerCount: | 
|---|
|  |  |  | PlayerFB.CrossServerMsg_FBPlayerCount(msgData) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 需要发送到地图服务器处理的 | 
|---|
|  |  |  | elif msgType in [ShareDefine.CrossServerMsg_RebornRet, ShareDefine.CrossServerMsg_CollectNPCOK, ShareDefine.CrossServerMsg_FBEnd, | 
|---|
|  |  |  | ShareDefine.CrossServerMsg_NPCAttackCount]: | 
|---|
|  |  |  | 
|---|
|  |  |  | elif msgType == ShareDefine.CrossServerMsg_CrossServerState: | 
|---|
|  |  |  | CrossRealmPlayer.CrossServerMsg_CrossServerState(msgData) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | elif msgType == ShareDefine.CrossServerMsg_CrossServerTime: | 
|---|
|  |  |  | playerID = msgData.get("PlayerID") | 
|---|
|  |  |  | if playerID: | 
|---|
|  |  |  | tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID) | 
|---|
|  |  |  | if tagPlayer: | 
|---|
|  |  |  | GameWorld.DebugAnswer(tagPlayer, "跨服服务器时间: %s" % GameWorld.GetCrossServerTimeStr()) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | elif msgType == ShareDefine.CrossServerMsg_DebugAnswer: | 
|---|
|  |  |  | GameWorld.CrossServerMsg_DebugAnswer(msgData) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | else: | 
|---|
|  |  |  | GameWorld.ErrLog("没有该信息类型逻辑处理!") | 
|---|
|  |  |  |  | 
|---|
|  |  |  | except: | 
|---|
|  |  |  | GameWorld.ErrLog("OnClientServerReceiveMsg:%s; except:%s" % (cPickle.loads(dataMsg), traceback.format_exc())) | 
|---|
|  |  |  | if GameWorld.GetGameWorld().GetDebugLevel(): | 
|---|
|  |  |  | raise BaseException(str(traceback.format_exc())) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | GameWorld.RaiseException("子服服务器接收信息处理报错\r\n%s" % str(traceback.format_exc())) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def MapServer_ClientServerReceiveMsg(msgType, msgData): | 
|---|