#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package GameWorldLogic.CrossMsg
|
#
|
# @todo:¿ç·þͨѶÐÅÏ¢
|
# @author hxp
|
# @date 2026-02-04
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: ¿ç·þͨѶÐÅÏ¢
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2026-02-04 19:00"""
|
#-------------------------------------------------------------------------------
|
|
import DBFamily
|
import GameWorld
|
import PlayerMail
|
import ShareDefine
|
import NetPackCommon
|
import ChServerToServerPyPack
|
from GM import GMShell
|
import PlayerFamily
|
import CrossPlayer
|
import TurnAttack
|
import PyGameData
|
import ChPlayer
|
|
import traceback
|
import cPickle
|
import time
|
|
def SendToCrossServer(msgType, dataMsg, serverIDList=None, playerID=0):
|
## ÓÎÏ··þ·¢ËÍÐÅÏ¢µ½¿ç·þ·þÎñÆ÷
|
if GameWorld.IsCrossServer():
|
return
|
#if not dataMsg:
|
# return
|
logData = "" if msgType in ShareDefine.NoLogDataSSMsgTypes else dataMsg
|
GameWorld.Log("SendToCrossServer => %s, %s, %s" % (msgType, serverIDList, logData), playerID)
|
SendToServer(msgType, dataMsg, serverIDList, ShareDefine.dirType_Cross, playerID, isLog=False)
|
return
|
|
def SendToClientServer(msgType, dataMsg, serverIDList=None, playerID=0):
|
''' ¿ç·þ·¢ËÍÐÅÏ¢µ½×ÓÓÎÏ··þÎñÆ÷
|
@param serverGroupIDList: ·¢ËÍÖ¸¶¨µÄ·þÎñÆ÷×éIDÁÐ±í£¬ÄÚ²¿ÒѾÕë¶ÔÁбíÖÐ×éIDÈ¥ÖØ£¬
|
ËùÒÔÍⲿÂß¼¿ÉÖ±½ÓÌí¼Ó£¬²»Óÿ¼ÂÇ×éIDÖØ¸´ÎÊÌ⣬ûÓÐÖ¸¶¨·þÎñÆ÷×éIDʱ£¬Ä¬ÈϹ㲥ËùÓÐ×Ó·þ
|
'''
|
if not GameWorld.IsCrossServer():
|
return
|
#if not dataMsg:
|
# return
|
logData = "" if msgType in ShareDefine.NoLogDataSSMsgTypes else dataMsg
|
GameWorld.Log("SendToClientServer => %s, %s, %s" % (msgType, serverIDList, logData), playerID)
|
SendToServer(msgType, dataMsg, serverIDList, ShareDefine.dirType_Main, playerID, isLog=False) # ĬÈÏ·¢¸øÖ÷·þ¼´¿É
|
return
|
|
def SendBackServer(msgType, dataMsg, serverID, serverType, playerID=0):
|
## ÓÃÓÚ·þÎñÆ÷Ò»¶ÔÒ»»Ø°ü
|
SendToServer(msgType, dataMsg, [serverID], NetPackCommon.GetSSPackDirType(serverType), playerID)
|
return
|
|
def SendBattleRequest(dataMsg, guid, mapID, funcLineID, reqPlayerID=0):
|
msgType = ShareDefine.S2B_BattleRequest
|
GameWorld.Log("SendToBattleServer => %s, funcMapID=%s,funcLineID=%s,%s,%s" % (msgType, mapID, funcLineID, guid, time.time()), reqPlayerID)
|
SendToServer(msgType, dataMsg, dirType=ShareDefine.dirType_Battle, playerID=reqPlayerID, isLog=False)
|
return
|
|
def SendBattleResult(retInfo, fromServerID, guid, mapID, funcLineID, reqPlayerID=0):
|
msgType = ShareDefine.B2S_BattleResult
|
GameWorld.Log("SendToFromServer => %s, fromServerID=%s,funcMapID=%s,funcLineID=%s,%s,%s"
|
% (msgType, fromServerID, mapID, funcLineID, guid, time.time()), reqPlayerID)
|
SendToServer(msgType, retInfo, [fromServerID], ShareDefine.dirType_Main, reqPlayerID, isLog=False)
|
return
|
|
def SendToServer(msgType, dataMsg, serverIDList=None, dirType=ShareDefine.dirType_Main, playerID=0, isLog=True):
|
'''·¢Ë͸øÆäËû·þÎñÆ÷
|
@param msgType: ¹¦ÄÜÐÅÏ¢ÀàÐÍ×Ö·û¶¨Òå
|
@param dataMsg: ·¢Ë͵ÄÊý¾Ý£¬ÈÎÒâ¸ñʽ£¬Óɹ¦ÄÜ×ÔÐоö¶¨
|
@param serverIDList: Ö¸¶¨Ä¿±ê·þÎñÆ÷ID »ò ·þÎñÆ÷IDÁбí
|
'''
|
if not PyGameData.g_serverInitOK:
|
GameWorld.Log("·þÎñÆ÷δÆô¶¯ºÃ£¡²»ÔÊÐíÓëÆäËû·þÎñÆ÷ͨѶ! msgType=%s" % msgType)
|
return
|
|
if isinstance(serverIDList, int):
|
serverIDList = [serverIDList]
|
elif not isinstance(serverIDList, list):
|
serverIDList = []
|
#else:
|
# serverIDList = list(set(serverIDList)) # È¥ÖØ
|
|
if isLog:
|
logData = "" if msgType in ShareDefine.NoLogDataSSMsgTypes else dataMsg
|
GameWorld.Log("SendToServer => %s, %s, %s" % (msgType, serverIDList, logData), playerID)
|
|
# ÐÒéÒªÓÃ×î¸ß¼¶2£¬¿É¼õÉÙ³¤¶È
|
sendMsg = cPickle.dumps(dataMsg, 2)
|
|
pack = ChServerToServerPyPack.tagSSCommMsg()
|
pack.FromServerID = GameWorld.GetGameWorld().GetServerID()
|
pack.ServerType = GameWorld.GetServerType()
|
pack.PlayerID = playerID
|
pack.ServerTime = int(time.time())
|
pack.MsgType = msgType
|
pack.TypeLen = len(pack.MsgType)
|
pack.Data = sendMsg
|
pack.Len = len(pack.Data)
|
NetPackCommon.SendCrossServerToServerPack(pack, serverIDList, dirType)
|
return
|
|
#// C2 10 ¿ç·þͨÓÃÐÅÏ¢°ü #tagSSCommMsg
|
#
|
#struct tagSSCommMsg
|
#{
|
# tagHead Head;
|
# DWORD FromServerID; //Äĸö·þ·¢µÄ
|
# BYTE ServerType; //·þÎñÆ÷ÀàÐÍ
|
# DWORD PlayerID; //ÄĸöÍæ¼Ò´¥·¢·¢Ë͵Ä
|
# BYTE TypeLen;
|
# char MsgType[TypeLen];
|
# DWORD Len;
|
# char Data[Len];
|
#};
|
def OnSSCommMsg(netPack):
|
## ÊÕµ½ÆäËû·þÎñÆ÷·¢À´µÄÏûÏ¢
|
fromServerID = netPack.FromServerID
|
serverType = netPack.ServerType
|
playerID = netPack.PlayerID
|
msgType = netPack.MsgType
|
recvMsg = netPack.Data
|
|
if not PyGameData.g_serverInitOK:
|
GameWorld.Log("·þÎñÆ÷δÆô¶¯ºÃ£¬²»´¦ÀíÆäËû·þÎñÆ÷ÐÅÏ¢! %s, fromServerID=%s" % (msgType, fromServerID))
|
return
|
|
if fromServerID == GameWorld.GetGameWorld().GetServerID():
|
# ²»´¦Àí¸ø×Ô¼º·¢µÄÏûÏ¢
|
return
|
|
try:
|
dataMsg = cPickle.loads(recvMsg)
|
|
logData = "" if msgType in ShareDefine.NoLogDataSSMsgTypes else str(dataMsg)
|
GameWorld.Log("OnSSRecvMsg => %s, fromServerID=%s, %s,time=%s" % (msgType, fromServerID, logData, time.time()), playerID)
|
|
# ËùÓÐÀàÐÍ·þÎñÆ÷¾ù¿ÉÄÜÊÕµ½µÄÐÅÏ¢
|
if msgType == ShareDefine.S2B_BattleRequest: # ÇëÇóÕ½¶·
|
TurnAttack.S2B_BattleRequest(dataMsg, fromServerID, msgType)
|
elif msgType == ShareDefine.B2S_BattleResult: # Õ½¶·½á¹û
|
TurnAttack.B2S_BattleResult(dataMsg, fromServerID, msgType)
|
|
else:
|
curServerType = GameWorld.GetServerType()
|
## °´·þÎñÆ÷ÀàÐ͹éÀà´¦ÀíÐèÒª´¦ÀíµÄÐÅÏ¢ÀàÐÍ£¬½øÒ»²½·ÀÖ¹ÐÅÏ¢Îó·¢Îó´¦Àíµ¼ÖµÄÊý¾ÝÎÊÌâ
|
|
# ¿ç·þ·þÎñÆ÷Òª´¦ÀíµÄÏûÏ¢
|
if curServerType in [ShareDefine.serverType_CrossCenter, ShareDefine.serverType_Cross]:
|
if msgType == ShareDefine.CC2C_FamilyCrossCfg: # ¹«»á·ÖÇøÅäÖÃ
|
DBFamily.CC2C_FamilyCrossCfg(dataMsg, fromServerID, serverType)
|
elif msgType == ShareDefine.S2C_PlayerBaseInfo:
|
ChPlayer.S2C_PlayerBaseInfo(dataMsg, fromServerID, playerID)
|
elif msgType == ShareDefine.S2C_OnlineState: # Íæ¼ÒÔÚÏß״̬
|
ChPlayer.S2C_OnlineState(dataMsg, fromServerID, playerID)
|
elif msgType == ShareDefine.S2C_FamilyData: # Ê×´Îͬ²½¹«»á»¥Í¨Êý¾Ý
|
DBFamily.S2C_FamilyData(dataMsg, fromServerID)
|
elif msgType == ShareDefine.S2C_FamilyPyPack: # ¹«»á¹¦ÄÜÍæ¼ÒÇëÇópy°üת·¢
|
PlayerFamily.S2C_FamilyPyPack(dataMsg, fromServerID, playerID)
|
elif msgType == ShareDefine.S2C_GMCMD:
|
GMShell.S2C_GMCMD(dataMsg, fromServerID, playerID)
|
|
# ÓÎÏ··þÎñÆ÷Òª´¦ÀíµÄÏûÏ¢
|
elif curServerType == ShareDefine.serverType_Main:
|
if msgType == ShareDefine.C2S_FamilyCrossInfo:
|
DBFamily.C2S_FamilyCrossInfo(dataMsg, fromServerID)
|
elif msgType == ShareDefine.C2S_FamilyDataRet: # ͬ²½¹«»á»¥Í¨Êý¾Ý½á¹û»Ø¸´
|
DBFamily.C2S_FamilyDataRet(dataMsg, fromServerID)
|
#elif msgType == ShareDefine.C2S_PlayerLoginOK:
|
# ChPlayer.C2S_PlayerLoginOK(playerID)
|
elif msgType == ShareDefine.C2S_FamilyMapPlayer:
|
PlayerFamily.C2S_FamilyMapPlayer(dataMsg, playerID)
|
elif msgType == ShareDefine.C2S_FamilyPyPackRet:
|
PlayerFamily.C2S_FamilyPyPackRet(dataMsg, playerID)
|
elif msgType == ShareDefine.C2S_NotifyCode:
|
CrossPlayer.C2S_NotifyCode(dataMsg, playerID)
|
elif msgType == ShareDefine.C2S_SendFakePack:
|
CrossPlayer.C2S_SendFakePack(dataMsg)
|
elif msgType == ShareDefine.C2S_CostPlayerResources:
|
CrossPlayer.C2S_CostPlayerResources(dataMsg, playerID)
|
elif msgType == ShareDefine.C2S_GivePlayerResources:
|
CrossPlayer.C2S_GivePlayerResources(dataMsg, playerID)
|
elif msgType == ShareDefine.C2S_SetPlayerNomalDict:
|
CrossPlayer.C2S_SetPlayerNomalDict(dataMsg, playerID)
|
elif msgType == ShareDefine.C2S_SendPlayerMail:
|
PlayerMail.C2S_SendPlayerMail(dataMsg, playerID)
|
|
except:
|
GameWorld.RaiseException("·þÎñÆ÷½ÓÊÕÐÅÏ¢´¦Àí±¨´í \r\n%s" % str(traceback.format_exc()))
|
return
|