From d7f44d8d871a90c818bdb3ffe9a60af875b7100a Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 30 九月 2025 10:12:23 +0800
Subject: [PATCH] 135 【挑战】战锤秘境-服务端(白骨盈野;副本基础;副本扫荡;广告奖励支持;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py | 1347 ++++++++-------------------------------------------------
 1 files changed, 205 insertions(+), 1,142 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 611abb5..51b29fe 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
@@ -16,36 +16,22 @@
 import IPY_GameWorld
 import PlayerControl
 import ItemCommon
-import GameMap
-import EventShell
 import NPCCommon
 import ReadChConfig
-import BuffSkill
 import ChPyNetSendPack
 import NetPackCommon
-import SkillCommon
 import IpyGameDataPY
-import PlayerFB
 import ShareDefine
-import EventReport
-import PlayerFamily
-import PlayerActivity
-import ItemControler
-import PlayerSuccess
-import GameFuncComm
 import PyGameData
-import PlayerVip
 import GameObj
 import FBLogic
 import ChConfig
 import PlayerGoldInvest
+import ObjPool
 
-import datetime
 import random
 import json
 import math
-import time
-import copy
 #---------------------------------------------------------------------
 #全局变量
 Def_VSFB_CanEnter = 'VSFB_CanEnter'                   #可以进入
@@ -127,29 +113,25 @@
 
 def GetFBLineEnterPosInfo(mapID, lineID, fbLineIpyData=None):
     # 坐标信息
+    return [10,10]
+def GetPassAwardList(mapID, lineID):
+    # 过关奖励
+    fbLineIpyData = GetFBLineIpyData(mapID, lineID)
+    return [] if not fbLineIpyData else fbLineIpyData.GetPassAwardList()
+def GetSweepAwardList(mapID, lineID, sweepCnt):
+    # 扫荡奖励
+    fbLineIpyData = GetFBLineIpyData(mapID, lineID)
     if not fbLineIpyData:
-        fbLineIpyData = GetFBLineIpyData(mapID, lineID)
-    return None if not fbLineIpyData else fbLineIpyData.GetEnterPosInfo()
-def GetFBLineStepTime(mapID, lineID=0):
-    # 阶段时间信息
-    fbLineIpyData = GetFBLineIpyData(mapID, lineID)
-    return None if not fbLineIpyData else fbLineIpyData.GetStepTime()
-def GetFBLineRefreshNPC(mapID, lineID=0): 
-    # 刷怪信息
-    fbLineIpyData = GetFBLineIpyData(mapID, lineID)
-    return None if not fbLineIpyData else fbLineIpyData.GetRefreshNPC()
-def GetFBLineGrade(mapID, lineID=0):
-    # 评级规则信息
-    fbLineIpyData = GetFBLineIpyData(mapID, lineID)
-    return None if not fbLineIpyData else fbLineIpyData.GetGradeInfo()
-def GetFBLineReward(mapID, lineID):
-    # 奖励信息;支持扫荡取奖励
-    fbLineIpyData = GetFBLineIpyData(mapID, lineID)
-    return None if not fbLineIpyData else fbLineIpyData.GetRewardInfo()
-
-def GetFBGradeRewardRateList(mapID):
-    fbIpyData = GetFBIpyData(mapID)
-    return [] if not fbIpyData else fbIpyData.GetRewardRate()
+        return []
+    awardItemList = fbLineIpyData.GetSweepAwardList()
+    if not awardItemList:
+        awardItemList = fbLineIpyData.GetPassAwardList()
+        
+    sweepItemList = []
+    for itemInfo in awardItemList:
+        itemID, itemCount = itemInfo[:2]
+        sweepItemList.append([itemID, itemCount * sweepCnt])
+    return sweepItemList
 
 def GetFBFuncOpenState(dataMapID):
     ## 获取副本开启状态 @return: 0-关闭;1-开启
@@ -167,42 +149,40 @@
 
 def IsFBPass(curPlayer, mapID, lineID):
     ## 副本线路是否已过关
-    passLineID = 0
-    if mapID == ChConfig.Def_FBMapID_RealmTower:
-        passLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RealmTowerFloor)
-    elif mapID == ChConfig.Def_FBMapID_SkyTower:
-        passLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_SkyTowerFloor)
-    elif mapID == ChConfig.Def_FBMapID_TrialTower:
-        passLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_TrialTower_PassLV)
-    else:
-        ipyData = IpyGameDataPY.GetIpyGameDataNotLog('FBGeneralTrain', mapID, lineID)
-        if ipyData:
-            passLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBPassLineID % mapID)
-        else:
-            grade = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_PlayerFBStar_MapId, lineID, False, [mapID])
-            if grade:
-                return True
-            
-    if passLineID >= lineID:
-        return True
+    if mapID == ChConfig.Def_FBMapID_Main:
+        return PlayerControl.IsMainLevelPass(curPlayer, lineID)
     
+    if mapID in ChConfig.PassByStarMapIDList:
+        grade = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_FBStar, lineID, False, [mapID])
+        if grade:
+            return True
+    else:
+        passLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBPassLineID % mapID)
+        if passLineID >= lineID:
+            return True
+        
     return False
+
+def SetFBPass(curPlayer, mapID, funcLineID, isNotify=True):
+    passLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBPassLineID % mapID)
+    if funcLineID > passLineID:
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FBPassLineID % mapID, funcLineID)
+    if isNotify:
+        Sync_FBPlayerFBInfoData(curPlayer, mapID)
+    return
 
 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:
         #开服天开放检查
-        if not GetFBFuncOpenState(mapID):
-            GameWorld.Log("当前时间未开放该副本!mapID=%s" % (mapID), playerID)
-            if isNotify:
-                PlayerControl.NotifyCode(curPlayer, "FBIsNotOpen")
-            return ShareDefine.EntFBAskRet_FBClose
+        #if not GetFBFuncOpenState(mapID):
+        #    GameWorld.Log("当前时间未开放该副本!mapID=%s" % (mapID), playerID)
+        #    if isNotify:
+        #        PlayerControl.NotifyCode(curPlayer, "FBIsNotOpen")
+        #    return ShareDefine.EntFBAskRet_FBClose
         
         #进入次数判断
         canEnter, notifyMark = __CheckCanEnterFBByTime(curPlayer, mapID, lineID, fbIpyData, reqEnterCnt, isTeamAsk)
@@ -211,35 +191,23 @@
                 PlayerControl.NotifyCode(curPlayer, notifyMark, [mapID])
             return ShareDefine.EntFBAskRet_NoEnterCnt
         
-        #进入CD判断
-        if CheckIsEnterCD(curPlayer, mapID):
-            if isNotify:
-                PlayerControl.NotifyCode(curPlayer, "SingleEnterCD", [mapID])
-            return ShareDefine.EntFBAskRet_EnterCD
     # 功能线路通用检查
     if fbLineIpyData:
         #等级判断
         curLV = curPlayer.GetLV()
         lvLimitMin = fbLineIpyData.GetLVLimitMin()
-        lvLimitMax = fbLineIpyData.GetLVLimitMax()
         if lvLimitMin and curLV < lvLimitMin:
             GameWorld.Log("玩家等级不足, 无法进入副本!mapID=%s,lineID=%s,curLV(%s) < lvLimitMin(%s)" 
                           % (mapID, lineID, curLV, lvLimitMin), playerID)
             if isNotify:
                 PlayerControl.NotifyCode(curPlayer, "FbLV", [mapID])
             return ShareDefine.EntFBAskRet_LVLimit
-        if lvLimitMax and curLV > lvLimitMax:
-            GameWorld.Log("玩家等级超过, 无法进入副本!mapID=%s,lineID=%s,curLV(%s) > lvLimitMax(%s)" 
-                          % (mapID, lineID, curLV, lvLimitMax), playerID)
-            if isNotify:
-                PlayerControl.NotifyCode(curPlayer, "FbLV", [mapID])
-            return ShareDefine.EntFBAskRet_LVLimit
         
         #门票判断
-        if not GetFBEnterTicket(curPlayer, mapID, lineID, fbLineIpyData, reqEnterCnt, isTeamAsk)[0]:
-            if isNotify:
-                PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_157069", [mapID])
-            return ShareDefine.EntFBAskRet_NoTicket
+        #if not GetFBEnterTicket(curPlayer, mapID, lineID, fbLineIpyData, reqEnterCnt, isTeamAsk)[0]:
+        #    if isNotify:
+        #        PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_157069", [mapID])
+        #    return ShareDefine.EntFBAskRet_NoTicket
         
     return ShareDefine.EntFBAskRet_OK
 
@@ -249,50 +217,40 @@
     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)
+    enterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FbEnterCnt % mapID)
     maxCnt = GetEnterFBMaxCnt(curPlayer, mapID)
     if enterCnt + reqEnterCnt <= maxCnt:
         return True, ""
     
