From b8fde01b237a2ad9c69e64f265efa692f1d4f70f Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期五, 10 五月 2019 19:39:50 +0800
Subject: [PATCH] 6603 【后端】【2.0】增加新版的sp和被动技能 - 增加前端用的印记包

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py |  126 +++++++++++++++++++++++++++++++++++------
 1 files changed, 107 insertions(+), 19 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..747aea3 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py
@@ -39,9 +39,12 @@
 import GameWorld
 import ChConfig
 import PlayerControl
+import FamilyRobBoss
+import NPCCustomRefresh
 import EventShell
 import FBLogic
 import FBCommon
+import ShareDefine
 import EventReport
 import ItemCommon
 import PyGameData
@@ -73,6 +76,8 @@
     
     #调用副本开启触发器
     FBLogic.OnOpenFB(tick)
+    
+    GameServer_DynamicLineMapStateChange(gameWorld, IPY_GameWorld.fbosOpen)
     return
 
 ## 副本关闭
@@ -91,8 +96,10 @@
     gameFBMgr = gameWorld.GetGameFB() 
     gameFBMgr.SetPlayerLogoffTick(0)
     gameFBMgr.SetIsSafeClose(0)
-
-    GameWorld.Log("FB Close! lineID = %s, openState = %s"%(gameWorld.GetLineID(), gameWorld.GetOpenState()))
+    
+    lineID = gameWorld.GetLineID()
+    copyMapID = gameWorld.GetCopyMapID()
+    GameWorld.Log("FB Close! lineID = %s, openState = %s"%(lineID, gameWorld.GetOpenState()))
     
     gameWorld.SetOpenState(IPY_GameWorld.fbosClosed)
     gameMap = gameWorld.GetMap()
@@ -101,9 +108,23 @@
     if fbType == 0:
         return
     
+    if fbType == IPY_GameWorld.fbtSingle:
+        ownerID = gameFBMgr.GetGameFBDictByKey(ChConfig.Def_FB_SingleFBPlayerID)
+        if ownerID in PyGameData.g_fbHelpBattlePlayerDict:
+            PyGameData.g_fbHelpBattlePlayerDict.pop(ownerID)
+            GameWorld.DebugLog("清除单人副本镜像助战信息: ownerID=%s" % ownerID)
+    elif fbType == IPY_GameWorld.fbtTeam:
+        teamID = gameWorld.GetPropertyID()
+        if teamID in PyGameData.g_teamFBMemRelationDict:
+            PyGameData.g_teamFBMemRelationDict.pop(teamID)
+            GameWorld.DebugLog("清除组队副本队员关系信息: teamID=%s" % teamID)
+            
     #副本关闭时统一清怪
     FBCommon.ClearFBNPC()
     
+    if lineID in PyGameData.g_fbRobotJobDict:
+        PyGameData.g_fbRobotJobDict.pop(lineID)
+        
     mapID = FBCommon.GetRecordMapID(gameMap.GetMapID())
     #清理物品
     unPickItemDict = {}
@@ -134,9 +155,15 @@
         
     #发送未拾取的物品给玩家
     if mapID in ChConfig.Def_SendUnPickItemMailMapIDList and unPickItemDict:
+        isCrossServer = GameWorld.IsCrossServer()
+        playerServerGroupIDDict = PyGameData.g_crossPlayerServerGroupIDInfo.get(copyMapID, {})
         for ownerID, mailItemList in unPickItemDict.items():
             GameWorld.Log("发送未拾取的物品给玩家: %s" % mailItemList, ownerID)
-            PlayerControl.SendMailByKey("ItemNoPickUp", [ownerID], mailItemList, [gameWorld.GetMapID()])
+            if isCrossServer:
+                serverGroupID = playerServerGroupIDDict.get(ownerID, 0)
+                PlayerControl.SendCrossMail(serverGroupID, "ItemNoPickUp", [ownerID], mailItemList, [gameWorld.GetMapID()])
+            else:
+                PlayerControl.SendMailByKey("ItemNoPickUp", [ownerID], mailItemList, [gameWorld.GetMapID()])
         
     playerManager = gameWorld.GetMapCopyPlayerManager()
     
@@ -150,6 +177,26 @@
     #根据是否收缩型FB处理
     FreeOrClearFBByAutoSize(gameWorld)
     
