From df2af1331d39ad7da3f833931c01e2391f575988 Mon Sep 17 00:00:00 2001
From: xdh <xiefantasy@qq.com>
Date: 星期四, 09 五月 2019 14:33:51 +0800
Subject: [PATCH] 6705 【后端】【2.0】天星塔功能

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py                                 |    7 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py                             |  108 ++--
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetSkyTower.py                     |   16 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBillboard.py                      |    8 
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py                                                  |  108 ++--
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPrestigeSys.py                    |   20 
 /dev/null                                                                                                          |  667 ---------------------------
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/KillScreenNPC.py                   |    6 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/QuestRunner.py                  |    8 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_SkyTower.py |  413 +++++++++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py                               |   32 +
 ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py                                                         |    1 
 PySysDB/PySysDBPY.h                                                                                                |   12 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventShell.py                            |    6 
 ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py                                                      |    7 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                                    |    8 
 16 files changed, 606 insertions(+), 821 deletions(-)

diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index 2d29f3f..03fc42b 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -29,6 +29,7 @@
 	DWORD		NeedLV;	//需要等级
 	DWORD		NeedItemID;	//需要道具ID
 	WORD		NeedItemCnt;	//消耗的道具数量
+	list		NeedEquip;	//需要8部位装备条件阶级|品质|是否套装
 	list		AddAttrType;	//境界加成属性类型	
 	list		AddAttrNum;	//境界加成属性值
 	DWORD		BossID;	//渡劫bossid
@@ -1893,4 +1894,15 @@
 	DWORD		_ElementSkillID;	//专精技能ID
 	DWORD		MainSkillID;	//主技能ID
 	DWORD		NeedLV;	//选择需要等级
+};
+
+//天星塔表
+
+struct tagSkyTower
+{
+	DWORD		_FloorID;	//层
+	DWORD		BossID;	//bossID
+	dict		Reward;	//奖励
+	WORD		NeedLV;	//要求等级
+	DWORD		FightPower;	//推荐战力
 };
\ No newline at end of file
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py b/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
index 407f81f..60b2355 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
@@ -585,7 +585,6 @@
             ShareDefine.Def_BT_FCCostGold               : 5,             #消费排行榜(仙界盛典)
             ShareDefine.Def_BT_NewFCCostGold            : 5,             #消费排行榜(仙界盛典)
             ShareDefine.Def_BT_FBHelpBattle             : 100,           #助战次数榜
-            ShareDefine.Def_BT_ZhuXianTower             : 100,           #诛仙塔榜
             }
 
 #排行榜保存类型(和BillboardType匹配), 默认保存, 如果不保存,可配置进去
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index ce0d1ce..3afc13f 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -29573,6 +29573,58 @@
 
 
 #------------------------------------------------------
+# B2 13 天星塔通关层数 #tagMCSkyTowerInfo
+
+class  tagMCSkyTowerInfo(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("Floor", c_int),    # 已通关层
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xB2
+        self.SubCmd = 0x13
+        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 = 0xB2
+        self.SubCmd = 0x13
+        self.Floor = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCSkyTowerInfo)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// B2 13 天星塔通关层数 //tagMCSkyTowerInfo:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                Floor:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.Floor
+                                )
+        return DumpString
+
+
+m_NAtagMCSkyTowerInfo=tagMCSkyTowerInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCSkyTowerInfo.Cmd,m_NAtagMCSkyTowerInfo.SubCmd))] = m_NAtagMCSkyTowerInfo
+
+
+#------------------------------------------------------
 #B2 02 推送提醒设置通知 #tagMCPushNotificationsSetting
 
 class  tagMCPushNotificationsSetting(Structure):
@@ -29693,62 +29745,6 @@
 
 m_NAtagMCZhuXianBossCnt=tagMCZhuXianBossCnt()
 ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCZhuXianBossCnt.Cmd,m_NAtagMCZhuXianBossCnt.SubCmd))] = m_NAtagMCZhuXianBossCnt
-
-
-#------------------------------------------------------
-# B2 13 诛仙塔通关层数 #tagMCZhuXianTowerInfo
-
-class  tagMCZhuXianTowerInfo(Structure):
-    _pack_ = 1
-    _fields_ = [
-                  ("Cmd", c_ubyte),
-                  ("SubCmd", c_ubyte),
-                  ("Floor", c_int),    # 已通关层
-                  ("LastFloor", c_int),    # 上次挑战层
-                  ]
-
-    def __init__(self):
-        self.Clear()
-        self.Cmd = 0xB2
-        self.SubCmd = 0x13
-        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 = 0xB2
-        self.SubCmd = 0x13
-        self.Floor = 0
-        self.LastFloor = 0
-        return
-
-    def GetLength(self):
-        return sizeof(tagMCZhuXianTowerInfo)
-
-    def GetBuffer(self):
-        return string_at(addressof(self), self.GetLength())
-
-    def OutputString(self):
-        DumpString = '''// B2 13 诛仙塔通关层数 //tagMCZhuXianTowerInfo:
-                                Cmd:%s,
-                                SubCmd:%s,
-                                Floor:%d,
-                                LastFloor:%d
-                                '''\
-                                %(
-                                self.Cmd,
-                                self.SubCmd,
-                                self.Floor,
-                                self.LastFloor
-                                )
-        return DumpString
-
-
-m_NAtagMCZhuXianTowerInfo=tagMCZhuXianTowerInfo()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCZhuXianTowerInfo.Cmd,m_NAtagMCZhuXianTowerInfo.SubCmd))] = m_NAtagMCZhuXianTowerInfo
 
 
 #------------------------------------------------------
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
index 9d1a485..858218a 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -642,11 +642,10 @@
     Def_BT_Campaign_Recharge,                 #累计充值(开服活动榜)
     Def_BT_Campaign_PetLV,                    #灵宠等级(开服活动榜)
     
-    Def_BT_ZhuXianTower,                      #诛仙塔榜
     Def_BT_NewFCCostGold,                     #消费排行榜(新仙界盛典)
     
     Def_BT_Max,                               #排行榜最大类型
-) = range(0, 24 + 2) 
+) = range(0, 23 + 2) 
     
 #职业对应战力排行榜类型
 JobFightPowerBillboardDict = {
@@ -658,7 +657,7 @@
 #排行榜Value1存储境界信息的榜单列表
 BTValue1_OfficialRankList = [Def_BT_FightPower, Def_BT_FightPower_Warrior, Def_BT_FightPower_Wizard, Def_BT_FightPower_Assassin, 
                              Def_BT_LV, Def_BT_FightPower_Horse, Def_BT_FightPower_Pet, Def_BT_TrialTower, Def_BT_OffLineEfficient,
-                             Def_BT_FBHelpBattle, Def_BT_ZhuXianTower,
+                             Def_BT_FBHelpBattle,
                              ]
 
 ##---比率---
@@ -1459,7 +1458,7 @@
 DailyActionID_HelpBattleCheckIn, # 助战登记  20
 DailyActionID_CrossReamPK, # 跨服PK  21
 DailyActionID_FamilyBoss1, # 仙盟BOSS  22
-DailyActionID_FamilyBoss2, # 废弃  23
+DailyActionID_SkyTower, # 天星塔  23
 DailyActionID_HorsePetBoss, # 骑宠BOSS  24
 DailyActionID_FairyDomain, # 缥缈仙域  25
 ) = range(1, 25 + 1)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 2af735a..2da3678 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -1768,8 +1768,8 @@
 Def_FBMapID_SealDemonEx = 52020
 #诛仙BOSS
 Def_FBMapID_ZhuXianBoss = 31380
-#诛仙塔
-Def_FBMapID_ZhuXianTower = 31370
+#天星塔
+Def_FBMapID_SkyTower = 31370
 #仙魔之争
 Def_FBMapID_XMZZ = 31010
 #神兽副本
@@ -1906,7 +1906,7 @@
                 'CrossGrassland':[Def_FBMapID_CrossGrasslandLing, Def_FBMapID_CrossGrasslandXian], #草园
                 'GatherSoul':[Def_FBMapID_GatherSoul],#聚魂副本
                 'ZhuXianBoss':[Def_FBMapID_ZhuXianBoss],#诛仙BOSS
-                'ZhuXianTower':[Def_FBMapID_ZhuXianTower],#诛仙塔
+                'SkyTower':[Def_FBMapID_SkyTower],#天星塔
                 'AllFamilyBoss':[Def_FBMapID_AllFamilyBoss],#多仙盟BOSS
                 'HorsePetBoss':[Def_FBMapID_HorsePetBoss],#骑宠BOSS
                 'FairyTreasure':[Def_FBMapID_FairyTreasure],#缥缈宝藏