-    ### 以下是到达次数上限后的处理
-    fbType = GameWorld.GetMap().GetMapFBTypeByMapID(mapID)
+    if mapID in ChConfig.UnPassFreeMapIDList and not IsFBPass(curPlayer, mapID, lineID):
+        return True, ""
     
-    # 单人副本达到次数后不可再进入
-    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"
+#    ### 以下是到达次数上限后的处理
+#    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 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"
+#        
+#    if 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"
     
-    # 组队副本
-    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, ""
+    GameWorld.DebugLog("可进入次数不足: mapID=%s, lineID=%s, enterCnt(%s) + reqEnterCnt(%s) <= maxCnt=%s" 
+                       % (mapID, lineID, enterCnt, reqEnterCnt, maxCnt))
+    return False, "GeRen_chenxin_268121"
 
 ## 获取副本进入门票信息
 #  @param curPlayer 玩家实例
@@ -301,38 +259,39 @@
 #  @return [是否可进, [[门票索引列表, delCnt], ...], 删除个数, 是否有绑定, 扣钱信息]
 def GetFBEnterTicket(curPlayer, mapID, lineID=0, fbLineIpyData=None, reqEnterCnt=1, isTeamAsk=False):
     #门票判断
-    if not fbLineIpyData:
-        fbLineIpyData = GetFBLineIpyData(mapID, lineID)
-        
-    ticketID = fbLineIpyData.GetTicketID()
-    if not ticketID:
-        return True, [], 0, False, []
-    
-    ticketCostCntList = fbLineIpyData.GetTicketCostCnt()
-    if not ticketCostCntList:
-        GameWorld.ErrLog("没有配置门票消耗!mapID=%s,lineID=%s" % (mapID, lineID), curPlayer.GetPlayerID())
-        return False, [], 0, False, []
-    
-    enterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntDay % mapID)
-    costCnt = ticketCostCntList[-1] if enterCnt >= len(ticketCostCntList) else ticketCostCntList[enterCnt]
-    totalCostCnt = costCnt*reqEnterCnt
-    if not totalCostCnt:
-        GameWorld.ErrLog("没有配置门票消耗!mapID=%s,lineID=%s" % (mapID, lineID), curPlayer.GetPlayerID())
-        return False, [], 0, False, []
-    
-    itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
-    enough, indexList, hasBind, lackCnt = ItemCommon.GetItem_FromPack_ByID_ExEx(ticketID, itemPack, totalCostCnt)
-    if not enough:
-        ticketPrice = fbLineIpyData.GetTicketPrice()
-        if ticketPrice and not isTeamAsk: #组队进组队副本时必须要有门票道具
-            costMoney = ticketPrice * lackCnt
-            costMoneyList = PlayerControl.HaveMoneyEx(curPlayer, ShareDefine.TYPE_Price_Gold_Paper_Money, costMoney)
-            return bool(costMoneyList), indexList, totalCostCnt, hasBind, costMoneyList
-        GameWorld.DebugLog("门票不足, 无法进入副本!mapID=%s,lineID=%s,ticketID=%s,reqEnterCnt=%s,totalCostCnt=%s" 
-                      % (mapID, lineID, ticketID, reqEnterCnt, totalCostCnt), curPlayer.GetPlayerID())
-        return False, [], 0, False, []
-    
-    return enough, indexList, totalCostCnt, hasBind, []
+    return True, [], 0, False, []
+#    if not fbLineIpyData:
+#        fbLineIpyData = GetFBLineIpyData(mapID, lineID)
+#        
+#    ticketID = fbLineIpyData.GetTicketID()
+#    if not ticketID:
+#        return True, [], 0, False, []
+#    
+#    ticketCostCntList = fbLineIpyData.GetTicketCostCnt()
+#    if not ticketCostCntList:
+#        GameWorld.ErrLog("没有配置门票消耗!mapID=%s,lineID=%s" % (mapID, lineID), curPlayer.GetPlayerID())
+#        return False, [], 0, False, []
+#    
+#    enterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FbEnterCnt % mapID)
+#    costCnt = ticketCostCntList[-1] if enterCnt >= len(ticketCostCntList) else ticketCostCntList[enterCnt]
+#    totalCostCnt = costCnt*reqEnterCnt
+#    if not totalCostCnt:
+#        GameWorld.ErrLog("没有配置门票消耗!mapID=%s,lineID=%s" % (mapID, lineID), curPlayer.GetPlayerID())
+#        return False, [], 0, False, []
+#    
+#    itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
+#    enough, indexList, hasBind, lackCnt = ItemCommon.GetItem_FromPack_ByID_ExEx(ticketID, itemPack, totalCostCnt)
+#    if not enough:
+#        ticketPrice = fbLineIpyData.GetTicketPrice()
+#        if ticketPrice and not isTeamAsk: #组队进组队副本时必须要有门票道具
+#            costMoney = ticketPrice * lackCnt
+#            costMoneyList = PlayerControl.HaveMoneyEx(curPlayer, ShareDefine.TYPE_Price_Gold_Paper_Money, costMoney)
+#            return bool(costMoneyList), indexList, totalCostCnt, hasBind, costMoneyList
+#        GameWorld.DebugLog("门票不足, 无法进入副本!mapID=%s,lineID=%s,ticketID=%s,reqEnterCnt=%s,totalCostCnt=%s" 
+#                      % (mapID, lineID, ticketID, reqEnterCnt, totalCostCnt), curPlayer.GetPlayerID())
+#        return False, [], 0, False, []
+#    
+#    return enough, indexList, totalCostCnt, hasBind, []
 
 ## 获取副本进入门票信息
 #  @param curPlayer 玩家实例
@@ -407,17 +366,6 @@
     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):
@@ -506,15 +454,6 @@
     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():
     ''' 获取当前单人副本玩家 '''
     curPlayer = None
@@ -590,44 +529,6 @@
                 curPlayer.Sync_TimeTick(timeType, 0, diffSecond * 1000, True)
     return updGrade
 
-def UpdateCustomFBGrade(curPlayer, tick, gradeTimeList, timeType=IPY_GameWorld.tttFlagTake):
-    '''更新当前副本星级、评级
-    @param gradeTimeList: 评级分段时间列表,单位秒 [最高评级可用时间, 下级可用时间, ..., 最低级可用时间]
-    @param curPlayer: 触发的玩家,一般是DoEnter时调用,会同步更新一次副本评级并将信息通知该玩家
-    @note: 星级:1-1星;2-2星 ...            [60, 20, 10]
-            评级:1-D;2-C;3-B;4-A;5-S;    [60, 30, 30, 20, 10]
-    '''
-    lowest = 1
-    curGrade = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ClientCustomSceneGrade)
-    #最后一个评级了,不再处理
-    if curGrade == lowest:
-        return curGrade
-    
-    fbStepTick = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ClientCustomSceneStepTick)
-    useSecond = int((tick - fbStepTick) / 1000.0) # 战斗阶段已耗总秒数
-    diffSecond = 0
-    updGrade = len(gradeTimeList)
-    gSecondTotal = 0
-    for gSecond in gradeTimeList:
-        gSecondTotal += gSecond
-        diffSecond = gSecondTotal - useSecond
-        # 还在当前评级段
-        if diffSecond > 0:
-            break
-        updGrade -= 1 # 用时超过当前评级段,降级
-    updGrade = max(lowest, updGrade) # 保底最低级
-    if curGrade == updGrade:
-        return curGrade
-    curPlayer.SetDict(ChConfig.Def_PlayerKey_ClientCustomSceneGrade, updGrade)
-    
-    GameWorld.DebugLog("UpdateCustomFBGrade useSecond=%s,gradeTimeList=%s,curGrade=%s,updGrade=%s,diffSecond=%s" 
-                       % (useSecond, gradeTimeList, curGrade, updGrade, diffSecond))
-    
-    Notify_FBHelp(curPlayer, {Help_grade:updGrade})
-    if updGrade != lowest:
-        curPlayer.Sync_TimeTick(timeType, 0, diffSecond * 1000, True)
-    return updGrade
-
 def NotifyFBOver(curPlayer, dataMapID, lineID, isPass, overDict={}):
     ## 通知玩家副本总结, 该函数统一几个必带参数
     overDict.update({Over_dataMapID:dataMapID, Over_lineID:lineID, Over_isPass:int(isPass)})
@@ -670,8 +571,8 @@
                 itemDict['ItemID'] = itemInfo[0]
             if infolen > 1:
                 itemDict['Count'] = itemInfo[1]
-            if infolen > 2:
-                itemDict['IsAuctionItem'] = int(itemInfo[2])
+            #if infolen > 2:
+            #    itemDict['IsAuctionItem'] = int(itemInfo[2])
         elif isinstance(itemInfo, int):
             itemDict['ItemID'] = itemInfo
         elif isinstance(itemInfo, dict):
