From c65290e4ebcbecf93fbde371947ff99feab7d29d Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 26 六月 2024 14:41:51 +0800
Subject: [PATCH] 10191 【越南】【主干】【港台】新增多种培养材料副本

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py                          |    4 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_GeneralTrain.py |  159 +++++++++++++++++++++++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py                                 |   11 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py                                   |   33 ++++++
 PySysDB/PySysDBPY.h                                                                                                    |   13 ++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/EnterFB.py                             |    2 
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py                                                      |   11 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                                        |    1 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py               |   22 ++++
 9 files changed, 251 insertions(+), 5 deletions(-)

diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index 9735ee0..2f3389e 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -880,6 +880,19 @@
 	eval		RewardInfo;	//奖励信息
 };
 
+//副本通用养成表
+
+struct tagFBGeneralTrain
+{
+	DWORD		_DataMapID;	//数据地图ID
+	BYTE		_LineID;	//功能线路ID
+	WORD		LVLimit;	//多少级可挑战, 0为不限制
+	WORD		RealmLimit;	//多少境界可挑战, 0为不限制
+	DWORD		BossNPCID;	//过关bossID
+	list		OtherNPCIDList;	//其他NPCIDList
+	list		PassAwardItemList;	//过关奖励列表
+};
+
 //副本助战表
 
 struct tagFBHelpBattle
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index 8d7d762..be51fff 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -23980,6 +23980,7 @@
     PassGradeCnt = 0    #(BYTE PassGradeCnt)//星级值对应个数, 每个key存9个lineID
     PassGrade = list()    #(vector<DWORD> PassGrade)//副本线路对应星级值列表
     EnterCntTotal = 0    #(DWORD EnterCntTotal)//累计进入次数
+    PassLineID = 0    #(DWORD PassLineID)//已过关到的lineID
     data = None
 
     def __init__(self):
@@ -23997,6 +23998,7 @@
             value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
             self.PassGrade.append(value)
         self.EnterCntTotal,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.PassLineID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         return _pos
 
     def Clear(self):
@@ -24007,6 +24009,7 @@
         self.PassGradeCnt = 0
         self.PassGrade = list()
         self.EnterCntTotal = 0
+        self.PassLineID = 0
         return
 
     def GetLength(self):
@@ -24017,6 +24020,7 @@
         length += 2
         length += 1
         length += 4 * self.PassGradeCnt
+        length += 4
         length += 4
 
         return length
@@ -24031,6 +24035,7 @@
         for i in range(self.PassGradeCnt):
             data = CommFunc.WriteDWORD(data, self.PassGrade[i])
         data = CommFunc.WriteDWORD(data, self.EnterCntTotal)
+        data = CommFunc.WriteDWORD(data, self.PassLineID)
         return data
 
     def OutputString(self):
@@ -24041,7 +24046,8 @@
                                 ItemAddCnt:%d,
                                 PassGradeCnt:%d,
                                 PassGrade:%s,