@@ -3603,6 +3603,8 @@
 Def_Player_Dict_ZhuXianTowerPassLV = "ZhuXianTowerPassLV"  # 诛仙塔已通关层数
 Def_Player_Dict_ZhuXianTowerLastFloor = "ZhuXianTowerLastFloor"  # 诛仙塔上次挑战层数
 Def_Player_Dict_ZhuXianTowerCostTime = "ZhuXianTowerCostTime"  # 诛仙塔通关时间
+#天星塔
+Def_Player_Dict_SkyTowerFloor = "SkyTowerFloor"  # 天星塔已通关层数
 
 #古神禁地
 Def_Player_Dict_GodArea_Anger = "GodArea_Anger"  # 古神禁地怒气值
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index ce0d1ce..3afc13f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -29573,6 +29573,58 @@
 
 
 #------------------------------------------------------
+# B2 13 天星塔通关层数 #tagMCSkyTowerInfo
+
+class  tagMCSkyTowerInfo(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("Floor", c_int),    # 已通关层
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xB2
+        self.SubCmd = 0x13
+        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 = 0xB2
+        self.SubCmd = 0x13
+        self.Floor = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCSkyTowerInfo)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// B2 13 天星塔通关层数 //tagMCSkyTowerInfo:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                Floor:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.Floor
+                                )
+        return DumpString
+
+
+m_NAtagMCSkyTowerInfo=tagMCSkyTowerInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCSkyTowerInfo.Cmd,m_NAtagMCSkyTowerInfo.SubCmd))] = m_NAtagMCSkyTowerInfo
+
+
+#------------------------------------------------------
 #B2 02 推送提醒设置通知 #tagMCPushNotificationsSetting
 
 class  tagMCPushNotificationsSetting(Structure):
@@ -29693,62 +29745,6 @@
 
 m_NAtagMCZhuXianBossCnt=tagMCZhuXianBossCnt()
 ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCZhuXianBossCnt.Cmd,m_NAtagMCZhuXianBossCnt.SubCmd))] = m_NAtagMCZhuXianBossCnt
-
-
-#------------------------------------------------------
-# B2 13 诛仙塔通关层数 #tagMCZhuXianTowerInfo
-
-class  tagMCZhuXianTowerInfo(Structure):
-    _pack_ = 1
-    _fields_ = [
-                  ("Cmd", c_ubyte),
-                  ("SubCmd", c_ubyte),
-                  ("Floor", c_int),    # 已通关层
-                  ("LastFloor", c_int),    # 上次挑战层
-                  ]
-
-    def __init__(self):
-        self.Clear()
-        self.Cmd = 0xB2
-        self.SubCmd = 0x13
-        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 = 0xB2
-        self.SubCmd = 0x13
-        self.Floor = 0
-        self.LastFloor = 0
-        return
-
-    def GetLength(self):
-        return sizeof(tagMCZhuXianTowerInfo)
-
-    def GetBuffer(self):
-        return string_at(addressof(self), self.GetLength())
-
-    def OutputString(self):
-        DumpString = '''// B2 13 诛仙塔通关层数 //tagMCZhuXianTowerInfo:
-                                Cmd:%s,
-                                SubCmd:%s,
-                                Floor:%d,
-                                LastFloor:%d
-                                '''\
-                                %(
-                                self.Cmd,
-                                self.SubCmd,
-                                self.Floor,
-                                self.LastFloor
-                                )
-        return DumpString
-
-
-m_NAtagMCZhuXianTowerInfo=tagMCZhuXianTowerInfo()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCZhuXianTowerInfo.Cmd,m_NAtagMCZhuXianTowerInfo.SubCmd))] = m_NAtagMCZhuXianTowerInfo
 
 
 #------------------------------------------------------
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventShell.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventShell.py
index 32f6d7c..44eefe3 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventShell.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventShell.py
@@ -1682,12 +1682,12 @@
     RunQuestEvent(curPlayer, "on_trialtowercnt", cnt, Def_RunQuestType_Normal)
     return
 
-## 通关诛仙塔第X层
+## 通关天星塔第X层
 #  @param curPlayer 玩家实例
 #  @param eventName 
 #  @return None
-def EventRespons_ZhuXianTowerPass(curPlayer, cnt):
-    RunQuestEvent(curPlayer, "zhuxiantowerpass", cnt, Def_RunQuestType_Normal)
+def EventRespons_SkyTowerCnt(curPlayer, cnt):
+    RunQuestEvent(curPlayer, "skytowerpass", cnt, Def_RunQuestType_Normal)
     return
 
 ##护送X次美女 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/QuestRunner.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/QuestRunner.py
index af77405..8201199 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/QuestRunner.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/QuestRunner.py
@@ -2572,16 +2572,16 @@
     maxPassLV = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_TrialTower_PassLV) # 历史最大过关数
     return QuestRunnerValue.GetEval(conditionType, maxPassLV, conditionValue)
 
-##通关诛仙塔第X层
+##通关天星塔第X层
 # @param curPlayer 玩家实例
 # @param curMission 任务实例
 # @param curConditionNode 节点信息
 # @return 返回值, 是否判断成功
-# @remarks <Check_Zhuxiantower type="类型" value="值"/> 
-def ConditionType_Check_Zhuxiantower(curPlayer, curMission, curConditionNode):
+# @remarks <Check_Skytower type="类型" value="值"/> 
+def ConditionType_Check_Skytower(curPlayer, curMission, curConditionNode):
     conditionValue = GameWorld.ToIntDef(curConditionNode.GetAttribute("value"), 0)
     conditionType = curConditionNode.GetAttribute("type")
-    maxPassLV = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ZhuXianTowerPassLV) # 历史最大过关数
+    maxPassLV = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_SkyTowerFloor) # 历史最大过关数
     return QuestRunnerValue.GetEval(conditionType, maxPassLV, conditionValue)
 
 def ConditionType_Get_Player_Coin(curPlayer, curMission, curConditionNode):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/KillScreenNPC.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/KillScreenNPC.py
index 1917405..9ddcc20 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/KillScreenNPC.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/KillScreenNPC.py
@@ -23,7 +23,6 @@
 import AttackCommon
 import GameObj
 import NPCCommon
-import GameLogic_ZhuXianTower
 
 
 ## GM命令执行入口
@@ -33,11 +32,6 @@
 #  @remarks 函数详细说明.
 def OnExec(curPlayer, playerList):
 
-    if curPlayer.GetMapID() == ChConfig.Def_FBMapID_ZhuXianTower:
-        #诛仙塔击杀怪
-        GameWorld.GetGameFB().SetGameFBDict(GameLogic_ZhuXianTower.FBDict_RemainHP, 1)
-        return
-    
     isMapAllNPC = 0
     if len(playerList) > 0:
         isMapAllNPC = playerList[0]
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetZhuXianTower.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetSkyTower.py
similarity index 71%
rename from ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetZhuXianTower.py
rename to ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetSkyTower.py
index c3a4b5e..8ffcb3d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetZhuXianTower.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetSkyTower.py
@@ -4,23 +4,21 @@
 #
 #-------------------------------------------------------------------------------
 #
-##@package GM.Commands.SetZhuXianTower
+##@package GM.Commands.SetSkyTower
 #
-# @todo:诛仙塔过关数设置
+# @todo:天星塔过关数设置
 # @author xdh
 # @date 2019-01-21 16:10
 # @version 1.0
 #
 #
-# 详细描述: 诛仙塔过关数设置
+# 详细描述: 天星塔过关数设置
 #
 #---------------------------------------------------------------------
 #"""Version = 2019-01-21 16:10"""
 #---------------------------------------------------------------------
 
-import GameLogic_ZhuXianTower
-import ShareDefine
-import PlayerBillboard
+import GameLogic_SkyTower
 import GameWorld
 #---------------------------------------------------------------------
 #全局变量
@@ -36,8 +34,8 @@
     if len(cmdList) != 1:
         return
     fbLevel = cmdList[0]
-    GameLogic_ZhuXianTower.SetZhuXianTowerCurPassLV(curPlayer, fbLevel, 100)
+    GameLogic_SkyTower.SetSkyTowerCurfloorID(curPlayer, fbLevel)
 
-    GameLogic_ZhuXianTower.SyncZhuXianLevelInfo(curPlayer)
-    GameWorld.DebugAnswer(curPlayer, "诛仙塔过关数设置 floor=%s!"%fbLevel)
+    GameLogic_SkyTower.SyncSkyTowerInfo(curPlayer)
+    GameWorld.DebugAnswer(curPlayer, "天星塔过关数设置 floor=%s!"%fbLevel)
     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
