From 71a26587b4adb83f1ce0810a1b67b1a48c525a8b Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 17 十二月 2024 14:19:17 +0800
Subject: [PATCH] 10337 【越南】【英文】【BT】【砍树】爬塔通关类的支持一键过关

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFB.py                               |   50 +++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py                        |   30 ++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_SkyTower.py   |   69 +++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini                                           |    6 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py                                   |   56 ++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_RealmTower.py |   58 +++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_TrialTower.py |   78 ++++++++++
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py                                                        |   56 ++++++++
 8 files changed, 393 insertions(+), 10 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
index 80b6ad4..27aa94f 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
@@ -18984,6 +18984,62 @@
 
 
 #------------------------------------------------------
+# B1 08 快速一键过关副本 #tagCMFBQuickPass
+
+class  tagCMFBQuickPass(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("MapID", c_int),    
+                  ("LineID", c_ushort),    
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xB1
+        self.SubCmd = 0x08
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.Cmd = 0xB1
+        self.SubCmd = 0x08
+        self.MapID = 0
+        self.LineID = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagCMFBQuickPass)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// B1 08 快速一键过关副本 //tagCMFBQuickPass:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                MapID:%d,
+                                LineID:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.MapID,
+                                self.LineID
+                                )
+        return DumpString
+
+
+m_NAtagCMFBQuickPass=tagCMFBQuickPass()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMFBQuickPass.Cmd,m_NAtagCMFBQuickPass.SubCmd))] = m_NAtagCMFBQuickPass
+
+
+#------------------------------------------------------
 # B1 06 助战召唤 #tagCMHelpBattleCall
 
 class  tagCMHelpBattleCall(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
index dee19f4..4538b16 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
@@ -476,9 +476,9 @@
 PacketSubCMD_8=0x04
 PacketCallFunc_8=OnClientStartFB
 
-PacketCMD_9=
-PacketSubCMD_9=
-PacketCallFunc_9=
+PacketCMD_9=0xB1
+PacketSubCMD_9=0x08
+PacketCallFunc_9=OnFBQuickPass
 
 PacketCMD_10=
 PacketSubCMD_10=
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
index 80b6ad4..27aa94f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -18984,6 +18984,62 @@
 
 
 #------------------------------------------------------
+# B1 08 快速一键过关副本 #tagCMFBQuickPass
+
+class  tagCMFBQuickPass(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("MapID", c_int),    
+                  ("LineID", c_ushort),    
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xB1
+        self.SubCmd = 0x08
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.Cmd = 0xB1
+        self.SubCmd = 0x08
+        self.MapID = 0
+        self.LineID = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagCMFBQuickPass)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// B1 08 快速一键过关副本 //tagCMFBQuickPass:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                MapID:%d,
+                                LineID:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.MapID,
+                                self.LineID
+                                )
+        return DumpString
+
+
+m_NAtagCMFBQuickPass=tagCMFBQuickPass()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMFBQuickPass.Cmd,m_NAtagCMFBQuickPass.SubCmd))] = m_NAtagCMFBQuickPass
+
+
+#------------------------------------------------------
 # B1 06 助战召唤 #tagCMHelpBattleCall
 
 class  tagCMHelpBattleCall(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py
index a543acd..6ef3d49 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py
@@ -1668,6 +1668,36 @@
     
     return callFunc(curPlayer, mapID, lineID, cnt, dataEx)
 
+def OnPlayerFBQuickPass(curPlayer, mapID, lineID):
+    '''副本快速过关验证
+    @param mapID: 数据地图ID
+    @param lineID: 目标关卡线路ID,可一次性跳多关,由前端发包决定
+    @return: (bossID, quickCnt) 或  None
+    @note: bossID 目标NPCID - 目标关卡所需要挑战的主NPCID,一般是boss,用于验证战力是否满足快速过关
+    @note: quickCnt 本次总共跳过几关 - 默认1
+    '''
+    do_FBLogic_ID = __GetFBLogic_MapID(mapID)
+    
+    callFunc = GameWorld.GetExecFunc(FBProcess, "GameLogic_%s.%s" % (do_FBLogic_ID, "OnPlayerFBQuickPass"))
+    
+    # 没有额外条件判断默认返回True
+    if callFunc == None:
+        return
+    
+    return callFunc(curPlayer, mapID, lineID)
+
+def OnPlayerFBQuickPassResult(curPlayer, mapID, lineID):
+    '''副本快速过关结果
+    '''
+    do_FBLogic_ID = __GetFBLogic_MapID(mapID)
+    
+    callFunc = GameWorld.GetExecFunc(FBProcess, "GameLogic_%s.%s" % (do_FBLogic_ID, "OnPlayerFBQuickPassResult"))
+    
+    if callFunc == None:
+        return
+
+    return callFunc(curPlayer, mapID, lineID)
+
 #---------------------------------------------------------------------
 
 ## 切换地图询问(只询问第一条线) 判断是否可以进入副本
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_RealmTower.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_RealmTower.py
index 25a083f..80776a2 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_RealmTower.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_RealmTower.py
@@ -67,7 +67,7 @@
     return __CheckCanChallenge(curPlayer, nextFloorID)
 
 ## 检查可否进行挑战
-def __CheckCanChallenge(curPlayer, floorID):
+def __CheckCanChallenge(curPlayer, floorID, checkPre=True):
     playerID = curPlayer.GetPlayerID()
     ipyData = GetTowerIpyData(floorID)
     if not ipyData:
@@ -79,7 +79,7 @@
         GameWorld.DebugLog("该境界塔层已过关: floorID=%s" % floorID, playerID)
         return False
     
-    if floorID > curFloorID + 1:
+    if checkPre and floorID > curFloorID + 1:
         GameWorld.DebugLog("上一层未过关: floorID=%s > curFloorID=%s+1" % (floorID, curFloorID), playerID)
         return False
     
@@ -138,9 +138,10 @@
     return
 
 ## 获取BossID
-def __GetRealmTowerBossID():
-    gameFB = GameWorld.GetGameFB()
-    floorID = gameFB.GetGameFBDictByKey(FBDict_Floor)
+def __GetRealmTowerBossID(floorID=-1):
+    if floorID == -1:
+        gameFB = GameWorld.GetGameFB()
+        floorID = gameFB.GetGameFBDictByKey(FBDict_Floor)
     ipyData = GetTowerIpyData(floorID)
     if not ipyData:
         GameWorld.ErrLog("__GetRealmTowerBossID() can not find %s in RealmTowerNPC.txt" % floorID)
@@ -308,3 +309,50 @@
     
     StartfloorID(curPlayer, floorID, tick)
     return
+
+def OnPlayerFBQuickPass(curPlayer, mapID, lineID):
+    '''副本快速过关验证
+    @param mapID: 数据地图ID
+    @param lineID: 目标关卡线路ID,可一次性跳多关,由前端发包决定
+    @return: (bossID, quickCnt) 或  None
+    @note: bossID 目标NPCID - 目标关卡所需要挑战的主NPCID,一般是boss,用于验证战力是否满足快速过关
+    @note: quickCnt 本次总共跳过几关 - 默认1
+    '''
+    
+    if not __CheckCanChallenge(curPlayer, lineID, False):
+        return
+    curLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RealmTowerFloor)
+    bossID = __GetRealmTowerBossID(lineID)
+    quickCnt = lineID - curLineID
+    
+    return bossID, quickCnt
+
+def OnPlayerFBQuickPassResult(curPlayer, mapID, lineID):
+    '''副本快速过关结果
+    '''
+    
+    playerID = curPlayer.GetPlayerID()
+    curLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RealmTowerFloor)
+    fromLineID = curLineID + 1
+    GameWorld.DebugLog("处理快速过关结算: mapID=%s,fromLineID=%s to %s" % (mapID, fromLineID, lineID), playerID)
+    
+    itemListTotal = []
+    for floorID in range(fromLineID, lineID + 1):
+        ipyData = GetTowerIpyData(floorID)
+        if not ipyData:
+            continue
+        
+        #更新关卡
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_RealmTowerFloor, floorID)
+        GameWorld.DebugLog('更新境界塔快速过关: floorID=%s' % floorID, playerID)
+        
+        # 给过关奖励
+        giveItemList = ipyData.GetRewardItemList()
+        itemListTotal += giveItemList
+        
+    prizeItemList = GameWorld.MergeItemList(itemListTotal)
+    ItemControler.GivePlayerItemOrMail(curPlayer, prizeItemList, None, ["RealmTower", False, {}])
+    quickPassDict = {FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(prizeItemList), "quickPass":1}
+    __SendRealmTowerOverInfo(curPlayer, floorID, True, quickPassDict)
+    SyncRealmTowerInfo(curPlayer)
+    return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_SkyTower.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_SkyTower.py
index e3212f3..a8d0845 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_SkyTower.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_SkyTower.py
@@ -570,4 +570,73 @@
         
     return
 
