From 89cd5c46258340014d31e4b8c6ee7df0e3b00c2d Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 16 三月 2026 19:51:54 +0800
Subject: [PATCH] 16 卡牌服务端(自动开服相关;A103增加同步开服时间;增加是否允许加入跨服标记,默认否;跨服公会仅在允许跨服时才会加入跨服;优化ServersConfig.json配置,支持后台导出,优化战斗服务器配置;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ReadChConfig.py                                                |   19 ++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/GMToolLogicProcess/Commands/GMT_SetCanCross.py       |   41 ++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ServerDay.py                                       |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldEvent.py                               |   30 +------
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py                                                 |    1 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py                                             |    8 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py                                             |    1 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBFamily.py                                      |    4 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/GMToolLogicProcess/Commands/GMT_Face.py              |    0 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/GMToolLogicProcess/Commands/GMT_SetOpenServerTime.py |   55 +++++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/GMToolLogicProcess/Commands/GMT_CheckOpenServer.py   |   27 ++++--
 11 files changed, 148 insertions(+), 40 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index 9005953..13a57ab 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -1405,6 +1405,7 @@
                   ("NowSecond", c_ubyte),    
                   ("NowMicSecond", c_int),    
                   ("WeekOfYear", c_ubyte),    #一年中的第几周
+                  ("OpenServerTime", c_int),    #开服时间戳
                   ]
 
     def __init__(self):
@@ -1433,6 +1434,7 @@
         self.NowSecond = 0
         self.NowMicSecond = 0
         self.WeekOfYear = 0
+        self.OpenServerTime = 0
         return
 
     def GetLength(self):
@@ -1456,7 +1458,8 @@
                                 NowMinute:%d,
                                 NowSecond:%d,
                                 NowMicSecond:%d,