@@ -681,7 +582,7 @@
                 continue
             itemDict['ItemID'] = itemInfo.GetItemTypeID()
             itemDict['Count'] = itemInfo.GetCount()
-            itemDict['IsAuctionItem'] = ItemControler.GetIsAuctionItem(itemInfo)
+            #itemDict['IsAuctionItem'] = ItemControler.GetIsAuctionItem(itemInfo)
             #itemDict['IsSuite'] = int(itemInfo.GetIsSuite())
             itemDict['UserData'] = itemInfo.GetUserData()
         jsonItemList.append(itemDict)
@@ -1598,67 +1499,22 @@
 
 ## ---------------------------------- TD ---------------------------------------
 def GetEnterFBMaxCnt(curPlayer, mapID):
-    ## 获取副本最大可进入次数: 基本次数 + 时间已恢复次数 + VIP额外次数 + 购买次数 + 找回次数 + 使用道具增加次数
+    ## 获取副本最大可进入次数: 基本次数 + 广告次数 + 购买次数 + 使用道具增加次数 + 其他
     fbIpyData = GetFBIpyData(mapID)
     if not fbIpyData:
         return 0
     maxTimes = fbIpyData.GetDayTimes()
-    MWPrivilegeID = fbIpyData.GetExtraTimesMWPriID()
-    
-    mwAddCnt = 0#wmpIpyData.GetEffectValue() if wmpIpyData else 0
-    extraTimesVIPPriID = fbIpyData.GetExtraTimesVIPPriID()
-    extraCnt = PlayerVip.GetPrivilegeValue(curPlayer, extraTimesVIPPriID)
-    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)
-    regainFbCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RegainFbCnt % mapID)
+    adCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBADCnt % mapID)
+    buyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBBuyCnt % mapID)
+    itemCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBItemCnt % mapID)
     investFBCnt = PlayerGoldInvest.GetAddFBCnt(curPlayer, mapID)
-    maxCnt = maxTimes + regainFbCnt + extraCnt + buyCnt + recoverFbCnt + mwAddCnt + itemAddCnt + investFBCnt
+    maxCnt = maxTimes + adCnt + buyCnt + itemCnt + investFBCnt
     return maxCnt
 
-def GetFBDetailCntInfo(curPlayer, mapID):
-    #返回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
-    maxTimes += mwAddCnt #法宝增加的次数加到基础次数里
-    extraTimesVIPPriID = fbIpyData.GetExtraTimesVIPPriID()
-    extraCnt = PlayerVip.GetPrivilegeValue(curPlayer, extraTimesVIPPriID)
-    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, maxRegainFbCnt, buyCnt, itemAddCnt]
-    rCntList = copy.deepcopy(cntList)
-    sumCnt = 0
-    for i, cnt in enumerate(cntList):
-        sumCnt += cnt
-        rCntList[i] = max(0, sumCnt - enterCnt)
-        if enterCnt <= sumCnt:
-            break
-    rRecoverFbCnt, rExtraCnt, rCommonCnt, rRegainFbCnt, rBuyCnt, rItemAddCnt = rCntList
-
-    #未买次数
-    buyTimesVIPPriID = fbIpyData.GetBuyTimesVIPPriID()
-    canBuyCnt = PlayerVip.GetPrivilegeValue(curPlayer, buyTimesVIPPriID)
-    noBuyCnt = max(0, canBuyCnt - buyCnt)
-    return [[rCommonCnt, rRegainFbCnt, rExtraCnt, rBuyCnt, rItemAddCnt, noBuyCnt], [maxTimes, maxRegainFbCnt, extraCnt, canBuyCnt, 10000, canBuyCnt]]
-
-## 玩家进入副本次数
-#  @param curPlayer 玩家实例
-#  @param fbID 副本id
-#  @return bool
 def GetEnterFBCount(curPlayer, fbID, lineBit=-1):
+    ## 玩家进入副本次数
     fbID = GetRecordMapID(fbID)
-    enterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntDay % fbID)
+    enterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FbEnterCnt % fbID)
     if lineBit >= 0:
         return GameWorld.GetDataByDigitPlace(enterCnt, lineBit)
     return enterCnt
@@ -1666,24 +1522,19 @@
 def AddFBCntByItem(curPlayer, itemID, mapID, addCnt):
     ## 物品增加副本次数
     mapID = GetRecordMapID(mapID)
-    itemAddCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ItemAddFbCnt % mapID)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_ItemAddFbCnt % mapID, itemAddCnt + addCnt)
+    itemAddCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBItemCnt % mapID)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FBItemCnt % mapID, itemAddCnt + addCnt)
     Sync_FBPlayerFBInfoData(curPlayer, mapID)
     PlayerControl.NotifyCode(curPlayer, 'AddActivityCount_1', [itemID, mapID, addCnt])
-    OnFBCountChangeEffectRecoverCount(curPlayer, mapID)
     return
 
-## 增加玩家进入副本次数
-#  @param curPlayer 玩家实例
-#  @param fbID 副本id
-#  @param addCount 增加次数
-#  @return 返回值无意义
 def AddEnterFBCount(curPlayer, fbID, addCount=1, lineBit=-1, isFree=False):
+    ## 增加玩家进入副本次数
     ## @param isFree: 是否免费进入的,免费的不增加实际进入次数,但需要触发进入次数额外处理,如活跃、成就等
-    addCountEx = addCount
+    #addCountEx = addCount
     addCount = 0 if isFree else addCount
     fbID = GetRecordMapID(fbID)
-    enterCntKey = ChConfig.Def_Player_Dict_EnterFbCntDay % fbID
+    enterCntKey = ChConfig.Def_Player_Dict_FbEnterCnt % fbID
     enterCnt = curPlayer.NomalDictGetProperty(enterCntKey)
     if lineBit >= 0:
         curLineEnterCnt = GameWorld.GetDataByDigitPlace(enterCnt, lineBit)
@@ -1698,180 +1549,21 @@
         addCount = updCnt-enterCnt
         PlayerControl.NomalDictSetProperty(curPlayer, enterCntKey, updCnt)
         
-        PlayerActivity.OnEnterFBActivity(curPlayer, fbID, updCnt, addCountEx)
-        PlayerSuccess.AddEnterFBSuccess(curPlayer, fbID, addCountEx)
+        #PlayerActivity.OnEnterFBActivity(curPlayer, fbID, updCnt, addCountEx)
+        #PlayerSuccess.AddEnterFBSuccess(curPlayer, fbID, addCountEx)
         updValue = updCnt
-    enterCntTotalKey = ChConfig.Def_Player_Dict_EnterFbCntTotal % fbID
-    enterCntTotal = min(curPlayer.NomalDictGetProperty(enterCntTotalKey) + addCount, ChConfig.Def_UpperLimit_DWord)
-    PlayerControl.NomalDictSetProperty(curPlayer, enterCntTotalKey, enterCntTotal)
-    GameWorld.DebugLog("    AddEnterFBCount fbID=%s, addCount=%s, lineBit=%s, enterCnt=%s,updValue=%s,enterCntTotal=%s" 
-                       % (fbID, addCount, lineBit, enterCnt, updValue, enterCntTotal), curPlayer.GetPlayerID())
+    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 OnFBCountChangeEffectRecoverCount(curPlayer, mapID):
-    ## 副本相关次数变更,包含增加、扣除等影响副本按时间恢复次数相关逻辑处理
-    
-    recoverIntervalDict = IpyGameDataPY.GetFuncEvalCfg('FBCntRegainInterval', 1)
-    if str(mapID) not in recoverIntervalDict:
-        return
-    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:
-        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 RegainFBCntProcess(curPlayer):
-    ## 按时间恢复副本次数
-    
-    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)
-        passTime = curTime - lastRegainTime
-        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
-
-def SetIsHelpFight(curPlayer):
-    ##设置是否助战 注意!需要在增加副本次数之前设置
-    mapID = GameWorld.GetMap().GetMapID()
-    mapID = GetRecordMapID(mapID)
-    enterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntDay % mapID)
-    maxCnt = GetEnterFBMaxCnt(curPlayer, mapID)
-    if enterCnt >= maxCnt:
-        GameWorld.GetGameFB().SetPlayerGameFBDict(curPlayer.GetID(), ChConfig.FBPlayerDict_IsHelpFight, 1)
-        return True
-    return False
-
-def GetIsHelpFight(curPlayer):
-    ##获取是否助战
-    return GameWorld.GetGameFB().GetPlayerGameFBDictByKey(curPlayer.GetID(), ChConfig.FBPlayerDict_IsHelpFight)
-
 def FBOnWeek(curPlayer, onWeekType):