new file mode 100644
index 0000000..3f5d124
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_SkyTower.py
@@ -0,0 +1,413 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+#-------------------------------------------------------------------------------
+#
+##@package GameWorldLogic.FBProcess.GameLogic_SkyTower
+#
+# @todo:天星塔
+# @author xdh
+# @date 2019-05-09
+# @version 1.0
+# 详细描述: 天星塔
+#
+#---------------------------------------------------------------------
+#"""Version = 2019-05-09 11:00"""
+#---------------------------------------------------------------------
+
+import FBCommon
+import GameWorld
+import IPY_GameWorld
+import PlayerControl
+import NPCCustomRefresh
+import ChPyNetSendPack
+import ItemControler
+import EventShell
+import NetPackCommon
+import ShareDefine
+import IpyGameDataPY
+import ChConfig
+import ChPlayer
+import PlayerActivity
+
+
+g_runeTypeDict = {}
+FBDict_Level = 'FBDict_Level'   # 副本关卡
+
+
+# 副本通用配置
+(
+Def_PrepareTime, # 每关准备时间,秒
+Def_FightTime, # 每关战斗时间,秒
+Def_ExitTime, # 退出时间, 秒
+Def_DayPrizeMaxCnt, #每日奖励最多累积几天(配0则无限)
+) = range(4)
+
+
+
+
+# 副本状态
+(
+FB_State_Open, # 副本开启
+FB_State_FightPrepare, # 战斗准备时间
+FB_State_Fighting, # 战斗
+FB_State_FreeTime, # 活动结束准备(胜利/失败)
+FB_State_Close, # 关闭副本
+) = range(5)
+
+
+## 天星塔配置
+def __GetTrialCfg(): return FBCommon.GetFBLineStepTime(ChConfig.Def_FBMapID_SkyTower)
+
+def GetTowerIpyData(floor):
+    return IpyGameDataPY.GetIpyGameData('SkyTower', floor)
+
+def OnFBPlayerLogin(curPlayer):
+    SyncSkyTowerInfo(curPlayer)
+    return
+
+
+## 同步天星塔关卡信息
+#  @floorID 为0时默认全部同步,> 0时仅同步该关卡
+def SyncSkyTowerInfo(curPlayer):
+    ttInfo = ChPyNetSendPack.tagMCSkyTowerInfo()
+    ttInfo.Clear()
+    ttInfo.floorID = __GetSkyTowerCurFloor(curPlayer)
+    NetPackCommon.SendFakePack(curPlayer, ttInfo)
+    return
+
+## 获取当前已通关关卡
+def __GetSkyTowerCurFloor(curPlayer):
+    return curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_SkyTowerFloor)
+
+## 更新当前已通关关卡
+def SetSkyTowerCurfloorID(curPlayer, floorID):
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_SkyTowerFloor, floorID)
+
+    #任务
+    EventShell.EventRespons_SkyTowerCnt(curPlayer, floorID)
+    GameWorld.DebugLog(' 更新天星塔已通关数 %s' % floorID)
+    return
+
+## 是否可进入
+#  @param curPlayer
+#  @param mapID 地图ID
+#  @param lineId 分线ID
+#  @param tick
+#  @return 是否可进入
+def OnEnterFBEvent(curPlayer, mapID, lineId, tick):
+    return True
+
+
+## 检查可否进行挑战
+def __CheckCanChallenge(curPlayer, floorID):
+    playerID = curPlayer.GetPlayerID()
+    ipyData = GetTowerIpyData(floorID)
+    
+    if not ipyData:
+        GameWorld.ErrLog("天星塔关卡(%s)不存在" % (floorID), playerID)
+        return False
+    
+    # 是否已过关
+    if floorID <= __GetSkyTowerCurFloor(curPlayer):
+        GameWorld.DebugLog("天星塔本关(%s)已过关, 无法挑战!" % floorID, playerID)
+        return False
+    
+    if curPlayer.GetLV() < ipyData.GetNeedLV():
+        GameWorld.DebugLog("天星塔本关  等级不足%s, 无法挑战!" % ipyData.GetNeedLV(), playerID)
+        return False
+    
+    return True
+
+
+##副本玩家进入点
+# @param curPlayer 玩家实例
+# @param mapID 地图ID
+# @param lineId 分线ID
+# @param ipyEnterPosInfo 功能线路IPY配置坐标信息
+# @param tick 时间戳
+# @return posX, posY, 随机半径(可选)
+def OnGetFBEnterPos(curPlayer, mapID, lineId, ipyEnterPosInfo, tick):
+    return ipyEnterPosInfo
+
+
+## 是否可以进入
+#  @param ask 请求信息
+#  @param tick
+#  @return 回复是否通过请求
+def OnChangeMapAsk(ask, tick):
+    return IPY_GameWorld.cmeAccept
+
+## 进副本
+#  @param curPlayer
+#  @param tick
+#  @return None
+def DoEnterFB(curPlayer, tick):
+    # 不做处理,有副本行为客户端发包选择挑战关卡
+    #EventReport.WriteEvent_FB(curPlayer, ChConfig.Def_FBMapID_SkyTower, 0, ChConfig.CME_Log_Start)
+    return
+
+
+## 副本时间到关闭
+#  @param tick 当前时间
+#  @return None
+#  @remarks 函数详细说明.
+def OnCloseFB(tick):
+    return
+
+
+##玩家退出副本.
+# @param curPlayer 玩家实例
+# @param tick 时间戳
+# @return 返回值无意义
+# @remarks 玩家主动离开副本.
+def DoExitFB(curPlayer, tick):
+    # 玩家退出默认关闭副本
+    #GameWorldProcess.CloseFB(tick)
+    return
+
+
+##副本总逻辑计时器
+# @param tick 时间戳
+# @return 无意义
+# @remarks 副本总逻辑计时器
+def OnProcess(tick):
+    gameFB = GameWorld.GetGameFB()
+    fbStep = gameFB.GetFBStep()
+    
+    if fbStep == FB_State_FightPrepare:
+        __DoLogic_FightPrepare(tick)
+    elif fbStep == FB_State_Fighting:
+        __DoLogic_Fighting(tick)
+    elif fbStep == FB_State_FreeTime:
+        __DoLogic_FreeTime(tick)
+    elif fbStep == FB_State_Close:
+        pass
+    
+    return
+
+## 获取BossID
+def __GetSkyTowerBossID(floorID= -1):
+    gameFB = GameWorld.GetGameFB()
+    if floorID == -1:
+        floorID = gameFB.GetGameFBDictByKey(FBDict_Level)
+    ipyData = GetTowerIpyData(floorID)
+    
+    if not ipyData:
+        GameWorld.ErrLog("__GetSkyTowerBossID() can not find %s in SkyTowerNPC.txt" % floorID)
+        return 0
+    return ipyData.GetBossID()
+
+##战斗准备时间
+# @param tick  时钟
+# @return 无意义
+def __DoLogic_FightPrepare(tick):
+    gameFB = GameWorld.GetGameFB()
+    
+    trialCfg = __GetTrialCfg()
+    if tick - gameFB.GetFBStepTick() < trialCfg[Def_PrepareTime] * 1000:
+        return
+    
+    bossID = __GetSkyTowerBossID()
+    if not bossID:
+        FBCommon.DoLogic_FBKickAllPlayer()
+        return
+    
+    FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttTowerTake, trialCfg[Def_FightTime] * 1000)
+    
+    NPCCustomRefresh.SetNPCRefresh(FBCommon.GetFBLineRefreshNPC(ChConfig.Def_FBMapID_SkyTower, 0), [bossID])
+    
+    #转入战斗
+    FBCommon.SetFBStep(FB_State_Fighting, tick)
+    return
+
+## 开始副本关卡
+def StartfloorID(curPlayer, floorID, tick):
+    PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_SkyTower)
+    if curPlayer.GetPlayerAction() == IPY_GameWorld.paDie:
+        GameWorld.DebugLog("复活玩家...", curPlayer.GetPlayerID())
+        ChPlayer.PlayerRebornByType(curPlayer, ChConfig.rebornType_City, tick)
+    curPlayer.SetHP(curPlayer.GetMaxHP())
+    FBCommon.ClearFBNPC()
+    
+    gameFB = GameWorld.GetGameFB()
+    gameFB.SetGameFBDict(FBDict_Level, floorID)
+    
+    prepareTick = __GetTrialCfg()[Def_PrepareTime] * 1000
+    
+    FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttWaitStart, prepareTick)
+    FBCommon.SetFBStep(FB_State_FightPrepare, tick)
+    helpDict = {FBCommon.Help_wheel:floorID}
+    FBCommon.Notify_FBHelp(curPlayer, helpDict)
+    GameWorld.DebugLog("StartfloorID, floorID=%s, helpDict=%s" 
+                       % (floorID, str(helpDict)), curPlayer.GetPlayerID())
+    return
+
+
+##战斗时间
+# @param tick  时钟
+# @return 无意义
+def __DoLogic_Fighting(tick):
+    gameFB = GameWorld.GetGameFB()
+    
+    #判断时间结束
+    if tick - gameFB.GetFBStepTick() < __GetTrialCfg()[Def_FightTime] * 1000:
+        return
+    
+    floorID = gameFB.GetGameFBDictByKey(FBDict_Level)
+    playerManager = GameWorld.GetMapCopyPlayerManager()
+    for index in xrange(playerManager.GetPlayerCount()):
+        curPlayer = playerManager.GetPlayerByIndex(index)
+        if not curPlayer:
+            continue
+        __SendSkyTowerOverInfo(curPlayer, floorID, False)
+    
+    #游戏结束
+    __SetFBToFreeTime(tick)
+    return
+
+##设置副本进入离开状态
+# @param tick  时钟
+# @return 无意义
+def __SetFBToFreeTime(tick):
+    FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttLeaveMap, __GetTrialCfg()[Def_ExitTime] * 1000)
+    FBCommon.SetFBStep(FB_State_FreeTime, tick)
+    return
+
+##比赛结束的空闲时间
+# @param tick  时钟
+# @return 无意义
+# @remarks 比赛结束的空闲时间
+def __DoLogic_FreeTime(tick):
+    if tick - GameWorld.GetGameFB().GetFBStepTick() < __GetTrialCfg()[Def_ExitTime] * 1000:
+        return
+    
+    #FBCommon.DoLogic_FBKickAllPlayer()
+    return
+
+## 杀怪
+#  @param curPlayer
+#  @param curNPC 被杀的怪
+#  @param tick
+#  @return None
+def DoFB_Player_KillNPC(curPlayer, curNPC, tick):
+    gameFB = GameWorld.GetGameFB()
+    if gameFB.GetFBStep() != FB_State_Fighting:
+        return
+    bossID = __GetSkyTowerBossID()
+    if bossID != curNPC.GetNPCID():
+        return
+    
+    
+    floorID = gameFB.GetGameFBDictByKey(FBDict_Level)
+            
+    # 过关全服广播
+    ipyData = GetTowerIpyData(floorID)
+    if not ipyData:
+        return
+    
+            
+    if ipyData.GetIsNotify():
+        IPY_Data = IpyGameDataPY.IPY_Data()
+        maxLevel = IPY_Data.GetRuneTowerByIndex(IPY_Data.GetRuneTowerCount()-1).GetID()
+        sysMark = 'RuneTowerInfo_1' if floorID == maxLevel else 'GeRen_liubo_471172'
+        PlayerControl.WorldNotify(0, sysMark,
+                                  [curPlayer.GetPlayerName(), floorID / 100])
+    #更新关卡
+    SetSkyTowerCurfloorID(curPlayer, floorID)
+    # 给过关奖励
+    prizeDict = __GiveFBPassPrize(curPlayer, floorID)
+    # 过关时间
+    costTime = tick - GameWorld.GetGameFB().GetFBStepTick()
+    prizeDict[FBCommon.Over_costTime] = costTime
+    __SendSkyTowerOverInfo(curPlayer, floorID, True, prizeDict)
+    
+    
+    SyncSkyTowerInfo(curPlayer) # 同步最新关卡信息
+    __SetFBToFreeTime(tick)
+    #每日任务
+    PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_Tower)
+    return
+
+
+
+## 给过关奖励
+def __GiveFBPassPrize(curPlayer, ipyData):
+    giveItemDict = ipyData.GetReward()
+    giveItemList = [[itemID, itemCnt, 0] for itemID, itemCnt in giveItemDict.items()]
+    event = ["SKYTower", False, {}]
+    ItemControler.GivePlayerItemOrMail(curPlayer, giveItemList, None, event)
+
+    prizeDict = {FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(giveItemList)}
+    return prizeDict
+
+
+
+## 发送挑战结果信息
+def __SendSkyTowerOverInfo(curPlayer, floorID, isPass, overDict={}):
+    
+    overDict[FBCommon.Over_dataMapID] = ChConfig.Def_FBMapID_SkyTower
+    overDict[FBCommon.Over_wheel] = floorID
+    overDict[FBCommon.Over_isPass] = int(isPass)
+    GameWorld.DebugLog("__SendSkyTowerOverInfo overDict=%s" % (str(overDict)), curPlayer.GetPlayerID())
+    FBCommon.Notify_FB_Over(curPlayer, overDict)
+    return
+
+
+## 检查是否可攻击, 主判定不可攻击的情况,其他逻辑由外层决定
+#  @param attacker 攻击方
+#  @param defender 防守方
+#  @return bool
+def CheckCanAttackTagObjInFB(attacker, defender):
+    gameFB = GameWorld.GetGameFB()
+    if gameFB.GetFBStep() != FB_State_Fighting:
+        return False
+    return True
+
+##玩家死亡.
+# @param curPlayer:死亡的玩家 
+# @param tick 时间戳
+# @return 返回值无意义
+# @remarks 玩家主动离开副本.
+def DoPlayerDead(curPlayer):
+    gameFB = GameWorld.GetGameFB()
+    floorID = gameFB.GetGameFBDictByKey(FBDict_Level)
+    __SendSkyTowerOverInfo(curPlayer, floorID, False)
+    tick = GameWorld.GetGameWorld().GetTick()
+    #游戏结束
+    __SetFBToFreeTime(tick)
+    return
+
+## 是否副本复活
+#  @param None
+#  @return 是否副本复活
+def OnPlayerReborn():
+    return True
+
+## 副本行为
+#  @param curPlayer 玩家
+#  @param actionType 行为类型
+#  @param actionInfo 行为信息
+#  @param tick 当前时间
+#  @return None
+def DoFBAction(curPlayer, actionType, actionInfo, tick):
+    # 默认为选择关卡,由客户端决定,进场及副本选关通用此行为
+    if actionInfo <= 0:
+        return
+    
+    gameFB = GameWorld.GetGameFB()
+    fbStep = gameFB.GetFBStep()
+    
+    if fbStep in [FB_State_FightPrepare, FB_State_Fighting]:
+        GameWorld.DebugLog("准备或战斗中, 无法变更关卡!")
+        return
+    
+    floorID = actionInfo
+    if not __CheckCanChallenge(curPlayer, floorID):
+        FBCommon.DoLogic_FBKickAllPlayer()
+        return
+    
+    StartfloorID(curPlayer, floorID, tick)
+    return
+
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_ZhuXianTower.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_ZhuXianTower.py
deleted file mode 100644
index f68012f..0000000
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_ZhuXianTower.py
+++ /dev/null
@@ -1,667 +0,0 @@
-#!/usr/bin/python
-# -*- coding: GBK -*-
-#-------------------------------------------------------------------------------
-#
-#-------------------------------------------------------------------------------
-#
-##@package GameWorldLogic.FBProcess.GameLogic_ZhuXianTower
-#
-# @todo:诛仙塔
-# @author xdh
-# @date 2019-01-21
-# @version 1.0
-# 详细描述: 诛仙塔
-#
-#---------------------------------------------------------------------
-#"""Version = 2019-01-21 11:00"""
-#---------------------------------------------------------------------
-
-import FBCommon
-import GameWorld
-import IPY_GameWorld
-import PlayerControl
-import NPCCustomRefresh
-import ChPyNetSendPack
-import ItemControler
-import NetPackCommon
-import ShareDefine
-import IpyGameDataPY
-import ItemCommon
-import ChConfig
-import ChPlayer
-import PlayerActLogin
-import GameWorldProcess
-import PlayerBillboard
-import EventReport
-import EventShell
-
-import random
-import math
-
-Def_MaxStar = 5  #S级评级
-
-FBDict_Level = 'FBDict_Level'  # 副本关卡
-FBDict_FBStar = 'FBDict_FBStar'  # 当前副本星级
-FBDict_isFirstS= 'FBDict_isFirstS'  # 是否首次S级过关
-FBDict_StartTick = 'FBDict_StartTick'  #开始时间
-FBDict_Speed = 'FBDict_Speed'  #掉血速度 /s
-FBDict_RemainHP = 'FBDict_RemainHP'  #剩余时间
-FBDict_IsReduceing = 'FBDict_IsReduceing'  #是否掉血中
-FBDict_BossTotalHP = 'FBDict_BossTotalHP'  #BOSS血量
-FBDict_LastHurtTick = 'FBDict_LastHurtTick'  #上次伤害时间
-FBDict_HasGiveAward = 'FBDict_HasGiveAward'  # 是否有给奖励
-FBDict_HasPass = 'FBDict_HasPass'  # 是否有通关
-
-# 副本通用配置
-(
-Def_PrepareTime,  # 每关准备时间,秒
-Def_FightTime,  # 每关战斗时间,秒
-Def_ExitTime,  # 退出时间, 秒
-Def_StarTime,  # 星级对应耗时配置, 秒
-) = range(4)
-
-# 副本状态
-(
-FB_State_Open,  # 副本开启
-FB_State_FightPrepare,  # 战斗准备时间
-FB_State_Fighting,  # 战斗
-FB_State_FreeTime,  # 活动结束准备(胜利/失败)
-FB_State_Close,  # 关闭副本
-) = range(5)
-
-
-## 诛仙塔配置
-def __GetZhuXianCfg(): return FBCommon.GetFBLineStepTime(ChConfig.Def_FBMapID_ZhuXianTower)
-
-
-def GetTowerIpyData(level):
-    return IpyGameDataPY.GetIpyGameData('ZhuXianTower', level)
-
-
-def OnFBPlayerOnLogin(curPlayer):
-    SyncZhuXianLevelInfo(curPlayer)
-    return
-
-
-## 同步诛仙塔关卡信息
-#  @fbLevel 为0时默认全部同步,> 0时仅同步该关卡
-def SyncZhuXianLevelInfo(curPlayer):
-    ttInfo = ChPyNetSendPack.tagMCZhuXianTowerInfo()
-    ttInfo.Clear()
-    ttInfo.Floor = __GetZhuXianTowerCurPassLV(curPlayer)
-    ttInfo.LastFloor = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ZhuXianTowerLastFloor)
-    NetPackCommon.SendFakePack(curPlayer, ttInfo)
-    return
-
-
-## 获取当前已通关关卡
-def __GetZhuXianTowerCurPassLV(curPlayer):
-    return curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ZhuXianTowerPassLV)
-
-
-## 更新当前已通关关卡
-def SetZhuXianTowerCurPassLV(curPlayer, passlv, costSeconds=0):
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_ZhuXianTowerPassLV, passlv)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_ZhuXianTowerCostTime, costSeconds)
-    #更新诛仙塔排行榜
-    PlayerBillboard.UpdateZhuXianTowerBillboard(curPlayer)
-    EventShell.EventRespons_ZhuXianTowerPass(curPlayer, passlv)
-    GameWorld.DebugLog(' 更新诛仙塔已通关数 %s' % passlv)
-    return
-
-
-## 是否可进入
-#  @param curPlayer
-#  @param mapID 地图ID
-#  @param lineId 分线ID
-#  @param tick
-#  @return 是否可进入
-def OnEnterFBEvent(curPlayer, mapID, lineId, tick):    
-    return True
-
-
-## 检查可否进行挑战
-def __CheckCanChallenge(curPlayer):
-    #判断次数
-    curFloor = __GetZhuXianTowerCurPassLV(curPlayer)
-    ipyMgr = IpyGameDataPY.IPY_Data()
-    maxFloor = ipyMgr.GetZhuXianTowerByIndex(ipyMgr.GetZhuXianTowerCount() - 1).GetID()
-    if curFloor >= maxFloor: #已经最后层时,判断次数
-        enterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntDay % ChConfig.Def_FBMapID_ZhuXianTower)
-        if enterCnt >= FBCommon.GetEnterFBMaxCnt(curPlayer, ChConfig.Def_FBMapID_ZhuXianTower):
-            GameWorld.Log('进入次数不足!!')
-            return 0
-        return maxFloor
-    return curFloor + 1
-    
-##玩家切换地图
-def DoPlayerChangeMapLogic(curPlayer):
-    gameFB = GameWorld.GetGameFB()
-    fbStep = gameFB.GetFBStep()
-    curStar = gameFB.GetGameFBDictByKey(FBDict_FBStar)
-    hasPass = gameFB.GetGameFBDictByKey(FBDict_HasPass)
-    if fbStep == FB_State_FreeTime: #失败或非S通关需要加cd
-        if curStar != Def_MaxStar or not hasPass:
-            FBCommon.UpdateFBEnterTick(curPlayer)
-    return
-
-##副本玩家进入点
-# @param curPlayer 玩家实例
-# @param mapID 地图ID
-# @param lineId 分线ID
-# @param ipyEnterPosInfo 功能线路IPY配置坐标信息
-# @param tick 时间戳
-# @return posX, posY, 随机半径(可选)
-def OnGetFBEnterPos(curPlayer, mapID, lineId, ipyEnterPosInfo, tick):
-    return ipyEnterPosInfo
-
-
-## 是否可以进入
-#  @param ask 请求信息
-#  @param tick
-#  @return 回复是否通过请求
-def OnChangeMapAsk(ask, tick):
-    return IPY_GameWorld.cmeAccept
-
-
-## 进副本
-#  @param curPlayer
-#  @param tick
-#  @return None
-def DoEnterFB(curPlayer, tick):
-    # 不做处理,有副本行为客户端发包选择挑战关卡
-    EventReport.WriteEvent_FB(curPlayer, ChConfig.Def_FBMapID_ZhuXianTower, 0, ChConfig.CME_Log_Start)
-    gameFB = GameWorld.GetGameFB()
-    fbStep = gameFB.GetFBStep()
-    ZhuXianCfg = __GetZhuXianCfg()
-    if fbStep <= FB_State_FightPrepare:
-        notify_tick = ZhuXianCfg[Def_PrepareTime] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick())
-        curPlayer.Sync_TimeTick(IPY_GameWorld.tttWaitStart, 0, max(notify_tick, 0), True)
-        
-    elif fbStep == FB_State_Fighting:
-        notify_tick = ZhuXianCfg[Def_FightTime] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick())
-        curPlayer.Sync_TimeTick(IPY_GameWorld.tttTowerTake, 0, max(notify_tick, 0), True)
-        __UpdZhuXianTowerFBStar(tick, True, curPlayer)
-    return
-
-
-## 副本时间到关闭
-#  @param tick 当前时间
-#  @return None
-#  @remarks 函数详细说明.
-def OnCloseFB(tick):
-    return
-
-
-##玩家退出副本.
-# @param curPlayer 玩家实例
-# @param tick 时间戳
-# @return 返回值无意义
-# @remarks 玩家主动离开副本.
-def DoExitFB(curPlayer, tick):
-    # 玩家退出默认关闭副本
-    gameFB = GameWorld.GetGameFB()
-    fbStep = gameFB.GetFBStep()
-    if fbStep == FB_State_FreeTime:
-        #退出时,若s级则补发奖励
-        curStar = gameFB.GetGameFBDictByKey(FBDict_FBStar)
-        hasPass = gameFB.GetGameFBDictByKey(FBDict_HasPass)
-        if hasPass and curStar == Def_MaxStar:
-            __GiveFBPassPrize(curPlayer)
-        GameWorldProcess.CloseFB(tick)
-    return
-
-
-##副本总逻辑计时器
-# @param tick 时间戳
-# @return 无意义
-# @remarks 副本总逻辑计时器
-def OnProcess(tick):
-    gameFB = GameWorld.GetGameFB()
-    fbStep = gameFB.GetFBStep()
-    
-    if fbStep == FB_State_FightPrepare:
-        __DoLogic_FightPrepare(tick)
-    elif fbStep == FB_State_Fighting:
-        __DoLogic_Fighting(tick)
-        __CheckBossHP(tick)
-        __UpdZhuXianTowerFBStar(tick)
-        FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 5000)
-    elif fbStep == FB_State_FreeTime:
-        __DoLogic_FreeTime(tick)
-    elif fbStep == FB_State_Close:
-        pass
-    
-    return
-
-
-## 更新当前副本星级
-def __UpdZhuXianTowerFBStar(tick, isEnter=False, curPlayer=None):
-    gameFB = GameWorld.GetGameFB()
-    fbStep = gameFB.GetFBStep()
-    if fbStep != FB_State_Fighting:
-        return
-    curStar = gameFB.GetGameFBDictByKey(FBDict_FBStar)
-    if curStar == 1:
-        return curStar
-    
-    mapID = GameWorld.GetMap().GetMapID()
-    useSecond = int(math.ceil((tick - gameFB.GetFBStepTick()) / 1000.0))
-    chaosDemonCfg = FBCommon.GetFBLineStepTime(mapID)
-    starTimeList = chaosDemonCfg[Def_StarTime]
-    diffSecond = 0
-    updStar = 1  # 默认至少1星
-    for star, starTime in enumerate(starTimeList, 2):
-        if useSecond <= starTime:
-            updStar = star
-            diffSecond = starTime - useSecond
-            
-    if curStar == updStar and not isEnter:
-        return curStar
-        
-    gameFB.SetGameFBDict(FBDict_FBStar, updStar)
-    
-    GameWorld.DebugLog("__UpdFBStar useSecond=%s,curStar=%s,updStar=%s, diffSecond=%s" 
-                       % (useSecond, curStar, updStar, diffSecond))
-    
-    if curPlayer:
-        DoFBHelp(curPlayer, tick)
-        if updStar != 1:
-            curPlayer.Sync_TimeTick(IPY_GameWorld.tttFlagTake, 0, diffSecond * 1000, True)
-    else:
-        playerManager = GameWorld.GetMapCopyPlayerManager()
-        for index in xrange(playerManager.GetPlayerCount()):
-            curPlayer = playerManager.GetPlayerByIndex(index)
-            if not curPlayer:
-                continue
-            DoFBHelp(curPlayer, tick)
-            if updStar != 1:
-                curPlayer.Sync_TimeTick(IPY_GameWorld.tttFlagTake, 0, diffSecond * 1000, True)
-            
-    return updStar
-
-
-## 获取BossID
-def __GetZhuXianBossID(fbLevel=-1):
-    gameFB = GameWorld.GetGameFB()
-    if fbLevel == -1:
-        fbLevel = gameFB.GetGameFBDictByKey(FBDict_Level)
-    ipyData = GetTowerIpyData(fbLevel)
-    
-    if not ipyData:
-        GameWorld.ErrLog("__GetZhuXianBossID() can not find %s in tagZhuXianTower.txt" % fbLevel)
-        return 0
-    return ipyData.GetNPCID()
-
-
-##战斗准备时间
-# @param tick  时钟
-# @return 无意义
-def __DoLogic_FightPrepare(tick):
-    gameFB = GameWorld.GetGameFB()
-    ZhuXianCfg = __GetZhuXianCfg()
-    if tick - gameFB.GetFBStepTick() < ZhuXianCfg[Def_PrepareTime] * 1000:
-        return
-    bossID = __GetZhuXianBossID()
-    if not bossID:
-        FBCommon.DoLogic_FBKickAllPlayer()
-        return
-    
-    FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttTowerTake, ZhuXianCfg[Def_FightTime] * 1000)
-    
-    NPCCustomRefresh.SetNPCRefresh(FBCommon.GetFBLineRefreshNPC(ChConfig.Def_FBMapID_ZhuXianTower, 0), [bossID])
-    
-    #转入战斗
-    FBCommon.SetFBStep(FB_State_Fighting, tick)
-    return
-
-
-## 开始副本关卡
-def StartFBLevel(curPlayer, fbLevel, tick):
-    
-    if curPlayer.GetPlayerAction() == IPY_GameWorld.paDie:
-        GameWorld.DebugLog("复活玩家...", curPlayer.GetPlayerID())
-        ChPlayer.PlayerRebornByType(curPlayer, ChConfig.rebornType_City, tick)
-    curPlayer.SetHP(curPlayer.GetMaxHP())
-    FBCommon.ClearFBNPC()
-    
-    gameFB = GameWorld.GetGameFB()
-    gameFB.SetGameFBDict(FBDict_Level, fbLevel)
-    playerPower = curPlayer.GetFightPower()
-    ipyData = GetTowerIpyData(fbLevel)
-    needPower = ipyData.GetNeedPower()
-    totalHP = eval(IpyGameDataPY.GetFuncCompileCfg('ZhuXianTowerBossTime'))
-    gameFB.SetGameFBDict(FBDict_BossTotalHP, totalHP * 1000)
-    gameFB.SetGameFBDict(FBDict_Speed, 1000)  #速度默认1000
-    gameFB.SetGameFBDict(FBDict_RemainHP, totalHP * 1000)
-    gameFB.SetGameFBDict(FBDict_IsReduceing, 0)
-    gameFB.SetGameFBDict(FBDict_LastHurtTick, 0)
-    gameFB.SetGameFBDict(FBDict_HasGiveAward, 0)
-    gameFB.SetGameFBDict(FBDict_StartTick, 0)
-    gameFB.SetGameFBDict(FBDict_FBStar, 0)
-    gameFB.SetGameFBDict(FBDict_HasPass, 0)
-    
-    prepareTick = __GetZhuXianCfg()[Def_PrepareTime] * 1000
-    FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttAddUpTime, prepareTick)
-    FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttWaitStart, prepareTick)
-    FBCommon.SetFBStep(FB_State_FightPrepare, tick)
-
-    lastFloor = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ZhuXianTowerLastFloor)
-    if fbLevel != lastFloor:
-        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_ZhuXianTowerLastFloor, fbLevel)
-        SyncZhuXianLevelInfo(curPlayer) # 同步信息
-    
-    DoFBHelp(curPlayer, tick)
-    GameWorld.DebugLog("StartFBLevel, fbLevel=%s,totalHP=%s" % (fbLevel, totalHP), curPlayer.GetPlayerID())
-    return
-
-
-##战斗时间
-# @param tick  时钟
-# @return 无意义
-def __DoLogic_Fighting(tick):
-    gameFB = GameWorld.GetGameFB()
-    
-    #判断时间结束
-    if tick - gameFB.GetFBStepTick() < __GetZhuXianCfg()[Def_FightTime] * 1000:
-        lastHurtTick = gameFB.GetGameFBDictByKey(FBDict_LastHurtTick)
-        if lastHurtTick and tick - lastHurtTick >= 2000:
-            StopReduceHP(tick)
-            GameWorld.GetGameFB().SetGameFBDict(FBDict_LastHurtTick, 0)
-        return
-    
-    fbLevel = gameFB.GetGameFBDictByKey(FBDict_Level)
-    playerManager = GameWorld.GetMapCopyPlayerManager()
-    for index in xrange(playerManager.GetPlayerCount()):
-        curPlayer = playerManager.GetPlayerByIndex(index)
-        if not curPlayer:
-            continue
-        __SendZhuXianTowerOverInfo(curPlayer, fbLevel, False)
-    
-    #游戏结束
-    __SetFBToFreeTime(tick)
-    return
-
-
-##设置副本进入离开状态
-# @param tick  时钟
-# @return 无意义
-def __SetFBToFreeTime(tick):
-    FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttLeaveMap, __GetZhuXianCfg()[Def_ExitTime] * 1000)
-    FBCommon.SetFBStep(FB_State_FreeTime, tick)
-    return
-
-
-##比赛结束的空闲时间
-# @param tick  时钟
-# @return 无意义
-# @remarks 比赛结束的空闲时间
-def __DoLogic_FreeTime(tick):
-    if tick - GameWorld.GetGameFB().GetFBStepTick() < __GetZhuXianCfg()[Def_ExitTime] * 1000:
-        return
-    
-    #FBCommon.DoLogic_FBKickAllPlayer()
-    return
-
-
-def DoZhuXianTowerOver(tick):
-    gameFB = GameWorld.GetGameFB()
-    fbLevel = gameFB.GetGameFBDictByKey(FBDict_Level)
-    # 过关全服广播
-    ipyData = GetTowerIpyData(fbLevel)
-    if not ipyData:
-        return
-    curPlayer = FBCommon.GetCurSingleFBPlayer()
-    if not curPlayer:
-        GameWorldProcess.CloseFB(tick)
-        return
-    # 记录过关
-    #EventReport.WriteEvent_FB(curPlayer, ChConfig.Def_FBMapID_ZhuXianTower, 0, ChConfig.CME_Log_End, 0, 1)
-
-    # 过关时间
-    costTime = tick - GameWorld.GetGameFB().GetFBStepTick()
-    curStar = gameFB.GetGameFBDictByKey(FBDict_FBStar)
-    isFirstS = 0
-    if fbLevel != __GetZhuXianTowerCurPassLV(curPlayer) and curStar == Def_MaxStar:
-        #更新关卡
-        SetZhuXianTowerCurPassLV(curPlayer, fbLevel, costTime/1000)
-        
-        isFirstS = 1  #是否首次S通关
-    gameFB.SetGameFBDict(FBDict_isFirstS, isFirstS)
-    
-    unLockEquipPlace = ipyData.GetUnLockEquipPlace()
-    if isFirstS and unLockEquipPlace:
-        PlayerControl.WorldNotify(0, 'KillGodTowerInfo_1', [curPlayer.GetPlayerName(), fbLevel, unLockEquipPlace])
-        
-    # 给过关奖励
-    prizeItemList = __GiveFBPassPrize(curPlayer, False)
-    
-    prizeDict = {FBCommon.Over_costTime:costTime, FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(prizeItemList),
-                 FBCommon.Over_grade:curStar}
-    __SendZhuXianTowerOverInfo(curPlayer, fbLevel, True if prizeItemList else False, prizeDict)
-
-    SyncZhuXianLevelInfo(curPlayer)  # 同步最新关卡信息
-    __SetFBToFreeTime(tick)
-    #每日任务
-    #PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_Tower)
-    return
-
-
-## 杀怪
-#  @param curPlayer
-#  @param curNPC 被杀的怪
-#  @param tick
-#  @return None
-def DoFB_Player_KillNPC(curPlayer, curNPC, tick):
-    
-    return
-
-
-## 给过关奖励
-def __GiveFBPassPrize(curPlayer, isGive=True):
-    gameFB = GameWorld.GetGameFB()
-    preFloor = gameFB.GetGameFBDictByKey(FBDict_Level)
-    ipyData = GetTowerIpyData(preFloor)
-    if not ipyData:
-        return []
-    
-    isFirstPass = gameFB.GetGameFBDictByKey(FBDict_isFirstS)  #是否首次s通关
-    if isFirstPass:
-        prizeItemList = ipyData.GetFirstAward()
-    else:
-        curStar = gameFB.GetGameFBDictByKey(FBDict_FBStar)
-        prizeItemList = ipyData.GetGradeAward().get(curStar, [])
-    if not prizeItemList:
-        return []
-    if not isGive:
-        return prizeItemList
-    if gameFB.GetGameFBDictByKey(FBDict_HasGiveAward):
-        GameWorld.Log('本层奖励已给,不能重复给!!', curPlayer.GetID())
-        return
-    hasPass = gameFB.GetGameFBDictByKey(FBDict_HasPass)
-    if not hasPass:
-        return
-    
-    # 发邮件或放入背包
-    ItemControler.GivePlayerItemOrMail(curPlayer, prizeItemList, 'KillGodTowerReward', ["ZhuXianTower", False, {}])
-    
-    #首次S级不扣次数,非S级给奖励扣次数,非首次S扣次数
-    if not isFirstPass:
-        FBCommon.AddEnterFBCount(curPlayer, ChConfig.Def_FBMapID_ZhuXianTower, 1)
-
-        
-    gameFB.SetGameFBDict(FBDict_HasGiveAward, 1)
-    PlayerActLogin.AddLoginAwardActionCnt(curPlayer, ChConfig.Def_LoginAct_ZhuXianTower, 1)
-    return
-
-
-##副本帮助信息
-# @param curPlayer 玩家实例
-# @param tick 时间戳
-# @return 无意义
-# @remarks 用于通知阵营比分条
-def DoFBHelp(curPlayer, tick):
-    gameFB = GameWorld.GetGameFB()
-    star = gameFB.GetGameFBDictByKey(FBDict_FBStar)
-    
-    curSpeed = gameFB.GetGameFBDictByKey(FBDict_Speed) 
-    isReduceing = gameFB.GetGameFBDictByKey(FBDict_IsReduceing) 
-    remainHP = GetBossRemainHP(tick)
-    totalHP = __GetBossTotalHP()
-    hpReduceSpeed = curSpeed * 10000 / totalHP if totalHP else 0
-    remainHPPer = min(1000000, remainHP * 1000000 / totalHP) if totalHP else 0
-    fbLevel = gameFB.GetGameFBDictByKey(FBDict_Level)
-    fbHelpDict = {FBCommon.Help_wheel:fbLevel, FBCommon.Help_grade:star, 'hpReduceSpeed':hpReduceSpeed, 'remainHPPer':remainHPPer, 'isReduceing':isReduceing}
-    GameWorld.DebugLog("DoFBHelp: %s" % fbHelpDict, curPlayer.GetPlayerID())
-    FBCommon.Notify_FBHelp(curPlayer, fbHelpDict)
-    return
-
-
-## 发送挑战结果信息
-def __SendZhuXianTowerOverInfo(curPlayer, fbLevel, isPass, overDict={}):
-    
-    overDict[FBCommon.Over_dataMapID] = ChConfig.Def_FBMapID_ZhuXianTower
-    overDict[FBCommon.Over_wheel] = fbLevel
-    overDict[FBCommon.Over_isPass] = int(isPass)
-    GameWorld.DebugLog("__SendZhuXianTowerOverInfo overDict=%s" % (str(overDict)), curPlayer.GetPlayerID())
-    FBCommon.Notify_FB_Over(curPlayer, overDict)
-    GameWorld.GetGameFB().SetGameFBDict(FBDict_HasPass, int(isPass))
-    return
-
-
-## 检查是否可攻击, 主判定不可攻击的情况,其他逻辑由外层决定
-#  @param attacker 攻击方
-#  @param defender 防守方
-#  @return bool
-def CheckCanAttackTagObjInFB(attacker, defender):
-    gameFB = GameWorld.GetGameFB()
-    if gameFB.GetFBStep() != FB_State_Fighting:
-        return False
-    return True
-
-
-##玩家死亡.
-# @param curPlayer:死亡的玩家 
-# @param tick 时间戳
-# @return 返回值无意义
-# @remarks 玩家主动离开副本.
-def DoPlayerDead(curPlayer):
-    gameFB = GameWorld.GetGameFB()
-    fbLevel = gameFB.GetGameFBDictByKey(FBDict_Level)
-    __SendZhuXianTowerOverInfo(curPlayer, fbLevel, False)
-    tick = GameWorld.GetGameWorld().GetTick()
-    #游戏结束
-    __SetFBToFreeTime(tick)
-    return
-
-
-## 是否副本复活
-#  @param None
-#  @return 是否副本复活
-def OnPlayerReborn():
-    return True
-
-
-## 副本行为
-#  @param curPlayer 玩家
-#  @param actionType 行为类型
-#  @param actionInfo 行为信息
-#  @param tick 当前时间
-#  @return None
-def DoFBAction(curPlayer, actionType, actionInfo, tick):
-    # 默认为选择关卡,由客户端决定,进场及副本选关通用此行为
-    gameFB = GameWorld.GetGameFB()
-    fbStep = gameFB.GetFBStep()
-    if actionType == 0:
-
-        if fbStep in [FB_State_FightPrepare, FB_State_Fighting]:
-            GameWorld.DebugLog("准备或战斗中, 无法变更关卡!")
-            return
-        newFloor = __CheckCanChallenge(curPlayer)
-        if not newFloor:
-            FBCommon.DoLogic_FBKickAllPlayer()
-            return
-        
-        StartFBLevel(curPlayer, newFloor, tick)
-    elif actionType == 1:
-        #领取奖励
-        if fbStep != FB_State_FreeTime:
-            return
-        __GiveFBPassPrize(curPlayer)
-    return
-
-
-def __CheckBossHP(tick):
-    gameFB = GameWorld.GetGameFB()
-    fbStep = gameFB.GetFBStep()
-
-    if fbStep == FB_State_Fighting and GetBossRemainHP(tick) == 0:
-        #结束 设置BOSS死亡
-        FBCommon.ClearFBNPC()
-        FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0)
-        GameWorld.DebugLog('结束 设置BOSS死亡 ')
-        
-        DoZhuXianTowerOver(tick)
-        
-    return
-
-
-def StopReduceHP(tick):
-    ##暂停BOSS血量减少
-    gameFB = GameWorld.GetGameFB()
-    if not gameFB.GetGameFBDictByKey(FBDict_IsReduceing):
-        return
-    remainHP = GetBossRemainHP(tick)
-    if not remainHP:
-        return
-    gameFB.SetGameFBDict(FBDict_IsReduceing, 0)
-    gameFB.SetGameFBDict(FBDict_RemainHP, remainHP)
-    GameWorld.DebugLog('    暂停BOSS血量减少')
-    return
-
-
-def StartReduceHP(tick):
-    ##开始BOSS掉血
-    gameFB = GameWorld.GetGameFB()
-    if gameFB.GetGameFBDictByKey(FBDict_IsReduceing):
-        return
-    gameFB.SetGameFBDict(FBDict_IsReduceing, 1)
-    startTick = gameFB.GetGameFBDictByKey(FBDict_StartTick)
-    if not startTick:
-        gameFB.SetGameFBDict(FBDict_RemainHP, __GetBossTotalHP())
-    gameFB.SetGameFBDict(FBDict_StartTick, tick)
-    GameWorld.DebugLog('    开始BOSS掉血')
-    
-    FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0)
-    return
-
-
-def __GetBossTotalHP():return GameWorld.GetGameFB().GetGameFBDictByKey(FBDict_BossTotalHP)
-    
-
-def GetBossRemainHP(tick):
-    gameFB = GameWorld.GetGameFB()
-    
-    startTick = gameFB.GetGameFBDictByKey(FBDict_StartTick)
-    lastSpeed = gameFB.GetGameFBDictByKey(FBDict_Speed) 
-    remainHP = gameFB.GetGameFBDictByKey(FBDict_RemainHP)
-    if not gameFB.GetGameFBDictByKey(FBDict_IsReduceing):
-        return remainHP
-    if not startTick:
-        startTick = tick
-        remainHP = __GetBossTotalHP()
-    else:
-        remainHP = max(0, int((remainHP - (tick - startTick) / 1000.0 * lastSpeed)))
-    return remainHP
-
-
-## 玩家对NPC造成伤害
-#  @param curPlayer 当前玩家
-#  @param curNPC 
-#  @param hurtHP 
-#  @return None
-def DoFB_Player_HurtNPC(curPlayer, curNPC, hurtHP):
-    tick = GameWorld.GetGameWorld().GetTick()
-    GameWorld.GetGameFB().SetGameFBDict(FBDict_LastHurtTick, tick)
-    StartReduceHP(tick)
-    return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index 16a4d6f..02a6b60 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -54,6 +54,7 @@
                         ("DWORD", "NeedLV", 0),
                         ("DWORD", "NeedItemID", 0),
                         ("WORD", "NeedItemCnt", 0),
