From 0dda6b752c530be0648384a499da549b44d3ec11 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期日, 23 二月 2020 00:04:00 +0800
Subject: [PATCH] 4679 【主干】【bug】地图未启动好触发上架系统拍品无法上架

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py |  481 +++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 336 insertions(+), 145 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py
index 801bb41..6015f9d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py
@@ -30,8 +30,9 @@
 import EventReport
 import PlayerFamily
 import PlayerActivity
+import ItemControler
 import PlayerSuccess
-import PlayerMagicWeapon
+import GameFuncComm
 import PyGameData
 import PlayerVip
 import GameObj
@@ -57,12 +58,20 @@
 Help_wheel = 'wheel' #当前波数(关卡编号),从1开始,1~n
 Help_npc = 'npc' #NPC已击杀个数 [{"NPCID":150,"killCnt":100}]
 Help_npcTotal = 'npcTotal' #NPC总已击杀个数
+Help_npcTotalNeed = 'npcTotalNeed' #NPC总需击杀个数
 Help_exp = 'exp' #已获得经验
 Help_expPoint = 'expPoint' #已获得经验点
 Help_money = 'money' #已获得钱 [{"moneyType":3,"moneyValue":1000}]
 Help_score = 'score' #已获得积分
 Help_grade = 'grade' #评级(5-S,4-A,3-B,2-C,1-D)
 Help_leaderID = 'leaderID' #渡劫玩家ID
+Help_isHelp = 'isHelp' #本次是否是助战
+Help_helpCount = 'helpCount' #该副本今日已助战次数
+Help_relation = 'relation' #该副本关系加成信息 [优先关系, 总加成]
+Help_robotJob = 'robotJob' #机器人职业 {"ObjID":job, ...}
+Help_isAuto = 'isAuto' #是否自动召唤
+Help_hasRefreshBoss = 'hasRefreshBoss' #是否已刷新boss
+Help_gsItemInfo = 'gsItemInfo' #聚魂副本物品信息 {"波数":[[{"ItemID":101, "ItemCount":10}]]}
 
 #副本结算信息通用key
 Over_dataMapID = 'dataMapID' #数据地图ID
@@ -82,11 +91,15 @@
 Over_grade = 'grade' #评级(5-S,4-A,3-B,2-C,1-D)
 Over_itemInfo = 'itemInfo' #物品列表 [{"ItemID":101, "ItemCount":10, "IsBind":1, "IsSuite":1, "UserData":"自定义属性字符串"}]
 Over_succItemInfo = 'succItemInfo' #物品列表
+Over_firstPassItem = 'firstPassItem' #物品列表
 Over_score = 'score' #已获得积分
 Over_extrScore = 'extrScore' #已获得额外积分
 Over_enterLV = 'enterLV' #进入时等级
 Over_leaderID = 'leaderID' #渡劫玩家ID
-Over_xianyuanCoin = 'xianyuanCoin' #获得仙缘币信息 [获得仙缘币数, 没有获得的原因] 原因: 1-达到助战次数上限,2-达到每日获得仙缘币上限
+Over_helpPlayer = 'helpPlayer' #助战玩家信息 {"玩家ID":{玩家信息key:value, ...}, ...}
+Over_ownerID = 'ownerID' #归属玩家ID
+Over_ownerName = 'ownerName' #归属玩家名
+Over_isAssist = 'isAssist' #是否协助
 
 #副本行为
 (
@@ -154,6 +167,10 @@
 def CheckCanEnterFBComm(curPlayer, mapID, lineID, fbIpyData, fbLineIpyData, reqEnterCnt=1, isNotify=True, isTeamAsk=False):
     # 可否进入副本通用检查, 扫荡通用
     playerID = curPlayer.GetPlayerID()
+    
+    if not FBLogic.OnNeedCheckCanEnterFBComm(curPlayer, mapID, lineID):
+        return ShareDefine.EntFBAskRet_OK
+    
     # 总表通用检查
     if fbIpyData:
         #开服天开放检查
@@ -164,19 +181,12 @@
             return ShareDefine.EntFBAskRet_FBClose
         
         #进入次数判断
-        maxTimes = fbIpyData.GetDayTimes()
-        helpPoint = fbIpyData.GetHelpPoint()
-        if maxTimes and not helpPoint and mapID not in ChConfig.Def_NoLimitEnterCntMap:
-            enterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntDay % mapID)
-            maxCnt = GetEnterFBMaxCnt(curPlayer, mapID)
-            if enterCnt + reqEnterCnt > maxCnt:
-                GameWorld.Log("已达到当日最大进入次数!mapID=%s,enterCnt=%s,reqEnterCnt=%s,maxTimes=%s,maxCnt=%s" 
-                              % (mapID, enterCnt, reqEnterCnt, maxTimes, maxCnt), playerID)
-                if isNotify:
-                    PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_268121", [mapID])
-                return ShareDefine.EntFBAskRet_NoEnterCnt
-            
-            # 周今日次数暂不做,待扩展...
+        canEnter, notifyMark = __CheckCanEnterFBByTime(curPlayer, mapID, lineID, fbIpyData, reqEnterCnt, isTeamAsk)
+        if not canEnter:
+            if notifyMark:
+                PlayerControl.NotifyCode(curPlayer, notifyMark, [mapID])
+            return ShareDefine.EntFBAskRet_NoEnterCnt
+        
         #进入CD判断
         if CheckIsEnterCD(curPlayer, mapID):
             if isNotify:
@@ -201,15 +211,6 @@
                 PlayerControl.NotifyCode(curPlayer, "FbLV", [mapID])
             return ShareDefine.EntFBAskRet_LVLimit
         