+def OnPlayerFBQuickPass(curPlayer, mapID, lineID):
+    '''副本快速过关验证
+    @param mapID: 数据地图ID
+    @param lineID: 目标关卡线路ID,可一次性跳多关,由前端发包决定
+    @return: (bossID, quickCnt) 或  None
+    @note: bossID 目标NPCID - 目标关卡所需要挑战的主NPCID,一般是boss,用于验证战力是否满足快速过关
+    @note: quickCnt 本次总共跳过几关 - 默认1
+    '''
+    
+    if not __CheckCanChallenge(curPlayer, lineID):
+        return
+    curLineID = __GetSkyTowerCurFloor(curPlayer)
+    bossID = __GetSkyTowerBossID(lineID)
+    quickCnt = lineID - curLineID
+    
+    return bossID, quickCnt
 
+def OnPlayerFBQuickPassResult(curPlayer, mapID, lineID):
+    '''副本快速过关结果
+    '''
+    
+    playerID = curPlayer.GetPlayerID()
+    curLineID = __GetSkyTowerCurFloor(curPlayer)
+    fromLineID = curLineID + 1
+    GameWorld.DebugLog("处理快速过关结算: mapID=%s,fromLineID=%s to %s" % (mapID, fromLineID, lineID), playerID)
+    
+    itemListTotal = []
+    for floorID in range(fromLineID, lineID + 1):
+        ipyData = GetTowerIpyData(floorID)
+        if not ipyData:
+            continue
+        
+        if ipyData.GetIsNotify():
+            sysMark = 'KillGodTowerInfo_1'# if floorID == maxLevel else 'GeRen_liubo_471172'
+            PlayerControl.WorldNotify(0, sysMark, [curPlayer.GetPlayerName(), floorID])
+            
+        #更新关卡
+        SetSkyTowerCurfloorID(curPlayer, floorID)
+        
+        #过关奖励
+        giveItemDict = ipyData.GetReward()
+        giveItemList = [[itemID, itemCnt, 0] for itemID, itemCnt in giveItemDict.items()]
+        itemListTotal += giveItemList
+        
+        PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_SkyTower)
+        
+        # 全服目标
+        ipyDataServer = IpyGameDataPY.GetIpyGameDataNotLog("SkyTowerServerChallenge", floorID)
+        if ipyDataServer:
+            maxNeedPassCount = 0
+            rankRewardInfo = ipyDataServer.GetPassRankRewardInfo()
+            for rank in rankRewardInfo.keys():
+                maxNeedPassCount = max(maxNeedPassCount, int(rank))
+            for needPlayerCount in ipyDataServer.GetServerRewardInfo().keys():
+                maxNeedPassCount = max(maxNeedPassCount, int(needPlayerCount))
+            playerID = curPlayer.GetPlayerID()
+            msgInfo = str(["ServerChallengePass", [floorID, maxNeedPassCount, rankRewardInfo]])
+            GameWorld.DebugLog("全服过关信息同步GameServer: %s" % msgInfo, playerID)
+            GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "SkyTower", msgInfo, len(msgInfo))
+            
+    prizeItemList = GameWorld.MergeItemList(itemListTotal)
+    ItemControler.GivePlayerItemOrMail(curPlayer, prizeItemList, None, ["SKYTower", False, {}])
+    
+    quickPassDict = {FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(prizeItemList), "quickPass":1}
+    __SendSkyTowerOverInfo(curPlayer, floorID, True, quickPassDict)
+    SyncSkyTowerInfo(curPlayer, 0) # 同步最新关卡信息
+    if floorID >= 10:
+        PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_SkyTower, floorID)
+        
+    return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_TrialTower.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_TrialTower.py
index 2a292a0..aaeb8ce 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_TrialTower.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_TrialTower.py
@@ -355,7 +355,7 @@
 
 
 ## 给过关奖励