+                        ("list", "NeedEquip", 0),
                         ("list", "AddAttrType", 0),
                         ("list", "AddAttrNum", 0),
                         ("DWORD", "BossID", 0),
@@ -1461,6 +1462,14 @@
                         ("DWORD", "MainSkillID", 0),
                         ("DWORD", "NeedLV", 0),
                         ),
+
+                "SkyTower":(
+                        ("DWORD", "FloorID", 1),
+                        ("DWORD", "BossID", 0),
+                        ("dict", "Reward", 0),
+                        ("WORD", "NeedLV", 0),
+                        ("DWORD", "FightPower", 0),
+                        ),
                 }
 
 
@@ -1508,6 +1517,7 @@
         self.NeedLV = 0
         self.NeedItemID = 0
         self.NeedItemCnt = 0
+        self.NeedEquip = []
         self.AddAttrType = []
         self.AddAttrNum = []
         self.BossID = 0
@@ -1520,6 +1530,7 @@
     def GetNeedLV(self): return self.NeedLV # 需要等级
     def GetNeedItemID(self): return self.NeedItemID # 需要道具ID
     def GetNeedItemCnt(self): return self.NeedItemCnt # 消耗的道具数量
+    def GetNeedEquip(self): return self.NeedEquip # 需要8部位装备条件阶级|品质|是否套装
     def GetAddAttrType(self): return self.AddAttrType # 境界加成属性类型
     def GetAddAttrNum(self): return self.AddAttrNum # 境界加成属性值
     def GetBossID(self): return self.BossID # 渡劫bossid