-    
-    mapIDInfo = []
-    ipyDataMgr = IpyGameDataPY.IPY_Data()
-    for i in xrange(ipyDataMgr.GetFBFuncCount()):
-        ipyData = ipyDataMgr.GetFBFuncByIndex(i)
-        mapID = ipyData.GetDataMapID()
-        weekTimes = ipyData.GetWeekTimes()
-        # 没有周次数限制的不处理
-        if not weekTimes:
-            continue
-        # 重置类型不同的不处理
-        if ipyData.GetWeekResetType() != onWeekType:
-            continue
-        
-        # 重置周次数
-        enterCntWeekKey = ChConfig.Def_Player_Dict_EnterFbCntWeek % mapID
-        if curPlayer.NomalDictGetProperty(enterCntWeekKey):
-            PlayerControl.NomalDictSetProperty(curPlayer, enterCntWeekKey, 0)
-            mapIDInfo.append(mapID)
-            
-    if mapIDInfo:
-        Sync_FBPlayerFBInfoData(curPlayer, mapIDInfo)
-        
     return
 
-## 玩家通用副本OnDay处理
-#  @param curPlayer: 玩家实例
-#  @return: None
 def FBOnDay(curPlayer, onDayType):
     GameWorld.Log("副本过天处理,FBOnDay...", curPlayer.GetPlayerID())
+    if onDayType != ShareDefine.Def_OnEventType:
+        return
     FBLogic.OnFBPlayerOnDay(curPlayer, onDayType) # 在重置次数之前,可用于处理资源找回
     
     mapIDInfo = []
@@ -1879,71 +1571,18 @@
     for i in xrange(ipyDataMgr.GetFBFuncCount()):
         ipyData = ipyDataMgr.GetFBFuncByIndex(i)
         mapID = ipyData.GetDataMapID()
-        
-        # 有真实助战次数奖励限制的
-        if ipyData.GetDayHelpCountMax():
-            helpCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FBRealHelpCount % mapID)
-            if helpCount:
-                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FBRealHelpCount % mapID, 0)
-                GameWorld.DebugLog("重置日助战奖励次数限制!mapID=%s" % mapID)
-                
-        dayTimes = ipyData.GetDayTimes()
+        enterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FbEnterCnt % mapID)
         # 没有日次数限制的不处理
-        if not dayTimes and not ipyData.GetBuyTimesVIPPriID() and not ipyData.GetExtraTimesVIPPriID() and not ipyData.GetExtraTimesMWPriID():
-            #GameWorld.DebugLog("    不需要重置的副本,mapID=%s,dayTimes=%s,vipBuyPriID=%s,vipExtraTime=%s" 
-            #                   % (mapID, dayTimes, ipyData.GetBuyTimesVIPPriID(), ipyData.GetExtraTimesVIPPriID()))
+        if not enterCnt and not ipyData.GetDayTimes() and not ipyData.GetPayCntMax():
             continue
-        
-        # 重置类型不同的不处理
-        if ipyData.GetDayResetType() != onDayType:
-            #GameWorld.DebugLog("    重置时间点不同,不处理,mapID=%s" % mapID)
-            continue
-        
-        maxCnt = GetEnterFBMaxCnt(curPlayer, mapID)
-        
-        # 进入次数
-        enterCntKey = ChConfig.Def_Player_Dict_EnterFbCntDay % mapID
-        enterCnt = curPlayer.NomalDictGetProperty(enterCntKey)
-        PlayerControl.NomalDictSetProperty(curPlayer, enterCntKey, 0)
-            
-        # 购买次数
-        buyCntKey = ChConfig.Def_Player_Dict_BuyFbCntDay % mapID
-        buyCnt = curPlayer.NomalDictGetProperty(buyCntKey)
-        PlayerControl.NomalDictSetProperty(curPlayer, buyCntKey, 0)
-        
-        # 找回次数
-        recoverCntKey = ChConfig.Def_Player_Dict_RecoverFbCnt % mapID
-        recoverCnt = curPlayer.NomalDictGetProperty(recoverCntKey)
-        PlayerControl.NomalDictSetProperty(curPlayer, recoverCntKey, 0)
-        
-        # 物品增加次数
-        itemAddCntKey = ChConfig.Def_Player_Dict_ItemAddFbCnt % mapID
-        itemAddCnt = curPlayer.NomalDictGetProperty(itemAddCntKey)
-        PlayerControl.NomalDictSetProperty(curPlayer, itemAddCntKey, 0)
-        
-        # 时间恢复次数
-        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)
-            
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FbEnterCnt % mapID, 0)
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FBADCnt % mapID, 0)
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FBBuyCnt % mapID, 0)
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FBItemCnt % mapID, 0)
         mapIDInfo.append(mapID)
         
     if mapIDInfo:
         Sync_FBPlayerFBInfoData(curPlayer, mapIDInfo)
-        Sync_FBPlayerFBBuyCount(curPlayer, mapIDInfo)
-        NotifyFBCntRegainInfo(curPlayer, mapIDInfo)
     
     return
 
@@ -1953,27 +1592,6 @@
 def FBOnLogin(curPlayer):
     FBLogic.OnFBPlayerOnLogin(curPlayer)
     Sync_FBPlayerFBInfoData(curPlayer)
-    SyncFBEnterTick(curPlayer)
-    Sync_FBPlayerFBBuyCount(curPlayer)
-    #PlayerFB.Sync_PubFBSweepData(curPlayer)
-    NotifyFBCntRegainInfo(curPlayer)
-    #判断副本里离线超过一定时间则退出副本
-    CheckFBPlayerOffine(curPlayer)
-    return
-
-def CheckFBPlayerOffine(curPlayer):
-    mapid = curPlayer.GetMapID()
-    
-    ipyData = GetFBIpyData(mapid)
-    if not ipyData:
-        return
-    OfflineTime = ipyData.GetOfflineTime()
-    if not OfflineTime:
-        return
-    leaveServerSecond = PlayerControl.GetPlayerLeaveServerSecond(curPlayer) #离线时间秒
-    if leaveServerSecond >= OfflineTime:
-        GameWorld.DebugLog('判断副本里离线超过一定时间则退出副本 leaveServerSecond=%s'%leaveServerSecond)
-        PlayerControl.PlayerLeaveFB(curPlayer)
     return
 
 #//A5 75 购买副本进入次数#tagCMBuyEnterCount
@@ -1983,395 +1601,38 @@
 #    tagHead        Head;
 #    DWORD        FBID;   // 副本ID
 #};
-
 def BuyFBEnterCount(playerIndex, clientData, tick):
     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)
     mapID = clientData.FBID
-    if mapID == ChConfig.Def_FBMapID_Love:
-        coupleID = PlayerControl.GetCoupleID(curPlayer)
-        if not coupleID:
-            GameWorld.DebugLog("没有伴侣无法购买情缘副本次数!")
-            return
     ipyData = GetFBIpyData(mapID)
     if not ipyData:
         return
-    canBuyCnt = 0
-    buyTimesVIPPriID = ipyData.GetBuyTimesVIPPriID()
-    if buyTimesVIPPriID:
-        canBuyCnt += PlayerVip.GetPrivilegeValue(curPlayer, buyTimesVIPPriID)
+    canBuyCnt = ipyData.GetPayCntMax()
     canBuyCnt += PlayerGoldInvest.GetAddFBBuyCnt(curPlayer, mapID)
-    GameWorld.DebugLog("购买副本进入次数: mapID=%s,canBuyCnt=%s" % (mapID, canBuyCnt))
-    if canBuyCnt <= 0:
-        GameWorld.DebugLog("mapID:%s 不可以购买进入次数"%mapID)
-        return
-    
-    hasBuyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_BuyFbCntDay % mapID)
-    maxDayTimes = ipyData.GetDayTimes()
-    maxCnt = GetEnterFBMaxCnt(curPlayer, mapID)
-    enterCnt = GetEnterFBCount(curPlayer, mapID)
-    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
-    
+    hasBuyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBBuyCnt % mapID)
+    GameWorld.DebugLog("购买副本进入次数: mapID=%s,canBuyCnt=%s,hasBuyCnt=%s" % (mapID, canBuyCnt, hasBuyCnt))
     if hasBuyCnt >= canBuyCnt:
-        GameWorld.DebugLog("购买次数已经用完mapID=%s,buyTimesVIPPriID=%s,hasBuyCnt=%s >= canBuyCnt=%s" % (mapID, buyTimesVIPPriID, hasBuyCnt, canBuyCnt))
+        GameWorld.DebugLog("副本购买次数已经用完! mapID=%s,hasBuyCnt=%s >= canBuyCnt=%s" % (mapID, hasBuyCnt, canBuyCnt))
         return
-    costGoldDict = IpyGameDataPY.GetFuncEvalCfg('BuyFBCntCost', 1, {})
-    costGold = costGoldDict.get(str(mapID), '0')
-    costGold = eval(costGold)
-    costMoneyTypeInfo = IpyGameDataPY.GetFuncEvalCfg('BuyFBCntCost', 2, {})
-    costType = costMoneyTypeInfo.get(str(mapID), ShareDefine.TYPE_Price_Gold_Paper_Money)
-    if costGold <= 0:
-        GameWorld.DebugLog("没有配置购买副本次数消耗货币数! mapID=%s,costType=%s,costGold=%s" % (mapID, costType, costGold))
+    costType = ipyData.GetPayMoneyType()
+    payMoneyList = ipyData.GetPayMoneyValues()
+    if not costType or not payMoneyList:
+        GameWorld.DebugLog("没有配置购买副本次数消耗货币数! mapID=%s,costType=%s,payMoneyList=%s" % (mapID, costType, payMoneyList))
         return
