From 7311a1f98dccf5b66e30faafd9ef9b6b0b661e23 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 14 八月 2018 17:01:21 +0800
Subject: [PATCH] Fix: 1536 【BUG】娲皇遗迹层数进入错误;               瞬间同时退出时可能导致该bug,修改为按最后一个退出的方式判断;

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py |   42 +++++++++++++++++++++++++++++++-----------
 1 files changed, 31 insertions(+), 11 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py
index e31eba8..b399c4a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py
@@ -311,15 +311,35 @@
         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'%(
@@ -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)
     

--
Gitblit v1.8.0