ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldEvent.py
@@ -17,11 +17,18 @@
import DBDataMgr
import GameWorld
import PlayerFamily
import IpyGameDataPY
import IPY_GameWorld
import PlayerEventCounter
import PlayerControl
import NetPackCommon
import PlayerOnline
import ShareDefine
import PlayerTeam
import PyGameData
import BattleObj
import ChPlayer
import ObjPool
import datetime
import time
@@ -227,9 +234,28 @@
    ## 每秒分钟执行一次
    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
    OnMinute(tick)
    
    # 其他逻辑
@@ -238,6 +264,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()
@@ -255,8 +296,11 @@
    #GameWorldActionControl.Dispose_OperationActionState()
    #GameWorldActionControl.Dispose_DailyActionState()
    #GameWorldActionControl.Dispose_FBStateTime()
    PlayerFamily.OnMinute()
    PlayerOnline.OnMinute()
    BattleObj.OnMinute()
    ObjPool.OnMinute(curTime)
    
    PlayerTeam.OnCheckTeamPlayerDisconnectTimeout(tick)
    __CheckIpyDataRecycle(curTime)
    return
    
@@ -362,3 +406,47 @@
    PyGameData.g_ipyDataRecycleCheckTime = 1    
    IpyGameDataPY.IPYData.Recycle()
    return
# 关闭地图通知py处理
def CloseMap(tick):
    serverID = GameWorld.GetGameWorld().GetServerID()
    GameWorld.Log("地图服务器关闭开始保存数据! serverID=%s" % serverID)
    PyGameData.g_serverClosing = 1
    playerManager = GameWorld.GetPlayerManager()
    for i in xrange(playerManager.GetPlayerCount()):
        curPlayer = playerManager.GetPlayerByIndex(i)
        if not curPlayer or curPlayer.GetID() == 0 or curPlayer.IsEmpty():
            continue
        #镜像玩家回收、真实玩家踢下线
        if GameWorld.IsMirrorPlayer(curPlayer):
            PlayerControl.DeleteMirror(curPlayer)
        else:
            curPlayer.Kick(IPY_GameWorld.disMapServerClose)
    DBDataMgr.OnServerClose()
    return
def CheckCloseMapOK():
    '''检查等待关服数据处理完毕
    没有玩家了,且公共数据已入库完毕
    '''
    if PyGameData.g_serverClosing != 1:
        return
    if not PyGameData.g_closeSaveDataOK:
        return
    if GameWorld.GetPlayerManager().OnlineCount():
        return
    DBDataMgr.ClearBackupFile() # 正常关服数据处理完毕可直接删除备档
    from PyMongoDB.DBCommon import CommonDefine
    from PyMongoDB.Common import CommFunc
    data = ''
    data = CommFunc.WriteBYTE(data, CommonDefine.dgPlayerSaveGameServerData)
    NetPackCommon.SendPyPackToMapServerSelf(data, len(data))
    GameWorld.Log("python 已处理地图关闭逻辑")
    PyGameData.g_serverClosing = 2
    return