+    GameServer_DynamicLineMapStateChange(gameWorld, IPY_GameWorld.fbosClosed)
+        
+    gameWorld.SetPropertyID(0)
+    PyGameData.g_crossPlayerServerGroupIDInfo.pop(copyMapID, None)
+    return
+
+def GameServer_DynamicLineMapStateChange(gameWorld, state):
+    if gameWorld.GetMapID() not in ChConfig.Def_CrossDynamicLineMap:
+        return
+    
+    realMapID, copyMapID = gameWorld.GetRealMapID(), gameWorld.GetCopyMapID()
+    if state == IPY_GameWorld.fbosWaitForClose:
+        crossFuncLineDataCache = FBLogic.OnGetCrossFuncLineDataCache()
+        msgInfo = [realMapID, copyMapID, state, crossFuncLineDataCache]
+    else:
+        msgInfo = [realMapID, copyMapID, state]
+        
+    msgInfo = str(msgInfo)
+    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "DynamicLineMapStateChange", msgInfo, len(msgInfo))
+    GameWorld.Log("DynamicLineMapStateChange realMapID=%s, copyMapID=%s, PropertyID=%s, state=%s" % (realMapID, copyMapID, gameWorld.GetPropertyID(), state))
     return
 
 ##根据表中的收缩类型释放或者清空副本状态
@@ -231,6 +278,7 @@
     
     ##踢人
     __KickAllPlayerAndCloseFB(gameWorld, tick)
+    GameServer_DynamicLineMapStateChange(gameWorld, IPY_GameWorld.fbosClosed)
     return
 
 ## 副本踢出玩家逻辑
@@ -307,19 +355,39 @@
         return
     
     #特殊副本,不执行这个逻辑
-    if not GameWorld.GetMap().GetAutoSize():
+    if not IsNoPlayerNeedCloseFB():
         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'%(
@@ -402,9 +470,13 @@
             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)
 
@@ -452,11 +524,11 @@
     
     __ProcessOpen(gameWorld, tick)
     
-    __ProcessTimeKickPlayer(gameWorld, tick)
+    __ProcessTimeKickPlayer(gameWorld, tick) # 处理副本生存周期强关副本
     
-    __ProcessFBDelayKickPlayer(gameWorld, tick)
+    __ProcessFBDelayKickPlayer(gameWorld, tick) # 关闭副本延迟踢出玩家
     
-    __ProcessClose(gameWorld, tick)
+    __ProcessClose(gameWorld, tick) # 自伸缩副本关闭逻辑
     
     __ProcessMapServerAcPlayer(tick)
     
@@ -477,6 +549,12 @@
     __RefreshOnFiveMinute(tick)
     #定时检测关闭超时文件
     EventReport.OnTimeCloseScribeTxt()
+    
+    #仙盟归属boss定时处理
+    FamilyRobBoss.OnFamilyOwnerBossProcess(tick)
+    
+    #地图自定义随机刷怪
+    NPCCustomRefresh.ProcessMapRandomRefreshNPC(gameWorld, tick)
     return
 
 ## 通知RouteServer 消息
@@ -541,6 +619,11 @@
     if GameWorld.GetMap().GetMapFBType() == IPY_GameWorld.fbtNull:
         msgInfo = str([gameWorld.GetMapID(), gameWorld.GetLineID(), gameWorld.GetRealMapID(), gameWorld.GetCopyMapID()])
         GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "CommMapServerInitOK", msgInfo, len(msgInfo))
+        
+    if gameWorld.GetMapID() in ChConfig.Def_CrossDynamicLineMap and gameWorld.GetCopyMapID() == gameWorld.GetGameWorldCount() - 1:
+        msgInfo = str([gameWorld.GetRealMapID(), gameWorld.GetGameWorldCount()])
+        GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "DynamicLineMapInitOK", msgInfo, len(msgInfo))
+        
     return
 
 
@@ -550,6 +633,9 @@
 #  @remarks 函数详细说明.
 def CloseFB(tick):
     GameWorld.GetGameWorld().SetCloseFBTick(tick)
+    
+    gameWorld = GameWorld.GetGameWorld()
+    GameServer_DynamicLineMapStateChange(gameWorld, IPY_GameWorld.fbosWaitForClose)
     return
 
 ## 玩家离开地图时,尝试关闭副本
@@ -564,8 +650,7 @@
     if gameMap.GetMapFBType() == 0:
         return
     
-    if gameMap.GetAutoSize() == 0:
-        #只处理自动是否的地图
+    if not IsNoPlayerNeedCloseFB():
         return
     
     playerManager = gameWorld.GetMapCopyPlayerManager()
@@ -574,6 +659,9 @@
         __CloseFB(GameWorld.GetGameWorld(), GameWorld.GetGameWorld().GetTick())    
 
 
+def IsNoPlayerNeedCloseFB():
+    ## 副本中无玩家是否需要自动关闭的副本
+    return GameWorld.GetMap().GetAutoSize() and GameWorld.GetMap().GetMapID() not in ChConfig.Def_NoPlayerNotCloseAutoSizeMap
 
 #//08 06 根据国家统计的玩家数目#tagMPlayerCountByCountry
 #tagMPlayerCountByCountry       *   GettagMPlayerCountByCountry();

--
Gitblit v1.8.0