-    costMoneyList = PlayerControl.HaveMoneyEx(curPlayer, costType, costGold)
-    #GameWorld.Log('costMoneyList=%s,costGold=%s'%(costMoneyList,costGold))
-    if not costMoneyList:
+    costMoney = payMoneyList[hasBuyCnt] if len(payMoneyList) > hasBuyCnt else payMoneyList[-1]
+    if not PlayerControl.PayMoney(curPlayer, costType, costMoney, ChConfig.Def_Cost_BuyFBCnt, {"MapID":mapID}):
         return
-    infoDict = {"MapID":mapID}
-    
-    for moneyType, moneyNum in costMoneyList:
-        if not PlayerControl.PayMoney(curPlayer, moneyType, moneyNum, ChConfig.Def_Cost_BuyFBCnt, infoDict):
-            GameWorld.DebugLog("仙玉不足!costGold=%s" % costGold)
-            return
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_BuyFbCntDay % mapID, hasBuyCnt + 1)
-    Sync_FBPlayerFBBuyCount(curPlayer, [mapID])
-    PlayerControl.NotifyCode(curPlayer, 'FBEnterTimeBuy', [mapID])
-    OnFBCountChangeEffectRecoverCount(curPlayer, mapID)
-    if mapID == ChConfig.Def_FBMapID_Love:
-        coupleID = PlayerControl.GetCoupleID(curPlayer)
-        if coupleID:
-            addItemList = IpyGameDataPY.GetFuncEvalCfg("LoveFB", 3)
-            paramList = [curPlayer.GetPlayerName()]
-            PlayerControl.SendMailByKey("BuyLoveFBCntCoupleMail", [coupleID], addItemList, paramList)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FBBuyCnt % mapID, hasBuyCnt + 1)
+    Sync_FBPlayerFBInfoData(curPlayer, mapID)
     return
 
-def DoFuncOpen_RunDaily(curPlayer): return EventReport.WriteFuncCMEAcceptable(curPlayer, ShareDefine.GameFuncID_RunDaily)
-def DoFuncOpen_RunFamily(curPlayer): return EventReport.WriteFuncCMEAcceptable(curPlayer, ShareDefine.GameFuncID_RunFamily)
-
-#---------------------------------------------------------------------
-## 副本开启提示(几分钟)
-#  @param openTimeList 开启时间列表[(开启时钟,开启分钟), ]
-#  @param notifyMsg 提示mark
-#  @param notifyTimeList 提示时间列表
-#  @param mergeMinOSD 该提示针对跨服子服有效的最小开服天, >=0时有限制
-#  @param mergeMaxOSD 该提示针对跨服子服有效的最大开服天, >=0时有限制
-#  @param mergeMapInfo 该提示所属的跨服活动地图信息, 主要用于不同子服对应所跨的活动地图ID
-#  @return None
-def FBOpenNotify(openTimeList, notifyMsg, notifyTimeList, mapID = 0, mergeMinOSD=-1, 
-                 mergeMaxOSD=-1, mergeMapInfo=[]):
-    
-    # 只在第一线中提示
-    if GameWorld.GetGameWorld().GetCurGameWorldIndex() != 0 or not notifyTimeList:
+def AddFBADCnt(curPlayer, mapID):
+    fbIpyData = GetFBIpyData(mapID)
+    if not fbIpyData:
         return
