From 0323f1602690cba6522523d968b5ed2032dccba2 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期二, 16 九月 2025 14:37:45 +0800 Subject: [PATCH] 129 【战斗】战斗系统-服务端(李典技能;被动触发支持增加击晕概率;) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldEvent.py | 121 ++++++++++++++++++++++++++++++++++++++- 1 files changed, 116 insertions(+), 5 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 9e4ecb5..ecd028e 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldEvent.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldEvent.py @@ -17,9 +17,16 @@ import DBDataMgr import GameWorld +import IpyGameDataPY +import IPY_GameWorld import PlayerEventCounter +import PlayerControl +import NetPackCommon +import PlayerOnline import ShareDefine import PyGameData +import BattleObj +import ObjPool import datetime import time @@ -57,15 +64,23 @@ return Get_Server_Hour(), Get_Server_Day(), Get_Server_Week(), Get_Server_Month(), Get_Server_Year() +#调用该函数时,C++已经设置好区服,如果改变区服需重启 +def StartDB(tick): + #初始化数据库, 恢复备档(按区服记录), 加载静态表 + from PyMongoDB import PyMongoMain + PyMongoMain.StartDB() + InitGameWorld(tick) + return + def InitGameWorld(tick): ## GameWorld初始化 if PyGameData.g_initGameTime: return - PyGameData.g_initGameTime = int(time.time()) - serverID = GameWorld.GetServerID() + serverID = GameWorld.GetGameWorld().GetServerID() GameWorld.Log("服务器启动初始化InitGameWorld: serverID=%s" % serverID) DBDataMgr.OnServerStart() # 优先加载公共数据 LoadDBPlayer() + PyGameData.g_initGameTime = int(time.time()) # 放到加载数据之后 #初始话开服时间、星期几 initOpenServerTime = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_InitOpenServerTime) @@ -90,7 +105,7 @@ else: serverGroupID = GameWorld.GetServerGroupID() GameWorld.Log("服务器启动成功: ServerGroupID=%s,serverID=%s" % (serverGroupID, serverID)) - GameWorld.GetGameWorld().SetGameWorldDict(ShareDefine.Def_WorldKey_GameWorldInitOK, 1) + PyGameData.g_serverInitOK = True return def AllMapServerInitOK(tick): @@ -107,7 +122,7 @@ @param openServerTime: 开服时间戳 @return: 1-成功;-1-设置的时间异常;-2-已经设置过且开服了,不能重复设置 ''' - serverID = GameWorld.GetServerID() + serverID = GameWorld.GetGameWorld().GetServerID() curTime = int(time.time()) if openServerTime < curTime: GameWorld.ErrLog("当前时间已经超过设置的开服时间,不能设置! serverID=%s" % serverID) @@ -145,7 +160,7 @@ def OnNewServerOpen(tick): '''新服开启需要处理的逻辑''' - serverID = GameWorld.GetServerID() + serverID = GameWorld.GetGameWorld().GetServerID() GameWorld.Log("执行正式开服重置逻辑... serverID=%s" % serverID) setOpenServerTime = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_SetOpenServerTime) @@ -215,11 +230,32 @@ def OnHighProcess(tick): ## 每秒分钟执行一次 + if not PyGameData.g_initGameTime: + return + if tick - PyGameData.g_highProcessTick < 1000: + return + PyGameData.g_highProcessTick = tick + + if PyGameData.g_serverClosing: + CheckCloseMapOK() + return + + OnMinute(tick) + + # 其他逻辑 + + + return def OnMinute(tick): ## 每整分钟执行一次 curTime = GameWorld.GetCurrentTime() + curMinute = curTime.minute + if curMinute == PyGameData.g_minuteProcess: + return + PyGameData.g_minuteProcess = curMinute + #检查服务器正式开服 DoCheckNewServerOpen(tick) DBDataMgr.OnMinute(curTime) @@ -229,6 +265,11 @@ #GameWorldActionControl.Dispose_OperationActionState() #GameWorldActionControl.Dispose_DailyActionState() #GameWorldActionControl.Dispose_FBStateTime() + PlayerOnline.OnMinute() + BattleObj.OnMinute() + ObjPool.OnMinute() + + __CheckIpyDataRecycle(curTime) return def DoLogic_GameWorldEvenByTime(tick): @@ -307,3 +348,73 @@ PlayerEventCounter.DoLogic_OnYear(tick) return + +def __CheckIpyDataRecycle(timeNow): + ## 检查IpyData数据回收 + playerCount = GameWorld.GetPlayerManager().OnlineCount() + if playerCount: + PyGameData.g_ipyDataRecycleCheckTime = 0 + #GameWorld.DebugLog("地图还有玩家在线! playerCount=%s" % playerCount) + return + + curTime = GameWorld.ChangeDatetimeToNum(timeNow) + if not PyGameData.g_ipyDataRecycleCheckTime: + PyGameData.g_ipyDataRecycleCheckTime = curTime + #GameWorld.DebugLog("地图没有玩家在线") + return + + if PyGameData.g_ipyDataRecycleCheckTime == 1: + # 已经回收了 + #GameWorld.DebugLog("本次已经回收过了") + return + + if curTime - PyGameData.g_ipyDataRecycleCheckTime < 24 * 3600: + #GameWorld.DebugLog("还未到达回收时间, passSeconds=%s" % (curTime - PyGameData.g_ipyDataRecycleCheckTime)) + return + PyGameData.g_ipyDataRecycleCheckTime = 1 + IpyGameDataPY.IPYData.Recycle() + return + + +# 关闭地图通知py处理 +def CloseMap(tick): + serverID = GameWorld.GetGameWorld().GetServerID() + GameWorld.Log("地图服务器关闭开始保存数据! serverID=%s" % serverID) + PyGameData.g_serverClosing = 1 + + playerManager = GameWorld.GetPlayerManager() + for i in xrange(playerManager.GetPlayerCount()): + curPlayer = playerManager.GetPlayerByIndex(i) + if not curPlayer or curPlayer.GetID() == 0 or curPlayer.IsEmpty(): + continue + + #镜像玩家回收、真实玩家踢下线 + if GameWorld.IsMirrorPlayer(curPlayer): + PlayerControl.DeleteMirror(curPlayer) + else: + curPlayer.Kick(IPY_GameWorld.disMapServerClose) + + DBDataMgr.OnServerClose() + return + +def CheckCloseMapOK(): + '''检查等待关服数据处理完毕 + 没有玩家了,且公共数据已入库完毕 + ''' + if PyGameData.g_serverClosing != 1: + return + if not PyGameData.g_closeSaveDataOK: + return + if GameWorld.GetPlayerManager().OnlineCount(): + return + DBDataMgr.ClearBackupFile() # 正常关服数据处理完毕可直接删除备档 + + from PyMongoDB.DBCommon import CommonDefine + from PyMongoDB.Common import CommFunc + data = '' + data = CommFunc.WriteBYTE(data, CommonDefine.dgPlayerSaveGameServerData) + NetPackCommon.SendPyPackToMapServerSelf(data, len(data)) + GameWorld.Log("python 已处理地图关闭逻辑") + PyGameData.g_serverClosing = 2 + return + \ No newline at end of file -- Gitblit v1.8.0