hxp
2019-01-07 d8cf06e323dca770512529f741a667278c0c8786
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()
@@ -79,15 +132,15 @@
    PlayerControl.SetCrossRealmState(curPlayer, 0)
    return
def SendCrossRealmReg(curPlayer, actionType, mapID=0, dataMapID=0, copyMapID=0, posX=0, posY=0):
def SendCrossRealmReg(curPlayer, registerType, mapID=0, dataMapID=0, copyMapID=0, posX=0, posY=0):
    # 发送跨服账号注册上传数据
    
    # 设置上传数据的活动类型
    curPlayer.SetDict(ChConfig.Def_PlayerKey_MergeRegisterType, actionType)
    sysMsg = str([actionType, mapID, dataMapID, copyMapID, posX, posY])
    curPlayer.SetDict(ChConfig.Def_PlayerKey_CrossRegisterType, registerType)
    sysMsg = str([registerType, mapID, dataMapID, copyMapID, posX, posY])
    curPlayer.MapServer_QueryPlayerResult(0, 0, "CrossRealmReg", sysMsg, len(sysMsg))            
    GameWorld.Log("SendCrossRealmReg actionType=%s,mapID=%s,dataMapID=%s,copyMapID=%s,posX=%s,posY=%s"
                  % (actionType, mapID, dataMapID, copyMapID, posX, posY), curPlayer.GetPlayerID())
    GameWorld.Log("SendCrossRealmReg registerType=%s,mapID=%s,dataMapID=%s,copyMapID=%s,posX=%s,posY=%s"
                  % (registerType, mapID, dataMapID, copyMapID, posX, posY), curPlayer.GetPlayerID())
    return
def OnCrossRealmRegOK(playerID, msgList, tick): 
@@ -97,13 +150,19 @@
    if not curPlayer:
        return
    
    #newAccount, newName = msgList
    if not IsCrossServerOpen():
        return
    
    actionType = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_MergeRegisterType)
    GameWorld.Log("跨服报名成功 , actionType=%s" % (actionType), playerID)
    registerType = msgList[0]
    playerRegisterType = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_CrossRegisterType)
    if playerRegisterType and registerType != playerRegisterType:
        return
    curPlayer.SetDict(ChConfig.Def_PlayerKey_CrossRegisterType, 0)
    GameWorld.Log("跨服报名成功 , registerType=%s" % (registerType), playerID)
    
    # 跨服PK上传数据完毕,通知跨服服务器,准备完毕
    if actionType == ShareDefine.Def_CrossAction_PK:
    if registerType == ChConfig.Def_FBMapID_CrossRealmPK:
        regVSRoomID = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_MergeRegisterRoomID) 
        vsRoomID = curPlayer.GetVsRoomId()
        
@@ -122,13 +181,13 @@
        
    # 其他的,在上传数据完毕后,使用通用的通知可进入跨服
    else:
        NotifyCanEnterMergeServer(curPlayer, actionType)
        NotifyCanEnterMergeServer(curPlayer, registerType)
        
    # hxp 2015.09.10 跨服boss,后面的暂时不需要
    return
def NotifyCanEnterMergeServer(curPlayer, actionType):
def NotifyCanEnterMergeServer(curPlayer, registerType):
    # 通用包,通知客户端可进入跨服服务器
    return
@@ -234,6 +293,7 @@
    sendPack.ItemDataSize = len(sendPack.ItemData)
    sendPack.PlusData = PlusData
    sendPack.PlusDataSize = len(sendPack.PlusData)
    sendPack.CrossPlayer = 1
    NetPackCommon.SendFakePack(curPlayer, sendPack)
    return