-    
-    curTime = datetime.datetime.today()
-    nextTime = curTime + datetime.timedelta(hours=1)
-    
-    curYear, curMonth, curDay, curHour = curTime.year, curTime.month, curTime.day, curTime.hour
-    nextYear, nextMonth, nextDay, nextHour = nextTime.year, nextTime.month, nextTime.day, nextTime.hour
-    startTimeStrFormat = "%s-%s-%s %s:%s:%s"
-    
-    # 需要提示的最大分钟
-    maxNotifyMinute = max(notifyTimeList)
-    
-    remaindMinute = -1
-    for hour, minute in openTimeList:
-        
-        # 当前小时的和下一个小时才有可能需要提示
-        if hour not in [curHour, nextHour]:
-            continue
-        
-        # 获取本次比较的开启时间
-        if hour == curHour:
-            startTimeStr = startTimeStrFormat % (curYear, curMonth, curDay, hour, minute, "00")
-        else:
-            startTimeStr = startTimeStrFormat % (nextYear, nextMonth, nextDay, hour, minute, "00")
-        
-        # 字符串转化为datetime
-        startTime = datetime.datetime.strptime(startTimeStr, ChConfig.TYPE_Time_Format)
-        
-        # 还剩多少时间开启
-        remainTime = startTime - curTime
-        
-        # 计算剩余秒数
-        seconds = remainTime.seconds
-        
-        # 计算剩余分钟,提前一秒通知
-        remaindMinute = (seconds - 1) / 60 + 1
-        if 0 < remaindMinute <= maxNotifyMinute:
-            break
-
-    # 在配置中需要提示,且未提示过
-    if remaindMinute in notifyTimeList \
-    and remaindMinute != GameWorld.GetGameFB().GetGameFBDictByKey(ChConfig.Map_FBDict_NotifyOpen):
-        if mapID > 0:
-            msgParamList = [remaindMinute, mapID]
-        else:
-            msgParamList = [remaindMinute]
-        PlayerControl.WorldNotify(0, notifyMsg, msgParamList, 0, mergeMinOSD, mergeMaxOSD, mergeMapInfo)
-        GameWorld.GetGameFB().SetGameFBDict(ChConfig.Map_FBDict_NotifyOpen, remaindMinute)
-    return
-
-
-## 判断当前是否时副本进场时间(准备时间)
-#  @param openTimeList 开启时间列表[(开启时钟,开启分钟), ]
-#  @param prepareSeconds 准备时间(秒)
-#  @return bool
-def CheckIsFBPrepareTime(openTimeList, prepareSeconds):
-    curTime = GameWorld.GetCurrentTime()
-    prevTime = curTime - datetime.timedelta(hours=1)
-    
-    curYear, curMonth, curDay, curHour = curTime.year, curTime.month, curTime.day, curTime.hour
-    prevYear, prevMonth, prevDay, prevHour = prevTime.year, prevTime.month, prevTime.day, prevTime.hour
-    startTimeStrFormat = "%s-%s-%s %s:%s:%s"
-    
-    for hour, minute in openTimeList:
-
-        # 当前小时的和上一小时才有可能时进入时间
-        if hour not in [curHour, prevHour]:
-            continue
-        
-        # 获取本次比较的开启时间
-        if hour == curHour:
-            startTimeStr = startTimeStrFormat % (curYear, curMonth, curDay, hour, minute, "00")
-        else:
-            startTimeStr = startTimeStrFormat % (prevYear, prevMonth, prevDay, hour, minute, "00")
-        
-        # 字符串转化为datetime
-        startTime = datetime.datetime.strptime(startTimeStr, ChConfig.TYPE_Time_Format)
-        
-        # 距开始时间的时间差
-        pastTime = curTime - startTime
-        
-        # 换算成秒数
-        pastSeconds = pastTime.seconds
-
-        # 如果在规定准备秒数内,则返回True
-        if 0 <= pastSeconds <= prepareSeconds:
-            return True
-         
-    return False
-
-
-## 副本行为 - 鼓舞buff
-#  @param curPlayer 玩家
-#  @param key 副本玩家字典key
-#  @param encourageType 金钱类型
-#  @param tick 当前时间
-#  @param isMaxlv 是否直接满级
-#  @return None
-def FbEncourageBuff(curPlayer, key, encourageType, tick, ownerID=0):
-    #GameWorld.Log("FbEncourageBuff moneyType=%s" % (moneyType))
-    curMapID = curPlayer.GetMapID()
-    curMapID = GetRecordMapID(curMapID)
-    ipyData = IpyGameDataPY.GetIpyGameData('FbEncourage', curMapID, encourageType)
-    if not ipyData:
-        return
-    maxCnt = ipyData.GetInspireMaxLV()
-    gameFB = GameWorld.GetGameFB()
-    ownerID = ownerID or curPlayer.GetID()
-    encourageLV = gameFB.GetPlayerGameFBDictByKey(ownerID, key)
-    encourageCntKey = 'FbEncourageCnt_%s' % encourageType
-    encourageCnt = gameFB.GetPlayerGameFBDictByKey(ownerID, encourageCntKey)
-    maxLV = IpyGameDataPY.GetFuncEvalCfg('FBEncourageBuff', 2, {}).get(curMapID, 0)
-    if encourageLV >= maxLV:
-        PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_93643")
-        return
-    if encourageCnt >= maxCnt:
-        if encourageType == IPY_GameWorld.TYPE_Price_Silver_Money:
-            PlayerControl.NotifyCode(curPlayer, "Xjmj_CopperInspireFull")
-        else:
-            PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_93643")
-        return
-    
-    encourageCost = eval(ipyData.GetMoneyCount())
-    if curMapID == ChConfig.Def_FBMapID_SealDemon:
-        isDouble = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FMTDouble)
-        if isDouble: #封魔坛双倍挑战则鼓舞双倍花费
-            encourageCost *= 2
-
-    costMoneyList = PlayerControl.HaveMoneyEx(curPlayer, encourageType, encourageCost)
-    if not costMoneyList:
-        return
-    
-    # 扣除鼓舞消耗
-    infoDict = {"MapID":curMapID}
-    for moneyType, moneyCnt in costMoneyList:
-        if not PlayerControl.PayMoney(curPlayer, moneyType, moneyCnt, ChConfig.Def_Cost_FBEncourage, infoDict):
-            return
-    buffTypeID = IpyGameDataPY.GetFuncEvalCfg('FBEncourageBuff', 1, {}).get(curMapID, ChConfig.Def_SkillID_FBEncourageBuff)
-    skillBuffID = buffTypeID + encourageLV
-    skillBuff = GameWorld.GetGameData().GetSkillBySkillID(skillBuffID)
-    if not skillBuff:
-        GameWorld.Log("FbEncourageBuff   找不到技能%s" % skillBuffID)
-        return
-    
-    buffType = SkillCommon.GetBuffType(skillBuff)
-    
-    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)
-    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, ownerID=0):
-    curPlayerID = curPlayer.GetID()
-    GameWorld.Log("AddFbEncourageBuff() curPlayerID=%s" % curPlayerID)
-    ownerID = ownerID or curPlayer.GetID()
-    gameFB = GameWorld.GetGameFB()
-    encourageLV = gameFB.GetPlayerGameFBDictByKey(ownerID, key)
-    if not encourageLV:
-        return
-    mapID = GameWorld.GetMap().GetMapID()
-    mapID = GetRecordMapID(mapID)
-    buffTypeID = IpyGameDataPY.GetFuncEvalCfg('FBEncourageBuff', 1, {}).get(mapID, ChConfig.Def_SkillID_FBEncourageBuff)
-    skillBuffID = buffTypeID + encourageLV -1
-    skillBuff = GameWorld.GetGameData().GetSkillBySkillID(skillBuffID)
-    if not skillBuff:
-        GameWorld.Log("FbEncourageBuff   找不到技能%s" % skillBuffID)
-        return
-    
-    buffType = SkillCommon.GetBuffType(skillBuff)
-    BuffSkill.DoAddBuff(curPlayer, buffType, skillBuff, tick)
-    
-    SendFBEncourageInfo(curPlayer, encourageLV, ownerID)
-    return
-
-## 清除鼓舞buff
-#  @param curPlayer 玩家
-#  @param tick 当前时间
-#  @return True - 清除成功 ; False - 无该buff
-def ClearEncourageBuff(curPlayer, tick):
-    for buffTypeID in list(set(IpyGameDataPY.GetFuncEvalCfg('FBEncourageBuff', 1, {}).values())):
-        if BuffSkill.DelBuffBySkillID(curPlayer, buffTypeID, tick):
-            playerControl = PlayerControl.PlayerControl(curPlayer)
-            playerControl.RefreshPlayerAttrByBuff()
-            GameWorld.Log("ClearEncourageBuff() True")
-            return True
-    GameWorld.Log("ClearEncourageBuff() False")
-    return False
-
-## 发送副本鼓舞信息
-#  @param curPlayer 玩家
-#  @return None
-def SendFBEncourageInfo(curPlayer, lv, ownerID=0):
-    #//A3 0A 副本鼓舞信息通知 #tagMCFBEncourageInfo
-    curMapID = curPlayer.GetMapID()
-    curMapID = GetRecordMapID(curMapID)
-    ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('FbEncourage', {'DataMapID':curMapID}, True)
-    if not ipyDataList:
-        return
-    encourageInfo = ChPyNetSendPack.tagMCFBEncourageInfo()
-    encourageInfo.Clear()
-    encourageInfo.InfoList = []
-    encourageCntKey = 'FbEncourageCnt_%s'
-    gameFB = GameWorld.GetGameFB()
-    ownerID = ownerID or curPlayer.GetID()
-    for ipyData in ipyDataList:
-        inspireType = ipyData.GetInspireType()
-        packData = ChPyNetSendPack.tagMCFBEncourageCnt()
-        packData.MoneyType = inspireType
-        packData.EncourageCnt = gameFB.GetPlayerGameFBDictByKey(ownerID, encourageCntKey % inspireType)
-        encourageInfo.InfoList.append(packData)
-    encourageInfo.Cnt = len(encourageInfo.InfoList)
-    NetPackCommon.SendFakePack(curPlayer, encourageInfo)
-    return
-
-## 获取玩家所在副本区域福利倍值
-#  @param curPlayer 玩家
-#  @return 倍值-默认为1
-def GetAreaRewardMultiple(curPlayer):
-    return max(1, curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_AreaRewardMultiple))
-
-## 设置玩家所在副本区域福利倍值
-#  @param curPlayer 玩家
-#  @param value 更新倍值
-#  @return
-def SetAreaRewardMultiple(curPlayer, value):
-    curPlayer.SetDict(ChConfig.Def_PlayerKey_AreaRewardMultiple, value) 
-    return
-
-
-## 检查是否进入副本CD中
-#  @param curPlayer 玩家
-#  @param mapID 
-#  @return True-CD中,不可进入;False-非CD中,可进入
-def CheckIsEnterCD(curPlayer, mapID):
-    return GetFBEnterCD(curPlayer, mapID) > 0
-
-## 获取进入副本CD时间
-#  @param curPlayer 玩家
-#  @param mapID 
-#  @return <=0 代表没有CD, >0表示还剩下的CD tick
-def GetFBEnterCD(curPlayer, mapID):
-    mapID = GetRecordMapID(mapID)
-    enterCDDict = IpyGameDataPY.GetFuncEvalCfg('FBEnterCD', 1)
-    
-    if mapID not in enterCDDict:
-        return 0
-    lvLimitDict = IpyGameDataPY.GetFuncEvalCfg('FBEnterCD', 3)
-    if mapID in lvLimitDict:
-        if curPlayer.GetLV() >= lvLimitDict[mapID]:
-            return 0
-    cdTick = enterCDDict[mapID]
-    lastEnterTick = GetFBPDictValue(curPlayer, ChConfig.Def_PDict_LastEnterFBTick % mapID)
-    if not lastEnterTick:
-        return 0
-    
-    timeNum = GameWorld.ChangeTimeStrToNum(GameWorld.GetCurrentDataTimeStr())
-    passTick = max(0, timeNum - lastEnterTick)
-    curCDTick = max(0, cdTick - passTick)
-    if curCDTick > 0:
-        GameWorld.DebugLog("副本进入CD中!mapID=%s,timeNum=%s,lastEnterTick=%s,passTick=%s,剩余=%s" 
-                           % (mapID, timeNum, lastEnterTick, passTick, curCDTick))
-    return curCDTick
-
-
-## 更新玩家进入副本时间
-#  @param curPlayer 玩家
-#  @param tick 更新值
-#  @return
-def UpdateFBEnterTick(curPlayer):
-    mapID = GameWorld.GetMap().GetMapID()
-    mapID = GetRecordMapID(mapID)
-    enterCDDict = IpyGameDataPY.GetFuncEvalCfg('FBEnterCD', 1)
-    if mapID not in enterCDDict:
-        return
-    timeNum = GameWorld.ChangeTimeStrToNum(GameWorld.GetCurrentDataTimeStr())
-    SetFBPDictValue(curPlayer, ChConfig.Def_PDict_LastEnterFBTick % mapID, timeNum)
-    GameWorld.DebugLog("UpdateFBEnterTick mapID=%s,timeNum=%s" % (mapID, timeNum))
-    SyncFBEnterTick(curPlayer, mapID)
+    adCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBADCnt % mapID)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FBADCnt % mapID, adCnt + 1)
+    Sync_FBPlayerFBInfoData(curPlayer, mapID)
     return
 
 ## 获取记录值的mapID
@@ -2379,42 +1640,42 @@
 #  @return
 #  @remarks 一般用于几张地图公用一份存储记录,如组队副本进入次数,CD时间等数据需共享
 def GetRecordMapID(mapID):
