From 7f7cdbf15426f9203a2fcf5268c295cd5f888eba Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 08 十一月 2019 21:01:50 +0800
Subject: [PATCH] 8333 【主干】【后端】boss之家死亡在复活点复活,不退出副本(支持和中立地图一样可返回最后一次所在的野外地图;支持从副本退出后返回boss之家不重复扣除消耗)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py |   63 ++++++++++++++++++++++---------
 1 files changed, 44 insertions(+), 19 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
index c1095dd..afc5eab 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -1497,24 +1497,30 @@
 #        summonList.append(summonNPC)
 #        summonIndex += 1
         
-    
+    changeMapID = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ChangeMapID)
     # 更新最后一次离开的非中立常规地图, 从中立地图退出时需要回到该地方,必须在 DoResetWorldPosAndClear 之前更新
     if GameWorld.GetMap().GetMapFBType() == IPY_GameWorld.fbtNull and curPlayer.GetMapID() not in IpyGameDataPY.GetFuncEvalCfg("MapLine", 4):
         mapID = curPlayer.GetMapID()
         posX = curPlayer.GetPosX()
         posY = curPlayer.GetPosY()
-        lineID = curPlayer.GetClientLineID()
+        lineID = curPlayer.GetClientLineID() # 常规地图用分线ID
         NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FromMapID, mapID)
         NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FromPosX, posX)
         NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FromPosY, posY)
         NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FromLineID, lineID)
         GameWorld.DebugLog("最后一次离开的非中立常规地图更新!mapID=%s,lineID=%s,Pos(%s,%s)" % (mapID, lineID, posX, posY))
-    else:
-        mapID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FromMapID)
-        posX = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FromPosX)
-        posY = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FromPosY)
-        lineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FromLineID)
-        GameWorld.DebugLog("最后一次离开的非中立常规地图不变!mapID=%s,lineID=%s,Pos(%s,%s)" % (mapID, lineID, posX, posY))
+    # 当前是可返回的副本地图 且 目标地图为副本
+    elif curPlayer.GetMapID() in ChConfig.Def_CanBackFBMap and curPlayer.GetMapID() != changeMapID \
+        and GameWorld.GetMap().GetMapFBTypeByMapID(changeMapID) != IPY_GameWorld.fbtNull:
+        mapID = curPlayer.GetMapID()
+        posX = curPlayer.GetPosX()
+        posY = curPlayer.GetPosY()
+        lineID = GetFBFuncLineID(curPlayer) # 副本用功能线路ID
+        NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FromFBMapID, mapID)
+        NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FromFBPosX, posX)
+        NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FromFBPosY, posY)
+        NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FromFBLineID, lineID)
+        GameWorld.DebugLog("进入副本时,最后一次离开的可返回的副本ID更新!mapID=%s,lineID=%s,Pos(%s,%s)" % (mapID, lineID, posX, posY))
         
     # 从副本中切图
     if GameWorld.GetMap().GetMapFBType() != IPY_GameWorld.fbtNull:
@@ -1553,13 +1559,17 @@
     if GameWorld.IsCrossServer():
         CrossRealmPlayer.PlayerExitCrossServer(curPlayer)
         return
-
+    
+    funcLineID = 0
+    enterFBFree = False
     #中立地图回到上一次非中立常规地图    
-    if curPlayer.GetMapID() in IpyGameDataPY.GetFuncEvalCfg("MapLine", 4):
+    if curPlayer.GetMapID() in IpyGameDataPY.GetFuncEvalCfg("MapLine", 4) or curPlayer.GetMapID() in ChConfig.Def_CanBackFBMap:
         mapID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FromMapID)
         posX = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FromPosX)
         posY = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FromPosY)
         lineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FromLineID)
+        # 重置
+        NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FromMapID, 0)
         # 老号支持,本来就在中立地图的,返回新手村
         if not mapID:
             # {职业:[dataMapID,posX,posY], ...}
@@ -1575,11 +1585,24 @@
                 mapID, posX, posY = mapInfoList[0]
     #离开副本
     else:
