|  |  |  | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | gameFB = GameWorld.GetGameFB() | 
|---|
|  |  |  | logOffTick = gameFB.GetPlayerLogoffTick() | 
|---|
|  |  |  | 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: | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (not gameFB.GetIsSafeClose()) and tick - logOffTick < ChConfig.Def_EmptyFBKeepTime: | 
|---|
|  |  |  | #GameWorld.Log(str(tick - logOffTick)) | 
|---|
|  |  |  | #不是安全断线的情况下, 返回 | 
|---|
|  |  |  | return | 
|---|
|  |  |  | if logOffTick == 0: | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (not gameFB.GetIsSafeClose()) and tick - logOffTick < ChConfig.Def_EmptyFBKeepTime: | 
|---|
|  |  |  | #GameWorld.Log(str(tick - logOffTick)) | 
|---|
|  |  |  | #不是安全断线的情况下, 返回 | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #输出调试信息 | 
|---|
|  |  |  | GameWorld.Log('__ProcessClose! LineID = %s, openState = %s, isSafeClose = %s'%( | 
|---|
|  |  |  | 
|---|
|  |  |  | return IPY_GameWorld.cmePlayerFull | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #检查副本状态是否可以登录 | 
|---|
|  |  |  | if not FBCommon.CheckFBStateCanEnter(askStruct): | 
|---|
|  |  |  | checkRet = FBCommon.CheckFBStateCanEnter(askStruct) | 
|---|
|  |  |  | if type(checkRet) not in [tuple, list]: | 
|---|
|  |  |  | checkRet = (checkRet, "FB_andyshao_861048") | 
|---|
|  |  |  | canEnter, notifyMark = checkRet | 
|---|
|  |  |  | if not canEnter: | 
|---|
|  |  |  | #副本关闭中, 请稍后 | 
|---|
|  |  |  | return IPY_GameWorld.cmeCustom, 'FB_andyshao_861048' | 
|---|
|  |  |  | return IPY_GameWorld.cmeCustom, notifyMark | 
|---|
|  |  |  |  | 
|---|
|  |  |  | changeMapAskResult = FBLogic.OnChangeMapAsk(askStruct, tick) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | __ProcessOpen(gameWorld, tick) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | __ProcessTimeKickPlayer(gameWorld, tick) | 
|---|
|  |  |  | __ProcessTimeKickPlayer(gameWorld, tick) # 处理副本生存周期强关副本 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | __ProcessFBDelayKickPlayer(gameWorld, tick) | 
|---|
|  |  |  | __ProcessFBDelayKickPlayer(gameWorld, tick) # 关闭副本延迟踢出玩家 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | __ProcessClose(gameWorld, tick) | 
|---|
|  |  |  | __ProcessClose(gameWorld, tick) # 自伸缩副本关闭逻辑 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | __ProcessMapServerAcPlayer(tick) | 
|---|
|  |  |  |  | 
|---|