#!/usr/bin/python # -*- coding: GBK -*- # # ##@package CrossServerPackLogic.py # @todo: ¿ç·þ·þÎñÆ÷¼ä·â°üÂß¼­ # ¿ç·þ·þÎñÆ÷¼äµÄ·â°ü ¼ÈÊÇÊÕ°üÒ²ÊÇ·¢°ü import GameWorld import ShareDefine import NetPackCommon import ChServerToServerPyPack import TurnAttack import PyGameData import ChPlayer import traceback import cPickle import time def OnTest(netPack): GameWorld.Log("ÊÕµ½¿ç·þ°ü " + str(netPack.Data)) def SendTest(dirType, serverList): pack = ChServerToServerPyPack.tagSSTest() pack.Data = 12 #0È«¹ã²¥£¬1֪ͨÖ÷·þÎñÆ÷ÅųýºÏ·þ×Ó·þ£¬2֪ͨ·þÎñÆ÷°üº¬ºÏ·þ×Ó·þ£¬ 3֪ͨ¿ç·þ·þÎñÆ÷ NetPackCommon.SendCrossServerToServerPack(dirType, serverList, pack.GetBuffer()) return def GetCrossServerID(): ## »ñÈ¡±¾·þÎñÆ÷ËùÊôµÄ¿ç·þÖÐÐÄ·þÎñÆ÷ return 0 def SendToCrossServer(msgType, dataMsg): ## ·¢ËÍÐÅÏ¢µ½¿ç·þ·þÎñÆ÷ if GameWorld.IsCrossServer(): return if not dataMsg: return if msgType not in [ShareDefine.ClientServerMsg_ServerInitOK]: isOpen = GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossServerOpen) if not isOpen: GameWorld.Log("¿ç·þ·þÎñÆ÷먦Æô»òά»¤Öв»·¢ËÍÏûÏ¢! SendMsgToCrossServer => %s" % msgType) return crossServerID = GetCrossServerID() if not crossServerID: return playerID = 0 if isinstance(dataMsg, dict): playerID = dataMsg.get("playerID", 0) if not playerID: playerID = dataMsg.get("PlayerID", 0) GameWorld.Log("SendMsgToCrossServer => %s, %s, %s" % (msgType, crossServerID, dataMsg), playerID) SendToServer(msgType, dataMsg, [crossServerID], ShareDefine.dirType_Cross, playerID, isLog=False) return def SendToClientServer(msgType, dataMsg, serverIDList=None): ''' ·¢ËÍÐÅÏ¢µ½×Ó·þÎñÆ÷ @param serverGroupIDList: ·¢ËÍÖ¸¶¨µÄ·þÎñÆ÷×éIDÁÐ±í£¬ÄÚ²¿ÒѾ­Õë¶ÔÁбíÖÐ×éIDÈ¥ÖØ£¬ ËùÒÔÍⲿÂß¼­¿ÉÖ±½ÓÌí¼Ó£¬²»Óÿ¼ÂÇ×éIDÖØ¸´ÎÊÌ⣬ûÓÐÖ¸¶¨·þÎñÆ÷×éIDʱ£¬Ä¬ÈϹ㲥ËùÓÐ×Ó·þ ''' if not GameWorld.IsCrossServer(): return if not PyGameData.g_serverInitOK: GameWorld.ErrLog("¿ç·þ·þÎñÆ÷δÆô¶¯ºÃ,²»ÔÊÐíÏò×Ó·þ·¢ËÍÊý¾Ý! %s, %s, %s" % (msgType, serverIDList, dataMsg)) return playerID = 0 if isinstance(dataMsg, dict): playerID = dataMsg.get("playerID", 0) if not playerID: playerID = dataMsg.get("PlayerID", 0) GameWorld.Log("SendToClientServer => %s, %s, %s" % (msgType, serverIDList, dataMsg), playerID) SendToServer(msgType, dataMsg, serverIDList, ShareDefine.dirType_Main, playerID, isLog=False) # ĬÈÏ·¢¸øÖ÷·þ¼´¿É return def SendToBattleServer(msgType, dataMsg, playerID=0): SendToServer(msgType, dataMsg, dirType=ShareDefine.dirType_Battle, playerID=playerID) return def SendToServer(msgType, dataMsg, serverIDList=None, dirType=ShareDefine.dirType_Main, playerID=0, isLog=True): '''·¢Ë͸øÆäËû·þÎñÆ÷ @param msgType: ¹¦ÄÜÐÅÏ¢ÀàÐÍ×Ö·û¶¨Òå @param dataMsg: ·¢Ë͵ÄÊý¾Ý£¬ÈÎÒâ¸ñʽ£¬Óɹ¦ÄÜ×ÔÐоö¶¨ @param serverIDList: Ö¸¶¨Ä¿±ê·þÎñÆ÷ID »ò ·þÎñÆ÷IDÁбí ''' if isinstance(serverIDList, int): serverIDList = [serverIDList] elif not isinstance(serverIDList, list): serverIDList = [] else: serverIDList = list(set(serverIDList)) # È¥ÖØ if isLog: GameWorld.Log("SendToServer => %s, %s, %s" % (msgType, serverIDList, dataMsg), playerID) # ЭÒéÒªÓÃ×î¸ß¼¶2£¬¿É¼õÉÙ³¤¶È sendMsg = cPickle.dumps(dataMsg, 2) pack = ChServerToServerPyPack.tagSSCommMsg() pack.FromServerID = GameWorld.GetGameWorld().GetServerID() pack.ServerTime = int(time.time()) pack.MsgType = msgType pack.TypeLen = len(pack.MsgType) pack.Data = sendMsg pack.Len = len(pack.Data) NetPackCommon.SendCrossServerToServerPack(dirType, serverIDList, pack.GetBuffer()) return def OnSSCommMsg(netPack): ## ÊÕµ½ÆäËû·þÎñÆ÷·¢À´µÄÏûÏ¢ fromServerID = netPack.FromServerID fromServerTime = netPack.ServerTime msgType = netPack.MsgType recvMsg = netPack.Data if not PyGameData.g_serverInitOK: GameWorld.Log("·þÎñÆ÷δÆô¶¯ºÃ£¬²»´¦ÀíÆäËû·þÎñÆ÷ÐÅÏ¢! %s, fromServerID=%s" % (msgType, fromServerID)) return try: dataMsg = cPickle.loads(recvMsg) if GameWorld.IsCrossServer(): GameWorld.Log("OnCrossServerReceiveMsg: %s, fromServerID=%s, %s" % (msgType, fromServerID, dataMsg)) else: GameWorld.Log("OnClientServerReceiveMsg: %s, fromServerID=%s, %s" % (msgType, fromServerID, dataMsg)) crossServerID = GetCrossServerID() if crossServerID == fromServerID: __fixCrossServerTime(msgType, fromServerTime) if msgType == ShareDefine.SSMsg_BattleRequest: TurnAttack.SSMsg_BattleRequest(dataMsg, fromServerID) elif msgType == ShareDefine.SSMsg_BattleResult: TurnAttack.SSMsg_BattleResult(dataMsg, fromServerID) except: GameWorld.RaiseException("·þÎñÆ÷½ÓÊÕÐÅÏ¢´¦Àí±¨´í \r\n%s" % str(traceback.format_exc())) return def __fixCrossServerTime(msgType, crossServerTime): # ×Ó·þ½ÃÕý¿ç·þ·þÎñÆ÷ʱ¼ä curServerTime = int(time.time()) curServerCrossServerTime = GameWorld.ChangeTimeStrToNum(GameWorld.GetCrossServerTimeStr()) diffSeconds = curServerCrossServerTime - crossServerTime # ±¾·þ¼ÆËãÎó²î PyGameData.g_crossServerTimeInfo = [crossServerTime, curServerTime] # ¸²¸Ç¸üР# Îó²î³¬¹ý30Ãë »òÇ¿ÖÆÍ¬²½Ê±¼äµÄ if abs(diffSeconds) >= 30 or msgType == ShareDefine.CrossServerMsg_CrossServerTime: GameWorld.DebugLog("ͬ²½¿ç·þ·þÎñÆ÷ʱ¼ä£¬±¾·þÓë¿ç·þ·þÎñÆ÷ʱ¼ä¼ÆËãÎó²î£¡ diffSeconds=%s" % (diffSeconds)) playerManager = GameWorld.GetPlayerManager() for i in xrange(playerManager.GetPlayerCount()): curPlayer = playerManager.GetPlayerByIndex(i) if not GameWorld.IsNormalPlayer(curPlayer): continue ChPlayer.Sync_PyServerDataTimeToClient(curPlayer) return