-                                WeekOfYear:%d
+                                WeekOfYear:%d,
+                                OpenServerTime:%d
                                 '''\
                                 %(
                                 self.Cmd,
@@ -1472,7 +1475,8 @@
                                 self.NowMinute,
                                 self.NowSecond,
                                 self.NowMicSecond,
-                                self.WeekOfYear
+                                self.WeekOfYear,
+                                self.OpenServerTime
                                 )
         return DumpString
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBFamily.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBFamily.py
index b085183..d5d79ea 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBFamily.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBFamily.py
@@ -1243,6 +1243,10 @@
         CheckMainServerNoFamilyToCross(connServerID)
         return
     
+    if not DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_CanCross):
+        GameWorld.Log("该服务器暂时未开放加入跨服!")
+        return
+    
     NeedServerDay = IpyGameDataPY.GetFuncCfg("FamilyCross", 1)
     serverDay = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_ServerDay) + 1
     if serverDay < NeedServerDay:
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ServerDay.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ServerDay.py
index f2f77e6..1505c96 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ServerDay.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ServerDay.py
@@ -65,7 +65,9 @@
     IsMixServer = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_IsMixServer)
     MixDay = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_MixServerDay) + 1
     OpenWeekday = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_OpenServerWeekday)
+    openServerTime = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_InitOpenServerTime)
     GameWorld.DebugAnswer(curPlayer, '开服星期%s, 天数:%s 是否合服:%s, 合服天数:%s' % (OpenWeekday, ServerDay, IsMixServer, MixDay))
+    GameWorld.DebugAnswer(curPlayer, '开服时间:%s' % GameWorld.ChangeTimeNumToStr(openServerTime))
     return
 
 def __clearOpenServerDay(curPlayer):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldEvent.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldEvent.py
index 4e8750f..621bc11 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldEvent.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldEvent.py
@@ -161,30 +161,6 @@
     #PlayerDBOper.FindDBOper(PlayerDBOper.Table_DBPlayer, {}, {"PlayerID":1, "AccID":1, "_id":0}, LoadDBPlayerRet)
     return
 
-def GMSetOpenServerTime(openServerTime):
-    '''GM设置开服时间
-    @param openServerTime: 开服时间戳
-    @return: 1-成功;-1-设置的时间异常;-2-已经设置过且开服了,不能重复设置
-    '''
-    serverID = GameWorld.GetGameWorld().GetServerID()
-    curTime = int(time.time())
-    if openServerTime < curTime:
-        GameWorld.ErrLog("当前时间已经超过设置的开服时间,不能设置! serverID=%s" % serverID)
-        #GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_InvalidTime, "The set time is less than the current time.")
-        return -1
-    setOpenServerTime = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_SetOpenServerTime)
-    if setOpenServerTime and curTime > setOpenServerTime:
-        GameWorld.ErrLog("已经设置过且开服了,不能重复设置! serverID=%s" % serverID)
-        #GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_ServerAlreadyOpen, "The server has been opened.")
-        return -2
-    
-    DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_SetOpenServerTime, openServerTime)
-    GameWorld.Log("GM设置开服时间: serverID=%s,%s,%s" % (serverID, GameWorld.ChangeTimeNumToStr(openServerTime), openServerTime))
-    if openServerTime == curTime:
-        OnNewServerOpen(GameWorld.GetGameWorld().GetTick())
-        
-    return 1
-
 def DoCheckNewServerOpen(tick):
     setOpenServerTime = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_SetOpenServerTime)
     if not setOpenServerTime:
@@ -220,10 +196,14 @@
     DBDataMgr.GetMailMgr().DelAllMail()
     DBDataMgr.GetPlayerViewCacheMgr().DelAllCache()
     
+    # 设置允许跨服,该函数为自动开服会触发,所以要设置为允许跨服,手动开服的需后台手动设置为允许
+    DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_CanCross, 1)
     SetInitOpenServerTime(setOpenServerTime)
     AllMapServerInitOK(tick)
     
-    GameWorld.GetGameWorld().SaveGameServerData()
+    #强制备档一次、入库
+    DBDataMgr.BackupGameWorldData(saveToDB=True)
+    #GameWorld.GetGameWorld().SaveGameServerData()
     GameWorld.SendGameError("ClearOpenServerOK")
     return
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
index f577fe2..06d7dc5 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -3650,6 +3650,7 @@
     clientPack.NowSecond = serverTime.second
     clientPack.NowMicSecond = serverTime.microsecond
     clientPack.WeekOfYear = GameWorld.GetWeekOfYear()
+    clientPack.OpenServerTime = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_InitOpenServerTime)
     NetPackCommon.SendFakePack(curPlayer, clientPack)
     return
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/GMToolLogicProcess/Commands/GMT_CheckOpenServer.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/GMToolLogicProcess/Commands/GMT_CheckOpenServer.py
index 04906e0..90c04a6 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/GMToolLogicProcess/Commands/GMT_CheckOpenServer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/GMToolLogicProcess/Commands/GMT_CheckOpenServer.py
@@ -2,32 +2,37 @@
 # -*- coding: GBK -*-
 #-------------------------------------------------------------------------------
 #
-##@package PyMongoDataServer.GMToolLogicProcess.Commands.GMT_CheckOpenServer
+##@package PyMongoDB.GMToolLogicProcess.Commands.GMT_CheckOpenServer
 #
 # @todo:检查开服相关是否正常
 # @author hxp
-# @date 2024-10-23
+# @date 2026-03-16
 # @version 1.0
 #
 # 详细描述: 检查开服相关是否正常
 #
 #-------------------------------------------------------------------------------
-#"""Version = 2024-10-23 15:00"""
+#"""Version = 2026-03-16 20:00"""
 #-------------------------------------------------------------------------------
 
 import GMCommon
+import ShareDefine
+import GameWorld
+import DBDataMgr
 
-## 收到gm命令执行
-# @param gmCmdDict:gm命令字典
-# @return None 
 def OnExec(gmCmdDict):
-    from LogicProcess import (UserCtrlDB,)
+    from LogicProcess import (UserCtrlDB)
     
     # 先检查版本号
     checkRet = UserCtrlDB.CheckGameVersion()
     curVersion, centerVersion = checkRet if checkRet else ("", "")
-    if curVersion == centerVersion:
-        # 推给GameServer进一步检查
-        return GMCommon.Def_SendToGameServer, ''
-    return GMCommon.Def_Unknow, {"errMsg":"VersionError", "curVersion":curVersion, "centerVersion":centerVersion}
+    if curVersion != centerVersion:
+        return GMCommon.Def_Unknow, {"errMsg":"VersionError", "curVersion":curVersion, "centerVersion":centerVersion}
+    
+    openServerDay = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_ServerDay) + 1
+    if openServerDay != 1:
+        GameWorld.SendGameError("GMT_CheckOpenServer", "开服天异常:%s" % openServerDay)
+        return GMCommon.Def_Unknow, {"errMsg":"OpenServerDayError", "openServerDay":openServerDay}
+    
+    return GMCommon.Def_Success, {"errMsg":"OK"}
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/GMToolLogicProcess/Commands/GMT_ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/GMToolLogicProcess/Commands/GMT_Face.py
similarity index 100%
rename from ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/GMToolLogicProcess/Commands/GMT_
rename to ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/GMToolLogicProcess/Commands/GMT_Face.py
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/GMToolLogicProcess/Commands/GMT_SetCanCross.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/GMToolLogicProcess/Commands/GMT_SetCanCross.py
new file mode 100644
index 0000000..b9ffd91
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/GMToolLogicProcess/Commands/GMT_SetCanCross.py
@@ -0,0 +1,41 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package PyMongoDB.GMToolLogicProcess.Commands.GMT_SetCanCross
+#
+# @todo:设置是否允许跨服
+# @author hxp
+# @date 2026-03-16
+# @version 1.0
+#
+# 详细描述: 设置是否允许跨服
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2026-03-16 20:00"""
+#-------------------------------------------------------------------------------
+
+import GMCommon
+import ShareDefine
+import GameWorld
+import DBDataMgr
+
+def OnExec(gmCmdDict):
+    setValue = GameWorld.ToIntDef(gmCmdDict.get("setValue"), None)
+    if setValue == None:
+        return GMCommon.Def_ParamErr
+    
+    canCross = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_CanCross)
+    # 查询
+    if setValue == 2:
+        pass
+    elif setValue == 1:
+        canCross = DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_CanCross, 1)
+    else:
+        #if canCross:
+        #    return GMCommon.Def_Unknow, {"errMsg":"AlreadyCrossState"}
+        canCross = DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_CanCross, 0)
+        
+    GameWorld.Log("是否允许加入跨服: %s" % canCross)
+    return GMCommon.Def_Success, {"errMsg":"OK", "canCross":canCross}
+
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/GMToolLogicProcess/Commands/GMT_SetOpenServerTime.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/GMToolLogicProcess/Commands/GMT_SetOpenServerTime.py
new file mode 100644
index 0000000..235bdef
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyMongoDB/GMToolLogicProcess/Commands/GMT_SetOpenServerTime.py
@@ -0,0 +1,55 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package PyMongoDB.GMToolLogicProcess.Commands.GMT_SetOpenServerTime
+#
+# @todo:设置开服时间
+# @author hxp
+# @date 2026-03-16
+# @version 1.0
+#
+# 详细描述: 设置开服时间
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2026-03-16 20:00"""
+#-------------------------------------------------------------------------------
+
+import GMCommon
+import GameWorld
+import GameWorldEvent
+import ShareDefine
+import DBDataMgr
+import time
+
+def OnExec(gmCmdDict):
+    from LogicProcess import (UserCtrlDB)
+    
+    curTime = int(time.time())
+    OpenServerDate = gmCmdDict.get("OpenServerDate")
+    OpenServerHour = GameWorld.ToIntDef(gmCmdDict.get("OpenServerHour"), None)
+    OpenServerMinute = GameWorld.ToIntDef(gmCmdDict.get("OpenServerMinute"), None)
+    
+    if not OpenServerDate or OpenServerHour == None or OpenServerMinute == None:
+        openServerTime = curTime # 允许不设置时间,默认取当前服务器时间
+        timeStr = GameWorld.ChangeTimeNumToStr(openServerTime)
+    else:
+        timeStr = "%s %02d:%02d:%02d" % (OpenServerDate, OpenServerHour, OpenServerMinute, 0)
+        openServerTime = GameWorld.ChangeTimeStrToNum(timeStr)
+        
+    if openServerTime < curTime:
+        # 当前时间已经超过设置的开服时间,不能设置!
+        return GMCommon.Def_InvalidTime, "The set time is less than the current time."
+    
+    setOpenServerTime = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_SetOpenServerTime)
+    if setOpenServerTime and curTime > setOpenServerTime:
+        # 已经设置过且开服了,不能重复设置!
+        return GMCommon.Def_ServerAlreadyOpen, "The server has been opened."
+    
+    DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_SetOpenServerTime, openServerTime)
+    
+    if openServerTime == curTime:
+        GameWorldEvent.OnNewServerOpen(GameWorld.GetGameWorld().GetTick())
+        
+    return GMCommon.Def_Success, timeStr
+
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ReadChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ReadChConfig.py
index 83033e1..ede0efe 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ReadChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ReadChConfig.py
@@ -257,12 +257,27 @@
             GameWorld.Log('无法找到文件 = %s'%(filePath))
             raise Exception('无法找到文件 = %s'%(filePath))
         
+        batFilePath = ChConfig.GetServersRoutePath() + "\\Config\\BattleServer.json"
+        if not os.path.isfile(batFilePath):
+            GameWorld.Log('无法找到文件 = %s'%(batFilePath))
+            raise Exception('无法找到文件 = %s'%(batFilePath))
+        
         f = open(filePath, 'r')
-        strMsg = f.read()
+        serverDict = eval(f.read())
         f.close()
         
-        ServersConfigDict = eval(strMsg)
+        f = open(batFilePath, 'r')
+        batServerDict = eval(f.read())
+        f.close()
         
+        groupName = GameWorld.GetServerGroupName()
+        ServersConfigDict = {}
+        ServersConfigDict = {int(k):v for k, v in serverDict.items()}
+        for batServerID, mapID in batServerDict.items():
+            if batServerID in ServersConfigDict:
+                continue
+            ServersConfigDict[batServerID] = [groupName, mapID, ShareDefine.serverType_Battle]
+            
     return ServersConfigDict
 
 ## PyMongoDataServer.ini配置读取
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index 74fdf14..6eb013c 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -42,6 +42,7 @@
 '''
 Def_InitOpenServerTime = 'InitOpenServerTime'
 Def_SetOpenServerTime = 'SetOpenServerTime' # GM工具预定的开服时间
+Def_CanCross = 'CanCross' # 是否允许加入跨服,暂时仅对将要加入的做限制,已加入的暂不处理
 
 Def_FamilyCrossState = 'FamilyCrossState' # 本服公会跨服状态, 0-未跨服;1-已跨服
 Def_FamilyTransDataTime = 'FamilyTransDataTime' # 本服公会首次跨服互通数据开始传输时间戳,不为0代表传输数据中

--
Gitblit v1.8.0