From bc5f3f1c88d225109fa39a85b209ef13f5fb52a9 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 06 二月 2026 21:28:13 +0800
Subject: [PATCH] 66 【公会】基础主体-服务端(跨服公会所有基本功能支持、跨服砍价支持;修改查看目标公会、查看目标玩家方式;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/CrossMgr.py |   73 ++++++++++++++++++++++++------------
 1 files changed, 49 insertions(+), 24 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/CrossMgr.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/CrossMgr.py
index bd46703..6d22f2b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/CrossMgr.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/CrossMgr.py
@@ -76,6 +76,16 @@
     def SetConnState(self, connState): self._connState = connState
     def GetHeartCurTime(self): return self._heartCurTime # 上次收到该服心跳时的本服时间戳
     def SetHeartCurTime(self, curTime): self._heartCurTime = curTime
+    def IsServerOpen(self):
+        ## 是否正常开放中
+        
+        # 验证连接状态
+        if self._connState != ShareDefine.ssConn_Normal:
+            return False
+        
+        # 验证维护状态
+        
+        return True
     
 class SSServerMgr():
     ## 其他服务器管理器,所有服务器通用
@@ -103,14 +113,16 @@
     def DoHeartbeat(self, curTime):
         ## 心跳广播给其他服
         
+        if not GameWorld.IsCrossServer():
+            # 目前仅跨服服务器需要处理心跳广播 ,其他暂时不用
+            return
+        
         # 时间回调时也立刻同步心跳
         if self._heartTime and curTime >= self._heartTime and curTime - self._heartTime < HeartBreat:
+            #GameWorld.DebugLog("不广播心跳! self._heartTime=%s,curTime=%s,diff=%s" % (self._heartTime, curTime, curTime - self._heartTime))
             return
         self._heartTime = curTime
-        
-        if not GameWorld.IsCrossServer():
-            # 目前仅跨服服务器需要处理心跳,其他暂时不用
-            return
+        #GameWorld.DebugLog("广播心跳! self._heartTime=%s,%s" % (self._heartTime, GameWorld.ChangeTimeNumToStr(self._heartTime)))
         
         pack = ChServerToServerPyPack.tagSSHeart()
         pack.ServerID = GameWorld.GetGameWorld().GetServerID()
@@ -127,32 +139,42 @@
         curTime = int(time.time())
         
         ssServer = self.GetSSServer(serverID)
+        ssServer.SetServerType(serverType)
+        ssServer.SetHeartCurTime(curTime)
         
         befConnState = ssServer.GetConnState()
         
-        ssServer.SetServerType(serverType)
-        ssServer.SetConnState(ShareDefine.ssConn_Normal)
-        ssServer.SetHeartCurTime(curTime)
+        # 目标是跨服中心,更新跨服时间
+        if serverType == ShareDefine.serverType_CrossCenter:
+            if not self._crossCenterID:
+                self._crossCenterID = serverID
+                
+            updCrossTime = serverTime
+            curCrossTime = self.GetCrossTime()
+            self.SetCrossTime(updCrossTime, curTime)
+            diffSeconds = updCrossTime - curCrossTime # 误差秒
+            #GameWorld.DebugLog("curCrossTime=%s" % GameWorld.ChangeTimeNumToStr(curCrossTime))
+            #GameWorld.DebugLog("updCrossTime=%s" % GameWorld.ChangeTimeNumToStr(updCrossTime))
+            #GameWorld.DebugLog("与跨服时间误差=%s" % diffSeconds)
+            if abs(diffSeconds) >= 30:
+                GameWorld.Log("本服的跨服时间与跨服实际时间误差过大同步前端! diffSeconds=%s" % diffSeconds)
+                GameWorld.Log("curCrossTime=%s" % GameWorld.ChangeTimeNumToStr(curCrossTime))
+                GameWorld.Log("updCrossTime=%s" % GameWorld.ChangeTimeNumToStr(updCrossTime))
+                ChPlayer.Sync_PyServerDataTimeToClient()
+                
+        if befConnState == ShareDefine.ssConn_Normal:
+            #GameWorld.Log("收到目标跨服服务器心跳,正常连接中: crossServerID=%s,crossServerTime=%s" % (serverID, GameWorld.ChangeTimeNumToStr(serverTime)))
+            return
         
+        ssServer.SetConnState(ShareDefine.ssConn_Normal)
         isReconn = True if befConnState == ShareDefine.ssConn_Disconnected else False
         
         # 跨服服务器
-        if serverType == ShareDefine.serverType_CrossCenter:
-            GameWorld.Log("连上跨服中心服务器: crossServerID=%s,isReconn=%s,crossServerTime=%s" % (serverID, isReconn, GameWorld.ChangeTimeNumToStr(serverTime)))
-            if not self._crossCenterID:
-                self._crossCenterID = serverID
-            if serverID not in self._crossServerIDList:
-                self._crossServerIDList.append(serverID)
-                
-            lastCrossTime = self.GetCrossTime()
-            self.SetCrossTime(serverTime, curTime)
-            
-            # 时间回调或误差过大立即同步给前端
-            if serverTime < lastCrossTime or (serverTime - lastCrossTime) >= 30:
-                ChPlayer.Sync_PyServerDataTimeToClient()
-                
-        elif serverType == ShareDefine.serverType_Cross:
-            GameWorld.Log("连上跨服服务器: crossServerID=%s,isReconn=%s" % (serverID, isReconn))
+        if serverType in [ShareDefine.serverType_CrossCenter, ShareDefine.serverType_Cross]:
+            if serverType == ShareDefine.serverType_CrossCenter:
+                GameWorld.Log("连上跨服中心服务器: crossServerID=%s,isReconn=%s,crossServerTime=%s" % (serverID, isReconn, GameWorld.ChangeTimeNumToStr(serverTime)))
+            elif serverType == ShareDefine.serverType_Cross:
+                GameWorld.Log("连上常规跨服服务器: crossServerID=%s,isReconn=%s" % (serverID, isReconn))
             if serverID not in self._crossServerIDList:
                 self._crossServerIDList.append(serverID)
                 
@@ -167,6 +189,7 @@
         ## 获取跨服服务器时间 - 以跨服中心服务器为准,如果没有默认取本服时间
         curTime = int(time.time())
         if not self._crossTime:
+            #GameWorld.DebugLog("没有跨服时间,直接返回本服时间")
             return curTime
         self._crossTime += max(0, curTime - self._crossTimeCurTime)
         self._crossTimeCurTime = curTime
@@ -178,7 +201,8 @@
         self._crossTimeCurTime = curTime if curTime else int(time.time())
         return serverTime
     
-    def GetCrossServerIDList(self): return self._crossServerIDList
+    def GetCrossCenterID(self): return self._crossCenterID # 跨服中心服务器ID
+    def GetCrossServerIDList(self): return self._crossServerIDList # 所有运行中的跨服服务器ID,包含跨服中心
     
     def CheckSSServerDisconnected(self, curTime):
         ## 检查其他服是否断开连接
@@ -203,6 +227,7 @@
                 # 本服时间回调了暂不处理
                 continue
             if curTime - lastHeartTime <= DisconnectedTime:
+                #GameWorld.Log("检查断开时为正常连接中: serverID=%s,serverType=%s,pass=%s" % (ssServer.GetServerID(), ssServer.GetServerType(), curTime - lastHeartTime))
                 continue
             ssServer.SetConnState(ShareDefine.ssConn_Disconnected)
             

--
Gitblit v1.8.0