-        #职业阶判断
-        jobRankLimit = fbLineIpyData.GetJobRankLimit()
-        if jobRankLimit and PlayerControl.GetJobRank(curPlayer) < jobRankLimit:
-            GameWorld.Log("玩家职业阶级不足, 无法进入副本!mapID=%s,lineID=%s,jobRank=%s < jobRankLimit=%s" 
-                          % (mapID, lineID, PlayerControl.GetJobRank(curPlayer), jobRankLimit), playerID)
-            if isNotify:
-                PlayerControl.NotifyCode(curPlayer, "SingleEnterJob", [mapID])
-            return ShareDefine.EntFBAskRet_JobRankLimit
-        
         #门票判断
         if not GetFBEnterTicket(curPlayer, mapID, lineID, fbLineIpyData, reqEnterCnt, isTeamAsk)[0]:
             if isNotify:
@@ -217,6 +218,57 @@
             return ShareDefine.EntFBAskRet_NoTicket
         
     return ShareDefine.EntFBAskRet_OK
+
+def __CheckCanEnterFBByTime(curPlayer, mapID, lineID, fbIpyData, reqEnterCnt, isTeamAsk):
+    #进入次数判断
+    maxTimes = fbIpyData.GetDayTimes()
+    if not maxTimes:
+        return True, ""
+    
+    # 首次进入免费
+    if mapID in [ChConfig.Def_FBMapID_PersonalBoss]:
+        curfbStar = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_PlayerFBStar_MapId, lineID, False, [mapID])
+        if not curfbStar:
+            GameWorld.DebugLog("OnEnterFBEvent 首次进入该副本线路免费!mapID=%s,lineID=%s" % (mapID, lineID))
+            return True, ""
+        
+    #playerID = curPlayer.GetPlayerID()
+    enterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntDay % mapID)
+    maxCnt = GetEnterFBMaxCnt(curPlayer, mapID)
+    if enterCnt + reqEnterCnt <= maxCnt:
+        return True, ""
+    
+    ### 以下是到达次数上限后的处理
+    fbType = GameWorld.GetMap().GetMapFBTypeByMapID(mapID)
+    
+    # 单人副本达到次数后不可再进入
+    if fbType == IPY_GameWorld.fbtSingle:
+        #GameWorld.Log("已达到当日最大进入次数!单人副本 mapID=%s,enterCnt=%s,reqEnterCnt=%s,maxTimes=%s,maxCnt=%s" 
+        #              % (mapID, enterCnt, reqEnterCnt, maxTimes, maxCnt), playerID)
+        return False, "GeRen_chenxin_268121"
+    
+    # 组队副本
+    if fbType == IPY_GameWorld.fbtTeam:
+        # 无助战的不可再进入
+        if not fbIpyData.GetHelpPoint():
+            #GameWorld.Log("已达到当日最大进入次数!组队副本 mapID=%s,enterCnt=%s,reqEnterCnt=%s,maxTimes=%s,maxCnt=%s" 
+            #              % (mapID, enterCnt, reqEnterCnt, maxTimes, maxCnt), playerID)
+            return False, "GeRen_chenxin_268121"
+        
+        # 可助战的不可单人进入助战,可发起匹配
+        if not isTeamAsk and (not curPlayer.GetTeamID() or curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_TeamMemCount) <= 1):
+            #GameWorld.Log("已达到当日最大进入次数!组队副本不可单人助战! mapID=%s,enterCnt=%s,reqEnterCnt=%s,maxTimes=%s,maxCnt=%s" 
+            #              % (mapID, enterCnt, reqEnterCnt, maxTimes, maxCnt), playerID)
+            return False, "TeamSingleEnter"
+        
+    elif mapID not in ChConfig.Def_NoLimitEnterCntMap:
+        #GameWorld.Log("已达到当日最大进入次数! mapID=%s,enterCnt=%s,reqEnterCnt=%s,maxTimes=%s,maxCnt=%s" 
+        #              % (mapID, enterCnt, reqEnterCnt, maxTimes, maxCnt), playerID)
+        return False, "GeRen_chenxin_268121"
+    
+    # 周进入次数暂不做,待扩展...
+    
+    return True, ""
 
 ## 获取副本进入门票信息
 #  @param curPlayer 玩家实例
@@ -331,6 +383,17 @@
     gameFB.SetGameFBDict(ChConfig.Def_FB_NPCStrengthenMaxLV, maxLV)
     GameWorld.Log("NPC成长动态等级变更: isLeave=%s,totalLV=%s,playerCnt=%s,averageLV=%s,maxLV=%s" 
                   % (isLeave, totalLV, playerCnt, averageLV, maxLV), playerID)
+    # 上古战场特殊处理
+    if mapID == ChConfig.Def_FBMapID_ElderBattlefield:
+        lineID = GameWorld.GetGameWorld().GetPropertyID() - 1
+        fbLineIpyData = GetFBLineIpyData(mapID, lineID)
+        lvLimitMin = 0 if not fbLineIpyData else fbLineIpyData.GetLVLimitMin()
+        robotLVDiff = IpyGameDataPY.GetFuncCfg("ElderBattlefieldCfg", 5)
+        robotLVMin, robotLVMax = averageLV - robotLVDiff, averageLV
+        robotLVMin = max(lvLimitMin, robotLVMin)
+        gameFB.SetGameFBDict(ChConfig.Def_FB_NPCStrengthenMaxLV, robotLVMax)
+        gameFB.SetGameFBDict(ChConfig.Def_FB_NPCStrengthenMinLV, robotLVMin)
+        GameWorld.Log("    更新上古机器人等级范围: lineID=%s,robotLVDiff=%s,robotLV=(%s~%s)" % (lineID, robotLVDiff, robotLVMin, robotLVMax))
     return True
 
 def UpdFBLineNPCStrengthenPlayerCnt(playerID, isLeave):
@@ -392,18 +455,18 @@
 #  @return
 def SetFBPropertyMark(propertyMark, setPlayer=None):
     GameWorld.GetGameFB().SetGameFBDict(ChConfig.Map_FBDict_PropertyMark, propertyMark + 1) # 存储时+1才能判断是否存储过