@@ -4472,6 +4483,23 @@
     def GetElementSkillID(self): return self.ElementSkillID # 专精技能ID
     def GetMainSkillID(self): return self.MainSkillID # 主技能ID
     def GetNeedLV(self): return self.NeedLV # 选择需要等级
+
+# 天星塔表
+class IPY_SkyTower():
+    
+    def __init__(self):
+        self.FloorID = 0
+        self.BossID = 0
+        self.Reward = {}
+        self.NeedLV = 0
+        self.FightPower = 0
+        return
+        
+    def GetFloorID(self): return self.FloorID # 层
+    def GetBossID(self): return self.BossID # bossID
+    def GetReward(self): return self.Reward # 奖励
+    def GetNeedLV(self): return self.NeedLV # 要求等级
+    def GetFightPower(self): return self.FightPower # 推荐战力
 
 
 def Log(msg, playerID=0, par=0):
@@ -4795,6 +4823,8 @@
         self.ipyFBBuyBuffLen = len(self.ipyFBBuyBuffCache)
         self.ipySkillElementCache = self.__LoadFileData("SkillElement", IPY_SkillElement)
         self.ipySkillElementLen = len(self.ipySkillElementCache)
+        self.ipySkyTowerCache = self.__LoadFileData("SkyTower", IPY_SkyTower)
+        self.ipySkyTowerLen = len(self.ipySkyTowerCache)
         Log("IPY_FuncConfig count=%s" % len(self.ipyFuncConfigDict))
         Log("IPY_DataMgr InitOK!")
         return
