Fix: 1536 【BUG】娲皇遗迹层数进入错误;
瞬间同时退出时可能导致该bug,修改为按最后一个退出的方式判断;
4个文件已修改
43 ■■■■■ 已修改文件
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ExitFB.py 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ExitFB.py
@@ -24,6 +24,16 @@
#  @return None
#  @remarks 函数详细说明.
def OnExec(curPlayer, paramList):
    ChPlayer.__Func_ExitFB(curPlayer, GameWorld.GetGameWorld().GetTick())
    tick = GameWorld.GetGameWorld().GetTick()
    isAll = paramList[0] if paramList else 0
    if isAll:
        copyMapPlayerManager = GameWorld.GetMapCopyPlayerManager()
        for i in xrange(copyMapPlayerManager.GetPlayerCount()):
            player = copyMapPlayerManager.GetPlayerByIndex(i)
            if player == None or player.IsEmpty():
                continue
            ChPlayer.__Func_ExitFB(player, tick)
        return
    ChPlayer.__Func_ExitFB(curPlayer, tick)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py
@@ -311,6 +311,26 @@
        return
    
    gameFB = GameWorld.GetGameFB()
    fbIndex = gameWorld.GetCurGameWorldIndex()
    if fbIndex in PyGameData.g_lastExitFBType:
        '''老模式根据 GetPlayerLogoffTick()、GetIsSafeClose()判断的话在某些情况下会有隐藏bug
                            因为当副本中玩家同时退出时可能出现  GameWorld.GetMapCopyPlayerManager().GetPlayerCount() != 1 的情况
                            所以老逻辑存在副本无法关闭的bug,这里只使用新模式,老模式暂不做修改,仅做兼容后备处理
        '''
        exitFBType, exitTick = PyGameData.g_lastExitFBType[fbIndex]
        if exitFBType == 1:
            passTick = tick - exitTick
            if passTick < ChConfig.Def_EmptyFBKeepTime:
                #GameWorld.DebugLog("最后一个玩家离线退出的,副本保护中!tick=%s,exitTick=%s,passTick=%s"
                #                   % (tick, exitTick, passTick), fbIndex)
                return
            #GameWorld.DebugLog("最后一个玩家离线退出的,副本保护超时,关闭副本!tick=%s,exitTick=%s,passTick=%s"
            #                   % (tick, exitTick, passTick), fbIndex)
        #else:
        #    GameWorld.DebugLog("最后一个玩家主动退出的,直接关闭副本!", fbIndex)
        PyGameData.g_lastExitFBType.pop(fbIndex)
        #GameWorld.DebugLog("PyGameData.g_lastExitFBType=%s" % PyGameData.g_lastExitFBType, fbIndex)
    else:
    logOffTick = gameFB.GetPlayerLogoffTick()
    if logOffTick == 0:
@@ -452,11 +472,11 @@
    
    __ProcessOpen(gameWorld, tick)
    
    __ProcessTimeKickPlayer(gameWorld, tick)
    __ProcessTimeKickPlayer(gameWorld, tick) # 处理副本生存周期强关副本
    
    __ProcessFBDelayKickPlayer(gameWorld, tick)
    __ProcessFBDelayKickPlayer(gameWorld, tick) # 关闭副本延迟踢出玩家
    
    __ProcessClose(gameWorld, tick)
    __ProcessClose(gameWorld, tick) # 自伸缩副本关闭逻辑
    
    __ProcessMapServerAcPlayer(tick)
    
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -1160,6 +1160,10 @@
#    3. 如果没有玩家存在, 副本回收
    if GameWorld.GetMap().GetMapFBType() != 0:
        #离开副本
        fbIndex = GameWorld.GetGameWorld().GetCurGameWorldIndex()
        exitFBType = 1 if isDisconnect else 2
        PyGameData.g_lastExitFBType[fbIndex] = [exitFBType, tick]
        #GameWorld.DebugLog("玩家离开副本:fbIndex=%s,exitFBType=%s, %s" % (fbIndex, exitFBType, PyGameData.g_lastExitFBType), curPlayer.GetPlayerID())
        FBLogic.DoExitFBLogic(curPlayer, tick)
    GameLogic_ManorWar.DoExitFB(curPlayer, tick)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
@@ -29,6 +29,7 @@
g_teamPlayerDict = {} # 地图队伍对应玩家ID列表,含离线玩家 {teamID:[playerID, ...], ...}
g_disconnectPlayer = {} # 在本地图离线的玩家信息 {playerID:[tick, posX, posY], ...}
g_lastExitFBType = {} # 最后一个离开副本信息 {fbIndex:[exitType, tick], ...} exitType: 1-掉线,2-主动退出
g_sgzztopPlayerName = '' #上古战场积分王名字