-def __GiveFBPassPrize(curPlayer, fbLevel):
+def __GiveFBPassPrize(curPlayer, fbLevel, moneyDictTotal=None, itemListTotal=None):
     ipyData = GetTowerIpyData(fbLevel)
     if not ipyData:
         return {}
@@ -406,6 +406,11 @@
     moneyDict = {ShareDefine.TYPE_Price_Rune:addJH, ShareDefine.TYPE_Price_Ysog:RuneMagicEssence}
     prizeDict = {FBCommon.Over_money:FBCommon.GetJsonMoneyList(moneyDict), FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(prizeItemList)}
     
+    if isinstance(moneyDictTotal, dict):
+        for moneyType, addValue in moneyDict.items():
+            moneyDictTotal[moneyType] = moneyDictTotal.get(moneyType, 0) + addValue
+    if isinstance(itemListTotal, list):
+        itemListTotal += prizeItemList
 #    for _ in xrange(challengeCnt):
 #        EventReport.WriteEvent_custom_mission_log(curPlayer, ChConfig.CME_FB_TrialTower, ChConfig.CME_Log_End, 1, cmeInfoEx=bossName)
     return prizeDict
@@ -659,4 +664,73 @@
     #BOSS复活活动
     PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_TowerSweep, 1)
     PlayerActLogin.AddLoginAwardActionCnt(curPlayer, ChConfig.Def_LoginAct_TowerSweep, 1)