@@ -5259,6 +5289,8 @@
     def GetFBBuyBuffByIndex(self, index): return self.ipyFBBuyBuffCache[index]
     def GetSkillElementCount(self): return self.ipySkillElementLen
     def GetSkillElementByIndex(self, index): return self.ipySkillElementCache[index]
+    def GetSkyTowerCount(self): return self.ipySkyTowerLen
+    def GetSkyTowerByIndex(self, index): return self.ipySkyTowerCache[index]
 
 IPYData = IPY_DataMgr()
 def IPY_Data(): return IPYData
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBillboard.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBillboard.py
index 2564940..2596575 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBillboard.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBillboard.py
@@ -50,7 +50,6 @@
     
     if isAll:
         UpdateRuneTowerBillboard(curPlayer)
-        UpdateZhuXianTowerBillboard(curPlayer)
         
         #UpdateTJGBillboard(curPlayer, minuteExp) 脱机效率可不更新
         
@@ -177,13 +176,6 @@
     ##更新玩家符印塔排行榜
     passLV = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_TrialTower_PassLV)
     UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_TrialTower, passLV) 
-    return
-
-def UpdateZhuXianTowerBillboard(curPlayer):
-    ##诛仙塔榜(通关时长没有的默认50秒)
-    costTime = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ZhuXianTowerCostTime, 50)
-    passLV = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ZhuXianTowerPassLV)
-    UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_ZhuXianTower, passLV, 10000-costTime)
     return
 
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPrestigeSys.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPrestigeSys.py
index 5629cf1..5ea05d2 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPrestigeSys.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPrestigeSys.py
@@ -126,6 +126,26 @@
         if not canLvUp:
             GameWorld.DebugLog('    副本未过关,不能升级境界')
             return