-                                EnterCntTotal:%d
+                                EnterCntTotal:%d,
+                                PassLineID:%d
                                 '''\
                                 %(
                                 self.FBID,
@@ -24050,7 +24056,8 @@
                                 self.ItemAddCnt,
                                 self.PassGradeCnt,
                                 "...",
-                                self.EnterCntTotal
+                                self.EnterCntTotal,
+                                self.PassLineID
                                 )
         return DumpString
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index c797b9e..d8ea020 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3558,6 +3558,7 @@
 Def_Player_Dict_ReqFBMissionType = "ReqFBMissionType" # 请求进入副本的任务类型
 Def_Player_Dict_PlayerFBStar_MapId = "FBStar_%s_%s"  # 副本星级星级信息, 参数为[mapID, key编号], 按位存储每个lineID对应的星级
 Def_Player_Dict_CustomMapStep = "CustomMapStep_%s_%s"  # 前端自定义场景阶段, 参数(mapID, lineID),对应 CustomMapStep_Fight ...
+Def_Player_Dict_FBPassLineID = "FBPassLineID_%s"  # 副本已过关到的lineID, 参数为副本ID
 Def_Player_Dict_EnterFbCntTotal = "EnterFbCntTotal_%s"  # 进入副本总累计次数, 参数为副本ID
 Def_Player_Dict_EnterFbCntDay = "EnterFbCntDay_%s"  # 今日进入副本次数, 参数为副本ID
 Def_Player_Dict_BuyFbCntDay = "BuyFbCntDay_%s" # 今日购买副本进入次数, 参数为副本ID
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index 8d7d762..be51fff 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -23980,6 +23980,7 @@
     PassGradeCnt = 0    #(BYTE PassGradeCnt)//星级值对应个数, 每个key存9个lineID
     PassGrade = list()    #(vector<DWORD> PassGrade)//副本线路对应星级值列表
     EnterCntTotal = 0    #(DWORD EnterCntTotal)//累计进入次数
+    PassLineID = 0    #(DWORD PassLineID)//已过关到的lineID
     data = None
 
     def __init__(self):
@@ -23997,6 +23998,7 @@
             value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
             self.PassGrade.append(value)
         self.EnterCntTotal,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.PassLineID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         return _pos
 
     def Clear(self):
@@ -24007,6 +24009,7 @@
         self.PassGradeCnt = 0
         self.PassGrade = list()
         self.EnterCntTotal = 0
+        self.PassLineID = 0
         return
 
     def GetLength(self):
@@ -24017,6 +24020,7 @@
         length += 2
         length += 1
         length += 4 * self.PassGradeCnt
+        length += 4
         length += 4
 
         return length
@@ -24031,6 +24035,7 @@
         for i in range(self.PassGradeCnt):
             data = CommFunc.WriteDWORD(data, self.PassGrade[i])
         data = CommFunc.WriteDWORD(data, self.EnterCntTotal)
+        data = CommFunc.WriteDWORD(data, self.PassLineID)
         return data
 
     def OutputString(self):
@@ -24041,7 +24046,8 @@
                                 ItemAddCnt:%d,
                                 PassGradeCnt:%d,
                                 PassGrade:%s,
-                                EnterCntTotal:%d
+                                EnterCntTotal:%d,
+                                PassLineID:%d
                                 '''\
                                 %(
                                 self.FBID,
@@ -24050,7 +24056,8 @@
                                 self.ItemAddCnt,
                                 self.PassGradeCnt,
                                 "...",
-                                self.EnterCntTotal
+                                self.EnterCntTotal,
+                                self.PassLineID
                                 )
         return DumpString
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/EnterFB.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/EnterFB.py
index 107a2e5..439d86d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/EnterFB.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/EnterFB.py
@@ -40,7 +40,7 @@
         FBCommon.SetFBPDictValue(curPlayer, ChConfig.Def_PDict_LastEnterFBTick % mapID, 0)
         
     tick = GameWorld.GetGameWorld().GetTick()
-    if mapID in ChConfig.ClientCustomScene:
+    if mapID in FBCommon.GetClientCustomScene():
         PlayerFB.DoEnterCustomScene(curPlayer, mapID, lineID, tick)
     elif mapID in ChConfig.Def_CrossMapIDList:
         PlayerControl.PlayerEnterCrossServer(curPlayer, mapID, lineID)
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 aad18b7..849c9c4 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py
@@ -20,6 +20,7 @@
 import GameWorldProcess
 import CrossRealmPlayer
 import DataRecordPack
+import IpyGameDataPY
 import PlayerSuccess
 import ReadChConfig
 import PlayerAssist
@@ -1380,6 +1381,9 @@
         if mapID in value:
             return key
         
+    if mapID in FBCommon.GetGeneralTrainMapIDList():
+        return "GeneralTrain"
+    
     #for key , value in ReadChConfig.GetEvalChConfig("MapID_ProcessPy").items():
     #    if mapID in value:
     #        return key
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 207155a..05b356d 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
@@ -2364,6 +2364,27 @@
             return dataMapID
     return mapID
 
