From 01a0e539b786ae0f1c46646874502367f5410aca Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 04 二月 2026 18:18:51 +0800
Subject: [PATCH] 66 【公会】基础主体-服务端(优化游戏服及跨服启动、通讯逻辑;服务器类型增加跨服中心、跨服事件、时间管理;跨服玩家在线状态、基础信息、玩家资源增减管理、发送跨服个人邮件等;跨服公会初版,修复公会成员审核、成员战力刷新等bug,增加公会名次同步;跨服公会暂未测试;)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldEvent.py | 150 ++++++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 138 insertions(+), 12 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 f157b02..e366e5e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldEvent.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldEvent.py
@@ -15,12 +15,15 @@
#"""Version = 2025-05-15 10:35"""
#-------------------------------------------------------------------------------
+import CrossMgr
+import ChConfig
import DBDataMgr
import GameWorld
import PyMongoMain
import PlayerFamily
import IpyGameDataPY
import IPY_GameWorld
+import DataRecordPack
import PlayerEventCounter
import PlayerViewCache
import PlayerControl
@@ -28,7 +31,6 @@
import PlayerOnline
import ShareDefine
import PyGameData
-import ItemCommon
import BattleObj
import ChPlayer
import ObjPool
@@ -79,16 +81,21 @@
def InitGameWorld(tick):
## GameWorld初始化
- if PyGameData.g_initGameTime:
+ if PyGameData.g_initGameWorldOK:
return
serverID = GameWorld.GetGameWorld().GetServerID()
- GameWorld.Log("服务器启动初始化InitGameWorld: serverID=%s" % serverID)
+ serverType = GameWorld.GetServerType()
+ GameWorld.Log("服务器启动初始化InitGameWorld: serverID=%s,serverType=%s" % (serverID, serverType))
DBDataMgr.OnServerStart() # 优先加载公共数据
- ItemCommon.InitPyItem()
+ #ItemCommon.InitPyItem() # 改为放 InitItem 加载
LoadDBPlayer()
PlayerViewCache.LoadRobot()
PyGameData.g_initGameTime = int(time.time()) # 放到加载数据之后
+ if DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_FamilyTransDataTime):
+ DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_FamilyTransDataTime, 0)
+ GameWorld.Log("启动服务器时重置跨服公会传输数据状态!")
+
#初始话开服时间、星期几
initOpenServerTime = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_InitOpenServerTime)
openServerWeekday = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_OpenServerWeekday)
@@ -102,17 +109,43 @@
# 其他功能初始化
+ # 最后触发检查是否完全启动成功
+ PyGameData.g_initGameWorldOK = True
+ OnServerInitOK()
+ return
+
+def OnServerInitOK():
+ '''服务器完全启动初始化成功后的处理,如db数据加载及静态物品数据等都加载完毕了
+ 如跨服间相关逻辑通讯需要等服务器完全启动完毕后才可进行
+ '''
+ if not PyGameData.g_initGameWorldOK or not PyGameData.g_initPyItem:
+ return
+ if PyGameData.g_serverInitOK:
+ return
+ PyGameData.g_serverInitOK = True
+
+ tick = GameWorld.GetGameWorld().GetTick()
+ serverID = GameWorld.GetGameWorld().GetServerID()
+
OnHighProcess(tick) # 主动触发一次高精度的调用,确保服务器启动后一些功能活动等的数据会被加载
OnMinute(tick)
GameWorld.Log("=============================== 服务器启动成功 ===================================")
+ serverType = GameWorld.GetServerType()
isCrossServer = GameWorld.IsCrossServer()
if isCrossServer:
- pass
+ GameWorld.Log("跨服服务器启动成功: serverType=%s,serverID=%s" % (serverType, serverID))
else:
- serverGroupID = GameWorld.GetServerGroupID()
- GameWorld.Log("服务器启动成功: ServerGroupID=%s,serverID=%s" % (serverGroupID, serverID))
- PyGameData.g_serverInitOK = True
+ serverDay = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_ServerDay) + 1
+ isMixServer = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_IsMixServer)
+ mixServerDay = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_MixServerDay) + 1
+ GameWorld.Log("游戏服务器启动成功: serverType=%s,serverID=%s,serverDay=%s,isMixServer=%s,mixServerDay=%s"
+ % (serverType, serverID, serverDay, isMixServer, mixServerDay))
+
+ DataRecordPack.DR_Reload("restart")
+
+ # ---------- 以下处理服务器完全启动好后的逻辑 ----------
+
return
def AllMapServerInitOK(tick):
@@ -237,7 +270,7 @@
def OnHighProcess(tick):
## 每秒分钟执行一次
- if not PyGameData.g_initGameTime:
+ if not PyGameData.g_serverInitOK:
return
curTime = int(time.time())
if not PyGameData.g_highProcessTime:
@@ -262,6 +295,7 @@
return
PyMongoMain.GetUserCtrlDB().onSecondProcess()
+ CrossMgr.OnSecondProcess(tick, curTime)
OnMinute(tick)
@@ -299,10 +333,15 @@
DBDataMgr.OnMinute(curTime)
DoLogic_GameWorldEvenByTime(tick)
+ #每5分钟
+ if curMinute % 5 == 0:
+ OnMinute_5(curTime, tick)
+
#其他功能逻辑
#GameWorldActionControl.Dispose_OperationActionState()
#GameWorldActionControl.Dispose_DailyActionState()
#GameWorldActionControl.Dispose_FBStateTime()
+ PlayerControl.OnMinute(curTime)
PlayerFamily.OnMinute()
PlayerOnline.OnMinute()
BattleObj.OnMinute()
@@ -311,7 +350,36 @@
__CheckIpyDataRecycle(curTime)
return
+def OnMinute_5(curTime, tick):
+ ## 每5分钟
+ DisposeGameActivePlayer(curTime, tick)
+ return
+
+def DisposeGameActivePlayer(curTime, tick):
+ curMinute = curTime.minute
+ gameWorld = GameWorld.GetGameWorld()
+ noteData = gameWorld.GetGameWorldDictByKey("OnlineCntM")
+ if noteData == curMinute:
+ # 同一分钟只处理1次
+ return
+ gameWorld.SetGameWorldDict("OnlineCntM", curMinute)
+ activePlayerCount = GameWorld.GetPlayerManager().OnlineCount()
+ DataRecordPack.DR_OnLinePlayerCount(activePlayerCount) # 总在线
+ return
+
def DoLogic_GameWorldEvenByTime(tick):
+ '''跨服事件由跨服中心服务器驱动,游戏服使用原方式
+ 跨服中心OnEvent -> 其他服务器OnEvent (包含个常规跨服服务器及游戏服,不保证谁先执行)
+ 个别功能如果需要确保跨服先执行Event,再处理游戏服Event,可以由功能驱动跨服先执行,再同步游戏服执行
+ '''
+ if GameWorld.IsCrossServer():
+ if not GameWorld.IsCrossCenter():
+ return
+ eventValue = GameWorld.ToIntDef(GameWorld.ChangeTimeNumToStr(int(time.time()), ChConfig.TYPE_Time_Format_YmdH))
+ if DoLogic_CrossCenterEvent(eventValue):
+ CrossMgr.SendCrossServerEvent()
+ return
+
#-----------服务器当前时间
curTime = datetime.datetime.today()
curTimeHour = curTime.hour
@@ -361,11 +429,13 @@
GameWorld.Log("Server -> OnDay!")
#设定服务器当前天事件
eventMgr = DBDataMgr.GetEventTrigMgr()
- eventMgr.SetValueIncrement(ShareDefine.Def_ServerDay)
+ serverDay = eventMgr.SetValueIncrement(ShareDefine.Def_ServerDay)
isMixServer = eventMgr.GetValue(ShareDefine.Def_IsMixServer)
+ mixServerDay = 0
if isMixServer:
- eventMgr.SetValueIncrement(ShareDefine.Def_MixServerDay)
-
+ mixServerDay = eventMgr.SetValueIncrement(ShareDefine.Def_MixServerDay)
+ GameWorld.Log("OnDay -> serverDay=%s,isMixServer=%s,mixServerDay=%s" % (serverDay + 1, isMixServer, mixServerDay + 1))
+
PlayerEventCounter.DoLogic_OnDay(tick)
return
@@ -387,6 +457,62 @@
PlayerEventCounter.DoLogic_OnYear(tick)
return
+def DoLogic_CrossCenterEvent(centerEventValue, centerServerID=0):
+ ## 收到跨服中心事件同步,如OnDay等
+ serverEventValue = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_CrossCenterEvent)
+ if not serverEventValue:
+ serverEventValue = centerEventValue
+ DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_CrossCenterEvent, centerEventValue)
+
+ if centerServerID:
+ GameWorld.Log("处理跨服中心事件值! serverEventValue=%s,centerEventValue=%s,centerServerID=%s" % (serverEventValue, centerEventValue, centerServerID))
+
+ if serverEventValue == centerEventValue:
+ GameWorld.DebugLog("跨服中心事件值不变! serverEventValue=%s,centerEventValue=%s,centerServerID=%s" % (serverEventValue, centerEventValue, centerServerID))
+ return
+
+ serverEventTime = GameWorld.ChangeStrToDatetime("%s:%02d:%02d" % serverEventValue, ChConfig.TYPE_Time_Format_YmdHMS)
+ centerEventTime = GameWorld.ChangeStrToDatetime("%s:%02d:%02d" % centerEventValue, ChConfig.TYPE_Time_Format_YmdHMS)
+
+ serverHour = serverEventTime.hour
+ serverDay = serverEventTime.day
+ #serverWeek = datetime.datetime.isocalendar(serverEventTime)[1]
+ serverMonth = serverEventTime.month
+ serverYear = serverEventTime.year
+
+ centerHour = centerEventTime.hour
+ centerDay = centerEventTime.day
+ #centerWeek = datetime.datetime.isocalendar(centerEventTime)[1]
+ centerMonth = centerEventTime.month
+ centerYear = centerEventTime.year
+
+ DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_CrossCenterEvent, centerEventValue)
+
+ isEvent = False
+
+ #OnHour事件
+ if (serverHour != centerHour or serverDay != centerDay or serverMonth != centerMonth or serverYear != centerYear):
+ isEvent = True
+ PlayerEventCounter.DoLogic_CrossCenterOnHour(centerEventValue)
+
+ #OnDay事件
+ if (serverDay != centerDay or serverMonth != centerMonth or serverYear != centerYear):
+ isEvent = True
+ PlayerEventCounter.DoLogic_CrossCenterOnDay(centerEventValue)
+
+ #OnWeek事件
+ #if (serverWeek != curTimeWeek):
+ # OnWeek(tick)
+
+ #OnMonth事件
+ #if (serverMonth != curTimeMonth or serverYear != curTimeYear):
+ # OnMonth(tick)
+
+ #OnYear事件
+ #if serverYear != curTimeYear:
+ # OnYear(tick)
+
+ return isEvent
def __CheckIpyDataRecycle(timeNow):
## 检查IpyData数据回收
--
Gitblit v1.8.0