#!/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
|
|
|