+    #等级判断
+    if curPlayer.GetLV() < realmIpyData.GetNeedLV():
+        return
+    #装备判断
+    needEquip = realmIpyData.GetNeedEquip()
+    if needEquip and len(needEquip) == 3:
+        classLV, color, isSuite = needEquip
+        equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
+        for place in ChConfig.EquipPlace_Base:
+            ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', classLV, place)
+            if not ipyData:
+                return
+            gridIndex = ipyData.GetGridIndex()
+            curEquip = equipPack.GetAt(gridIndex)
+            if not ItemCommon.CheckItemCanUse(curEquip):
+                return
+            if curEquip.GetItemColor() < color:
+                return
+            if isSuite and not curEquip.GetSuiteID():
+                return
     
     needItemID = realmIpyData.GetNeedItemID()
     needItemCount = realmIpyData.GetNeedItemCnt()
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index 9d1a485..858218a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -642,11 +642,10 @@
     Def_BT_Campaign_Recharge,                 #累计充值(开服活动榜)
     Def_BT_Campaign_PetLV,                    #灵宠等级(开服活动榜)
     
-    Def_BT_ZhuXianTower,                      #诛仙塔榜
     Def_BT_NewFCCostGold,                     #消费排行榜(新仙界盛典)
     
     Def_BT_Max,                               #排行榜最大类型