-    return True
\ No newline at end of file
+    return True
+
+def OnPlayerFBQuickPass(curPlayer, mapID, lineID):
+    '''副本快速过关验证
+    @param mapID: 数据地图ID
+    @param lineID: 目标关卡线路ID,可一次性跳多关,由前端发包决定
+    @return: (bossID, quickCnt) 或  None
+    @note: bossID 目标NPCID - 目标关卡所需要挑战的主NPCID,一般是boss,用于验证战力是否满足快速过关
+    @note: quickCnt 本次总共跳过几关 - 默认1
+    '''
+    
+    ipyData = GetTowerIpyData(lineID)
+    if not ipyData:
+        return
+    curLineID = __GetTrialLevelCurPassLV(curPlayer)
+    if lineID <= curLineID:
+        GameWorld.DebugLog("符印塔本关已过关, 无法挑战! lineID=%s" % lineID, curPlayer.GetPlayerID())
+        return
+    bossID = ipyData.GetNPCID()
+    quickCnt = 0 #lineID - curLineID
+    
+    fromLineID = curLineID + 1
+    for passLineID in range(fromLineID, lineID + 1):
+        # 符印塔lineID可能会跳,这里遍历不输出找不到的lineID
+        ipyData = IpyGameDataPY.GetIpyGameDataNotLog('RuneTower', passLineID)
+        if not ipyData:
+            continue
+        quickCnt += 1
+        
+    return bossID, quickCnt
+
+def OnPlayerFBQuickPassResult(curPlayer, mapID, lineID):
+    '''副本快速过关结果
+    '''
+    
+    playerID = curPlayer.GetPlayerID()    
+    curLineID = __GetTrialLevelCurPassLV(curPlayer)
+    fromLineID = curLineID + 1
+    GameWorld.DebugLog("处理快速过关结算: mapID=%s,fromLineID=%s to %s" % (mapID, fromLineID, lineID), playerID)
+    
+    moneyDictTotal = {}
+    itemListTotal = []
+    for passLineID in range(fromLineID, lineID + 1):
+        ipyData = IpyGameDataPY.GetIpyGameDataNotLog('RuneTower', passLineID)
+        if not ipyData:
+            continue
+        
+        if ipyData.GetIsNotify():
+            IPY_Data = IpyGameDataPY.IPY_Data()
+            maxLevel = IPY_Data.GetRuneTowerByIndex(IPY_Data.GetRuneTowerCount()-1).GetID()
+            sysMark = 'RuneTowerInfo_1' if passLineID == maxLevel else 'GeRen_liubo_471172'
+            PlayerControl.WorldNotify(0, sysMark, [curPlayer.GetPlayerName(), passLineID / 100])
+            
+        #更新关卡
+        SetTrialLevelCurPassLV(curPlayer, passLineID)
+        # 给过关奖励
+        __GiveFBPassPrize(curPlayer, passLineID, moneyDictTotal, itemListTotal)
+        
+        #任务
+        EventShell.EventRespons_TrialTowerCnt(curPlayer, passLineID)
+        #每日任务
+        PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_Tower)
+        
+    prizeItemList = GameWorld.MergeItemList(itemListTotal)
+    quickPassDict = {FBCommon.Over_money:FBCommon.GetJsonMoneyList(moneyDictTotal), 
+                     FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(prizeItemList),
+                     "quickPass":1}
+    __SendTrialTowerOverInfo(curPlayer, passLineID, True, quickPassDict)
+    SyncTrialLevelInfo(curPlayer) # 同步最新关卡信息
+    return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFB.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFB.py
index 029f675..8213c7e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFB.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFB.py
@@ -626,3 +626,53 @@
     packData.Cnt = len(packData.InfoList)
     NetPackCommon.SendFakePack(curPlayer, packData)
     return