-    if setPlayer != None:
-        PlayerControl.SetFBFuncLineID(setPlayer, propertyMark)
-        GameWorld.DebugLog("SetFBPropertyMark 设置玩家副本功能线路ID: %s" % propertyMark, setPlayer.GetPlayerID())
-        return
-    
-    playerManager = GameWorld.GetMapCopyPlayerManager()
-    for index in xrange(playerManager.GetPlayerCount()):
-        curPlayer = playerManager.GetPlayerByIndex(index)
-        if not curPlayer.GetPlayerID():
-            continue
-        PlayerControl.SetFBFuncLineID(curPlayer, propertyMark)
-        GameWorld.DebugLog("SetFBPropertyMark 广播玩家副本功能线路ID: %s" % propertyMark, curPlayer.GetPlayerID())
+#    if setPlayer != None:
+#        PlayerControl.SetFBFuncLineID(setPlayer, propertyMark)
+#        GameWorld.DebugLog("SetFBPropertyMark 设置玩家副本功能线路ID: %s" % propertyMark, setPlayer.GetPlayerID())
+#        return
+#    
+#    playerManager = GameWorld.GetMapCopyPlayerManager()
+#    for index in xrange(playerManager.GetPlayerCount()):
+#        curPlayer = playerManager.GetPlayerByIndex(index)
+#        if not curPlayer.GetPlayerID():
+#            continue
+#        PlayerControl.SetFBFuncLineID(curPlayer, propertyMark)
+#        GameWorld.DebugLog("SetFBPropertyMark 广播玩家副本功能线路ID: %s" % propertyMark, curPlayer.GetPlayerID())
     return
 
 ## 是否已经扣除入场券/进入次数等
@@ -417,6 +480,15 @@
 #  @return
 def SetHadDelTicket(curPlayer, delSign=1):
     GameWorld.GetGameFB().SetPlayerGameFBDict(curPlayer.GetID(), ChConfig.FBPlayerDict_IsDelTicket, delSign)
+    return
+
+## 自定义场景阶段
+def GetCustomMapStep(curPlayer, mapID, lineID):
+    return curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_CustomMapStep % (mapID, lineID))
+def SetCustomMapStep(curPlayer, mapID, lineID, step):
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_CustomMapStep % (mapID, lineID), step)
+    if step == ChConfig.CustomMapStep_Over:
+        PlayerControl.SetCustomMap(curPlayer, 0, 0)
     return
 
 def GetCurSingleFBPlayer():
@@ -526,7 +598,7 @@
     return
 
 def GetJsonItemList(itemList):
-    ## [[itemID,itemCount,isBind], curItem] -> [{"ItemID":101, "Count":10, "IsBind":1, "IsSuite":1, "UserData":"自定义属性字符串"}]
+    ## [[itemID,itemCount,isAuctionItem], curItem] -> [{"ItemID":101, "Count":10, "IsAuctionItem":1, "UserData":"自定义属性字符串"}]
     jsonItemList = []
     for itemInfo in itemList:
         itemDict = {}
@@ -537,7 +609,7 @@
             if infolen > 1:
                 itemDict['Count'] = itemInfo[1]
             if infolen > 2:
-                itemDict['IsBind'] = int(itemInfo[2])
+                itemDict['IsAuctionItem'] = int(itemInfo[2])
         elif isinstance(itemInfo, int):
             itemDict['ItemID'] = itemInfo
         else: #物品实例
@@ -545,8 +617,8 @@
                 continue
             itemDict['ItemID'] = itemInfo.GetItemTypeID()
             itemDict['Count'] = itemInfo.GetCount()
-            itemDict['IsBind'] = int(itemInfo.GetIsBind())
-            itemDict['IsSuite'] = int(itemInfo.GetIsSuite())
+            itemDict['IsAuctionItem'] = ItemControler.GetIsAuctionItem(itemInfo)
+            #itemDict['IsSuite'] = int(itemInfo.GetIsSuite())
             itemDict['UserData'] = itemInfo.GetUserData()
         jsonItemList.append(itemDict)
     return jsonItemList
@@ -574,7 +646,7 @@
 #---------------------------------------------------------------------
 def SyncDynamicBarrierState(barrierPointList, state, curPlayer=None):
     '''同步动态障碍物是否有效性
-    @param barrierPointList: 障碍物点列表 [[aPosX,aPosY,bPosX,bPosY], [aPosX,aPosY,bPosX,bPosY], ...]
+    @param barrierPointList: 障碍物点列表 [[aPosX,aPosY,bPosX,bPosY,angle可选], [aPosX,aPosY,bPosX,bPosY,angle可选], ...]
     @param state: 是否有效
     @param curPlayer: 指定通知目标玩家,为None时广播本地图所有玩家
     '''
@@ -582,12 +654,15 @@
     barrierStatePack.Clear()
     barrierStatePack.State = state
     barrierStatePack.BarrierList = []
-    for aPosX, aPosY, bPosX, bPosY in barrierPointList:
+    for posInfo in barrierPointList:
+        aPosX, aPosY, bPosX, bPosY = posInfo[:4]
+        angle = posInfo[4] if len(posInfo) > 4 else 0
         barrier = ChPyNetSendPack.tagMCDynamicBarrier()
         barrier.APosX = aPosX
         barrier.APosY = aPosY
         barrier.BPosX = bPosX
         barrier.BPosY = bPosY
+        barrier.Angle = angle
         barrierStatePack.BarrierList.append(barrier)
     barrierStatePack.Count = len(barrierStatePack.BarrierList)
     if curPlayer:
@@ -961,6 +1036,35 @@
     #可以进入
     return True
 #---------------------------------------------------------------------
