hxp
8 天以前 a1ea5474ffd2b081668f9a0cef8d069aa78db85d
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldEvent.py
@@ -17,14 +17,22 @@
import DBDataMgr
import GameWorld
import PyMongoMain
import PlayerFamily
import IpyGameDataPY
import IPY_GameWorld
import DataRecordPack
import PlayerEventCounter
import PlayerViewCache
import PlayerControl
import NetPackCommon
import PlayerOnline
import ShareDefine
import PlayerTeam
import PyGameData
import ItemCommon
import BattleObj
import ChPlayer
import ObjPool
import datetime
import time
@@ -65,7 +73,7 @@
#调用该函数时,C++已经设置好区服,如果改变区服需重启
def StartDB(tick):
    #初始化数据库, 恢复备档(按区服记录), 加载静态表
    from PyMongoDB import PyMongoMain
    #from PyMongoDB import PyMongoMain
    PyMongoMain.StartDB()
    InitGameWorld(tick)
    return
@@ -77,7 +85,9 @@
    serverID = GameWorld.GetGameWorld().GetServerID()
    GameWorld.Log("服务器启动初始化InitGameWorld: serverID=%s" % serverID)
    DBDataMgr.OnServerStart() # 优先加载公共数据
    ItemCommon.InitPyItem()
    LoadDBPlayer()
    PlayerViewCache.LoadRobot()
    PyGameData.g_initGameTime = int(time.time()) # 放到加载数据之后
    
    #初始话开服时间、星期几
@@ -230,13 +240,29 @@
    ## 每秒分钟执行一次
    if not PyGameData.g_initGameTime:
        return
    if tick - PyGameData.g_highProcessTick < 1000:
    curTime = int(time.time())
    if not PyGameData.g_highProcessTime:
        PyGameData.g_highProcessTime = curTime
    if curTime < PyGameData.g_highProcessTime:
        GameWorld.Log("时间回调了: lastProcessTime=%s" % (GameWorld.ChangeTimeNumToStr(PyGameData.g_highProcessTime)))
        PyGameData.g_highProcessTime = curTime
        OnFixServerTimeProcess()
    passSeconds = curTime - PyGameData.g_highProcessTime
    if passSeconds < 1:
        return
    PyGameData.g_highProcessTick = tick
    if passSeconds > 10:
        GameWorld.Log("时间误差过大: passSeconds=%s,lastProcessTime=%s" % (passSeconds, GameWorld.ChangeTimeNumToStr(PyGameData.g_highProcessTime)))
        OnFixServerTimeProcess()
    PyGameData.g_highProcessTime = curTime
    
    if PyGameData.g_serverClosing:
        CheckCloseMapOK()
        return
    PyMongoMain.GetUserCtrlDB().onSecondProcess()
    
    OnMinute(tick)
    
@@ -246,6 +272,21 @@
    
    return
def OnFixServerTimeProcess():
    # 补同步一次服务器时间给前端
    playerManager = GameWorld.GetPlayerManager()
    for i in xrange(playerManager.GetPlayerCount()):
        curPlayer = playerManager.GetPlayerByIndex(i)
        if not GameWorld.IsNormalPlayer(curPlayer):
            continue
        ChPlayer.Sync_PyServerDataTimeToClient(curPlayer)
        ChPlayer.Sync_OpenServerDay(curPlayer)
    return
def OnMinute(tick):
    ## 每整分钟执行一次
    curTime = GameWorld.GetCurrentTime()
@@ -259,15 +300,40 @@
    DBDataMgr.OnMinute(curTime)
    DoLogic_GameWorldEvenByTime(tick)
    
    #每5分钟
    if curMinute % 5 == 0:
        OnMinute_5(curTime, tick)
    #其他功能逻辑
    #GameWorldActionControl.Dispose_OperationActionState()
    #GameWorldActionControl.Dispose_DailyActionState()
    #GameWorldActionControl.Dispose_FBStateTime()
    PlayerControl.OnMinute(curTime)
    PlayerFamily.OnMinute()
    PlayerOnline.OnMinute()
    BattleObj.OnMinute()
    ObjPool.OnMinute(curTime)
    
    PlayerTeam.OnCheckTeamPlayerDisconnectTimeout(tick)
    __CheckIpyDataRecycle(curTime)
    return
    
def OnMinute_5(curTime, tick):
    ## 每5分钟
    DisposeGameActivePlayer(curTime, tick)
    return
def DisposeGameActivePlayer(curTime, tick):
    curMinute = curTime.minute
    gameWorld = GameWorld.GetGameWorld()
    noteData = gameWorld.GetGameWorldDictByKey("OnlineCntM")
    if noteData == curMinute:
        # 同一分钟只处理1次
        return
    gameWorld.SetGameWorldDict("OnlineCntM", curMinute)
    activePlayerCount = GameWorld.GetPlayerManager().OnlineCount()
    DataRecordPack.DR_OnLinePlayerCount(activePlayerCount) # 总在线
    return
def DoLogic_GameWorldEvenByTime(tick):
    #-----------服务器当前时间
    curTime = datetime.datetime.today()