hxp
2024-09-18 458f8ad37f944f5a4334dc9e522e6640e4aa2def
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
@@ -97,6 +97,8 @@
import PlayerFairyDomain
import IpyGameDataPY
import PlayerFamilyParty
import PlayerFamilyZhenfa
import PlayerFamilyEmblem
import GameWorldFamilyWar
import GameWorldArena
import CrossLuckyCloudBuy
@@ -110,6 +112,11 @@
import PyDataManager
import GameWorldOpenServerCampaign
import CrossBillboard
import CrossChampionship
import GameWorldMineArea
import PlayerFuncTeam
import GameWorship
import os
#---------------------------------------------------------------------
#---------------------------------------------------------------------
@@ -183,6 +190,8 @@
    PlayerLove.DoOnDay()
    # 云购
    CrossLuckyCloudBuy.DoOnDay()
    # 膜拜
    GameWorship.DoOnDay()
    return
def OnDayEx(tick):
@@ -324,6 +333,9 @@
    #情缘
    PlayerLove.OnTimeProcess(curTime, tick)
    
    #福地
    GameWorldMineArea.OnMineItemTimeProcess(curTime, tick)
    #每整分钟处理一次
    curDateTime = datetime.datetime.today()
    curMinute = curDateTime.minute
@@ -357,16 +369,22 @@
def GameWorldProcessOnMinute(curMinute, tick):
    # 每整分钟触发一次
    CheckServerHasPlayerLoginAfterInitOK()
    #检查服务器正式开服
    DoCheckNewServerOpen(tick)
    #回报数据库当前在线玩家数
    DisposeGameActivePlayer(tick)
    #处理游戏世界中的时间事件
    DisposeGameWorldEvenByTime(tick)
    #榜单
    CrossBillboard.OnMinuteProcess()
    GameWorldActionControl.Dispose_OperationActionState()
    GameWorldActionControl.Dispose_DailyActionState()
    GameWorldActionControl.Dispose_FBStateTime()
    #跨服PK
    CrossRealmPK.OnMinuteProcess()
    #跨服排位
    CrossChampionship.OnMinuteProcess(curMinute)
    CrossBattlefield.OnMinuteProcess()
    #处理重开服务器后, 活动继续开启逻辑根据天数
    #GameWorldActionControl.Dispose_Action_GoOn_ByDay(tick)
@@ -378,14 +396,42 @@
    PlayerFamilyRedPacket.OnRedPacketMinuteProcess()
    #拍卖行
    AuctionHouse.OnAuctionItemMinuteProcess(tick)
    #福地
    GameWorldMineArea.OnProcessOnMinute()
    #每5分钟触发一次仙盟总战力更新
    if curMinute % 5 == 0:
        PlayerFamily.UpdFamilyTotalFightPower()
        PlayerFamilyRedPacket.CheckDelRedpacketData()
        PlayerFamilyEmblem.CheckExpireEmblem()
        
    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():
    if GameWorld.IsCrossServer():
        # 跨服重读时重推跨服相关数据
        tick = GameWorld.GetGameWorld().GetTick()
        CrossRealmMsg.Sync_CrossServerInitDataToClientServer(tick, serverGroupID=0) # 这里设置为0,广播所有子服务器组
        return
    return
#---------------------------------------------------------------------
@@ -411,7 +457,7 @@
    #处理世界活动
    DisposeGameWorldGame(tick)
    #回报数据库当前在线玩家数
    DisposeGameActivePlayer(tick)
    #DisposeGameActivePlayer(tick)
    #同步地图服务器时间
    Dispose_MapServer_Time(tick)
    #保存玩家数据
@@ -611,15 +657,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")
@@ -1224,7 +1273,7 @@
def InitGameWorld(tick):
    #标记GameWorld初始化完成
    GameWorld.GetGameWorld().SetDict(ChConfig.Def_WorldKey_IsGameWorldInit, int(time.time()))
    PlayerControl.LoadDBPlayer()
    LoadDBPlayer()
    #初始化游戏时钟
    GameWorld.GetGameWorld().SetTickTypeCount(ChConfig.TYPE_Tick_Count)
    #初始话开服时间、星期几
@@ -1240,8 +1289,10 @@
    GameWorld.GetGameWorld().GetDBGoldOrderFormMgr().Sort()
    #排序排行榜
    PlayerBillboard.SortServerBillboard()
    #排序仙盟
    PlayerFamily.DoFamilySort()
    #功能队伍
    PlayerFuncTeam.OnGameServerInitOK()
    #仙盟
    PlayerFamily.OnGameServerInitOK()
    GameWorldActionControl.Dispose_FBStateTime()
    #仙盟联赛
    GameWorldFamilyWar.OnGameServerInitOK()
@@ -1263,8 +1314,11 @@
    GameWorldArena.OnServerStart()
    #跨服PK
    CrossRealmPK.OnGameServerInitOK()
    #跨服排位
    CrossChampionship.OnServerStart()
    #跨服战场
    CrossBattlefield.OnServerStart()
    GameWorship.OnServerStart()
    #红包
    PlayerFamilyRedPacket.OnServerStart()
    #云购
@@ -1294,6 +1348,20 @@
        GameWorld.SendGameError("GameWarning", "InitGameWorld later than AllMapServerInitOK")
        AllMapServerInitOK(tick)
        
    return