+def Sync_FBNPC(mapID=0, npcIDList=[], curPlayer=None):
+    ## 同步当前副本NPC给副本中的所有玩家
+    if not mapID:
+        mapID = GameWorld.GetMap().GetMapID()
+        mapID = GetRecordMapID(mapID)
+    npcCntDict = {}
+    gameNPCManager = GameWorld.GetNPCManager()
+    for index in xrange(gameNPCManager.GetNPCCount()):
+        curNPC = gameNPCManager.GetNPCByIndex(index)
+        npcID = curNPC.GetNPCID()
+        if not npcID:
+            continue
+        if curNPC.GetGameNPCObjType() == IPY_GameWorld.gnotPet:
+            continue
+        if npcIDList and npcID not in npcIDList:
+            continue
+        npcCntDict[npcID] = npcCntDict.get(npcID, 0) + 1
+        
+    if curPlayer:
+        NPCCommon.SyncNPCCntInfo(curPlayer, mapID, npcCntDict)
+    else:
+        playerManager = GameWorld.GetMapCopyPlayerManager()
+        for i in xrange(playerManager.GetPlayerCount()):
+            curPlayer = playerManager.GetPlayerByIndex(i)
+            if curPlayer.GetID() == 0:
+                continue
+            NPCCommon.SyncNPCCntInfo(curPlayer, mapID, npcCntDict)
+    return npcCntDict
+
 ##获得地图上的NPC列表
 # @param 无参数
 # @return 返回值, NPC实例列表[curNPC,curNPC,,,,,]
@@ -1377,8 +1481,10 @@
 
 ## ---------------------------------- TD ---------------------------------------
 def GetEnterFBMaxCnt(curPlayer, mapID):
-    ## 获取副本最大可进入次数: 基本次数 + VIP额外次数 + 购买次数 + 找回次数
+    ## 获取副本最大可进入次数: 基本次数 + 时间已恢复次数 + VIP额外次数 + 购买次数 + 找回次数 + 使用道具增加次数
     fbIpyData = GetFBIpyData(mapID)
+    if not fbIpyData:
+        return 0
     maxTimes = fbIpyData.GetDayTimes()
     MWPrivilegeID = fbIpyData.GetExtraTimesMWPriID()
     
@@ -1388,14 +1494,20 @@
     buyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_BuyFbCntDay % mapID)
     recoverFbCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RecoverFbCnt % mapID)
     itemAddCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ItemAddFbCnt % mapID)
-    maxCnt = maxTimes + extraCnt + buyCnt + recoverFbCnt + mwAddCnt + itemAddCnt
+    regainFbCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RegainFbCnt % mapID)
+    maxCnt = maxTimes + regainFbCnt + extraCnt + buyCnt + recoverFbCnt + mwAddCnt + itemAddCnt
     return maxCnt
 
 def GetFBDetailCntInfo(curPlayer, mapID):
-    #返回FB剩余正常次数、vip额外次数、已买次数、道具增加次数、未买次数
+    #返回FB剩余正常次数、时间恢复次数、vip额外次数、已买次数、道具增加次数、未买次数
     fbIpyData = GetFBIpyData(mapID)
     enterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntDay % mapID)
     maxTimes = fbIpyData.GetDayTimes()
+    maxRegainFbCnt = 0
+    recoverIntervalDict = IpyGameDataPY.GetFuncEvalCfg('FBCntRegainInterval', 1)
+    if str(mapID) in recoverIntervalDict:
+        maxRegainFbCnt = recoverIntervalDict[str(mapID)][0]
+        
     MWPrivilegeID = fbIpyData.GetExtraTimesMWPriID()
     
     mwAddCnt = 0#wmpIpyData.GetEffectValue() if wmpIpyData else 0
@@ -1405,8 +1517,8 @@
     buyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_BuyFbCntDay % mapID)
     recoverFbCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RecoverFbCnt % mapID)
     itemAddCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ItemAddFbCnt % mapID)
-    #先用找回来的次数,再用Vip额外次数,再用每日刷新次数和Vip买回来的次数,最后用卷轴加的次数
-    cntList = [recoverFbCnt, extraCnt, maxTimes, buyCnt, itemAddCnt]
+    #先用找回来的次数,再用Vip额外次数,再用每日刷新次数、时间恢复次数、和Vip买回来的次数,最后用卷轴加的次数
+    cntList = [recoverFbCnt, extraCnt, maxTimes, maxRegainFbCnt, buyCnt, itemAddCnt]
     rCntList = copy.deepcopy(cntList)
     sumCnt = 0
     for i, cnt in enumerate(cntList):
@@ -1414,13 +1526,13 @@
         rCntList[i] = max(0, sumCnt - enterCnt)
         if enterCnt <= sumCnt:
             break
-    rRecoverFbCnt, rExtraCnt,rCommonCnt,rBuyCnt,rItemAddCnt = rCntList
+    rRecoverFbCnt, rExtraCnt, rCommonCnt, rRegainFbCnt, rBuyCnt, rItemAddCnt = rCntList
 
     #未买次数
     buyTimesVIPPriID = fbIpyData.GetBuyTimesVIPPriID()
     canBuyCnt = PlayerVip.GetPrivilegeValue(curPlayer, buyTimesVIPPriID)
-    noBuyCnt = max(0, canBuyCnt-buyCnt)
-    return [[rCommonCnt, rExtraCnt, rBuyCnt, rItemAddCnt, noBuyCnt], [maxTimes, extraCnt, canBuyCnt, 10000, canBuyCnt]]
+    noBuyCnt = max(0, canBuyCnt - buyCnt)
+    return [[rCommonCnt, rRegainFbCnt, rExtraCnt, rBuyCnt, rItemAddCnt, noBuyCnt], [maxTimes, maxRegainFbCnt, extraCnt, canBuyCnt, 10000, canBuyCnt]]
 
 ## 玩家进入副本次数
 #  @param curPlayer 玩家实例
@@ -1438,7 +1550,10 @@
 #  @param fbID 副本id
 #  @param addCount 增加次数
 #  @return 返回值无意义
