hxp
2023-09-27 e6062b42c1191e9ab95e000a38276634eff0e1f1
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
@@ -90,6 +90,7 @@
import CrossRealmPK
import CrossRealmMsg
import CrossRealmPlayer
import CrossBattlefield
import CrossActionControl
import PlayerFBHelpBattle
import PlayerFamilyRedPacket
@@ -98,12 +99,18 @@
import PlayerFamilyParty
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
#---------------------------------------------------------------------
#---------------------------------------------------------------------
@@ -139,6 +146,7 @@
    GameWorld.Log("GameServer -> OnDay!")
    #排行榜拷贝昨日榜单
    PlayerBillboard.CopyBillboardOnDay()
    CrossBillboard.CopyBillboardOnDay()
    #开服活动,放在排行榜拷贝昨日榜更新后处理
    PlayerEventCounter.DoLogic_GameServer_OnDay(tick)
    # 通知开服天数, 放在地图OnDay之前处理, 不然地图在OnDay时需要用到开服天时会取到昨天的值
@@ -164,6 +172,7 @@
    # 通知开服天数
    #openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay)
    #GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_ServerDay, openServerDay)
    GameWorldOpenServerCampaign.DoOnDay()
    #清理过期补偿
    PlayerCompensation.ClearUpTimeOutCompensation()
    #PlayerGeTui.ClearFMTGeTuiLimit()
@@ -171,6 +180,10 @@
    PlayerBourse.OverTimeItemsDeal()
    # 仙盟联赛
    GameWorldFamilyWar.DoOnDay()
    # 情缘
    PlayerLove.DoOnDay()
    # 云购
    CrossLuckyCloudBuy.DoOnDay()
    return
def OnDayEx(tick):
@@ -309,6 +322,9 @@
    #拍卖行
    AuctionHouse.OnAuctionItemTimeProcess(curTime, tick)
    
    #情缘
    PlayerLove.OnTimeProcess(curTime, tick)
    #每整分钟处理一次
    curDateTime = datetime.datetime.today()
    curMinute = curDateTime.minute
@@ -342,9 +358,11 @@
def GameWorldProcessOnMinute(curMinute, tick):
    # 每整分钟触发一次
    CheckServerHasPlayerLoginAfterInitOK()
    #检查服务器正式开服
    DoCheckNewServerOpen(tick)
    #回报数据库当前在线玩家数
    DisposeGameActivePlayer(tick)
    #处理游戏世界中的时间事件
    DisposeGameWorldEvenByTime(tick)
    GameWorldActionControl.Dispose_OperationActionState()
@@ -352,6 +370,9 @@
    GameWorldActionControl.Dispose_FBStateTime()
    #跨服PK
    CrossRealmPK.OnMinuteProcess()
    #跨服排位
    CrossChampionship.OnMinuteProcess(curMinute)
    CrossBattlefield.OnMinuteProcess()
    #处理重开服务器后, 活动继续开启逻辑根据天数
    #GameWorldActionControl.Dispose_Action_GoOn_ByDay(tick)
    #触发世界等级
@@ -365,6 +386,29 @@
    #每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
#---------------------------------------------------------------------
@@ -390,7 +434,7 @@
    #处理世界活动
    DisposeGameWorldGame(tick)
    #回报数据库当前在线玩家数
    DisposeGameActivePlayer(tick)
    #DisposeGameActivePlayer(tick)
    #同步地图服务器时间
    Dispose_MapServer_Time(tick)
    #保存玩家数据
@@ -590,15 +634,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")
@@ -1203,6 +1250,7 @@
def InitGameWorld(tick):
    #标记GameWorld初始化完成
    GameWorld.GetGameWorld().SetDict(ChConfig.Def_WorldKey_IsGameWorldInit, int(time.time()))
    PlayerControl.LoadDBPlayer()
    #初始化游戏时钟
    GameWorld.GetGameWorld().SetTickTypeCount(ChConfig.TYPE_Tick_Count)
    #初始话开服时间、星期几
@@ -1241,6 +1289,14 @@
    GameWorldArena.OnServerStart()
    #跨服PK
    CrossRealmPK.OnGameServerInitOK()
    #跨服排位
    CrossChampionship.OnServerStart()
    #跨服战场
    CrossBattlefield.OnServerStart()
    #红包
    PlayerFamilyRedPacket.OnServerStart()
    #云购
    CrossLuckyCloudBuy.OnServerStart()
    #世界boss被杀次数重置
    #GameWorldBoss.CheckResetBossKilledCntOnServerInit()
    
@@ -1261,6 +1317,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):
@@ -1333,11 +1394,18 @@
    
    PyGameData.g_sortBOSSRefreshList = [] # boss刷新信息记录缓存重置, 不重置会导致通知前端的boss信息为空
    
    GameWorldArena.OnServerStart()
    CrossBattlefield.OnServerStart()
    PlayerDBGSEvent.SetInitOpenServerTime(setOpenServerTime)
    
    ReadChConfig.ReloadConfig()
    
    AllMapServerInitOK(tick)
    GameWorld.GetGameWorld().SaveGameServerData()
    GameWorld.SendGameError("ClearOpenServerOK")
    return
## 服务器开服时是星期几
@@ -1348,6 +1416,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())
    
@@ -1411,14 +1483,19 @@
    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() # 全局掉落控制
    
@@ -1427,6 +1504,8 @@
    PlayerFamily.RandomFakeFamily()
    #缥缈仙域
    PlayerFairyDomain.OnMapServerInitOK()
    #情侣信息
    PyDataManager.GetDBPyCoupleManager().SendMapServerCoupleInfo()
    # 记录服务器是否正常开启完毕
    getUrl = ReadChConfig.GetPyMongoConfig("EventReport", "OpenStateUrl") + "?Type=MapInit&MapCount=%s"%GameWorld.GetGameWorld().GetGameMapManager().GetCount()
    GameWorld.GetGameWorld().EventReport_EventReport("", "", "", "", 0, getUrl)
@@ -1842,20 +1921,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 当前时间
@@ -1883,7 +1954,7 @@
        curMap.SetState(IPY_GameServer.mssNone)
        if not isSendMapClose:
            # 避免多地图发送过多邮件, 如关服的时候
            SendGameError("MapDisconnect")   # 状态报告
            GameWorld.SendGameError("MapDisconnect")   # 状态报告
            isSendMapClose = True
    return
@@ -1934,7 +2005,12 @@
    ChPlayer.SavePlayerLVData()
    PlayerFBHelpBattle.OnServerClose()
    CrossActionControl.OnServerClose()
    CrossChampionship.OnServerClose()
    CrossBattlefield.OnServerClose()
    PlayerFamilyRedPacket.OnServerClose()
    CrossLuckyCloudBuy.OnServerClose()
    GameWorldArena.OnServerClose()
    PlayerLove.OnServerClose()
    GameWorld.Log("通知C++关服!")
    GameWorld.GetGameWorld().OnServerClose()
    
@@ -1942,6 +2018,6 @@
def ChangeGameServerState(state):
    # 只接收大于等于mssPyError
    GameWorld.DebugLog("ChangeGameServerState:%s"%state)
    SendGameError("GameServerError")
    GameWorld.SendGameError("GameServerError")