From f2cf64ffabcd15d5497aee8914b8d37d8b9a88b0 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期六, 07 二月 2026 15:39:43 +0800
Subject: [PATCH] 66 【公会】基础主体-服务端(公会GM命令支持跨服 CreateFamily、Family、Zhenbaoge;跨服公会聊天支持,包含公会聊天缓存;查看玩家A705回包增加公会所在服务器ID信息;)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldEvent.py | 122 +++++++++++++++++++++++++++++++++++++---
1 files changed, 112 insertions(+), 10 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 cc14de1..08e4dfb 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldEvent.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldEvent.py
@@ -15,6 +15,8 @@
#"""Version = 2025-05-15 10:35"""
#-------------------------------------------------------------------------------
+import CrossMgr
+import ChConfig
import DBDataMgr
import GameWorld
import PyMongoMain
@@ -29,7 +31,6 @@
import PlayerOnline
import ShareDefine
import PyGameData
-import ItemCommon
import BattleObj
import ChPlayer
import ObjPool
@@ -80,16 +81,24 @@
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()) # 放到加载数据之后
+ # 检查跨服中心唯一性
+ GameWorld.CheckCrossCenterUniquenessErr()
+
+ 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)
@@ -103,22 +112,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()
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("服务器启动成功: ServerGroupID=%s,serverID=%s,serverDay=%s,isMixServer=%s,mixServerDay=%s"
- % (serverGroupID, serverID, serverDay, isMixServer, mixServerDay))
- PyGameData.g_serverInitOK = True
+ 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):
@@ -243,7 +273,7 @@
def OnHighProcess(tick):
## 每秒分钟执行一次
- if not PyGameData.g_initGameTime:
+ if not PyGameData.g_serverInitOK:
return
curTime = int(time.time())
if not PyGameData.g_highProcessTime:
@@ -268,6 +298,7 @@
return
PyMongoMain.GetUserCtrlDB().onSecondProcess()
+ CrossMgr.OnSecondProcess(tick, curTime)
OnMinute(tick)
@@ -340,6 +371,18 @@
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
@@ -417,6 +460,65 @@
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 serverEventValue == centerEventValue:
+ if centerServerID:
+ GameWorld.Log("本服与跨服中心事件值相同不处理! serverEventValue=%s,centerEventValue=%s,centerServerID=%s" % (serverEventValue, centerEventValue, centerServerID))
+ return
+
+ if centerServerID:
+ GameWorld.Log("本服与跨服中心事件值变化! serverEventValue=%s,centerEventValue=%s,centerServerID=%s" % (serverEventValue, centerEventValue, centerServerID))
+ else:
+ GameWorld.Log("跨服中心服务器事件值变化! serverEventValue=%s,centerEventValue=%s" % (serverEventValue, centerEventValue))
+
+ serverEventTime = GameWorld.ChangeStrToDatetime("%s" % serverEventValue, ChConfig.TYPE_Time_Format_YmdH)
+ centerEventTime = GameWorld.ChangeStrToDatetime("%s" % centerEventValue, ChConfig.TYPE_Time_Format_YmdH)
+
+ 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