-def AddEnterFBCount(curPlayer, fbID, addCount=1, lineBit=-1):
+def AddEnterFBCount(curPlayer, fbID, addCount=1, lineBit=-1, isFree=False):
+    ## @param isFree: 是否免费进入的,免费的不增加实际进入次数,但需要触发进入次数额外处理,如活跃、成就等
+    addCountEx = addCount
+    addCount = 0 if isFree else addCount
     fbID = GetRecordMapID(fbID)
     enterCntKey = ChConfig.Def_Player_Dict_EnterFbCntDay % fbID
     enterCnt = curPlayer.NomalDictGetProperty(enterCntKey)
@@ -1455,80 +1570,127 @@
         addCount = updCnt-enterCnt
         PlayerControl.NomalDictSetProperty(curPlayer, enterCntKey, updCnt)
         
-        PlayerActivity.OnEnterFBActivity(curPlayer, fbID, updCnt, addCount)
-        PlayerSuccess.AddEnterFBSuccess(curPlayer, fbID, addCount)
+        PlayerActivity.OnEnterFBActivity(curPlayer, fbID, updCnt, addCountEx)
+        PlayerSuccess.AddEnterFBSuccess(curPlayer, fbID, addCountEx)
         updValue = updCnt
-        #由满到未满时记录开始恢复的时间
-        if fbID == ChConfig.Def_FBMapID_SealDemon:
-            fbIpyData = GetFBIpyData(fbID)
-            dayTimes = fbIpyData.GetDayTimes()
-            if maxCnt - enterCnt >= dayTimes and maxCnt - updCnt < dayTimes:
-                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FbCntRegainStartTime % fbID, int(time.time()))
-                NotifyFBCntRegainInfo(curPlayer)
     GameWorld.DebugLog("    AddEnterFBCount fbID=%s, addCount=%s, lineBit=%s, enterCnt=%s,updValue=%s" 
                        % (fbID, addCount, lineBit, enterCnt, updValue), curPlayer.GetPlayerID())
     Sync_FBPlayerFBInfoData(curPlayer, fbID)
+    OnFBCountChangeEffectRecoverCount(curPlayer, fbID)
     return True
 
-def RegainFBCntProcess(curPlayer):
-    #目前只有封魔坛可恢复次数 先特殊做
-    mapID = ChConfig.Def_FBMapID_SealDemon
-    enterCnt = GetEnterFBCount(curPlayer, mapID)
-    fbIpyData = GetFBIpyData(mapID)
-    maxDayTimes = fbIpyData.GetDayTimes()
-    maxCnt = GetEnterFBMaxCnt(curPlayer, mapID)
-    maxCanAdd = max(0, maxDayTimes - (maxCnt-enterCnt))
-    #GameWorld.DebugLog('封魔坛最大可恢复次数 %s'%maxCanAdd)
-    if not maxCanAdd:
+def OnFBCountChangeEffectRecoverCount(curPlayer, mapID):
+    ## 副本相关次数变更,包含增加、扣除等影响副本按时间恢复次数相关逻辑处理
+    
+    recoverIntervalDict = IpyGameDataPY.GetFuncEvalCfg('FBCntRegainInterval', 1)
+    if str(mapID) not in recoverIntervalDict:
         return
-    curTime = int(time.time())
-    recoverInterval = IpyGameDataPY.GetFuncCfg('FBCntRegainInterval')
-    lastRegainTime = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FbCntRegainStartTime % mapID)
-    needTime = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FbCntRegainTotalTime % mapID)
-    if not needTime:
-        needTime = recoverInterval
-    passTime = curTime - lastRegainTime
-    if passTime < needTime:
-        return
-    recoverCnt = min(maxCanAdd, 1 + (passTime-needTime) / recoverInterval) # 恢复次数
-    enterCntKey = ChConfig.Def_Player_Dict_EnterFbCntDay % mapID
-    newEnterCnt = max(0, enterCnt-recoverCnt)
-    PlayerControl.NomalDictSetProperty(curPlayer, enterCntKey, newEnterCnt)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FbCntRegainTotalTime % mapID, 0)
-    if recoverCnt == maxCanAdd:
+    maxCanRecoverCnt, recoverInterval = recoverIntervalDict[str(mapID)]
+    curRegainFbCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RegainFbCnt % mapID) # 当前已恢复次数
+    if curRegainFbCnt >= maxCanRecoverCnt:
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FbCntRegainStartTime % mapID, 0)
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FbCntRegainTotalTime % mapID, 0)
+        GameWorld.DebugLog("副本时间恢复次数已达当日上限!")
     else:
-        startTime = curTime- (passTime-needTime)%recoverInterval
-        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FbCntRegainStartTime % mapID, startTime)
-    GameWorld.DebugLog('    封魔坛恢复次数%s, passTime=%s, needTime=%s'%(recoverCnt, passTime, needTime))
-    Sync_FBPlayerFBInfoData(curPlayer, mapID)
-    NotifyFBCntRegainInfo(curPlayer)
+        curTime = int(time.time())
+        fbIpyData = GetFBIpyData(mapID)
+        maxFreeTimes = fbIpyData.GetDayTimes() # 常规封顶次数
+        enterCnt = GetEnterFBCount(curPlayer, mapID) # 已经进入次数
+        maxCnt = GetEnterFBMaxCnt(curPlayer, mapID) # 当前可用最大次数
+        remainCanEnterCnt = maxCnt - enterCnt # 剩余可进入次数
+        regainStartTime = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FbCntRegainStartTime % mapID)
+        passTime = curTime - regainStartTime
+        # 到达常规次数上限,暂时恢复时间
+        if remainCanEnterCnt >= maxFreeTimes:
+            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FbCntRegainStartTime % mapID, 0)
+            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FbCntRegainTotalTime % mapID, 0)
+            GameWorld.DebugLog("副本时间恢复次数已达常规次数!")
+        elif passTime < recoverInterval:
+            pass
+            #GameWorld.DebugLog("副本时间恢复次数还未到达恢复CD!")
+        else:
+            if not regainStartTime:
+                updRegainTotalTime = recoverInterval
+            else:
+                updRegainTotalTime = recoverInterval - passTime % recoverInterval
+            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FbCntRegainStartTime % mapID, curTime)
+            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FbCntRegainTotalTime % mapID, updRegainTotalTime)
+            GameWorld.DebugLog("副本还可按时间恢复次数!curTime=%s,regainStartTime=%s,passTime=%s,updRegainTotalTime=%s" 
+                               % (curTime, regainStartTime, passTime, updRegainTotalTime))
+    NotifyFBCntRegainInfo(curPlayer, [mapID])
     return
 