+def GetGeneralTrainMapIDList():
+    ## 获取通用养成副本
+    GeneralTrainMapIDList = IpyGameDataPY.GetConfigEx("GeneralTrainMapIDList")
+    if not GeneralTrainMapIDList:
+        GeneralTrainMapIDList = []
+        ipyDataMgr = IpyGameDataPY.IPY_Data()
+        for i in xrange(ipyDataMgr.GetFBGeneralTrainCount()):
+            ipyData = ipyDataMgr.GetFBGeneralTrainByIndex(i)
+            dMapID = ipyData.GetDataMapID()
+            if dMapID not in GeneralTrainMapIDList:
+                GeneralTrainMapIDList.append(dMapID)
+        GeneralTrainMapIDList = IpyGameDataPY.SetConfigEx("GeneralTrainMapIDList", GeneralTrainMapIDList)
+        #GameWorld.Log("加载GeneralTrainMapIDList=%s" % GeneralTrainMapIDList)
+        
+    return GeneralTrainMapIDList
+
+def GetClientCustomScene():
+    ## 获取前端自定义副本场景
+    mapIDList = GetGeneralTrainMapIDList()
+    return mapIDList + ChConfig.ClientCustomScene
+
 ## 同步进入副本时间
 #  @param curPlayer 玩家
 #  @param syncMapID 同步的地图,默认0为全部
