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)