hxp
2024-09-18 458f8ad37f944f5a4334dc9e522e6640e4aa2def
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
@@ -90,20 +90,33 @@
import CrossRealmPK
import CrossRealmMsg
import CrossRealmPlayer
import CrossBattlefield
import CrossActionControl
import PlayerFBHelpBattle
import PlayerFamilyRedPacket
import PlayerFairyDomain
import IpyGameDataPY
import PlayerFamilyParty
import PlayerFamilyZhenfa
import PlayerFamilyEmblem
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 PlayerFuncTeam
import GameWorship
import os
#---------------------------------------------------------------------
#---------------------------------------------------------------------
@@ -139,6 +152,7 @@
    GameWorld.Log("GameServer -> OnDay!")
    #排行榜拷贝昨日榜单
    PlayerBillboard.CopyBillboardOnDay()
    CrossBillboard.CopyBillboardOnDay()
    #开服活动,放在排行榜拷贝昨日榜更新后处理
    PlayerEventCounter.DoLogic_GameServer_OnDay(tick)
    # 通知开服天数, 放在地图OnDay之前处理, 不然地图在OnDay时需要用到开服天时会取到昨天的值
@@ -164,6 +178,7 @@
    # 通知开服天数
    #openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay)
    #GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_ServerDay, openServerDay)
    GameWorldOpenServerCampaign.DoOnDay()
    #清理过期补偿
    PlayerCompensation.ClearUpTimeOutCompensation()
    #PlayerGeTui.ClearFMTGeTuiLimit()
@@ -171,6 +186,12 @@
    PlayerBourse.OverTimeItemsDeal()
    # 仙盟联赛
    GameWorldFamilyWar.DoOnDay()
    # 情缘
    PlayerLove.DoOnDay()
    # 云购
    CrossLuckyCloudBuy.DoOnDay()
    # 膜拜
    GameWorship.DoOnDay()
    return
def OnDayEx(tick):
@@ -309,6 +330,12 @@
    #拍卖行
    AuctionHouse.OnAuctionItemTimeProcess(curTime, tick)
    
    #情缘
    PlayerLove.OnTimeProcess(curTime, tick)
    #福地
    GameWorldMineArea.OnMineItemTimeProcess(curTime, tick)
    #每整分钟处理一次
    curDateTime = datetime.datetime.today()
    curMinute = curDateTime.minute
@@ -342,16 +369,23 @@
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)
    #触发世界等级
@@ -362,11 +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
#---------------------------------------------------------------------
@@ -392,7 +457,7 @@
    #处理世界活动
    DisposeGameWorldGame(tick)
    #回报数据库当前在线玩家数
    DisposeGameActivePlayer(tick)
    #DisposeGameActivePlayer(tick)
    #同步地图服务器时间
    Dispose_MapServer_Time(tick)
    #保存玩家数据
@@ -592,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")
@@ -1205,6 +1273,7 @@
def InitGameWorld(tick):
    #标记GameWorld初始化完成
    GameWorld.GetGameWorld().SetDict(ChConfig.Def_WorldKey_IsGameWorldInit, int(time.time()))
    LoadDBPlayer()
    #初始化游戏时钟
    GameWorld.GetGameWorld().SetTickTypeCount(ChConfig.TYPE_Tick_Count)
    #初始话开服时间、星期几
@@ -1220,8 +1289,10 @@
    GameWorld.GetGameWorld().GetDBGoldOrderFormMgr().Sort()
    #排序排行榜
    PlayerBillboard.SortServerBillboard()
    #排序仙盟
    PlayerFamily.DoFamilySort()
    #功能队伍
    PlayerFuncTeam.OnGameServerInitOK()
    #仙盟
    PlayerFamily.OnGameServerInitOK()
    GameWorldActionControl.Dispose_FBStateTime()
    #仙盟联赛
    GameWorldFamilyWar.OnGameServerInitOK()
@@ -1243,8 +1314,15 @@
    GameWorldArena.OnServerStart()
    #跨服PK
    CrossRealmPK.OnGameServerInitOK()
    #跨服排位
    CrossChampionship.OnServerStart()
    #跨服战场
    CrossBattlefield.OnServerStart()
    GameWorship.OnServerStart()
    #红包
    PlayerFamilyRedPacket.OnServerStart()
    #云购
    CrossLuckyCloudBuy.OnServerStart()
    #世界boss被杀次数重置
    #GameWorldBoss.CheckResetBossKilledCntOnServerInit()
    
@@ -1270,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):
@@ -1344,11 +1436,16 @@
    
    GameWorldArena.OnServerStart()
    
    CrossBattlefield.OnServerStart()
    PlayerDBGSEvent.SetInitOpenServerTime(setOpenServerTime)
    
    ReadChConfig.ReloadConfig()
    
    AllMapServerInitOK(tick)
    GameWorld.GetGameWorld().SaveGameServerData()
    GameWorld.SendGameError("ClearOpenServerOK")
    return
## 服务器开服时是星期几
@@ -1363,6 +1460,7 @@
    if not GameWorld.GetGameWorld().GetDictByKey(ChConfig.Def_WorldKey_IsGameWorldInit):
        GameWorld.Log("AllMapServerInitOK时GameServer还未启动好!")
        return
    __CheckAllMapInitOK()
    #通知所有地图服务器初始化成功, 同步时间
    GameWorld.GetGameWorld().Notify_AllMapServerInitOK(GameWorld.GetCurrentDataTimeStr())
    
@@ -1408,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) 
@@ -1426,25 +1527,69 @@
    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)
    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
## 服务器合服首次启动数据加载处理
@@ -1473,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)
@@ -1941,8 +2080,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()