+
+#// B1 08 快速一键过关副本 #tagCMFBQuickPass
+#
+#struct    tagCMFBQuickPass
+#{
+#    tagHead         Head;
+#    DWORD        MapID;
+#    WORD        LineID;
+#};
+def OnFBQuickPass(playerIndex, clientData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)
+    playerID = curPlayer.GetPlayerID()
+    mapID = clientData.MapID
+    lineID = clientData.LineID
+    GameWorld.DebugLog("玩家请求快速一键过关副本: mapID=%s,lineID=%s" % (mapID, lineID), playerID)
+    
+    fbIpyData = FBCommon.GetFBIpyData(mapID)
+    fbLineIpyData = FBCommon.GetFBLineIpyData(mapID, lineID)
+    if FBCommon.CheckCanEnterFBComm(curPlayer, mapID, lineID, fbIpyData, fbLineIpyData) != ShareDefine.EntFBAskRet_OK:
+        return
+    
+    reqRet = FBLogic.OnPlayerFBQuickPass(curPlayer, mapID, lineID)
+    if not reqRet or len(reqRet) != 2:
+        GameWorld.DebugLog("无法一键过关副本: mapID=%s,lineID=%s" % (mapID, lineID), playerID)
+        return
+    bossID, quickCnt = reqRet
+    if bossID:
+        npcData = GameWorld.GetGameData().FindNPCDataByID(bossID)
+        if not npcData:
+            return
+        npcFightPower = NPCCommon.GetSuppressFightPower(npcData)
+        quickNeedRatio = IpyGameDataPY.GetFuncCfg("FBQuickPass", 1)
+        quickNeedFightPower = int(npcFightPower * quickNeedRatio)
+        curFightPower = PlayerControl.GetFightPower(curPlayer)
+        if quickNeedFightPower and curFightPower < quickNeedFightPower:
+            GameWorld.DebugLog("无法一键过关副本! 战力限制: mapID=%s,lineID=%s,bossID=%s,npcFightPower=%s,quickNeedFightPower=%s > %s" 
+                               % (mapID, lineID, bossID, npcFightPower, quickNeedFightPower, curFightPower), playerID)
+            return
+        
+    #增加副本进入次数
+    if fbIpyData and fbIpyData.GetDayTimes() and quickCnt:
+        # 跳关超过1关的要重新验证下
+        if quickCnt > 1 and FBCommon.CheckCanEnterFBComm(curPlayer, mapID, lineID, fbIpyData, fbLineIpyData, quickCnt) != ShareDefine.EntFBAskRet_OK:
+            return
+        FBCommon.AddEnterFBCount(curPlayer, mapID, quickCnt)
+        
+    #扫荡结果给奖励等
+    FBLogic.OnPlayerFBQuickPassResult(curPlayer, mapID, lineID)
+    return
+

--
Gitblit v1.8.0