From 7ceba1452ba6395abd5841f62e96e384df21aa05 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期六, 29 十二月 2018 02:38:08 +0800
Subject: [PATCH] 5424 【后端】【1.4】跨服竞技场开发(GM工具增加跨服服务器维护操作)
---
ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_CrossServerMaintain.py | 64 ++++++++++++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py | 3
ServerPython/db/PyMongoDataServer/GMToolLogicProcess/Commands/GMCommon.py | 6 +
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py | 4 +
ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMCommon.py | 6 +
ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py | 58 ++++++++++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossRealmPK.py | 4 +
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py | 2
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py | 9 +
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/GMCommon.py | 6 +
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py | 4 +
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py | 16 +++
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py | 3
13 files changed, 173 insertions(+), 12 deletions(-)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMCommon.py b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMCommon.py
index 03ea28d..8655e0b 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMCommon.py
+++ b/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'
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_CrossServerMaintain.py b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_CrossServerMaintain.py
new file mode 100644
index 0000000..1de499c
--- /dev/null
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_CrossServerMaintain.py
@@ -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
+
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py
index 43bc593..9692a16 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py
+++ b/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!!!")
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py
index fded022..c50aca3 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py
+++ b/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"]
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
index 2e3eac3..b31f8ee 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
+++ b/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()
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py
index 511ba7d..cecd0f5 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py
+++ b/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)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py
index 783cd36..7e15394 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py
+++ b/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)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
index 0ea5429..7698495 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
+++ b/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"# 查看跨服玩家信息结果
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/GMCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/GMCommon.py
index 282698d..90c1c76 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/GMCommon.py
+++ b/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 = ["无类型", "增益技能:", "减益技能:", "光环技能:", "增值技能:", "被动技能",
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py
index b5a986e..11a0900 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py
+++ b/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
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossRealmPK.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossRealmPK.py
index c55e59c..545f7bd 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossRealmPK.py
+++ b/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
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index 0ea5429..7698495 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/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"# 查看跨服玩家信息结果
diff --git a/ServerPython/db/PyMongoDataServer/GMToolLogicProcess/Commands/GMCommon.py b/ServerPython/db/PyMongoDataServer/GMToolLogicProcess/Commands/GMCommon.py
index 1a10ab9..129ff30 100644
--- a/ServerPython/db/PyMongoDataServer/GMToolLogicProcess/Commands/GMCommon.py
+++ b/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)
(
--
Gitblit v1.8.0