@@ -2427,6 +2448,7 @@
         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 keyNum in range(ChConfig.Def_FBStar_MaxKeyCnt):
             gradeValue = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_PlayerFBStar_MapId % (mID, keyNum))
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_GeneralTrain.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_GeneralTrain.py
new file mode 100644
index 0000000..cd69137
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_GeneralTrain.py
@@ -0,0 +1,159 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package GameWorldLogic.FBProcess.GameLogic_GeneralTrain
+#
+# @todo:通用养成副本
+# @author hxp
+# @date 2024-06-26
+# @version 1.0
+#
+# 详细描述: 通用养成副本
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2024-06-26 14:30"""
+#-------------------------------------------------------------------------------
+
+import FBCommon
+import GameWorld
+import PlayerControl
+import IpyGameDataPY
+import ItemControler
+import NPCCommon
+import ChConfig
+
+## 是否能够通过活动查询进入
+def OnEnterFBEvent(curPlayer, mapID, lineID, tick):
+    ipyData = IpyGameDataPY.GetIpyGameData('FBGeneralTrain', mapID, lineID)
+    if not ipyData:
+        return False
+    
+    LVLimit = ipyData.GetLVLimit()
+    if LVLimit and curPlayer.GetLV() < LVLimit:
+        GameWorld.DebugLog("通用养成副本等级不足,无法挑战! mapID=%s,lineID=%s,LVLimit=%s" % (mapID, lineID, LVLimit))
+        return False
+    
+    RealmLimit = ipyData.GetRealmLimit()
+    if RealmLimit and curPlayer.GetOfficialRank() < RealmLimit:
+        GameWorld.DebugLog("通用养成副本境界不足,无法挑战! mapID=%s,lineID=%s,RealmLimit=%s" % (mapID, lineID, RealmLimit))
+        return False
+    
+    passLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBPassLineID % mapID)
+    if passLineID + 1 != lineID:
+        GameWorld.DebugLog("通用养成副本只能挑战下一关! mapID=%s,lineID=%s,passLineID=%s" % (mapID, lineID, passLineID))
+        return False
+    
+    return True
+
+## 是否需要做进入副本通用检查条件逻辑,默认需要检查
+def OnNeedCheckCanEnterFBComm(curPlayer, mapID, lineID):
+    ## 进行中的不需要重复检查,防止断线重连被禁止进入
+    if FBCommon.GetCustomMapStep(curPlayer, mapID, lineID) == ChConfig.CustomMapStep_Fight:
+        GameWorld.DebugLog("通用养成副本已经在进行中,本次进入不需要重新检查! mapID=%s,lineID=%s" % (mapID, lineID))
+        return False
+    return True
+
+## 客户端进入自定义场景
+def OnEnterCustomScene(curPlayer, mapID, lineID):
+    return
+
+## 判断可否召唤木桩怪
+def OnCanSummonPriWoodPile(curPlayer, mapID, lineID, npcID, count):
+    
+    if FBCommon.GetCustomMapStep(curPlayer, mapID, lineID) != ChConfig.CustomMapStep_Fight:
+        FBCommon.SetCustomMapStep(curPlayer, mapID, lineID, ChConfig.CustomMapStep_Fight)
+        
+    npcIDList = GetGeneralTrainNPCIDList(mapID, lineID)
+    if not npcIDList or npcID not in npcIDList:
+        GameWorld.DebugLog("通用养成副本该NPC不能召唤! mapID=%s,lineID=%s,npcID=%s not in %s" % (mapID, lineID, npcID, npcIDList))
+        return False
+    
+    return True
+
+def OnCustomSceneProcess(curPlayer, mapID, lineID, tick):
+    return
+    
+def GetGeneralTrainNPCIDList(mapID, lineID):
+    npcIDList = []
+    ipyData = IpyGameDataPY.GetIpyGameData('FBGeneralTrain', mapID, lineID)
+    if not ipyData:
+        return []
+    
+    npcIDList.append(ipyData.GetBossNPCID())
+    npcIDList.extend(ipyData.GetOtherNPCIDList())
+    return npcIDList
+
+def GetGeneralTrainBossID(mapID, lineID):
+    ipyData = IpyGameDataPY.GetIpyGameData('FBGeneralTrain', mapID, lineID)
+    if not ipyData:
+        return 0
+    return ipyData.GetBossNPCID()
+
+## 自定义场景副本击杀NPC
+def DoCustomScene_Player_KillNPC(curPlayer, curNPC, mapID, lineID):
+    
+    npcID = curNPC.GetNPCID()
+    bossID = GetGeneralTrainBossID(mapID, lineID)
+    GameWorld.DebugLog("击杀副本NPC: mapID=%s,lineID=%s,npcID=%s,bossID=%s" % (mapID, lineID, npcID, bossID), curPlayer.GetPlayerID())
+    if npcID != bossID:
+        return
+    
+    if FBCommon.GetCustomMapStep(curPlayer, mapID, lineID) != ChConfig.CustomMapStep_Fight:
+        return
+    
+    ipyData = IpyGameDataPY.GetIpyGameData('FBGeneralTrain', mapID, lineID)
+    if not ipyData:
+        return
+    
+    passLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBPassLineID % mapID)
+    if lineID > passLineID:
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FBPassLineID % mapID, lineID)
+        
+    #增加进入次数
+    FBCommon.AddEnterFBCount(curPlayer, mapID)
+    
+    giveItemList = ipyData.GetPassAwardItemList()
+    GameWorld.DebugLog("通用养成副本过关! mapID=%s,lineID=%s,giveItemList=%s" % (mapID, lineID, giveItemList))
+    
+    NPCCommon.DoGiveItemByVirtualDrop(curPlayer, giveItemList, bossID)
+    
+    FBCommon.SetCustomMapStep(curPlayer, mapID, lineID, ChConfig.CustomMapStep_Over)
+    
+    isPass = 1
+    overDict = {FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(giveItemList)}
+    FBCommon.NotifyFBOver(curPlayer, mapID, lineID, isPass, overDict)
+    return
+
+## 可否扫荡
+def OnPlayerFBSweepAsk(curPlayer, mapID, lineID, sweepCnt, isFinish, dataEx):
+    
+    ipyData = IpyGameDataPY.GetIpyGameData('FBGeneralTrain', mapID, lineID)
+    if not ipyData:
+        return
+    
+    passLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBPassLineID % mapID)
+    if passLineID < lineID:
+        GameWorld.DebugLog("没有过关不能扫荡! mapID=%s,passLineID=%s < %s" % (mapID, passLineID, lineID))
+        return
+    
+    return True
+
+## 扫荡结果
+def OnPlayerFBSweepResult(curPlayer, mapID, lineID, sweepCnt, isFinish, dataEx):
+    GameWorld.DebugLog("通用养成副本扫荡: mapID=%s,lineID=%s,sweepCnt=%s" % (mapID, lineID, sweepCnt))
+    ipyData = IpyGameDataPY.GetIpyGameData('FBGeneralTrain', mapID, lineID)
+    if not ipyData:
+        return
+    
+    giveItemList = ipyData.GetPassAwardItemList()
+    awardItemList = []
+    for itemID, itemCount, isAuctionItem in giveItemList:
+        awardItemList.append([itemID, itemCount * sweepCnt, isAuctionItem])
+        
+    ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList)
+    
+    isPass = 1
+    overDict = {FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(awardItemList), FBCommon.Over_isSweep:1}
+    FBCommon.NotifyFBOver(curPlayer, mapID, lineID, isPass, overDict)
+    return True
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index f2b1e46..d0dc989 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -721,6 +721,16 @@
                         ("eval", "RewardInfo", 0),
                         ),
 
+                "FBGeneralTrain":(
+                        ("DWORD", "DataMapID", 1),
+                        ("BYTE", "LineID", 1),
+                        ("WORD", "LVLimit", 0),
+                        ("WORD", "RealmLimit", 0),
+                        ("DWORD", "BossNPCID", 0),
+                        ("list", "OtherNPCIDList", 0),
+                        ("list", "PassAwardItemList", 0),
+                        ),
+
                 "FBHelpBattle":(
                         ("DWORD", "DataMapID", 1),
                         ("BYTE", "LineID", 1),
@@ -3292,6 +3302,21 @@
     def GetGradeInfo(self): return self.attrTuple[14] # 评级规则 eval
     def GetRewardInfo(self): return self.attrTuple[15] # 奖励信息 eval
 
+# 副本通用养成表
+class IPY_FBGeneralTrain():
+    
+    def __init__(self):
+        self.attrTuple = None
+        return
+        
+    def GetDataMapID(self): return self.attrTuple[0] # 数据地图ID DWORD
+    def GetLineID(self): return self.attrTuple[1] # 功能线路ID BYTE
+    def GetLVLimit(self): return self.attrTuple[2] # 多少级可挑战, 0为不限制 WORD
+    def GetRealmLimit(self): return self.attrTuple[3] # 多少境界可挑战, 0为不限制 WORD
+    def GetBossNPCID(self): return self.attrTuple[4] # 过关bossID DWORD
+    def GetOtherNPCIDList(self): return self.attrTuple[5] # 其他NPCIDList list
+    def GetPassAwardItemList(self): return self.attrTuple[6] # 过关奖励列表 list
+
 # 副本助战表
 class IPY_FBHelpBattle():
     
@@ -5840,6 +5865,7 @@
         self.__LoadFileData("ChinMap", onlyCheck)
         self.__LoadFileData("FBFunc", onlyCheck)
         self.__LoadFileData("FBLine", onlyCheck)
+        self.__LoadFileData("FBGeneralTrain", onlyCheck)
         self.__LoadFileData("FBHelpBattle", onlyCheck)
         self.__LoadFileData("NPCCustomRefresh", onlyCheck)
         self.__LoadFileData("DailyAction", onlyCheck)
@@ -6651,6 +6677,13 @@
         self.CheckLoadData("FBLine")
         return self.ipyFBLineCache[index]
 
+    def GetFBGeneralTrainCount(self):
+        self.CheckLoadData("FBGeneralTrain")
+        return self.ipyFBGeneralTrainLen
+    def GetFBGeneralTrainByIndex(self, index):
+        self.CheckLoadData("FBGeneralTrain")
+        return self.ipyFBGeneralTrainCache[index]
+
     def GetFBHelpBattleCount(self):
         self.CheckLoadData("FBHelpBattle")
         return self.ipyFBHelpBattleLen

--
Gitblit v1.8.0