-        mapID = curPlayer.GetFromMapID()
-        posX = curPlayer.GetFromPosX()
-        posY = curPlayer.GetFromPosY()
-        lineID = curPlayer.GetFromLineID()
-        
+        fromFBMapID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FromFBMapID)
+        # 回到上一次可返回的副本里
+        if fromFBMapID:
+            mapID = fromFBMapID
+            posX = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FromFBPosX)
+            posY = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FromFBPosY)
+            lineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FromFBLineID)
+            funcLineID = lineID # 回副本的要指定功能线路ID
+            enterFBFree = True # 返回的免费进入
+            # 重置
+            NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FromFBMapID, 0)
+            GameWorld.DebugLog("离开副本,返回可之前可返回的副本! fromFBMapID=%s,lineID=%s,posXY(%s,%s)" % (mapID, lineID, posX, posY))
+        else:
+            mapID = curPlayer.GetFromMapID()
+            posX = curPlayer.GetFromPosX()
+            posY = curPlayer.GetFromPosY()
+            lineID = curPlayer.GetFromLineID()
+            
     if mapID == curPlayer.GetMapID():
         # 如果在同一张地图, 取DB重生点, 普通地图下线重上时FromMapID会被设置为本地图
         gameMap = GameWorld.GetMap()
@@ -1602,7 +1625,7 @@
     #    ChangePlayerAction(curPlayer, IPY_GameWorld.paNull)
     #===============================================================================================
     
-    PlayerResetWorldPosFB(curPlayer, mapID, posX, posY, False, lineID)
+    PlayerResetWorldPosFB(curPlayer, mapID, posX, posY, False, lineID, funcLineID=funcLineID, enterFBFree=enterFBFree)
     
     #在空闲或者移动状态下,才能锁死玩家
     if curPlayer.GetPlayerAction() in [IPY_GameWorld.paNull] or curPlayer.IsMoving():
@@ -1933,7 +1956,7 @@
         curMapID = GameWorld.GetMap().GetMapID()
         if curMapID in fbEnableTransportMap and mapID in fbEnableTransportMap[curMapID]:
             canFBMoveToOther = True
-        if curMapID == ChConfig.Def_FBMapID_BossHome:
+        if curMapID in ChConfig.Def_CanBackFBMap:
             canFBMoveToOther = True
         toMapFBType = GameWorld.GetMap().GetMapFBTypeByMapID(mapID)
         if toMapFBType == IPY_GameWorld.fbtNull:
@@ -2020,7 +2043,7 @@
 # @param funcLineID 副本功能线路ID,由前端请求
 # @return 返回值无意义
 # @remarks 玩家切换到指定副本ID
-def PlayerResetWorldPosFB(curPlayer, mapID, posX, posY, takeTruck, fbID=0, msg='', canLock=True, funcLineID=0):
+def PlayerResetWorldPosFB(curPlayer, mapID, posX, posY, takeTruck, fbID=0, msg='', canLock=True, funcLineID=0, enterFBFree=False):
     '''
     参数说明:
         @param fbID:
@@ -2077,9 +2100,11 @@
     msg = FBLogic.GetPlayerResetWorldPosFBMsg(curPlayer, mapID, funcLineID)
     
     NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_ReqFBFuncLine, funcLineID)
-    
     GameWorld.Log("玩家请求开始切图: sceneMapID=%s,posX=%s,posY=%s,takeTruck=%s,fbID=%s,msg=%s,funcLineID=%s,tick=%s,lastTransTick=%s" 
                   % (sceneMapID, posX, posY, takeTruck, fbID, msg, funcLineID, tick, lastTransTick), curPlayer.GetPlayerID())
+    if enterFBFree:
+        NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_EnterFBFree, 1)
+        GameWorld.DebugLog("    本次免费进入副本!")
     curPlayer.ResetWorldPosReq(sceneMapID, posX, posY, takeTruck, fbID, msg)
     curPlayer.SetDict(ChConfig.Def_PlayerKey_ChangeMapID, sceneMapID)
     

--
Gitblit v1.8.0