hxp
2021-05-10 27c520cac266513887f348cf9feb4be7b3efda45
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py
@@ -20,16 +20,20 @@
import PlayerControl
import IPY_GameServer
import CrossRealmPlayer
import PlayerCompensation
import CrossActionControl
import CrossBillboard
import GameWorldBoss
import CrossRealmPK
import PlayerQuery
import PlayerTalk
import CrossBoss
import ChConfig
import PlayerFB
import GMShell
import traceback
import json
import cPickle
def SendMsgToCrossServer(msgType, dataMsg):
    ## 发送信息到跨服服务器上
@@ -37,22 +41,26 @@
        return
    if not dataMsg:
        return
    sendMsg = str({"MsgType":msgType, "Data":dataMsg, "ServerGroupID":GameWorld.GetServerGroupID()})
    # 协议要用最高级2,可减少长度
    srcMsg = {"MsgType":msgType, "Data":dataMsg, "ServerGroupID":GameWorld.GetServerGroupID()}
    sendMsg = cPickle.dumps(srcMsg, 2)
    if not GameWorld.GetGameWorld().GetDictByKey(ChConfig.Def_WorldKey_GameWorldInitOK):
        GameWorld.ErrLog("服务器未启动好,不允许向跨服服务器发送数据! %s" % (sendMsg))
        GameWorld.ErrLog("服务器未启动好,不允许向跨服服务器发送数据! %s" % (srcMsg))
        return
    GameWorld.Log("SendMsgToCrossServer => %s" % (sendMsg))
    GameWorld.Log("SendMsgToCrossServer => %s" % (srcMsg))
    GameWorld.GetGameWorld().SendMergerChildToCenterStringData(sendMsg, len(sendMsg))
    return
def OnCrossServerReceiveMsg(recvMsg, tick):
    ## 跨服服务器收到信息处理
    try:
        GameWorld.Log("OnCrossServerReceiveMsg: %s" % recvMsg)
        if not GameWorld.GetGameWorld().GetDictByKey(ChConfig.Def_WorldKey_GameWorldInitOK):
            GameWorld.Log("服务器未启动好,不处理子服信息!")
            return
        msgDict = eval(recvMsg)
        msgDict = cPickle.loads(recvMsg)
        GameWorld.Log("OnCrossServerReceiveMsg: %s" % msgDict)
        
        msgType = msgDict.get("MsgType", -1)    
        msgData = msgDict.get("Data", "")
@@ -60,6 +68,9 @@
        
        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)
@@ -69,7 +80,16 @@
            
        elif msgType == ShareDefine.ClientServerMsg_PKBillboard:
            CrossRealmPK.ClientServerMsg_PKBillboard(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)
                        
@@ -85,8 +105,14 @@
        elif msgType == ShareDefine.ClientServerMsg_QueryNPCInfo:
            PlayerQuery.ClientServerMsg_QueryNPCInfo(serverGroupID, msgData)
            
        elif msgType == ShareDefine.ClientServerMsg_EnterFB:
            PlayerFB.ClientServerMsg_EnterFB(serverGroupID, msgData, tick)
        elif msgType == ShareDefine.ClientServerMsg_SetPlayerAttrValue:
            MapServer_CrossSetPlayerAttrValue(msgData)
        elif msgType == ShareDefine.ClientServerMsg_AddBuff:
            MapServer_CrossAddBuff(msgData)
            
        # 需要发送到地图服务器处理的
        elif msgType in [ShareDefine.ClientServerMsg_Reborn, ShareDefine.ClientServerMsg_CollectNPC]:
