From 05672ed6e854b0179482788d4b15e3f8eb727c0e Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 28 十一月 2025 15:06:09 +0800
Subject: [PATCH] 16 卡牌服务端(优化服务器时间、天封包A004 A103同步:过天、回调时间、时间误差超过10秒时补同步;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldEvent.py |   34 ++++++++++++++++++++++++++++++++--
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py                    |    2 +-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py     |    4 ++++
 3 files changed, 37 insertions(+), 3 deletions(-)

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 bbeaa36..78b2a7c 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldEvent.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldEvent.py
@@ -27,6 +27,7 @@
 import ShareDefine
 import PyGameData
 import BattleObj
+import ChPlayer
 import ObjPool
 
 import datetime
@@ -233,9 +234,23 @@
     ## 每秒分钟执行一次
     if not PyGameData.g_initGameTime:
         return
-    if tick - PyGameData.g_highProcessTick < 1000:
+    curTime = int(time.time())
+    if not PyGameData.g_highProcessTime:
+        PyGameData.g_highProcessTime = curTime
+        
+    if curTime < PyGameData.g_highProcessTime:
+        GameWorld.Log("时间回调了: lastProcessTime=%s" % (GameWorld.ChangeTimeNumToStr(PyGameData.g_highProcessTime)))
+        PyGameData.g_highProcessTime = curTime
+        OnFixServerTimeProcess()
+        
+    passSeconds = curTime - PyGameData.g_highProcessTime
+    if passSeconds < 1:
         return
-    PyGameData.g_highProcessTick = tick
+    if passSeconds > 10:
+        GameWorld.Log("时间误差过大: passSeconds=%s,lastProcessTime=%s" % (passSeconds, GameWorld.ChangeTimeNumToStr(PyGameData.g_highProcessTime)))
+        OnFixServerTimeProcess()
+        
+    PyGameData.g_highProcessTime = curTime
     
     if PyGameData.g_serverClosing:
         CheckCloseMapOK()
@@ -249,6 +264,21 @@
     
     return
 
+def OnFixServerTimeProcess():
+    
+    # 补同步一次服务器时间给前端
+    playerManager = GameWorld.GetPlayerManager()
+    for i in xrange(playerManager.GetPlayerCount()):
+        curPlayer = playerManager.GetPlayerByIndex(i)
+        
+        if not GameWorld.IsNormalPlayer(curPlayer):
+            continue
+        
+        ChPlayer.Sync_PyServerDataTimeToClient(curPlayer)
+        ChPlayer.Sync_OpenServerDay(curPlayer)
+        
+    return
+        
 def OnMinute(tick):
     ## 每整分钟执行一次
     curTime = GameWorld.GetCurrentTime()
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
index 47b50b2..c50b8a5 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -232,6 +232,10 @@
     playerID = curPlayer.GetPlayerID()
     GameWorld.Log("PlayerOnDay! ondayValue=%s" % (ondayValue), playerID)
     
+    # 过天同步下时间、开服天
+    ChPlayer.Sync_PyServerDataTimeToClient(curPlayer)
+    ChPlayer.Sync_OpenServerDay(curPlayer)
+    
     __DoPlayerOnDay(curPlayer, ShareDefine.Def_OnEventType)
     __DoPlayerOnDay(curPlayer, ShareDefine.Def_OnEventTypeEx)
     
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
index 2247e69..30ce84f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
@@ -19,7 +19,7 @@
 g_lastRTBTime = 0 # 上一次备档时间戳
 g_initGameTime = 0 # 开始初始化服务器时间戳
 g_serverInitOK = False # 服务器是否启动成功
-g_highProcessTick = 0 # 每秒触发一次,上次Tick
+g_highProcessTime = 0 # 每秒触发一次,上次Time
 g_minuteProcess = -1 # 每分钟触发一次,上次处理的分钟
 g_serverClosing = 0 # 是否关服中 0-非关服中;1-关服中;2-关服结束
 g_closeSaveDataOK = False # 关服数据入库是否成功

--
Gitblit v1.8.0