From 0229be00d8c80d62d6e50a2f45a8d5f7e6a4cb3e Mon Sep 17 00:00:00 2001 From: hch <305670599@qq.com> Date: 星期三, 19 六月 2024 00:49:37 +0800 Subject: [PATCH] 10182 【越南】【香港】【砍树】【主干】玩家数据扩展和排行榜扩展 --- ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py | 141 ++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 115 insertions(+), 26 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py index 8860fd5..8fa0ef5 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py @@ -81,7 +81,6 @@ import ShareDefine import GameWorldAverageLv import PlayerDBOper -import PlayerGeTui import GameWorldBoss import PlayerCompensation import ReadChConfig @@ -90,18 +89,30 @@ import CrossRealmPK import CrossRealmMsg import CrossRealmPlayer +import CrossBattlefield +import CrossActionControl import PlayerFBHelpBattle import PlayerFamilyRedPacket import PlayerFairyDomain import IpyGameDataPY import PlayerFamilyParty +import PlayerFamilyZhenfa import GameWorldFamilyWar import GameWorldArena +import CrossLuckyCloudBuy import AuctionHouse import PlayerXMZZ +import PlayerLove import PlayerTeam import PyGameData +import CrossBoss import ChPlayer +import PyDataManager +import GameWorldOpenServerCampaign +import CrossBillboard +import CrossChampionship +import GameWorldMineArea +import GameWorldAlineInvade #--------------------------------------------------------------------- #--------------------------------------------------------------------- @@ -137,6 +148,7 @@ GameWorld.Log("GameServer -> OnDay!") #排行榜拷贝昨日榜单 PlayerBillboard.CopyBillboardOnDay() + CrossBillboard.CopyBillboardOnDay() #开服活动,放在排行榜拷贝昨日榜更新后处理 PlayerEventCounter.DoLogic_GameServer_OnDay(tick) # 通知开服天数, 放在地图OnDay之前处理, 不然地图在OnDay时需要用到开服天时会取到昨天的值 @@ -162,13 +174,19 @@ # 通知开服天数 #openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) #GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_ServerDay, openServerDay) + GameWorldOpenServerCampaign.DoOnDay() #清理过期补偿 PlayerCompensation.ClearUpTimeOutCompensation() - #PlayerGeTui.ClearFMTGeTuiLimit() import PlayerBourse PlayerBourse.OverTimeItemsDeal() # 仙盟联赛 GameWorldFamilyWar.DoOnDay() + # 情缘 + PlayerLove.DoOnDay() + # 云购 + CrossLuckyCloudBuy.DoOnDay() + # 异兽入侵 + GameWorldAlineInvade.DoOnDay() return def OnDayEx(tick): @@ -296,8 +314,7 @@ CrossRealmPK.OnPKMatchProcess(tick) GameWorldBoss.DoCheckWorldBossReborn(tick) - #GameWorldBoss.ProcessBossGeTui(tick) - #PlayerGeTui.ProcessNewGuyCallBackGeTui(tick) + #组队副本版本 PlayerTeam.DoTeamProcess(tick) @@ -306,6 +323,12 @@ #拍卖行 AuctionHouse.OnAuctionItemTimeProcess(curTime, tick) + + #情缘 + PlayerLove.OnTimeProcess(curTime, tick) + + #福地 + GameWorldMineArea.OnMineItemTimeProcess(curTime, tick) #每整分钟处理一次 curDateTime = datetime.datetime.today() @@ -340,9 +363,11 @@ def GameWorldProcessOnMinute(curMinute, tick): # 每整分钟触发一次 + CheckServerHasPlayerLoginAfterInitOK() #检查服务器正式开服 DoCheckNewServerOpen(tick) - + #回报数据库当前在线玩家数 + DisposeGameActivePlayer(tick) #处理游戏世界中的时间事件 DisposeGameWorldEvenByTime(tick) GameWorldActionControl.Dispose_OperationActionState() @@ -350,6 +375,9 @@ GameWorldActionControl.Dispose_FBStateTime() #跨服PK CrossRealmPK.OnMinuteProcess() + #跨服排位 + CrossChampionship.OnMinuteProcess(curMinute) + CrossBattlefield.OnMinuteProcess() #处理重开服务器后, 活动继续开启逻辑根据天数 #GameWorldActionControl.Dispose_Action_GoOn_ByDay(tick) #触发世界等级 @@ -360,9 +388,34 @@ PlayerFamilyRedPacket.OnRedPacketMinuteProcess() #拍卖行 AuctionHouse.OnAuctionItemMinuteProcess(tick) + #福地 + GameWorldMineArea.OnProcessOnMinute() #每5分钟触发一次仙盟总战力更新 if curMinute % 5 == 0: PlayerFamily.UpdFamilyTotalFightPower() + PlayerFamilyRedPacket.CheckDelRedpacketData() + + return + +def CheckServerHasPlayerLoginAfterInitOK(): + ## 检查服务器启动成功后是否有玩家正常登录 + initGameWorldTime = GameWorld.GetGameWorld().GetDictByKey(ChConfig.Def_WorldKey_IsGameWorldInit) + if not initGameWorldTime: + return + + if PyGameData.g_noPlayerLoginWarningMailState: + return + + curTime = int(time.time()) + noPlayerLoginWarningTimes = IpyGameDataPY.GetFuncCfg("ServerEvent", 1) * 60 # x分钟没有玩家登录则预警 + if curTime - initGameWorldTime < noPlayerLoginWarningTimes: + return + + GameWorld.SendGameError("NoPlayerLogin") + PyGameData.g_noPlayerLoginWarningMailState = 1 + return + +def OnReloadConfig(): return #--------------------------------------------------------------------- @@ -388,7 +441,7 @@ #处理世界活动 DisposeGameWorldGame(tick) #回报数据库当前在线玩家数 - DisposeGameActivePlayer(tick) + #DisposeGameActivePlayer(tick) #同步地图服务器时间 Dispose_MapServer_Time(tick) #保存玩家数据 @@ -588,15 +641,18 @@ #activePlayerCount = GameWorld.GetPlayerManager().GetActivePlayerCount() #DataRecordPack.DR_OnLinePlayerCount(activePlayerCount, platformOLDict, tjgOnlineCnt) #=========================================================================== - for platform, playerCnt in platformOLDict.items(): - DataRecordPack.DR_OnLinePlayerCount(playerCnt, platform, tjgOnlineCnt) # 单平台 - EventReport.WriteEvent_concurrency(playerCnt, 0, platform) # 单平台 此处不能传脱机挂玩家总数 - - + isMixture = False #是否混服 + if isMixture: + for platform, playerCnt in platformOLDict.items(): + DataRecordPack.DR_OnLinePlayerCount(playerCnt, platform, tjgOnlineCnt) # 单平台 + EventReport.WriteEvent_concurrency(playerCnt, 0, platform) # 单平台 此处不能传脱机挂玩家总数 + DataRecordPack.DR_OnLinePlayerCount(activePlayerCount, {}, tjgOnlineCnt) # 总在线 + #EventReport.WriteEvent_concurrency(activePlayerCount, tjgOnlineCnt) + else: + serverPlatform = GameWorld.GetPlatform() + DataRecordPack.DR_OnLinePlayerCount(activePlayerCount, {}, tjgOnlineCnt) # 总在线 + EventReport.WriteEvent_concurrency(activePlayerCount, tjgOnlineCnt, serverPlatform) #=========================================================================== - - DataRecordPack.DR_OnLinePlayerCount(activePlayerCount, {}, tjgOnlineCnt) # 总在线 - #EventReport.WriteEvent_concurrency(activePlayerCount, tjgOnlineCnt) #刷新当前地图服务器 #=========================================================================== # custom_concurrencyMapList = ReadChConfig.GetEvalChConfig("EventReportMapID") @@ -1201,6 +1257,7 @@ def InitGameWorld(tick): #标记GameWorld初始化完成 GameWorld.GetGameWorld().SetDict(ChConfig.Def_WorldKey_IsGameWorldInit, int(time.time())) + PlayerControl.LoadDBPlayer() #初始化游戏时钟 GameWorld.GetGameWorld().SetTickTypeCount(ChConfig.TYPE_Tick_Count) #初始话开服时间、星期几 @@ -1239,6 +1296,14 @@ GameWorldArena.OnServerStart() #跨服PK CrossRealmPK.OnGameServerInitOK() + #跨服排位 + CrossChampionship.OnServerStart() + #跨服战场 + CrossBattlefield.OnServerStart() + #红包 + PlayerFamilyRedPacket.OnServerStart() + #云购 + CrossLuckyCloudBuy.OnServerStart() #世界boss被杀次数重置 #GameWorldBoss.CheckResetBossKilledCntOnServerInit() @@ -1259,6 +1324,11 @@ AuctionHouse.OnGameServerInitOK() # 注意:跨服相关信息的调用需放在最后,不然可能导致服务器未启动功能或者功能未加载成功导致跨服服务器与子服之间的数据同步可能出现异常的情况 CrossRealmMsg.OnGameServerInitOK() + if PyGameData.g_allMapServerInitOK: + GameWorld.Log("InitGameWorld时AllMapServerInitOK已触发则补触发一次!") + GameWorld.SendGameError("GameWarning", "InitGameWorld later than AllMapServerInitOK") + AllMapServerInitOK(tick) + return def DoCheckNewServerOpen(tick): @@ -1315,7 +1385,8 @@ universalRecMgr.Delete(recType) if recordCount: GameWorld.Log("DeleteRecData recType=%s, count=%s" % (recType, recordCount)) - + CrossBoss.g_bossRecDataDict = {} # 需要清除,不然会导致跨服boss通用记录缓存对象错误 + #清 家族 familyList = [] familyMgr = GameWorld.GetFamilyManager() @@ -1330,11 +1401,18 @@ PyGameData.g_sortBOSSRefreshList = [] # boss刷新信息记录缓存重置, 不重置会导致通知前端的boss信息为空 + GameWorldArena.OnServerStart() + + CrossBattlefield.OnServerStart() + PlayerDBGSEvent.SetInitOpenServerTime(setOpenServerTime) ReadChConfig.ReloadConfig() AllMapServerInitOK(tick) + + GameWorld.GetGameWorld().SaveGameServerData() + GameWorld.SendGameError("ClearOpenServerOK") return ## 服务器开服时是星期几 @@ -1345,6 +1423,10 @@ # @return None # @remarks 当一个mapServer开启时, def AllMapServerInitOK(tick): + PyGameData.g_allMapServerInitOK = True + if not GameWorld.GetGameWorld().GetDictByKey(ChConfig.Def_WorldKey_IsGameWorldInit): + GameWorld.Log("AllMapServerInitOK时GameServer还未启动好!") + return #通知所有地图服务器初始化成功, 同步时间 GameWorld.GetGameWorld().Notify_AllMapServerInitOK(GameWorld.GetCurrentDataTimeStr()) @@ -1408,22 +1490,31 @@ GameWorldFamilyWar.OnMapServerInitOK() # 跨服服务器状态 + GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossServerTime, PyGameData.g_crossServerTimeInfo) isCrossServerOpen = GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossServerOpen) GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossServerOpen, isCrossServerOpen) GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossZoneName, PyGameData.g_crossZoneName) # 跨服PK CrossRealmPK.OnMapServerInitOK() + #跨服战场 + CrossBattlefield.OnMapServerInitOK() # 本服竞技场 GameWorldArena.SendMapServerArenaInfo() + # 幸运云购 + CrossLuckyCloudBuy.OnMapServerInitOK() SendAllMapGlobalDropInfo() # 全局掉落控制 SendMapCommMapLinePlayerCount(True) # 同步一次普通地图线路人数信息 #随机假仙盟 PlayerFamily.RandomFakeFamily() + #仙盟阵法 + PlayerFamilyZhenfa.OnMapServerInitOK() #缥缈仙域 PlayerFairyDomain.OnMapServerInitOK() + #情侣信息 + PyDataManager.GetDBPyCoupleManager().SendMapServerCoupleInfo() # 记录服务器是否正常开启完毕 getUrl = ReadChConfig.GetPyMongoConfig("EventReport", "OpenStateUrl") + "?Type=MapInit&MapCount=%s"%GameWorld.GetGameWorld().GetGameMapManager().GetCount() GameWorld.GetGameWorld().EventReport_EventReport("", "", "", "", 0, getUrl) @@ -1839,20 +1930,12 @@ if mapServerPack.GetState() not in [0,1,2,3] and curMap.GetState() != mapServerPack.GetState(): # 记录服务器是否正常开启完毕, 避免重复发送 GameWorld.DebugLog("MapServer_RunningStateRefresh--_%s"%([mapServerPack.GetState(), curMap.GetState(), mapServerPack.GetMapID(), curMap.GetID()])) - SendGameError("MapError") + GameWorld.SendGameError("MapError") curMap.SetState(mapServerPack.GetState()) curMap.SetRefreshTick(tick) return - - -def SendGameError(state): - getUrl = ReadChConfig.GetPyMongoConfig("EventReport", "OpenStateUrl") - groupID = ReadChConfig.GetPyMongoConfig("platform", "GroupID") - userDBName = ReadChConfig.GetPyMongoConfig("connect", "USER_DB_NAME") - getUrl = getUrl + "?Type=%s&groupID=%s&userDBName=%s"%(state, groupID, userDBName) - GameWorld.GetGameWorld().EventReport_EventReport("", "", "", "", 0, getUrl) ## 刷新地图服务器状态, 如果1分钟没有状态回报, 刷新为消失状态 # @param tick 当前时间 @@ -1880,7 +1963,7 @@ curMap.SetState(IPY_GameServer.mssNone) if not isSendMapClose: # 避免多地图发送过多邮件, 如关服的时候 - SendGameError("MapDisconnect") # 状态报告 + GameWorld.SendGameError("MapDisconnect") # 状态报告 isSendMapClose = True return @@ -1930,7 +2013,13 @@ PlayerTeam.OnServerClose(tick) ChPlayer.SavePlayerLVData() PlayerFBHelpBattle.OnServerClose() + CrossActionControl.OnServerClose() + CrossChampionship.OnServerClose() + CrossBattlefield.OnServerClose() + PlayerFamilyRedPacket.OnServerClose() + CrossLuckyCloudBuy.OnServerClose() GameWorldArena.OnServerClose() + PlayerLove.OnServerClose() GameWorld.Log("通知C++关服!") GameWorld.GetGameWorld().OnServerClose() @@ -1938,6 +2027,6 @@ def ChangeGameServerState(state): # 只接收大于等于mssPyError GameWorld.DebugLog("ChangeGameServerState:%s"%state) - SendGameError("GameServerError") + GameWorld.SendGameError("GameServerError") \ No newline at end of file -- Gitblit v1.8.0