def LoadDBPlayer():
    if GameWorld.IsCrossServer():
        return
    PlayerDBOper.FindDBOper(PlayerDBOper.Table_DBPlayer, {}, {"PlayerID":1, "AccID":1, "_id":0}, LoadDBPlayerRet)
    return
def LoadDBPlayerRet(resultSetList, extendValueList):
    for resultDict in resultSetList:
        PyGameData.g_dbPlayerIDMap[resultDict["PlayerID"]] = resultDict["AccID"]
    GameWorld.Log("启动服务器加载DBPlayer玩家账号ID对应关系! %s, %s" % (len(PyGameData.g_dbPlayerIDMap), PyGameData.g_dbPlayerIDMap))
    PlayerFamily.OnLoadDBPlayerOK()
    return
def DoCheckNewServerOpen(tick):
@@ -1375,6 +1443,9 @@
    ReadChConfig.ReloadConfig()
    
    AllMapServerInitOK(tick)
    GameWorld.GetGameWorld().SaveGameServerData()
    GameWorld.SendGameError("ClearOpenServerOK")
    return
## 服务器开服时是星期几
@@ -1389,6 +1460,7 @@
    if not GameWorld.GetGameWorld().GetDictByKey(ChConfig.Def_WorldKey_IsGameWorldInit):
        GameWorld.Log("AllMapServerInitOK时GameServer还未启动好!")
        return
    __CheckAllMapInitOK()
    #通知所有地图服务器初始化成功, 同步时间
    GameWorld.GetGameWorld().Notify_AllMapServerInitOK(GameWorld.GetCurrentDataTimeStr())
    
@@ -1434,6 +1506,9 @@
    lastMixServerWorldLV = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_LastMixServerWorldLV)
    GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_LastMixServerWorldLV, lastMixServerWorldLV)
    
    # 功能队伍
    PlayerFuncTeam.OnMapServerInitOK()
    # 通知战盟相关活动开启状态
    fadState = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_FamilyActivityDayState)
    GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_FamilyActivityDayState, fadState) 
@@ -1471,6 +1546,8 @@
    SendMapCommMapLinePlayerCount(True) # 同步一次普通地图线路人数信息
    #随机假仙盟
    PlayerFamily.RandomFakeFamily()
    #仙盟阵法
    PlayerFamilyZhenfa.OnMapServerInitOK()
    #缥缈仙域
    PlayerFairyDomain.OnMapServerInitOK()
    #情侣信息
@@ -1478,6 +1555,41 @@
    # 记录服务器是否正常开启完毕
    getUrl = ReadChConfig.GetPyMongoConfig("EventReport", "OpenStateUrl") + "?Type=MapInit&MapCount=%s"%GameWorld.GetGameWorld().GetGameMapManager().GetCount()
    GameWorld.GetGameWorld().EventReport_EventReport("", "", "", "", 0, getUrl)
    return
def __CheckAllMapInitOK():
    ## 检查所有地图是否启动成功
    rootPath = ChConfig.GetServerRootPath()
    mapIDTxtPath = os.path.join(rootPath, "ZoneServerGroup\map1_8G\MapServer\MapServerData\Map\MapID.txt")
    if not os.path.isfile(mapIDTxtPath):
        GameWorld.ErrLog("MapID.txt不存在: %s" % mapIDTxtPath)
        return
    fileObj = open(mapIDTxtPath, 'rb')
    content = fileObj.read()
    fileObj.close()
    mapInfoDict = {}
    mapInfoList = content.split('\r\n')
    for info in mapInfoList:
        mapInfo = info.split('\t')
        if len(mapInfo) < 3:
            continue
        mapInfoDict[GameWorld.ToIntDef(mapInfo[1])] = mapInfo[2]
    gameMapManager = GameWorld.GetGameWorld().GetGameMapManager()
    for i in range(0, gameMapManager.GetCount()):
        curMap = gameMapManager.GetAt(i)
        mapID = curMap.GetID()
        state = curMap.GetState()
        if mapID in mapInfoDict and state == IPY_GameServer.mssRunning:
            mapInfoDict.pop(mapID)
    if not mapInfoDict:
        #GameWorld.Log("都启动成功了")
        return
    # 汇报没有启动启动成功的地图ID信息
    errorMapIDList = mapInfoDict.keys()
    GameWorld.SendGameError("AllMapInitError", "未启动成功地图:%s" % (str(errorMapIDList)))
    return
## 服务器合服首次启动数据加载处理
@@ -1506,14 +1618,8 @@
    # 删除过期的通用数据
    __DelOutofdayRecData(universalRecMgr)
    
    # 仙盟联赛重置
    GameWorldFamilyWar.DoFamilyWarReset()
    # 重置所有仙盟联赛评级
    familyManager = GameWorld.GetFamilyManager()
    for i in xrange(familyManager.GetCount()):
        family = familyManager.GetAt(i)
        PlayerFamily.SetFamilyWarRank(family, 0)
    PlayerFamily.DoFamilySort()
    # 仙盟
    PlayerFamily.OnMixServerInit()
    
    # 设置合服首次启动加载成功
    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_IsMixServerInitOK, 1)
@@ -1974,6 +2080,7 @@
    ChPlayer.SavePlayerLVData()
    PlayerFBHelpBattle.OnServerClose()
    CrossActionControl.OnServerClose()
    CrossChampionship.OnServerClose()
    CrossBattlefield.OnServerClose()
    PlayerFamilyRedPacket.OnServerClose()
    CrossLuckyCloudBuy.OnServerClose()