-    DataMapIDDict = IpyGameDataPY.GetConfigEx("DataMapIDDict")
-    if not DataMapIDDict:
-        mIDToDataMapIDDict = {} # 场景ID对应功能地图ID
-        dMapIDDict = {}
-        ipyDataMgr = IpyGameDataPY.IPY_Data()
-        for i in xrange(ipyDataMgr.GetFBLineCount()):
-            ipyData = ipyDataMgr.GetFBLineByIndex(i)
-            dMapID = ipyData.GetDataMapID()
-            mID = ipyData.GetMapID()
-            mIDList= dMapIDDict.get(dMapID, [])
-            if mID not in mIDList:
-                mIDList.append(mID)
-                dMapIDDict[dMapID] = mIDList
-                
-            dMIDList= mIDToDataMapIDDict.get(mID, [])
-            if dMapID not in dMIDList:
-                dMIDList.append(dMapID)
-                mIDToDataMapIDDict[mID] = dMIDList
-                
-        unMIDList = []
-        for mID, dMIDList in mIDToDataMapIDDict.items():
-            if len(dMIDList) > 1:
-                unMIDList.append(mID)
-                #GameWorld.DebugLog("----------- 同个场景对应到多个功能地图的,视为无意义的地图! mID=%s, to dMIDList=%s" % (mID, dMIDList))
-        for dMapID, mIDList in dMapIDDict.items():
-            for unMID in unMIDList:
-                if unMID in mIDList:
-                    mIDList.remove(unMID)
-            if len(mIDList) <= 1:
-                dMapIDDict.pop(dMapID)
-        DataMapIDDict = IpyGameDataPY.SetConfigEx("DataMapIDDict", dMapIDDict)
-        #GameWorld.Log("加载DataMapIDDict=%s" % DataMapIDDict)
-        
-    for dataMapID, mapIDList in DataMapIDDict.items():
-        if mapID in mapIDList:
-            return dataMapID
+#    DataMapIDDict = IpyGameDataPY.GetConfigEx("DataMapIDDict")
+#    if not DataMapIDDict:
+#        mIDToDataMapIDDict = {} # 场景ID对应功能地图ID
+#        dMapIDDict = {}
+#        ipyDataMgr = IpyGameDataPY.IPY_Data()
+#        for i in xrange(ipyDataMgr.GetFBLineCount()):
+#            ipyData = ipyDataMgr.GetFBLineByIndex(i)
+#            dMapID = ipyData.GetDataMapID()
+#            mID = ipyData.GetMapID()
+#            mIDList= dMapIDDict.get(dMapID, [])
+#            if mID not in mIDList:
+#                mIDList.append(mID)
+#                dMapIDDict[dMapID] = mIDList
+#                
+#            dMIDList= mIDToDataMapIDDict.get(mID, [])
+#            if dMapID not in dMIDList:
+#                dMIDList.append(dMapID)
+#                mIDToDataMapIDDict[mID] = dMIDList
+#                
+#        unMIDList = []
+#        for mID, dMIDList in mIDToDataMapIDDict.items():
+#            if len(dMIDList) > 1:
+#                unMIDList.append(mID)
+#                #GameWorld.DebugLog("----------- 同个场景对应到多个功能地图的,视为无意义的地图! mID=%s, to dMIDList=%s" % (mID, dMIDList))
+#        for dMapID, mIDList in dMapIDDict.items():
+#            for unMID in unMIDList:
+#                if unMID in mIDList:
+#                    mIDList.remove(unMID)
+#            if len(mIDList) <= 1:
+#                dMapIDDict.pop(dMapID)
+#        DataMapIDDict = IpyGameDataPY.SetConfigEx("DataMapIDDict", dMapIDDict)
+#        #GameWorld.Log("加载DataMapIDDict=%s" % DataMapIDDict)
+#        
+#    for dataMapID, mapIDList in DataMapIDDict.items():
+#        if mapID in mapIDList:
+#            return dataMapID
     return mapID
 
 def GetGeneralTrainMapIDList():
@@ -2433,53 +1694,8 @@
         
     return GeneralTrainMapIDList
 
-def GetClientCustomScene():
-    ## 获取前端自定义副本场景
-    mapIDList = GetGeneralTrainMapIDList()
-    return mapIDList + ChConfig.ClientCustomSceneList
-
-## 同步进入副本时间
-#  @param curPlayer 玩家
-#  @param syncMapID 同步的地图,默认0为全部
-#  @return None
-def SyncFBEnterTick(curPlayer, syncMapID=0):
-    enterCDDict = IpyGameDataPY.GetFuncEvalCfg('FBEnterCD', 1)
-    if not enterCDDict:
-        return
-    
-    timeNum = GameWorld.ChangeTimeStrToNum(GameWorld.GetCurrentDataTimeStr())
-            
-    enterList = ChPyNetSendPack.tagMCFBEnterTickList()
-    enterList.Clear()
-    enterList.EnterTickList = []
-    for mapID in enterCDDict.keys():
-        
-        if syncMapID not in [0, mapID]:
-            continue
-        
-        lastEnterTick = GetFBPDictValue(curPlayer, ChConfig.Def_PDict_LastEnterFBTick % mapID)
-        
-        # 修正副本CD时间
-        if timeNum < lastEnterTick:
-            SetFBPDictValue(curPlayer, ChConfig.Def_PDict_LastEnterFBTick % mapID, timeNum)
-            lastEnterTick = timeNum
-            GameWorld.DebugLog("修正玩家副本CD时间 mapID=%s,timeNum=%s" % (mapID, timeNum), curPlayer.GetPlayerID())
-            
-        enterTickObj = ChPyNetSendPack.tagMCFBEnterTick()
-        enterTickObj.Clear()
-        enterTickObj.MapID = mapID
-        enterTickObj.LastEnterTick = lastEnterTick#max(enterCDDict.get(mapID) - (timeNum - lastEnterTick), 0)
-        enterList.EnterTickList.append(enterTickObj)
-    
-    enterList.Cnt = len(enterList.EnterTickList)
-    NetPackCommon.SendFakePack(curPlayer, enterList)  
-    return
-
-## 通知个人通用副本信息
-#  @param curPlayer: 玩家实例
-#  @param runTime: 已经进行时间
-#  @return: None
 def Sync_FBPlayerFBInfoData(curPlayer, mapIDInfo=None):
+    ## 通知个人通用副本信息
     if not mapIDInfo:
         ipyDataMgr = IpyGameDataPY.IPY_Data()
         mapIDList = [ipyDataMgr.GetFBFuncByIndex(i).GetDataMapID() for i in xrange(ipyDataMgr.GetFBFuncCount())]
@@ -2488,76 +1704,25 @@
             return
         mapIDList = [mapIDInfo] if type(mapIDInfo) == int else mapIDInfo
         
-    fbInfoData = ChPyNetSendPack.tagMCPlayerFBInfoData()
-    fbInfoData.Clear()
-    fbInfoData.FBDataCnt = len(mapIDList)
-    fbInfoData.FBDataList = []
+    clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCFBInfoList)
+    clientPack.FBDataList = []
     
-    for mID in mapIDList:
-        mapInfo = ChPyNetSendPack.tagMCFBInfo()
-        mapInfo.Clear()
-        mapInfo.FBID = mID
-        mapInfo.EnterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntDay % mID)
-        mapInfo.EnterCntTotal = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntTotal % mID)
-        mapInfo.RecoverCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RecoverFbCnt % mID)
-        mapInfo.ItemAddCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ItemAddFbCnt % mID)
-        mapInfo.PassLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBPassLineID % mID)
-        
+    for mapID in mapIDList:
+        fbInfo = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCFBInfo)
+        fbInfo.MapID = mapID
+        fbInfo.EnterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FbEnterCnt % mapID)
+        fbInfo.ADAddCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBADCnt % mapID)
+        fbInfo.BuyAddCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBBuyCnt % mapID)
+        fbInfo.ItemAddCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBItemCnt % mapID)
+        fbInfo.PassLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBPassLineID % mapID)
         for keyNum in range(ChConfig.Def_FBStar_MaxKeyCnt):
-            gradeValue = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_PlayerFBStar_MapId % (mID, keyNum))
-            mapInfo.PassGrade.append(gradeValue)
-        mapInfo.PassGradeCnt = len(mapInfo.PassGrade)
-        #GameWorld.DebugLog("FBID:%s---:%s"%(mapInfo.FBID,mapInfo.EnterCnt))
-        fbInfoData.FBDataList.append(mapInfo)
+            gradeValue = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBStar % (mapID, keyNum))
+            fbInfo.PassGrade.append(gradeValue)
+        fbInfo.PassGradeCnt = len(fbInfo.PassGrade)
+        clientPack.FBDataList.append(fbInfo)
         