-) = range(0, 24 + 2) 
+) = range(0, 23 + 2) 
     
 #职业对应战力排行榜类型
 JobFightPowerBillboardDict = {
@@ -658,7 +657,7 @@
 #排行榜Value1存储境界信息的榜单列表
 BTValue1_OfficialRankList = [Def_BT_FightPower, Def_BT_FightPower_Warrior, Def_BT_FightPower_Wizard, Def_BT_FightPower_Assassin, 
                              Def_BT_LV, Def_BT_FightPower_Horse, Def_BT_FightPower_Pet, Def_BT_TrialTower, Def_BT_OffLineEfficient,
-                             Def_BT_FBHelpBattle, Def_BT_ZhuXianTower,
+                             Def_BT_FBHelpBattle,
                              ]
 
 ##---比率---
@@ -1459,7 +1458,7 @@
 DailyActionID_HelpBattleCheckIn, # 助战登记  20
 DailyActionID_CrossReamPK, # 跨服PK  21
 DailyActionID_FamilyBoss1, # 仙盟BOSS  22
-DailyActionID_FamilyBoss2, # 废弃  23
+DailyActionID_SkyTower, # 天星塔  23
 DailyActionID_HorsePetBoss, # 骑宠BOSS  24
 DailyActionID_FairyDomain, # 缥缈仙域  25
 ) = range(1, 25 + 1)

--
Gitblit v1.8.0