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