From 3afcfad8a40b4638ff069c63a83af90640fa6559 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 11 二月 2026 17:32:52 +0800
Subject: [PATCH] 66 【公会】基础主体-服务端(优化公会互通后某个游戏服在没有公会没有玩家加入跨服公会时下次维护无法成功显示加入跨服分区;优化分区配置检查,异常时不应用配置且发送qq邮件;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBFamily.py |   48 ++++++++++++++++++++++++------------------------
 1 files changed, 24 insertions(+), 24 deletions(-)

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 8706aed..b085183 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
@@ -20,6 +20,7 @@
 import CommFunc
 import GameWorld
 import ShareDefine
+import CheckServerID
 import PlayerViewCache
 import ChPyNetSendPack
 import NetPackCommon
@@ -800,7 +801,7 @@
         ## 更新分区配置,重置分区,重新分配
         ## @return: 本跨服是否成功更新分区,验证不通过的话不会重置,保留原分区
         GameWorld.Log("跨服公会互通配置更新! updCrossZoneCfgDict=%s" % updCrossZoneCfgDict)
-        if not CheckCrossZoneCfg(self.__crossZoneCfgDict, updCrossZoneCfgDict):
+        if not CheckFamilyCrossZoneCfg(self.__crossZoneCfgDict, updCrossZoneCfgDict):
             return
         
         crossServerID = GameWorld.GetGameWorld().GetServerID()
@@ -1052,15 +1053,17 @@
     GameWorld.Log("跨服公会分区配置加载: appID=%s,%s" % (appID, crossZoneCfgDict))
     return crossZoneCfgDict
 
-def CheckCrossZoneCfg(curCrossZoneCfgDict, updCrossZoneCfgDict):
-    # 检查待更新的分区配置是否符合规则,不符合的话保留原配置,不更新,待扩展
+def CheckFamilyCrossZoneCfg(curCrossZoneCfgDict, updCrossZoneCfgDict):
+    # 检查待更新的分区配置是否符合规则,不符合的话保留原配置,不更新
     
     if curCrossZoneCfgDict == updCrossZoneCfgDict:
         GameWorld.Log("跨服公会互通分区配置不变不处理")
         return
     
-    # 验证配置,是否有交叉、拆分,并邮件通知运维,待扩展,功能完整性优先
-    #GameWorld.SendGameErrorEx("FamilyCrossZoneCfgError", "noZoneServerIDList=%s" % noZoneServerIDList)
+    isOK, errInfo = CheckServerID.CheckCrossZoneCfg(curCrossZoneCfgDict, updCrossZoneCfgDict)
+    if not isOK:
+        GameWorld.SendGameErrorEx("FamilyCrossZoneCfgError", errInfo)
+        return
     
     return True
 
@@ -1186,23 +1189,26 @@
     ## 本服公会首次跨服互通同步数据中
     return DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_FamilyTransDataTime) > 0
 
-def CheckMainServerNoFamilyToCross(connServerID=0):
-    '''已经互通的情况下,需要再额外检查本服是否有公会
-    没有公会时需要主动告知跨服检查是否成功加入互通分区,否则本服将无法正常进行公会互通
+def CheckMainServerNoFamilyToCross(connServerID):
+    '''已经互通的情况下,需要再额外检查本服是否有在目标服务器互通分区里
+    有一种情况:游戏加入互通后,该服的所有公会被删除(可能玩家主动删除、可能系统认为需要删除的公会)
+    导致该游戏服在跨服服务器没有公会了,且该服没有任何玩家加入任何公会,此时该服务器就无法正常被划入某个分区
+    所以已互通的游戏服受到跨服同步的分区信息时,需要检查是否已在分区里,没有的话需要主动汇报请求加入
     '''
     if not IsFamilyCross():
         return
-    familyMgr = DBDataMgr.GetFamilyMgr()
-    familyIDList = familyMgr.GetFamilyIDList()
-    if familyIDList:
+    if not connServerID:
         return
+    familyMgr = DBDataMgr.GetFamilyMgr()
+    #familyIDList = familyMgr.GetFamilyIDList()
+    #if familyIDList:
+    #    return
     
     serverID = GameWorld.GetGameWorld().GetServerID()
-    GameWorld.Log("本服无公会需直接同步跨服请求检查加入互通分区! serverID=%s" % (serverID))
     
     curZoneServerIDList = familyMgr.GetCurZoneServerIDList()
     if serverID in curZoneServerIDList:
-        GameWorld.Log("已经在互通分区里了不处理! serverID=%s in %s" % (serverID, curZoneServerIDList))
+        GameWorld.Log("已经在该跨服互通分区里了不处理! serverID=%s in %s" % (serverID, curZoneServerIDList))
         return
     
     crossServerID = 0
@@ -1221,17 +1227,11 @@
         GameWorld.Log("本服公会未分配互通分区! serverID=%s" % (serverID))
         return
     
-    if connServerID:
-        if connServerID != crossServerID:
-            GameWorld.Log("本服公会互通非目标跨服ID不处理! serverID=%s,crossServerID=%s != %s" % (serverID, crossServerID, connServerID))
-            return
-    else:
-        ssServer = CrossMgr.GetSSServerMgr().GetSSServer(crossServerID)
-        connState = ssServer.GetConnState()
-        if connState != ShareDefine.ssConn_Normal:
-            GameWorld.Log("本服公会互通目标跨服ID非连接状态! serverID=%s,crossServerID=%s,connState=%s" % (serverID, crossServerID, connState))
-            return
-        
+    if connServerID != crossServerID:
+        GameWorld.Log("本服公会互通非目标跨服ID不处理! serverID=%s,crossServerID=%s != %s" % (serverID, crossServerID, connServerID))
+        return
+    GameWorld.Log("本服已互通但没有在该跨服互通分区里,直接请求加入! serverID=%s,crossServerID=%s,toZoneID=%s" % (serverID, crossServerID, toZoneID))
+    
     CrossMsg.SendToCrossServer(ShareDefine.S2C_FamilyData, {"checkInZone":1, "toZoneID":toZoneID}, [crossServerID])
     return
 

--
Gitblit v1.8.0