#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package CrossRealmMsg # # @todo:¿ç·þÐÅÏ¢¹ÜÀí # @author hxp # @date 2018-12-21 # @version 1.0 # # ÏêϸÃèÊö: ¿ç·þÐÅÏ¢¹ÜÀí # #------------------------------------------------------------------------------- #"""Version = 2018-12-21 18:00""" #------------------------------------------------------------------------------- import GameWorld import ShareDefine import PlayerControl import IPY_GameServer import CrossRealmPlayer import GameWorldBoss import CrossRealmPK import PlayerQuery import CrossBoss import ChConfig import GMShell import traceback import json def SendMsgToCrossServer(msgType, dataMsg): ## ·¢ËÍÐÅÏ¢µ½¿ç·þ·þÎñÆ÷ÉÏ if GameWorld.IsCrossServer(): return if not dataMsg: return sendMsg = str({"MsgType":msgType, "Data":dataMsg, "ServerGroupID":GameWorld.GetServerGroupID()}) GameWorld.Log("SendMsgToCrossServer => %s" % (sendMsg)) GameWorld.GetGameWorld().SendMergerChildToCenterStringData(sendMsg, len(sendMsg)) return def OnCrossServerReceiveMsg(recvMsg, tick): ## ¿ç·þ·þÎñÆ÷ÊÕµ½ÐÅÏ¢´¦Àí try: #GameWorld.Log("OnCrossServerReceiveMsg: %s" % recvMsg) msgDict = eval(recvMsg) msgType = msgDict.get("MsgType", -1) msgData = msgDict.get("Data", "") serverGroupID = msgDict.get("ServerGroupID", 0) if msgType == ShareDefine.ClientServerMsg_PKMatch: CrossRealmPK.ClientServerMsg_PKMatch(serverGroupID, msgData, tick) elif msgType == ShareDefine.ClientServerMsg_PKCancel: CrossRealmPK.ClientServerMsg_PKCancel(msgData, tick) elif msgType == ShareDefine.ClientServerMsg_PKPrepareOK: CrossRealmPK.ClientServerMsg_PKPrepareOK(msgData, tick) elif msgType == ShareDefine.ClientServerMsg_PKBillboard: CrossRealmPK.ClientServerMsg_PKBillboard(serverGroupID, msgData) elif msgType == ShareDefine.ClientServerMsg_GMCMD: GMShell.ClientServerMsg_GMCMD(msgData, tick) elif msgType == ShareDefine.ClientServerMsg_ServerInitOK: ClientServerMsg_ServerInitOK(serverGroupID, msgData, tick) elif msgType == ShareDefine.ClientServerMsg_ViewPlayerCache: CrossRealmPlayer.ClientServerMsg_ViewPlayerCache(serverGroupID, msgData) elif msgType == ShareDefine.ClientServerMsg_QueryNPCInfo: PlayerQuery.ClientServerMsg_QueryNPCInfo(serverGroupID, msgData) elif msgType == ShareDefine.ClientServerMsg_SetPlayerAttrValue: MapServer_CrossSetPlayerAttrValue(msgData) # ÐèÒª·¢Ë͵½µØÍ¼·þÎñÆ÷´¦ÀíµÄ elif msgType in [ShareDefine.ClientServerMsg_Reborn]: MapServer_CrossServerReceiveMsg(msgType, msgData, serverGroupID) else: GameWorld.ErrLog("ûÓиÃÐÅÏ¢ÀàÐÍÂß¼­´¦Àí£¡") except: GameWorld.ErrLog("OnCrossServerReceiveMsg:%s; except:%s" % (recvMsg, traceback.format_exc())) if GameWorld.GetGameWorld().GetDebugLevel(): raise BaseException(str(traceback.format_exc())) return def ClientServerMsg_ServerInitOK(serverGroupID, msgData, tick): ''' ÊÕµ½×Ó·þÁ¬½Ó³É¹¦Í¨Öª µ±×Ó·þÆô¶¯³É¹¦ºó£¬¿Éͬ²½Ò»´Î¿ç·þ·þÎñÆ÷»î¶¯×´Ì¬¼°»î¶¯Êý¾Ý¸ø×Ó·þ ''' GameWorld.Log("ÊÕµ½¿ç·þ×Ó·þÁ¬½Ó³É¹¦Í¨Öª!") CrossRealmPlayer.ClientServerMsg_ServerInitOK(serverGroupID) CrossRealmPK.ClientServerMsg_ServerInitOK(serverGroupID, tick) CrossBoss.ClientServerMsg_ServerInitOK(serverGroupID) return def MapServer_CrossServerReceiveMsg(msgType, msgData, serverGroupID): ## ÊÕµ½×Ó·þÐÅÏ¢£¬ÐèÒª·¢Ë͵½µØÍ¼·þÎñÆ÷´¦Àí if not isinstance(msgData, dict): return tagPlayerID = msgData.get("PlayerID") if not tagPlayerID: return tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(tagPlayerID) if not tagPlayer: return msgInfo = str([msgType, msgData, serverGroupID]) tagPlayer.MapServer_QueryPlayerResult(0, 0, "CrossServerReceiveMsg", msgInfo, len(msgInfo)) return def MapServer_CrossSetPlayerAttrValue(msgData): for playerID, setAttrInfoList in msgData.items(): player = GameWorld.GetPlayerManager().FindPlayerByID(playerID) if not player: return msgInfo = str(setAttrInfoList) player.MapServer_QueryPlayerResult(0, 0, "CrossSetPlayerAttrValue", msgInfo, len(msgInfo)) return ## ================================================================================================ def SendMsgToClientServer(msgType, dataMsg, serverGroupIDList=[]): ''' ¹ã²¥ÐÅÏ¢µ½×Ó·þÎñÆ÷ÉÏ @param serverGroupIDList: ·¢ËÍÖ¸¶¨µÄ·þÎñÆ÷×éIDÁÐ±í£¬ÄÚ²¿ÒѾ­Õë¶ÔÁбíÖÐ×éIDÈ¥ÖØ£¬ ËùÒÔÍⲿÂß¼­¿ÉÖ±½ÓÌí¼Ó£¬²»Óÿ¼ÂÇ×éIDÖØ¸´ÎÊÌ⣬ûÓÐÖ¸¶¨·þÎñÆ÷×éIDʱ£¬Ä¬ÈϹ㲥ËùÓÐ×Ó·þ ''' if not GameWorld.IsCrossServer(): return if not dataMsg: return sendMsg = str({"MsgType":msgType, "Data":dataMsg}) GameWorld.Log("SendMsgToClientServer => serverGroupIDList=%s, sendMsg=%s" % (serverGroupIDList, sendMsg)) if not serverGroupIDList: GameWorld.GetGameWorld().SendBroadcastMergeClient(sendMsg) else: serverGroupIDList = list(set(serverGroupIDList)) # È¥ÖØ #for serverGroupID in serverGroupIDList: # GameWorld.GetGameWorld().SendMergeMsgToClientByGroupID(serverGroupID, sendMsg) jsonGroupIDInfo = json.dumps(serverGroupIDList, ensure_ascii=False) GameWorld.GetGameWorld().SendMergeMsgToClientByGroupList(jsonGroupIDInfo, sendMsg) return def OnClientServerReceiveMsg(index, tick): ## ×Ó·þÊÕµ½¿ç·þ·þÎñÆ÷ÐÅÏ¢ dataPack = IPY_GameServer.IPY_MGBroadcastMergeClient() dataMsg = dataPack.GetData() #GameWorld.Log("OnClientServerReceiveMsg: %s" % dataMsg) try: msgDict = eval(dataMsg) msgType = msgDict.get("MsgType", -1) msgData = msgDict.get("Data", "") if msgType == ShareDefine.CrossServerMsg_ExitCrossServer: CrossRealmPlayer.CrossServerMsg_ExitCrossServer(msgData) elif msgType == ShareDefine.CrossServerMsg_Notify: PlayerControl.CrossServerMsg_Notify(msgData) elif msgType == ShareDefine.CrossServerMsg_ViewPlayerCacheRet: CrossRealmPlayer.CrossServerMsg_ViewPlayerCacheRet(msgData, tick) elif msgType == ShareDefine.CrossServerMsg_PKMatchReqRet: CrossRealmPK.CrossServerMsg_PKMatchReqRet(msgData) elif msgType == ShareDefine.CrossServerMsg_PKMatchResult: CrossRealmPK.CrossServerMsg_PKMatchResult(msgData) elif msgType == ShareDefine.CrossServerMsg_PKReadyOKRoomList: CrossRealmPK.CrossServerMsg_PKReadyOKRoomList(msgData) elif msgType == ShareDefine.CrossServerMsg_PKTimeoutRoomList: CrossRealmPK.CrossServerMsg_PKTimeoutRoomList(msgData) elif msgType == ShareDefine.CrossServerMsg_PKOverInfo: CrossRealmPK.CrossServerMsg_PKOverInfo(msgData) elif msgType == ShareDefine.CrossServerMsg_PKSeasonInfo: CrossRealmPK.CrossServerMsg_PKSeasonInfo(msgData) elif msgType == ShareDefine.CrossServerMsg_PKSyncBillboard: CrossRealmPK.CrossServerMsg_PKSyncBillboard(msgData) elif msgType == ShareDefine.CrossServerMsg_CrossBossInfo: CrossBoss.CrossServerMsg_CrossBossInfo(msgData) elif msgType == ShareDefine.CrossServerMsg_CrossBossState: CrossBoss.CrossServerMsg_CrossBossState(msgData) elif msgType == ShareDefine.CrossServerMsg_PutInItem: CrossRealmPlayer.CrossServerMsg_PutInItem(msgData) elif msgType == ShareDefine.CrossServerMsg_GiveMoney: CrossRealmPlayer.CrossServerMsg_GiveMoney(msgData) elif msgType == ShareDefine.CrossServerMsg_DropGoodItem: GameWorldBoss.CrossServerMsg_DropGoodItem(msgData, tick) elif msgType == ShareDefine.CrossServerMsg_NPCInfoRet: PlayerQuery.CrossServerMsg_NPCInfoRet(msgData, tick) # ÐèÒª·¢Ë͵½µØÍ¼·þÎñÆ÷´¦ÀíµÄ elif msgType in [ShareDefine.CrossServerMsg_RebornRet]: MapServer_ClientServerReceiveMsg(msgType, msgData) elif msgType == ShareDefine.CrossServerMsg_CrossServerState: CrossRealmPlayer.CrossServerMsg_CrossServerState(msgData) else: GameWorld.ErrLog("ûÓиÃÐÅÏ¢ÀàÐÍÂß¼­´¦Àí£¡") except: GameWorld.ErrLog("OnClientServerReceiveMsg:%s; except:%s" % (dataMsg, traceback.format_exc())) if GameWorld.GetGameWorld().GetDebugLevel(): raise BaseException(str(traceback.format_exc())) return def MapServer_ClientServerReceiveMsg(msgType, msgData): ## ÊÕµ½¿ç·þ·þÎñÆ÷ÐÅÏ¢£¬ÐèÒª·¢Ë͵½µØÍ¼·þÎñÆ÷´¦Àí if not isinstance(msgData, dict): return tagPlayerID = msgData.get("PlayerID") if not tagPlayerID: return tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(tagPlayerID) if not tagPlayer: return msgInfo = str([msgType, msgData]) tagPlayer.MapServer_QueryPlayerResult(0, 0, "ClientServerReceiveMsg", msgInfo, len(msgInfo)) return # Á¬½Ó¿ç·þ·þÎñÆ÷״̬ # 1 ΪÁ¬½Ó³É¹¦; ÆäËûΪʧ°Ü£¬Ê§°Ü»áÑÓ³Ù֪ͨ def OnConnCorossServer(index, tick): ## ×Ó·þÊÕµ½¿ç·þ·þÎñÆ÷ÐÅÏ¢ dataPack = IPY_GameServer.IPY_LGCrossLoginResult() result = dataPack.GetResult() connState = 1 if result == 1 else 0 GameWorld.GetGameWorld().SetDict(ShareDefine.Def_Notify_WorldKey_CrossServerConnState, connState) if result != 1: GameWorld.Log("--OnClientServerReceiveMsg disconn") CrossRealmPlayer.CrossServerMsg_CrossServerState({"isOpen":0}) return GameWorld.Log("OnConnCorossServer conn success!!!") if not GameWorld.GetGameWorld().GetDictByKey(ChConfig.Def_WorldKey_IsGameWorldInit): GameWorld.Log(" ·þÎñÆ÷»¹Î´Æô¶¯ºÃ£¬Ôݲ»´¦Àí! µÈ·þÎñÆ÷Æô¶¯ºÃºóÔÙ´¦Àí£¡") return serverGroupID = GameWorld.GetServerGroupID() if GameWorld.IsCrossRealmOpen() and not GameWorld.IsCrossServer(): GameWorld.Log("֪ͨ¿ç·þÖ÷·þÎñÆ÷Á´½Ó³É¹¦, ¿É½ÓÊÕ×îпç·þ»î¶¯×´Ì¬¼°Êý¾Ý...") dataMsg = {"ServerGroupID":serverGroupID} SendMsgToCrossServer(ShareDefine.ClientServerMsg_ServerInitOK, dataMsg) return def OnGameServerInitOK(): ## ×Ó·þÆô¶¯³É¹¦ if GameWorld.IsCrossServer(): return serverGroupID = GameWorld.GetServerGroupID() if GameWorld.IsCrossRealmOpen() and not GameWorld.IsCrossServer(): GameWorld.Log("֪ͨ¿ç·þÖ÷·þÎñÆ÷Æô¶¯³É¹¦, ¿É½ÓÊÕ×îпç·þ»î¶¯×´Ì¬¼°Êý¾Ý...") dataMsg = {"ServerGroupID":serverGroupID} SendMsgToCrossServer(ShareDefine.ClientServerMsg_ServerInitOK, dataMsg) return