-    NetPackCommon.SendFakePack(curPlayer, fbInfoData)
-    return
-
-
-
-#// A3 BD 通知玩家购买副本进入次数 #tagMCBuyEnterInfo
-#
-#struct    tagMCBuyEnterInfo
-#{
-#    tagHead            Head;
-#    BYTE        FBCount;    // 副本个数
-#    DWORD            tagMCFBInfo[FBCount];    // 副本信息
-#};
-#
-#struct    tagMCBuyInfo
-#{
-#    tagHead            Head;
-#    DWORD            FBID;        // 副本ID
-#    BYTE        BuyCount;    // 已购买次数
-#};
-## 通知个人购买副本次数信息
-#  @param curPlayer: 玩家实例
-#  @param runTime: 已经进行时间
-#  @return: None
-def Sync_FBPlayerFBBuyCount(curPlayer, mapIDList=[]):
-    if not mapIDList:
-        mapIDList = []
-        ipyDataMgr = IpyGameDataPY.IPY_Data()
-        for i in xrange(ipyDataMgr.GetFBFuncCount()):
-            ipyData = ipyDataMgr.GetFBFuncByIndex(i)
-            if not ipyData.GetBuyTimesVIPPriID():
-                continue
-            mapIDList.append(ipyData.GetDataMapID())
-   
-        
-    fbInfoData = ChPyNetSendPack.tagMCBuyEnterInfo()
-    fbInfoData.Clear()
-    fbInfoData.FBInfo = []
-    for mID in mapIDList:
-        mapInfo = ChPyNetSendPack.tagMCBuyInfo()
-        mapInfo.Clear()
-        mapInfo.FBID = mID
-        mapInfo.BuyCount = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_BuyFbCntDay % mID)
-        fbInfoData.FBInfo.append(mapInfo)
-        #GameWorld.DebugLog("FBID:%s---BuyCount:%s"%(mapInfo.FBID,mapInfo.BuyCount))
-    fbInfoData.FBCount = len(fbInfoData.FBInfo)
-    if fbInfoData.FBCount > 0:
-        NetPackCommon.SendFakePack(curPlayer, fbInfoData)
+    clientPack.FBDataCnt = len(clientPack.FBDataList)
+    NetPackCommon.SendFakePack(curPlayer, clientPack)
     return
 
 ## 根据人数分组
@@ -2593,108 +1758,6 @@
             group.extend(tmpList[gi])
             
     return groupList
-
-def ClearAreaRewardRecord(playerID):
-    ##清除战场区域福利记录
-    gameWorld = GameWorld.GetGameWorld()
-    gameWorld.SetGameWorldDict(ChConfig.Map_Player_AreaReward_GetCnt%playerID, 0)
-    gameWorld.SetGameWorldDict(ChConfig.Map_Player_AreaReward_GetExp%playerID, 0)
-    gameWorld.SetGameWorldDict(ChConfig.Map_Player_AreaReward_GetExpPoint%playerID, 0)
-    gameWorld.SetGameWorldDict(ChConfig.Map_Player_AreaReward_GetZhenQiTotal%playerID, 0)
-    gameWorld.SetGameWorldDict(ChConfig.Map_Player_AreaReward_GetTechPoint%playerID, 0)
-    return
-
-##战场区域福利逻辑
-# @param tick 时间戳
-# @return 无意义
-def DoLogicAreaReward(cfgKeyName, tick, needAlive=False):
-    gameFB = GameWorld.GetGameFB()
-    gameWorld = GameWorld.GetGameWorld()
-    rewardInterval = IpyGameDataPY.GetFuncCfg(cfgKeyName, 2)
-    rewardFormatDict = IpyGameDataPY.GetFuncEvalCfg(cfgKeyName)
-    getCntLimit = IpyGameDataPY.GetFuncCfg(cfgKeyName, 3)
-    lastAwardTick = gameFB.GetGameFBDictByKey(ChConfig.Map_FBDict_LastAreaRewardTick)
-    if tick - lastAwardTick < rewardInterval:
-        return
-    gameFB.SetGameFBDict(ChConfig.Map_FBDict_LastAreaRewardTick, tick)
-    
-    GameWorld.DebugLog("给战场福利 tick=%s,needAlive=%s" % (tick, needAlive))
-    # 更新玩家战场持续时间
-    playerManager = GameWorld.GetMapCopyPlayerManager()
-    for index in xrange(playerManager.GetPlayerCount()):
-        curPlayer = playerManager.GetPlayerByIndex(index)
-        if not curPlayer:
-            continue
-        if needAlive and GameObj.GetHP(curPlayer) <= 0:
-            continue
-        playerID = curPlayer.GetPlayerID()
-        if getCntLimit:
-            getCnt = gameWorld.GetGameWorldDictByKey(ChConfig.Map_Player_AreaReward_GetCnt%playerID)
-            if getCnt >= getCntLimit:
-                continue
-            gameWorld.SetGameWorldDict(ChConfig.Map_Player_AreaReward_GetCnt%playerID, getCnt + 1)
-        
-        multiple = GetAreaRewardMultiple(curPlayer) # 福利倍数
-        reLV = curPlayer.GetLV()
-        reExp = PlayerControl.GetPlayerReExp(curPlayer)
-        playerControl = PlayerControl.PlayerControl(curPlayer)
-        
-        if "Exp" in rewardFormatDict:
-            addExp = eval(rewardFormatDict["Exp"])
-            addExp = playerControl.AddExp(addExp)
-            if addExp > 0:
-                totalExp = GetFBAreaRewardExp(gameWorld, playerID) + addExp
-                gameWorld.SetGameWorldDict(ChConfig.Map_Player_AreaReward_GetExp%playerID, totalExp % ChConfig.Def_PerPointValue)
-                gameWorld.SetGameWorldDict(ChConfig.Map_Player_AreaReward_GetExpPoint%playerID, totalExp / ChConfig.Def_PerPointValue)
-                
-            
-        if "ZhenQi" in rewardFormatDict:
-            addZhenQi = eval(rewardFormatDict["ZhenQi"])
-            PlayerControl.PlayerAddZhenQi(curPlayer, addZhenQi, True, True, "FB")
-            totalZhenQi = gameWorld.GetGameWorldDictByKey(ChConfig.Map_Player_AreaReward_GetZhenQiTotal%playerID)
-            totalZhenQi += addZhenQi
-            gameWorld.SetGameWorldDict(ChConfig.Map_Player_AreaReward_GetZhenQiTotal%playerID, totalZhenQi)
-            
-        if "TechPoint" in rewardFormatDict:
-            addTechPoint = eval(rewardFormatDict["TechPoint"])
-            PlayerFamily.AddPlayerFamilyActiveValue(curPlayer, addTechPoint, True, ShareDefine.Def_AddFAVReason_FamilyInvade, True)
-            
-            techPoint = gameWorld.GetGameWorldDictByKey(ChConfig.Map_Player_AreaReward_GetTechPoint%playerID)
-            techPoint += addTechPoint
-            gameWorld.SetGameWorldDict(ChConfig.Map_Player_AreaReward_GetTechPoint%playerID, techPoint)
-            
-        #GameWorld.DebugLog("    战场福利 倍区=%s,reLV=%s,reExp=%s,addExp=%s,addZQ=%s,totalExp=%s,totalZQ=%s" 
-        #                   % (multiple, reLV, reExp, addExp, addZhenQi, totalExp, totalZhenQi), playerID)
-    return
-
-def GetFBAreaRewardExp(gameWorld, playerID):
-    exp = gameWorld.GetGameWorldDictByKey(ChConfig.Map_Player_AreaReward_GetExp%playerID)
-    expPoint = gameWorld.GetGameWorldDictByKey(ChConfig.Map_Player_AreaReward_GetExpPoint%playerID)
-    return expPoint * ChConfig.Def_PerPointValue + exp
-
-def GetFBAreaRewardZhenQi(gameWorld, playerID):
-    return gameWorld.GetGameWorldDictByKey(ChConfig.Map_Player_AreaReward_GetZhenQiTotal%playerID)
-
-def GetFBAreaRewardTechPoint(gameWorld, playerID):
-    return gameWorld.GetGameWorldDictByKey(ChConfig.Map_Player_AreaReward_GetTechPoint%playerID)
-
-def NotifyCopyMapPlayerFBHelp(tick, fbHelpFunc, interval=10000, befLogicFunc=None):
-    gameFB = GameWorld.GetGameFB()
-    lastTick = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_NotifyFBHelpTick)
-    if tick - lastTick < interval:
-        return
-    gameFB.SetGameFBDict(ChConfig.Def_FB_NotifyFBHelpTick, tick)
-    
-    if befLogicFunc:
-        befLogicFunc(tick)
-        
-    playerManager = GameWorld.GetMapCopyPlayerManager()
-    for index in xrange(playerManager.GetPlayerCount()):
-        curPlayer = playerManager.GetPlayerByIndex(index)
-        if not curPlayer:
-            continue
-        fbHelpFunc(curPlayer, tick)
-    return
 
 def GetCrossDynamicLineMapZoneID():
     ## 获取跨服动态线路地图本线路跨服分区

--
Gitblit v1.8.0