-def NotifyFBCntRegainInfo(curPlayer):
-    ##通知副本次数恢复剩余时间
-    curTime = int(time.time())
-    recoverInterval = IpyGameDataPY.GetFuncCfg('FBCntRegainInterval')
+def RegainFBCntProcess(curPlayer):
+    ## 按时间恢复副本次数
     
-    regainData = ChPyNetSendPack.tagMCFBCntRegainRemainTime()
-    regainData.Clear()
-    regainData.InfoList = []
-    for mapID in [ChConfig.Def_FBMapID_SealDemon]:
+    curTime = int(time.time())
+    recoverIntervalDict = IpyGameDataPY.GetFuncEvalCfg('FBCntRegainInterval', 1)
+    for mapIDStr, recoverInfo in recoverIntervalDict.items():
+        mapID = int(mapIDStr)
+        maxCanRecoverCnt, recoverInterval = recoverInfo
+        curRegainFbCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RegainFbCnt % mapID) # 当前已恢复次数
+        if maxCanRecoverCnt and curRegainFbCnt >= maxCanRecoverCnt:
+            #GameWorld.DebugLog("已到达副本恢复次数上限!mapID=%s,curRegainFbCnt(%s) >= maxCanRecoverCnt(%s)" % (mapID, curRegainFbCnt, maxCanRecoverCnt))
+            continue
+        fbIpyData = GetFBIpyData(mapID)
+        maxFreeTimes = fbIpyData.GetDayTimes() # 常规封顶次数
+        enterCnt = GetEnterFBCount(curPlayer, mapID) # 已经进入次数
+        maxCnt = GetEnterFBMaxCnt(curPlayer, mapID) # 当前可用最大次数
+        remainCanEnterCnt = maxCnt - enterCnt # 剩余可进入次数
+        if remainCanEnterCnt >= maxFreeTimes:
+            #GameWorld.DebugLog("可进入次数已经到达常规封顶次数!mapID=%s,remainCanEnterCnt=%s" % (mapID, remainCanEnterCnt))
+            continue
+        regainStartTime = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FbCntRegainStartTime % mapID)
+        if not regainStartTime:
+            #GameWorld.DebugLog("还未设置副本恢复次数倒计时!mapID=%s" % mapID)
+            continue
+        needTime = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FbCntRegainTotalTime % mapID)
+        passTime = curTime - regainStartTime
+        if passTime < needTime:
+            continue
+        remainTime = passTime - needTime # 扣除恢复单次后剩余的时间,离线上线后可能一次性恢复多次
+        recoverCnt = 1 + remainTime / recoverInterval # 倒计时时间可恢复总次数
+        realRecoverCnt = min(maxFreeTimes - remainCanEnterCnt, recoverCnt) # 实际最大可恢复总次数
+        if maxCanRecoverCnt:
+            realRecoverCnt = min(realRecoverCnt, maxCanRecoverCnt - curRegainFbCnt)
+        if realRecoverCnt <= 0:
+            continue
+        
+        # 更新时间倒计时已恢复次数
+        updRegainFbCnt = curRegainFbCnt + realRecoverCnt
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_RegainFbCnt % mapID, updRegainFbCnt)
+        
+        OnFBCountChangeEffectRecoverCount(curPlayer, mapID)
+        
+    return
+
+def NotifyFBCntRegainInfo(curPlayer, syncMapIDList=[]):
+    ##通知副本次数恢复剩余时间
+    recoverIntervalDict = IpyGameDataPY.GetFuncEvalCfg('FBCntRegainInterval', 1) # {mapID:[次数, 每次间隔], ...}
+    if not recoverIntervalDict:
+        return
+    if not syncMapIDList:
+        syncMapIDList = [int(mapIDStr) for mapIDStr in recoverIntervalDict.keys()]
+        
+    infoList = []
+    curTime = int(time.time())
+    for mapID in syncMapIDList:
+        if str(mapID) not in recoverIntervalDict:
+            continue
         mapInfo = ChPyNetSendPack.tagMCFBCntRegain()
         mapInfo.Clear()
         mapInfo.DataMapID = mapID
         lastRegainTime = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FbCntRegainStartTime % mapID)
         needTime = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FbCntRegainTotalTime % mapID)
-        if not needTime:
-            needTime = recoverInterval
         passTime = curTime - lastRegainTime
-        
-        if passTime >= needTime:
-            continue
-        mapInfo.RemainTime = needTime - passTime
-        regainData.InfoList.append(mapInfo)
-    if not regainData.InfoList:
+        mapInfo.RemainTime = max(0, needTime - passTime)
+        mapInfo.RegainCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RegainFbCnt % mapID)
+        infoList.append(mapInfo)
+    if not infoList:
         return
+    regainData = ChPyNetSendPack.tagMCFBCntRegainRemainTime()
+    regainData.Clear()
+    regainData.InfoList = infoList
     regainData.Cnt = len(regainData.InfoList)
     NetPackCommon.SendFakePack(curPlayer, regainData)
     return
@@ -1627,20 +1789,30 @@
         itemAddCntKey = ChConfig.Def_Player_Dict_ItemAddFbCnt % mapID
         itemAddCnt = curPlayer.NomalDictGetProperty(itemAddCntKey)
         PlayerControl.NomalDictSetProperty(curPlayer, itemAddCntKey, 0)
