ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py
@@ -23,7 +23,7 @@
import PlayerControl
import PlayerViewCache
import ChPyNetSendPack
import IPY_PlayerDefine
import PlayerDBGSEvent
import NetPackCommon
import PyGameData
@@ -54,8 +54,61 @@
    
    return opName.decode('gbk').encode(GameWorld.GetCharacterEncoding()) + playerName
def IsCrossServerOpen():
    ## 跨服服务器是否开放中
    return GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossServerOpen)
def ClientServerMsg_ServerInitOK(serverGroupID):
    ## 子服连接成功
    isOpen = GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossServerOpen)
    GameWorld.Log("子服连接成功,通知当前跨服服务器状态: isOpen=%s" % isOpen)
    CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossServerState, {"isOpen":isOpen}, [serverGroupID])
    return
def DoChangeCrossServerState(isOpen):
    ## 跨服服务器状态变更
    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossServerClose, 0 if isOpen else 1) # 存DB的反着存
    GameWorld.GetGameWorld().SetDict(ShareDefine.Def_Notify_WorldKey_CrossServerOpen, isOpen)
    if not isOpen:
        # 踢掉所有玩家
        playerManager = GameWorld.GetPlayerManager()
        for i in xrange(playerManager.GetActivePlayerCount()):
            curPlayer = playerManager.GetActivePlayerAt(i)
            if curPlayer == None:
                continue
            PlayerControl.SetCrossRealmState(curPlayer, 0)
            curPlayer.Kick(0)
    # 广播所有子服,本服务器进入维护
    CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossServerState, {"isOpen":isOpen})
    return
def CrossServerMsg_CrossServerState(msgData):
    ## 子服收到跨服服务器状态变更,子服不存DB,默认跨服维护中,连接跨服成功后由跨服同步状态直接更新到字典即可,没连上就默认维护中
    isOpen = msgData["isOpen"]
    isOpen = 1 if isOpen else 0
    GameWorld.Log("收到跨服服务器状态变更: 是否正常开放中=%s" % isOpen)
    GameWorld.GetGameWorld().SetDict(ShareDefine.Def_Notify_WorldKey_CrossServerOpen, isOpen)
    if not isOpen:
        playerManager = GameWorld.GetPlayerManager()
        for i in xrange(playerManager.GetActivePlayerCount()):
            curPlayer = playerManager.GetActivePlayerAt(i)
            if curPlayer == None:
                continue
            PlayerControl.SetCrossRealmState(curPlayer, 0)
    # 通知地图
    GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossServerOpen, isOpen)
    return
def PlayerExitCrossServer(curPlayer):
    ## 玩家退出跨服服务器
    if not GameWorld.IsCrossServer():
        return
    
    # 通知子服玩家退出跨服服务器
    playerID = curPlayer.GetPlayerID()
@@ -95,6 +148,9 @@
    
    curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
    if not curPlayer:
        return
    if not IsCrossServerOpen():
        return
    
    #newAccount, newName = msgList
@@ -234,6 +290,7 @@
    sendPack.ItemDataSize = len(sendPack.ItemData)
    sendPack.PlusData = PlusData
    sendPack.PlusDataSize = len(sendPack.PlusData)
    sendPack.CrossPlayer = 1
    NetPackCommon.SendFakePack(curPlayer, sendPack)
    return