5424 【后端】【1.4】跨服竞技场开发(GM工具增加跨服服务器维护操作)
12个文件已修改
1个文件已添加
185 ■■■■■ 已修改文件
ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMCommon.py 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_CrossServerMaintain.py 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/GMCommon.py 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossRealmPK.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/db/PyMongoDataServer/GMToolLogicProcess/Commands/GMCommon.py 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMCommon.py
@@ -68,10 +68,12 @@
Def_CurTimeGreaterEndTime, # 28当前时间大于结束时间
Def_ActionAllreadyOpen, #29 活动已经设置过了
Def_GMForbidMergeWar, #30 gm设置这个服不参加跨服塞
Def_IsNotMergeServer, #31 该服不是跨服服务器
Def_IsNotCrossServer, #31 该服不是跨服服务器
Def_ServerAlreadyOpen, #32 已经正式开服过
Def_ServerClose, #33 服务器维护中
Def_ServerOpen, #34 服务器正常
Def_ResultTypeMax, 
) = range(34)
) = range(36)
Def_GMKey_Type = 'pack_type'
Def_GMKey_ResultType = 'ResultType'
ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_CrossServerMaintain.py
New file
@@ -0,0 +1,64 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package GM.Commands.GMT_CrossServerMaintain
#
# @todo:跨服服务器维护
# @author hxp
# @date 2018-12-29
# @version 1.0
#
# 详细描述: 跨服服务器维护
#
#-------------------------------------------------------------------------------
#"""Version = 2018-12-29 02:30"""
#-------------------------------------------------------------------------------
import DataRecordPack
import CrossRealmPlayer
import ShareDefine
import GameWorld
import GMCommon
#---------------------------------------------------------------------
## 执行逻辑
#  @param curPlayer 当前玩家
#  @param gmCmdDict: 命令字典
#  @return None
#  @remarks 函数详细说明.
def OnExec(orderId, gmCmdDict):
    GameWorld.Log("GMT_CrossServerMaintain gmCmdDict=%s" % str(gmCmdDict))
    if not GameWorld.IsCrossServer():
        GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_IsNotCrossServer)
        return
    operate = gmCmdDict.get('operate', '')
    # 状态查询
    if operate == "query":
        isOpen = GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossServerOpen)
        GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_ServerOpen if isOpen else GMCommon.Def_ServerClose)
        return
    # 状态更改
    if operate == "on":
        isOpen = 1
    elif operate == "off":
        isOpen = 0
    else:
        GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_ParamErr)
        return
    # 变更服务器维护
    CrossRealmPlayer.DoChangeCrossServerState(isOpen)
    # 记录流向
    DataRecordPack.DR_ToolGMOperate(0, '', '', 'GMT_CrossServerMaintain', str(gmCmdDict))
    # 回复
    GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_Success)
    return
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py
@@ -78,10 +78,11 @@
    return