@@ -96,9 +122,7 @@
            GameWorld.ErrLog("没有该信息类型逻辑处理!")
            
    except:
        GameWorld.ErrLog("OnCrossServerReceiveMsg:%s; except:%s" % (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):
@@ -120,6 +144,8 @@
    CrossRealmPlayer.Sync_CrossCommInitDataToClientServer(serverGroupID)
    CrossRealmPK.Sync_CrossPKInitDataToClientServer(tick, serverGroupID)
    CrossBoss.Sync_CrossBossInitDataToClientServer(serverGroupID)
    CrossActionControl.Sync_CrossActInfoToClientServer(serverGroupID)
    PlayerCompensation.Sync_CrossMailPlayerIDToClientServer(serverGroupID)
    return
def MapServer_CrossServerReceiveMsg(msgType, msgData, serverGroupID):
@@ -146,6 +172,20 @@
        player.MapServer_QueryPlayerResult(0, 0, "CrossSetPlayerAttrValue", msgInfo, len(msgInfo))
    return
def MapServer_CrossAddBuff(msgData):
    ## 收到子服信息,添加buff
    tagPlayerID = msgData.get("PlayerID")
    if not tagPlayerID:
        return
    tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(tagPlayerID)
    if not tagPlayer:
        return
    buffID = msgData.get("buffID")
    if not buffID:
        return
    sendMsg = str(buffID)
    tagPlayer.MapServer_QueryPlayerResult(0, 0, 'AddBuff', sendMsg, len(sendMsg))
    return
## ================================================================================================
def SendMsgToClientServer(msgType, dataMsg, serverGroupIDList=[]):
@@ -157,19 +197,21 @@
        return
    if not dataMsg:
        return
    sendMsg = str({"MsgType":msgType, "Data":dataMsg})
    srcMsg = {"MsgType":msgType, "Data":dataMsg}
    sendMsg = cPickle.dumps(srcMsg, 2)
    if not GameWorld.GetGameWorld().GetDictByKey(ChConfig.Def_WorldKey_GameWorldInitOK):
        GameWorld.ErrLog("跨服服务器未启动好,不允许向子服发送数据! serverGroupIDList=%s, sendMsg=%s" % (serverGroupIDList, sendMsg))
        GameWorld.ErrLog("跨服服务器未启动好,不允许向子服发送数据! serverGroupIDList=%s, srcMsg=%s" % (serverGroupIDList, srcMsg))
        return
    GameWorld.Log("SendMsgToClientServer => serverGroupIDList=%s, sendMsg=%s" % (serverGroupIDList, sendMsg))
    GameWorld.Log("SendMsgToClientServer => serverGroupIDList=%s, srcMsg=%s" % (serverGroupIDList, srcMsg))
    if not serverGroupIDList:
        GameWorld.GetGameWorld().SendBroadcastMergeClient(sendMsg)
        GameWorld.GetGameWorld().SendBroadcastMergeClient(sendMsg, len(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)
        #    GameWorld.GetGameWorld().SendMergeMsgToClientByGroupID(serverGroupID, sendMsg, len(sendMsg))
        jsonGroupIDInfo = cPickle.dumps(serverGroupIDList, 2)
        GameWorld.GetGameWorld().SendMergeMsgToClientByGroupList(jsonGroupIDInfo, len(jsonGroupIDInfo), sendMsg, len(sendMsg))
    return
def OnClientServerReceiveMsg(index, tick):
@@ -178,14 +220,14 @@
    dataMsg = dataPack.GetData()
    
    try:
        GameWorld.Log("OnClientServerReceiveMsg: %s" % dataMsg)
        if not GameWorld.GetGameWorld().GetDictByKey(ChConfig.Def_WorldKey_GameWorldInitOK):
            GameWorld.Log("服务器未启动好,不处理跨服信息!")
            return
        
        msgDict = eval(dataMsg)
        msgDict = cPickle.loads(dataMsg)
        msgType = msgDict.get("MsgType", -1)    
        msgData = msgDict.get("Data", "")
        GameWorld.Log("OnClientServerReceiveMsg: %s" % msgDict)
        
        if msgType == ShareDefine.CrossServerMsg_ExitCrossServer:
            CrossRealmPlayer.CrossServerMsg_ExitCrossServer(msgData)
@@ -220,11 +262,17 @@
        elif msgType == ShareDefine.CrossServerMsg_PKSyncBillboard:
            CrossRealmPK.CrossServerMsg_PKSyncBillboard(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)
@@ -238,8 +286,24 @@
        elif msgType == ShareDefine.CrossServerMsg_NPCInfoRet:
            PlayerQuery.CrossServerMsg_NPCInfoRet(msgData, tick)
            
        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]:
        elif msgType in [ShareDefine.CrossServerMsg_RebornRet, ShareDefine.CrossServerMsg_CollectNPCOK, ShareDefine.CrossServerMsg_FBEnd,
                         ShareDefine.CrossServerMsg_NPCAttackCount]:
            MapServer_ClientServerReceiveMsg(msgType, msgData)
            
        elif msgType == ShareDefine.CrossServerMsg_CrossServerState:
@@ -249,15 +313,28 @@
            GameWorld.ErrLog("没有该信息类型逻辑处理!")
            
    except:
        GameWorld.ErrLog("OnClientServerReceiveMsg:%s; except:%s" % (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):
    ## 收到跨服服务器信息,需要发送到地图服务器处理
    
    if msgType in [ShareDefine.CrossServerMsg_FBEnd]:
        curServerGroupID = GameWorld.GetServerGroupID()
        for tagPlayerID, msgInfo in msgData.items():
            if not msgInfo:
                continue
            serverGroupID = msgInfo[0]
            if curServerGroupID != serverGroupID:
                continue
            tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(tagPlayerID)
            if not tagPlayer:
                continue
            msgInfo = str([msgType, msgInfo[1:]])
            tagPlayer.MapServer_QueryPlayerResult(0, 0, "ClientServerReceiveMsg", msgInfo, len(msgInfo))
        return
    if not isinstance(msgData, dict):
        return
    tagPlayerID = msgData.get("PlayerID")