From 89cd5c46258340014d31e4b8c6ee7df0e3b00c2d Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 16 三月 2026 19:51:54 +0800
Subject: [PATCH] 16 卡牌服务端(自动开服相关;A103增加同步开服时间;增加是否允许加入跨服标记,默认否;跨服公会仅在允许跨服时才会加入跨服;优化ServersConfig.json配置,支持后台导出,优化战斗服务器配置;)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldEvent.py | 74 ++++++++++++++++++-------------------
1 files changed, 36 insertions(+), 38 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 cb47a5c..621bc11 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldEvent.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldEvent.py
@@ -25,8 +25,8 @@
import IPY_GameWorld
import DataRecordPack
import PlayerEventCounter
+import GameLogic_Qunying
import GameWorldAction
-import PlayerViewCache
import PlayerControl
import NetPackCommon
import PlayerOnline
@@ -90,7 +90,7 @@
DBDataMgr.OnServerStart() # 优先加载公共数据
#ItemCommon.InitPyItem() # 改为放 InitItem 加载
LoadDBPlayer()
- PlayerViewCache.LoadRobot()
+ #PlayerViewCache.LoadRobot()
PyGameData.g_initGameTime = int(time.time()) # 放到加载数据之后
# 检查跨服中心唯一性
@@ -111,7 +111,7 @@
__DoMixServerInit()
# 其他功能初始化
-
+ GameLogic_Qunying.OnServerStart()
# 最后触发检查是否完全启动成功
PyGameData.g_initGameWorldOK = True
@@ -161,30 +161,6 @@
#PlayerDBOper.FindDBOper(PlayerDBOper.Table_DBPlayer, {}, {"PlayerID":1, "AccID":1, "_id":0}, LoadDBPlayerRet)
return
-def GMSetOpenServerTime(openServerTime):
- '''GM设置开服时间
- @param openServerTime: 开服时间戳
- @return: 1-成功;-1-设置的时间异常;-2-已经设置过且开服了,不能重复设置
- '''
- serverID = GameWorld.GetGameWorld().GetServerID()
- curTime = int(time.time())
- if openServerTime < curTime:
- GameWorld.ErrLog("当前时间已经超过设置的开服时间,不能设置! serverID=%s" % serverID)
- #GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_InvalidTime, "The set time is less than the current time.")
- return -1
- setOpenServerTime = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_SetOpenServerTime)
- if setOpenServerTime and curTime > setOpenServerTime:
- GameWorld.ErrLog("已经设置过且开服了,不能重复设置! serverID=%s" % serverID)
- #GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_ServerAlreadyOpen, "The server has been opened.")
- return -2
-
- DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_SetOpenServerTime, openServerTime)
- GameWorld.Log("GM设置开服时间: serverID=%s,%s,%s" % (serverID, GameWorld.ChangeTimeNumToStr(openServerTime), openServerTime))
- if openServerTime == curTime:
- OnNewServerOpen(GameWorld.GetGameWorld().GetTick())
-
- return 1
-
def DoCheckNewServerOpen(tick):
setOpenServerTime = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_SetOpenServerTime)
if not setOpenServerTime:
@@ -220,10 +196,14 @@
DBDataMgr.GetMailMgr().DelAllMail()
DBDataMgr.GetPlayerViewCacheMgr().DelAllCache()
+ # 设置允许跨服,该函数为自动开服会触发,所以要设置为允许跨服,手动开服的需后台手动设置为允许
+ DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_CanCross, 1)
SetInitOpenServerTime(setOpenServerTime)
AllMapServerInitOK(tick)
- GameWorld.GetGameWorld().SaveGameServerData()
+ #强制备档一次、入库
+ DBDataMgr.BackupGameWorldData(saveToDB=True)
+ #GameWorld.GetGameWorld().SaveGameServerData()
GameWorld.SendGameError("ClearOpenServerOK")
return
@@ -369,6 +349,14 @@
DataRecordPack.DR_OnLinePlayerCount(activePlayerCount) # 总在线
return
+def OnGM_CrossCenterEvent(gmEvent):
+ if not GameWorld.IsCrossCenter():
+ return
+ serverEventValue = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_CrossCenterEvent)
+ if DoLogic_CrossCenterEvent(serverEventValue, gmEvent=gmEvent):
+ CrossMgr.SendCrossServerEvent(gmEvent=gmEvent)
+ return
+
def DoLogic_GameWorldEvenByTime(tick):
'''跨服事件由跨服中心服务器驱动,游戏服使用原方式
跨服中心OnEvent -> 其他服务器OnEvent (包含个常规跨服服务器及游戏服,不保证谁先执行)
@@ -459,22 +447,23 @@
PlayerEventCounter.DoLogic_OnYear(tick)
return
-def DoLogic_CrossCenterEvent(centerEventValue, centerServerID=0):
+def DoLogic_CrossCenterEvent(centerEventValue, centerServerID=0, gmEvent=""):
## 收到跨服中心事件同步,如OnDay等
serverEventValue = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_CrossCenterEvent)
- if not serverEventValue:
- serverEventValue = centerEventValue
- DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_CrossCenterEvent, centerEventValue)
-
- if serverEventValue == centerEventValue:
+ #第一次也要执行一次
+ #if not serverEventValue:
+ # serverEventValue = centerEventValue
+ # DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_CrossCenterEvent, centerEventValue)
+
+ if serverEventValue == centerEventValue and not gmEvent:
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))
+ GameWorld.Log("本服与跨服中心事件值变化! serverEventValue=%s,centerEventValue=%s,centerServerID=%s,gmEvent=%s" % (serverEventValue, centerEventValue, centerServerID, gmEvent))
else:
- GameWorld.Log("跨服中心服务器事件值变化! serverEventValue=%s,centerEventValue=%s" % (serverEventValue, centerEventValue))
+ GameWorld.Log("跨服中心服务器事件值变化! serverEventValue=%s,centerEventValue=%s,gmEvent=%s" % (serverEventValue, centerEventValue, gmEvent))
serverEventTime = GameWorld.ChangeStrToDatetime("%s" % serverEventValue, ChConfig.TYPE_Time_Format_YmdH)
centerEventTime = GameWorld.ChangeStrToDatetime("%s" % centerEventValue, ChConfig.TYPE_Time_Format_YmdH)
@@ -496,12 +485,12 @@
isEvent = False
#OnHour事件
- if (serverHour != centerHour or serverDay != centerDay or serverMonth != centerMonth or serverYear != centerYear):
+ if (serverHour != centerHour or serverDay != centerDay or serverMonth != centerMonth or serverYear != centerYear or gmEvent == "GMOnHour"):
isEvent = True
PlayerEventCounter.DoLogic_CrossCenterOnHour(centerEventValue)
#OnDay事件
- if (serverDay != centerDay or serverMonth != centerMonth or serverYear != centerYear):
+ if (serverDay != centerDay or serverMonth != centerMonth or serverYear != centerYear or gmEvent == "GMOnDay"):
isEvent = True
PlayerEventCounter.DoLogic_CrossCenterOnDay(centerEventValue)
@@ -517,6 +506,15 @@
#if serverYear != curTimeYear:
# OnYear(tick)
+ # 游戏服额外处理玩家
+ if GameWorld.IsMainServer():
+ playerManager = GameWorld.GetPlayerManager()
+ for i in xrange(playerManager.OnlineCount()):
+ curPlayer = playerManager.OnlineAt(i)
+ if not GameWorld.IsNormalPlayer(curPlayer):
+ continue
+ PlayerEventCounter.PlayerOnCrossCenterEvent(curPlayer, centerEventValue, gmEvent=gmEvent)
+
return isEvent
def __CheckIpyDataRecycle(timeNow):
--
Gitblit v1.8.0