def ClientServerMsg_ServerInitOK(serverGroupID, msgData, tick):
    ''' 收到子服启动成功通知
    ''' 收到子服连接成功通知
         当子服启动成功后,可同步一次跨服服务器活动状态及活动数据给子服
    '''
    GameWorld.Log("收到跨服子服启动成功通知!")
    GameWorld.Log("收到跨服子服连接成功通知!")
    CrossRealmPlayer.ClientServerMsg_ServerInitOK(serverGroupID)
    CrossRealmPK.ClientServerMsg_ServerInitOK(serverGroupID, tick)
    return
@@ -149,6 +150,9 @@
        elif msgType == ShareDefine.CrossServerMsg_PKSyncBillboard:
            CrossRealmPK.CrossServerMsg_PKSyncBillboard(msgData)
            
        elif msgType == ShareDefine.CrossServerMsg_CrossServerState:
            CrossRealmPlayer.CrossServerMsg_CrossServerState(msgData)
        else:
            GameWorld.ErrLog("没有该信息类型逻辑处理!")
            
@@ -168,6 +172,7 @@
    result = dataPack.GetResult()
    if result != 1:
        GameWorld.Log("--OnClientServerReceiveMsg  disconn")
        CrossRealmPlayer.CrossServerMsg_CrossServerState({"isOpen":0})
        return
    
    GameWorld.Log("OnConnCorossServer conn success!!!")
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py
@@ -1704,6 +1704,10 @@
    GameWorld.Log("===收到跨服服务器通知已准备好的对战PK房间信息处理=== curServerGroupID=%s" % curServerGroupID)
    # serverGroupID, playerName, playerJob
    
    if not CrossRealmPlayer.IsCrossServerOpen():
        GameWorld.Log("跨服服务器维护中,不处理!")
        return
    for roomID, readyMemberDict in readyOKRoomList:
        for playerID, playerInfo in readyMemberDict.items():
            serverGroupID = playerInfo["ServerGroupID"]
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
@@ -1241,9 +1241,15 @@
    #世界boss被杀次数重置
    #GameWorldBoss.CheckResetBossKilledCntOnServerInit()
    #GameWorldActionTeHui.OnGameServerInitOK() # 特惠活动初始化
    #子服启动成功告知跨服主服
    serverGroupID = GameWorld.GetServerGroupID()
    GameWorld.Log("服务器启动成功: ServerGroupID=%s" % serverGroupID)
    isCrossServer = GameWorld.IsCrossServer()
    if isCrossServer:
        isServerClose = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossServerClose)
        isServerOpen = 0 if isServerClose else 1
        GameWorld.GetGameWorld().SetDict(ShareDefine.Def_Notify_WorldKey_CrossServerOpen, isServerOpen)
        GameWorld.Log("跨服服务器启动成功: isServerOpen=%s" % isServerOpen)
    else:
        serverGroupID = GameWorld.GetServerGroupID()
        GameWorld.Log("服务器启动成功: ServerGroupID=%s" % serverGroupID)
    return
def DoCheckNewServerOpen(tick):
@@ -1403,6 +1409,10 @@
    # 商店信息
    #GameWorldShopItem.OnMapServerInitOK()
    
    # 跨服服务器状态
    isCrossServerOpen = GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossServerOpen)
    GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossServerOpen, isCrossServerOpen)
    # 跨服PK
    CrossRealmPK.OnMapServerInitOK()
    
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()
@@ -97,6 +150,9 @@
    if not curPlayer:
        return
    
    if not IsCrossServerOpen():
        return
    #newAccount, newName = msgList
    
    actionType = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_MergeRegisterType)
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py
@@ -147,6 +147,8 @@
Def_BRServerPlayerCnt = "BRServerPlayerCnt"
#boss复活活动已复活次数
Def_BossRebornCnt = "BossRebornCnt"
#跨服服务器是否维护中
Def_CrossServerClose = "CrossServerClose"
def SetInitOpenServerTime(initTime):
    openDatetime = GameWorld.ChangeTimeNumToDatetime(initTime)
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -167,6 +167,8 @@
Def_Notify_WorldKey_FamilyPartyInfo = "FamilyPartyInfo"  # 仙盟宴会数据
Def_Notify_WorldKey_CrossServerOpen = "CrossServerOpen"  # 跨服服务器是否开启中
Def_Notify_WorldKey_CrossPKZoneID = "CrossPKZoneID"  # 本服跨服PK所属赛区
Def_Notify_WorldKey_CrossPKSeasonID = "CrossPKSeasonID"  # 本服跨服PK当前赛季
Def_Notify_WorldKey_CrossPKSeasonState = "CrossPKSeasonState"  # 本服跨服PK赛季状态 0-关闭,1-开启中
@@ -1182,6 +1184,7 @@
] = range(3)
# 跨服服务器发送子服信息定义
CrossServerMsg_CrossServerState = "CrossServerState"    # 跨服服务器状态变更
CrossServerMsg_ExitCrossServer = "ExitCrossServer"      # 退出跨服服务器
CrossServerMsg_Notify = "Notify"                        # 提示信息
CrossServerMsg_ViewPlayerCacheRet = "ViewPlayerCacheRet"# 查看跨服玩家信息结果
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/GMCommon.py
@@ -56,10 +56,12 @@
Def_CurTimeGreaterEndTime, # 28当前时间大于结束时间
Def_ActionAllreadyOpen, #29 活动已经设置过了
Def_GMForbidMergeWar, #30 gm设置这个服不参加跨服塞
Def_IsNotMergeServer, #31 该服不是跨服服务器
Def_IsNotCrossServer, #31 该服不是跨服服务器
Def_ServerAlreadyOpen, #32 已经正式开服过
Def_ServerClose, #33 服务器维护中
Def_ServerOpen, #34 服务器正常
Def_ResultTypeMax, 
) = range(34)
) = range(36)
#BUFF对应中文名
BuffNameList = ["无类型", "增益技能:", "减益技能:", "光环技能:", "增值技能:", "被动技能",
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py
@@ -35,6 +35,10 @@
    
    return opName.decode('gbk').encode(GameWorld.GetCharacterEncoding()) + playerName
def IsCrossServerOpen():
    ## 跨服服务器是否开放中
    return GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_CrossServerOpen)
#// C1 04 主动退出跨服 #tagCMExitCrossRealm
#
#struct    tagCMExitCrossRealm
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossRealmPK.py
@@ -198,6 +198,10 @@
        GameWorld.DebugLog("跨服服务器无法发起匹配!", playerID)
        return
    
    if not CrossRealmPlayer.IsCrossServerOpen():
        PlayerControl.NotifyCode(curPlayer, "CrossMatching18")
        return
    if GameWorld.GetMap().GetMapFBType() != IPY_GameWorld.fbtNull:
        GameWorld.DebugLog("副本中,无法进行跨服匹配!", playerID)
        return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -167,6 +167,8 @@
Def_Notify_WorldKey_FamilyPartyInfo = "FamilyPartyInfo"  # 仙盟宴会数据
Def_Notify_WorldKey_CrossServerOpen = "CrossServerOpen"  # 跨服服务器是否开启中
Def_Notify_WorldKey_CrossPKZoneID = "CrossPKZoneID"  # 本服跨服PK所属赛区
Def_Notify_WorldKey_CrossPKSeasonID = "CrossPKSeasonID"  # 本服跨服PK当前赛季
Def_Notify_WorldKey_CrossPKSeasonState = "CrossPKSeasonState"  # 本服跨服PK赛季状态 0-关闭,1-开启中
@@ -1182,6 +1184,7 @@
] = range(3)
# 跨服服务器发送子服信息定义
CrossServerMsg_CrossServerState = "CrossServerState"    # 跨服服务器状态变更
CrossServerMsg_ExitCrossServer = "ExitCrossServer"      # 退出跨服服务器
CrossServerMsg_Notify = "Notify"                        # 提示信息
CrossServerMsg_ViewPlayerCacheRet = "ViewPlayerCacheRet"# 查看跨服玩家信息结果
ServerPython/db/PyMongoDataServer/GMToolLogicProcess/Commands/GMCommon.py
@@ -68,10 +68,12 @@
Def_CurTimeGreaterEndTime, # 28当前时间大于结束时间
Def_ActionAllreadyOpen, #29 活动已经设置过了
Def_GMForbidMergeWar, #30 gm设置这个服不参加跨服塞
Def_IsNotMergeServer, #31 该服不是跨服服务器
Def_IsNotCrossServer, #31 该服不是跨服服务器
Def_ServerAlreadyOpen, #32 已经正式开服过
Def_ServerClose, #33 服务器维护中
Def_ServerOpen, #34 服务器正常
Def_ResultTypeMax, 
) = range(34)
) = range(36)
(