-            
-        GameWorld.DebugLog("    重置:mapID=%s,dayTimes=%s,buyCnt=%s,recoverCnt=%s,itemAddCnt=%s,maxCnt=%s,enterCnt=%s" 
-                           % (mapID, dayTimes, buyCnt, recoverCnt, itemAddCnt, maxCnt, enterCnt))
-        # 按时间CD恢复次数类型的副本特殊处理,重置时间点不会重置,需要保持当前剩余次数不变, 如: 封魔坛
-        if mapID in [ChConfig.Def_FBMapID_SealDemon]:
-            newEnterCnt = max(0, dayTimes - (maxCnt - enterCnt))
-            PlayerControl.NomalDictSetProperty(curPlayer, enterCntKey, newEnterCnt)
-            GameWorld.DebugLog("        特殊副本已进入次数更新: newEnterCnt=%s" % newEnterCnt)
+        
+        # 时间恢复次数
+        regainFBCntKey = ChConfig.Def_Player_Dict_RegainFbCnt % mapID
+        regainFBCnt = curPlayer.NomalDictGetProperty(regainFBCntKey)
+        PlayerControl.NomalDictSetProperty(curPlayer, regainFBCntKey, 0)
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FbCntRegainStartTime % mapID, 0)
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FbCntRegainTotalTime % mapID, 0)
+        
+        GameWorld.DebugLog("    重置:mapID=%s,dayTimes=%s,buyCnt=%s,recoverCnt=%s,itemAddCnt=%s,regainFBCnt=%s,maxCnt=%s,enterCnt=%s" 
+                           % (mapID, dayTimes, buyCnt, recoverCnt, itemAddCnt, regainFBCnt, maxCnt, enterCnt))
+        if mapID == ChConfig.Def_FBMapID_ZhuXianBoss:
+            if GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_ZhuXianBoss):
+                curCnt = min(maxCnt - enterCnt + IpyGameDataPY.GetFuncCfg('ZhuXianBossCntCfg'), IpyGameDataPY.GetFuncCfg('ZhuXianBossCntCfg', 2))
+                if curCnt > dayTimes:
+                    PlayerControl.NomalDictSetProperty(curPlayer, itemAddCntKey, curCnt - dayTimes)
+                elif curCnt < dayTimes:
+                    PlayerControl.NomalDictSetProperty(curPlayer, enterCntKey, dayTimes - curCnt)
             
         mapIDInfo.append(mapID)
         
     if mapIDInfo:
         Sync_FBPlayerFBInfoData(curPlayer, mapIDInfo)
         Sync_FBPlayerFBBuyCount(curPlayer, mapIDInfo)
+        NotifyFBCntRegainInfo(curPlayer, mapIDInfo)
     
     return
 
@@ -1697,9 +1869,12 @@
     maxDayTimes = ipyData.GetDayTimes()
     maxCnt = GetEnterFBMaxCnt(curPlayer, mapID)
     enterCnt = GetEnterFBCount(curPlayer, mapID)
-    if maxDayTimes and maxCnt - enterCnt >= maxDayTimes:
+    if mapID == ChConfig.Def_FBMapID_SealDemon and maxDayTimes and maxCnt - enterCnt >= maxDayTimes:
         GameWorld.DebugLog('当前次数已满,无需购买。。')
         return
+    if mapID == ChConfig.Def_FBMapID_ZhuXianBoss and maxCnt - enterCnt >= IpyGameDataPY.GetFuncCfg('ZhuXianBossCntCfg', 2):
+        return
+    
     if hasBuyCnt >= canBuyCnt:
         GameWorld.DebugLog("购买次数已经用完mapID=%s"%mapID)
         return
@@ -1719,16 +1894,7 @@
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_BuyFbCntDay % mapID, hasBuyCnt + 1)
     Sync_FBPlayerFBBuyCount(curPlayer, [mapID])
     PlayerControl.NotifyCode(curPlayer, 'FBEnterTimeBuy', [mapID])
-    lastRegainTime= curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FbCntRegainStartTime % mapID)
-    if lastRegainTime:
-        maxCnt = GetEnterFBMaxCnt(curPlayer, mapID)
-        if maxCnt - enterCnt == maxDayTimes:
-            curTime = int(time.time())
-            needTime = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FbCntRegainTotalTime % mapID)
-            if not needTime:
-                needTime = IpyGameDataPY.GetFuncCfg('FBCntRegainInterval')
-            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FbCntRegainTotalTime % mapID, needTime - (curTime-lastRegainTime))
-            NotifyFBCntRegainInfo(curPlayer)
+    OnFBCountChangeEffectRecoverCount(curPlayer, mapID)
     return
 
 def DoFuncOpen_RunDaily(curPlayer): return EventReport.WriteFuncCMEAcceptable(curPlayer, ShareDefine.GameFuncID_RunDaily)
@@ -1846,7 +2012,7 @@
 #  @param tick 当前时间
 #  @param isMaxlv 是否直接满级
 #  @return None
-def FbEncourageBuff(curPlayer, key, encourageType, tick, isMaxlv=False):
+def FbEncourageBuff(curPlayer, key, encourageType, tick, ownerID=0):
     #GameWorld.Log("FbEncourageBuff moneyType=%s" % (moneyType))
     curMapID = curPlayer.GetMapID()
     curMapID = GetRecordMapID(curMapID)
@@ -1855,10 +2021,10 @@
         return
     maxCnt = ipyData.GetInspireMaxLV()
     gameFB = GameWorld.GetGameFB()
-    curPlayerID = curPlayer.GetID()
-    encourageLV = gameFB.GetPlayerGameFBDictByKey(curPlayerID, key)
+    ownerID = ownerID or curPlayer.GetID()
+    encourageLV = gameFB.GetPlayerGameFBDictByKey(ownerID, key)
     encourageCntKey = 'FbEncourageCnt_%s' % encourageType
-    encourageCnt = gameFB.GetPlayerGameFBDictByKey(curPlayerID, encourageCntKey)
+    encourageCnt = gameFB.GetPlayerGameFBDictByKey(ownerID, encourageCntKey)
     maxLV = IpyGameDataPY.GetFuncEvalCfg('FBEncourageBuff', 2, {}).get(curMapID, 0)
     if encourageLV >= maxLV:
         PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_93643")
@@ -1893,29 +2059,47 @@
         return
     
     buffType = SkillCommon.GetBuffType(skillBuff)
-    BuffSkill.DoAddBuff(curPlayer, buffType, skillBuff, tick)
-    gameFB.SetPlayerGameFBDict(curPlayerID, key, encourageLV+1)
-    gameFB.SetPlayerGameFBDict(curPlayerID, encourageCntKey, encourageCnt+1)
+    
+    gameFB.SetPlayerGameFBDict(ownerID, key, encourageLV+1)
+    gameFB.SetPlayerGameFBDict(ownerID, encourageCntKey, encourageCnt+1)
     #GameWorld.Log("FbEncourageBuff encourage nextLV=%s success" % encourageLV)
     addHurtNum = IpyGameDataPY.GetFuncEvalCfg('FBEncourageBuff', 3, {}).get(curMapID, 0)
-    PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_628920", [(encourageLV+1)*addHurtNum])
-    SendFBEncourageInfo(curPlayer, encourageLV+1)
-    #成就
-    PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_FBEncourage, 1, [curMapID])
-    EventShell.EventRespons_FBEncourage(curPlayer, curMapID)
-    return
+    if curMapID == ChConfig.Def_FBMapID_AllFamilyBoss:
+        #给副本里所有盟成员提示
+        playerManager = GameWorld.GetMapCopyPlayerManager()
+        for index in xrange(playerManager.GetPlayerCount()):
+            player = playerManager.GetPlayerByIndex(index)
+            if not player:
+                continue
+            if player.GetFamilyID() != ownerID:
+                continue
+            BuffSkill.DoAddBuff(player, buffType, skillBuff, tick)
+            PlayerControl.NotifyCode(player, "AllianceBossText2", [curPlayer.GetName(), encourageLV+1])
+            SendFBEncourageInfo(player, encourageLV+1, ownerID)
+            if player.GetID() == curPlayer.GetID():
+                PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_FBEncourage, 1, [curMapID])
+                EventShell.EventRespons_FBEncourage(curPlayer, curMapID)
+            
+    else:
+        BuffSkill.DoAddBuff(curPlayer, buffType, skillBuff, tick)
+        PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_628920", [(encourageLV+1)*addHurtNum])
+        SendFBEncourageInfo(curPlayer, encourageLV+1, ownerID)
+        #成就
+        PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_FBEncourage, 1, [curMapID])
+        EventShell.EventRespons_FBEncourage(curPlayer, curMapID)
+    return True
 
 ## 添加副本鼓舞buff,一般用于玩家掉线后,在规定时间内重新上线回到副本时重新上buff
 #  @param curPlayer 玩家
 #  @param key 副本玩家字典key
 #  @param tick 当前时间
 #  @return None
-def AddFbEncourageBuff(curPlayer, key, tick):
+def AddFbEncourageBuff(curPlayer, key, tick, ownerID=0):
     curPlayerID = curPlayer.GetID()
     GameWorld.Log("AddFbEncourageBuff() curPlayerID=%s" % curPlayerID)
-  
+    ownerID = ownerID or curPlayer.GetID()
     gameFB = GameWorld.GetGameFB()
-    encourageLV = gameFB.GetPlayerGameFBDictByKey(curPlayerID, key)
+    encourageLV = gameFB.GetPlayerGameFBDictByKey(ownerID, key)
     if not encourageLV:
         return
     mapID = GameWorld.GetMap().GetMapID()
@@ -1930,7 +2114,7 @@
     buffType = SkillCommon.GetBuffType(skillBuff)
     BuffSkill.DoAddBuff(curPlayer, buffType, skillBuff, tick)
     
-    SendFBEncourageInfo(curPlayer, encourageLV)
+    SendFBEncourageInfo(curPlayer, encourageLV, ownerID)
     return
 
 ## 清除鼓舞buff
@@ -1950,7 +2134,7 @@
 ## 发送副本鼓舞信息
 #  @param curPlayer 玩家
 #  @return None
-def SendFBEncourageInfo(curPlayer, lv):
+def SendFBEncourageInfo(curPlayer, lv, ownerID=0):
     #//A3 0A 副本鼓舞信息通知 #tagMCFBEncourageInfo
     curMapID = curPlayer.GetMapID()
     curMapID = GetRecordMapID(curMapID)
@@ -1962,12 +2146,12 @@
     encourageInfo.InfoList = []
     encourageCntKey = 'FbEncourageCnt_%s'
     gameFB = GameWorld.GetGameFB()
-    curPlayerID = curPlayer.GetID()
+    ownerID = ownerID or curPlayer.GetID()
     for ipyData in ipyDataList:
         inspireType = ipyData.GetInspireType()
         packData = ChPyNetSendPack.tagMCFBEncourageCnt()
         packData.MoneyType = inspireType
-        packData.EncourageCnt = gameFB.GetPlayerGameFBDictByKey(curPlayerID, encourageCntKey % inspireType)
+        packData.EncourageCnt = gameFB.GetPlayerGameFBDictByKey(ownerID, encourageCntKey % inspireType)
         encourageInfo.InfoList.append(packData)
     encourageInfo.Cnt = len(encourageInfo.InfoList)
     NetPackCommon.SendFakePack(curPlayer, encourageInfo)
@@ -2321,4 +2505,11 @@
         fbHelpFunc(curPlayer, tick)
     return
 
+def GetCrossDynamicLineMapZoneID():
+    ## 获取跨服动态线路地图本线路跨服分区
+    return GameWorld.GetGameWorld().GetPropertyID() / 10000
+
+def GetCrossDynamicLineMapFuncLineID():
+    ## 获取跨服动态线路地图本线路功能线路ID
+    return GameWorld.GetGameWorld().GetPropertyID() % 10000 / 10
 

--
Gitblit v1.8.0