From ccaefa2a93fb82d0db5fc7e74832a292fb860984 Mon Sep 17 00:00:00 2001
From: xdh <xiefantasy@qq.com>
Date: 星期二, 22 一月 2019 14:23:20 +0800
Subject: [PATCH] 5919 【后端】【1.5.100】诛仙塔功能开发
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_ZhuXianBoss.py | 63 ++--
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py | 6
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py | 32 ++
ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py | 2
PySysDB/PySysDBPY.h | 12
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetZhuXianTower.py | 44 ++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_ZhuXianTower.py | 642 ++++++++++++++++++++++++++++++++++++++++++
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py | 6
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py | 52 +++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py | 6
10 files changed, 828 insertions(+), 37 deletions(-)
diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index 10cdeba..58e8825 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -1590,4 +1590,16 @@
WORD KillTime; //击杀总时间秒
WORD RealmLV; //需要境界
DWORD ZhuXianScore; //需要诛仙总评分
+};
+
+//诛仙塔表
+
+struct tagZhuXianTower
+{
+ DWORD _ID; //塔编号
+ DWORD NPCID; //npcid
+ list FirstAward; //首次S级奖励
+ dict GradeAward; //评级奖励
+ WORD UnLockEquipPlace; //解锁的装备位
+ DWORD NeedPower; //推荐战力
};
\ No newline at end of file
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py b/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
index 5615d04..e4dbbe7 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
@@ -583,7 +583,7 @@
ShareDefine.Def_BT_Campaign_PetLV : 100, #灵宠等级(开服活动榜)
ShareDefine.Def_BT_FCCostGold : 5, #消费排行榜(仙界盛典)
ShareDefine.Def_BT_FBHelpBattle : 100, #助战次数榜
-
+ ShareDefine.Def_BT_ZhuXianTower : 100, #诛仙塔榜
ShareDefine.Def_BT_HighLadder : 1000, #玩家天梯竞技场排行
ShareDefine.Def_BT_HighLadder_Yester : 1000, #玩家天梯竞技场昨日排行
ShareDefine.Def_BT_RechargeTeHuiLast : 20, #充值特惠活动排行榜-上一期记录
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index 6612111..8d88de9 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -27413,6 +27413,58 @@
#------------------------------------------------------
+# B2 13 诛仙塔通关层数 #tagMCZhuXianTowerInfo
+
+class tagMCZhuXianTowerInfo(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(tagMCZhuXianTowerInfo)
+
+ def GetBuffer(self):
+ return string_at(addressof(self), self.GetLength())
+
+ def OutputString(self):
+ DumpString = '''// B2 13 诛仙塔通关层数 //tagMCZhuXianTowerInfo:
+ Cmd:%s,
+ SubCmd:%s,
+ Floor:%d
+ '''\
+ %(
+ self.Cmd,
+ self.SubCmd,
+ self.Floor
+ )
+ return DumpString
+
+
+m_NAtagMCZhuXianTowerInfo=tagMCZhuXianTowerInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCZhuXianTowerInfo.Cmd,m_NAtagMCZhuXianTowerInfo.SubCmd))] = m_NAtagMCZhuXianTowerInfo
+
+
+#------------------------------------------------------
# B4 11 新增恶意攻击玩家 #tagMCAddMaliciousAtkPlayer
class tagMCAddMaliciousAtkPlayer(Structure):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
index 84a8327..ab6f754 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -570,6 +570,8 @@
Def_BT_Campaign_Recharge, #累计充值(开服活动榜)
Def_BT_Campaign_PetLV, #灵宠等级(开服活动榜)
+ Def_BT_ZhuXianTower, #诛仙塔榜
+
Def_BT_HighLadder, #天梯竞技场排行
Def_BT_HighLadder_Yester, #天梯竞技场昨日排行
Def_BT_RechargeTeHuiLast, #充值特惠活动排行榜-上一期记录
@@ -584,7 +586,7 @@
Def_BT_CostTeHuiLast, #消费特惠排行榜上一期
Def_BT_Max, #排行榜最大类型
-) = range(0, 32 + 2)
+) = range(0, 33 + 2)
#职业对应战力排行榜类型
JobFightPowerBillboardDict = {
@@ -596,7 +598,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_FBHelpBattle, Def_BT_ZhuXianTower,
]
##---比率---
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 2305cba..e3c76c7 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -1809,6 +1809,8 @@
Def_FBMapID_SealDemonEx = 52020
#诛仙BOSS
Def_FBMapID_ZhuXianBoss = 31380
+#诛仙塔
+Def_FBMapID_ZhuXianTower = 31370
#仙魔之争
Def_FBMapID_XMZZ = 31010
#神兽副本
@@ -1918,6 +1920,7 @@
'CrossRealmPK':[Def_FBMapID_CrossRealmPK], #跨服竞技场
'GatherSoul':[Def_FBMapID_GatherSoul],#聚魂副本
'ZhuXianBoss':[Def_FBMapID_ZhuXianBoss],#诛仙BOSS
+ 'ZhuXianTower':[Def_FBMapID_ZhuXianTower],#诛仙塔
}
#特殊副本ID, 由系统分配, 进入时候不验证IsMapCopyFull
@@ -3644,7 +3647,8 @@
#试炼之塔
Def_Player_Dict_TrialTower_PassLV = "TrialTower_PassLV" # 试炼之塔通关层数
Def_Player_Dict_TrialTower_LastDayPassLV = "Tower_LastDayPassLV" # 试炼之塔昨日通关层数
-
+#诛仙塔
+Def_Player_Dict_ZhuXianTowerPassLV = "ZhuXianTowerPassLV" # 诛仙塔通关层数
#古神禁地
Def_Player_Dict_GodArea_Anger = "GodArea_Anger" # 古神禁地怒气值
Def_Player_Dict_GodArea_LastAddAngerTime = "GodArea_LastAddAngerTime" # 古神禁地上一次增加怒气值的时间
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetZhuXianTower.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetZhuXianTower.py
new file mode 100644
index 0000000..3a1bd10
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetZhuXianTower.py
@@ -0,0 +1,44 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+#-------------------------------------------------------------------------------
+#
+##@package GM.Commands.SetZhuXianTower
+#
+# @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 GameWorld
+#---------------------------------------------------------------------
+#全局变量
+#---------------------------------------------------------------------
+
+#---------------------------------------------------------------------
+## 逻辑实现
+## GM命令执行入口
+# @param curPlayer
+# @param cmdList 参数列表
+# @return None
+def OnExec(curPlayer, cmdList):
+ if len(cmdList) != 1:
+ return
+ fbLevel = cmdList[0]
+ GameLogic_ZhuXianTower.SetZhuXianTowerCurPassLV(curPlayer, fbLevel)
+ #更新诛仙塔排行榜
+ PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_ZhuXianTower, fbLevel, 100)
+ GameLogic_ZhuXianTower.SyncZhuXianLevelInfo(curPlayer)
+ GameWorld.DebugAnswer(curPlayer, "诛仙塔过关数设置 floor=%s!"%fbLevel)
+ return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_ZhuXianBoss.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_ZhuXianBoss.py
index 83eee3e..19c2e58 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_ZhuXianBoss.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_ZhuXianBoss.py
@@ -27,16 +27,10 @@
import ItemCommon
import ChPyNetSendPack
import ShareDefine
-import EventShell
-import NPCCustomRefresh
import PlayerSuccess
import PlayerActivity
import NetPackCommon
import ItemControler
-import PlayerMagicWeapon
-import PlayerBossReborn
-import PlayerFairyCeremony
-import PlayerWeekParty
import EventReport
FBDict_StartTick = 'FBDict_StartTick%s' #开始时间
@@ -48,7 +42,7 @@
FBPlayerDict_Rank = "FBPlayerDict_Rank" # 玩家排名
FBDict_BossTotalHP = 'FBDict_BossTotalHP%s' #BOSS血量
-g_npcHurtDict = {}
+g_heroHurtDict = {} #{playerID:hurt}
def OnFBPlayerOnLogin(curPlayer):
@@ -151,9 +145,9 @@
# @param tick
# @return None
def DoEnterFB(curPlayer, tick):
+ global g_heroHurtDict
playerID = curPlayer.GetPlayerID()
- mapID = GameWorld.GetMap().GetMapID()
-
+
lineID = GameWorld.GetGameWorld().GetPropertyID() - 1
playerCnt = GameWorld.GetGameWorld().GetMapCopyPlayerManager().GetPlayerCount()
@@ -166,6 +160,7 @@
if not hadDelTicket:
FBCommon.SetHadDelTicket(curPlayer)
PyGameData.g_fbPickUpItemDict.pop(playerID, 0)
+ g_heroHurtDict.pop(playerID, 0)
# if playerCnt == 1:
# posX, posY = IpyGameDataPY.GetFuncEvalCfg('ZhuXianBossFirstPos')
# GameWorld.ResetPlayerPos(curPlayer, posX, posY)
@@ -204,7 +199,6 @@
# @param tick 时间戳
# @return 无意义
def DoExitFB(curPlayer, tick):
- global g_npcHurtDict
gameWorld = GameWorld.GetGameWorld()
# 清除鼓舞buff
FBCommon.ClearEncourageBuff(curPlayer, tick)
@@ -212,7 +206,6 @@
if gameWorld.GetMapCopyPlayerManager().GetPlayerCount() == 1:
lineID = gameWorld.GetPropertyID() - 1
PyGameData.g_ZhuXianBossPlayerHurtDict[lineID] = {}
- g_npcHurtDict[lineID] = {}
gameWorld.SetGameWorldDict(FBDict_StartTick % lineID, 0)
GameWorld.GetGameFB().ClearGameFBDict()
GameWorldProcess.CloseFB(tick)
@@ -255,12 +248,13 @@
# @return None
def DoFBHelp(curPlayer, tick):
#伤害排行信息
+ if GameWorld.GetGameFB().GetGameFBDictByKey(FBDict_IsOver):
+ return
hurtInfo = []
lineID = GameWorld.GetGameWorld().GetPropertyID() - 1
playerHurtList = PyGameData.g_ZhuXianBossPlayerHurtDict.get(lineID, {}).items()
- npcHurtList = g_npcHurtDict.get(lineID, {}).items()
-
- syncHurtList = (playerHurtList + npcHurtList)[:5]
+
+ syncHurtList = playerHurtList[:5]
syncHurtList.sort(key=lambda asd:asd[1][1], reverse=True)
for i, info in enumerate(syncHurtList, 1):
@@ -271,16 +265,16 @@
hurtDict["hurt"] = hurt % ChConfig.Def_PerPointValue
hurtDict["hurtEx"] = hurt / ChConfig.Def_PerPointValue
hurtInfo.append(hurtDict)
- myRank = __GetSelfHurtRank(curPlayer)
- if myRank and myRank > 5:
- hurtDict = {}
- hurtDict["rank"] = myRank
- info = playerHurtList[myRank - 1]
- playerName, hurt = info[1][:2]
- hurtDict["playerName"] = playerName
- hurtDict["hurt"] = hurt % ChConfig.Def_PerPointValue
- hurtDict["hurtEx"] = hurt / ChConfig.Def_PerPointValue
- hurtInfo.append(hurtDict)
+# myRank = __GetSelfHurtRank(curPlayer)
+# if myRank and myRank > 5:
+# hurtDict = {}
+# hurtDict["rank"] = myRank
+# info = playerHurtList[myRank - 1]
+# playerName, hurt = info[1][:2]
+# hurtDict["playerName"] = playerName
+# hurtDict["hurt"] = hurt % ChConfig.Def_PerPointValue
+# hurtDict["hurtEx"] = hurt / ChConfig.Def_PerPointValue
+# hurtInfo.append(hurtDict)
curSpeed = GameWorld.GetGameWorld().GetGameWorldDictByKey(FBDict_Speed % lineID)
isReduceing = GameWorld.GetGameWorld().GetGameWorldDictByKey(FBDict_IsReduceing % lineID)
@@ -288,7 +282,11 @@
totalHP = __GetBossTotalHP(lineID)
hpReduceSpeed = curSpeed * 10000 / totalHP if totalHP else 0
remainHPPer = min(100, remainHP * 100 / totalHP) if totalHP else 0
- fbHelpDict = {FBCommon.Help_lineID:lineID, "hurtInfo":hurtInfo, 'hpReduceSpeed':hpReduceSpeed, 'remainHPPer':remainHPPer, 'isReduceing':isReduceing}
+ myHurt = g_heroHurtDict.get(curPlayer.GetID(), 0)
+ fbHelpDict = {FBCommon.Help_lineID:lineID, "hurtInfo":hurtInfo, 'hpReduceSpeed':hpReduceSpeed,
+ 'remainHPPer':remainHPPer, 'isReduceing':isReduceing,'myHurt':myHurt % ChConfig.Def_PerPointValue,
+ 'myHurtEx':myHurt / ChConfig.Def_PerPointValue
+ }
GameWorld.DebugLog("DoFBHelp: %s" % fbHelpDict, curPlayer.GetPlayerID())
FBCommon.Notify_FBHelp(curPlayer, fbHelpDict)
return
@@ -328,6 +326,10 @@
return
#
def UpdateHurtInfo(curPlayer, hurtHP, isAdd=False):
+ global g_heroHurtDict
+ playerID = curPlayer.GetPlayerID()
+ g_heroHurtDict[playerID] = g_heroHurtDict.get(playerID, 0) + hurtHP
+
enterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntDay % ChConfig.Def_FBMapID_ZhuXianBoss)
if enterCnt >= FBCommon.GetEnterFBMaxCnt(curPlayer, ChConfig.Def_FBMapID_ZhuXianBoss):
#没归属的不进伤害榜
@@ -335,7 +337,7 @@
lineID = GameWorld.GetGameWorld().GetPropertyID() - 1
playerName = curPlayer.GetName()
- playerID = curPlayer.GetPlayerID()
+
familyID = curPlayer.GetFamilyID()
playerHurtDict = PyGameData.g_ZhuXianBossPlayerHurtDict.get(lineID, {})
if playerID not in playerHurtDict:
@@ -361,14 +363,13 @@
GameWorld.Log("强制踢出玩家关闭副本: overTick=%s,tick=%s" % (overTick, tick))
FBCommon.DoLogic_FBKickAllPlayer()
return
- mapID = GameWorld.GetMap().GetMapID()
-
+
lineID = GameWorld.GetGameWorld().GetPropertyID() - 1
if lineID <0:
return
gameWorld = GameWorld.GetGameWorld()
startTick = gameWorld.GetGameWorldDictByKey(FBDict_StartTick % lineID)
- if not startTick:
+ if not startTick or overTick:
return
FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 5000)
__CheckBossHP(tick)
@@ -405,7 +406,7 @@
playerManager = GameWorld.GetMapCopyPlayerManager()#GameWorld.GetPlayerManager()
firstPlayer = playerManager.FindPlayerByID(firstPlayerID)
if firstPlayer:
- #gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_Rank, rank)
+ gameFB.SetPlayerGameFBDict(firstPlayerID, FBPlayerDict_Rank, 1)
if not dropPosX or not dropPosY:
dropPosX, dropPosY = firstPlayer.GetPosX(), firstPlayer.GetPosY()
prizeItemList = GiveZhuXianBossAward(firstPlayer, lineID, dropItemMapInfo=[dropPosX, dropPosY, True])
@@ -548,7 +549,7 @@
dropPosX, dropPosY = curBoss.GetPosX(), curBoss.GetPosY()
#结束 设置BOSS死亡
-
+ FBCommon.ClearFBNPC()
FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0)
GameWorld.DebugLog('结束 设置BOSS死亡 lineID=%s' % lineID)
playerHurtList = __GetSortHurtList(lineID)
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
new file mode 100644
index 0000000..9e58080
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_ZhuXianTower.py
@@ -0,0 +1,642 @@
+#!/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 PlayerSuccess
+import GameWorldProcess
+import PlayerBillboard
+import EventReport
+
+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' # 是否有给奖励
+
+# 副本通用配置
+(
+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 OnFBPlayerLogin(curPlayer):
+ SyncZhuXianLevelInfo(curPlayer)
+ return
+
+
+## 同步诛仙塔关卡信息
+# @fbLevel 为0时默认全部同步,> 0时仅同步该关卡
+def SyncZhuXianLevelInfo(curPlayer):
+ ttInfo = ChPyNetSendPack.tagMCZhuXianTowerInfo()
+ ttInfo.Clear()
+ ttInfo.Floor = __GetZhuXianTowerCurPassLV(curPlayer)
+ NetPackCommon.SendFakePack(curPlayer, ttInfo)
+ return
+
+
+## 获取当前已通关关卡
+def __GetZhuXianTowerCurPassLV(curPlayer):
+ return curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ZhuXianTowerPassLV)
+
+
+## 更新当前已通关关卡
+def SetZhuXianTowerCurPassLV(curPlayer, passlv):
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_ZhuXianTowerPassLV, passlv)
+ #PlayerRune.DoUnlockRuneHole(curPlayer)
+
+ #PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_Tower, passlv, False)
+ 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):
+ #判断次数
+ 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
+
+ curFloor = __GetZhuXianTowerCurPassLV(curPlayer)
+ ipyMgr = IpyGameDataPY.IPY_Data()
+ maxFloor = ipyMgr.GetZhuXianTowerByIndex(ipyMgr.GetZhuXianTowerCount() - 1).GetID()
+ if curFloor >= maxFloor:
+ return maxFloor
+ return curFloor + 1
+
+##玩家切换地图
+def DoPlayerChangeMapLogic(curPlayer):
+ 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):
+ # 玩家退出默认关闭副本
+ #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)
+ 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)
+
+ 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)
+ unLockEquipPlace = ipyData.GetUnLockEquipPlace()
+ if unLockEquipPlace:
+ PlayerControl.WorldNotify(0, 'KillGodTowerInfo_1', [curPlayer.GetPlayerName(), fbLevel, unLockEquipPlace])
+ ipyMgr = IpyGameDataPY.IPY_Data()
+ maxFloor = ipyMgr.GetZhuXianTowerByIndex(ipyMgr.GetZhuXianTowerCount() - 1).GetID()
+ # 过关时间
+ costTime = tick - GameWorld.GetGameFB().GetFBStepTick()
+ curStar = gameFB.GetGameFBDictByKey(FBDict_FBStar)
+ isFirstS = 0
+ if fbLevel < maxFloor and curStar == Def_MaxStar:
+ #更新关卡
+ SetZhuXianTowerCurPassLV(curPlayer, fbLevel)
+ #更新诛仙塔排行榜
+ PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_ZhuXianTower, fbLevel, costTime/1000)
+ isFirstS = 1 #是否首次S通关
+ gameFB.SetGameFBDict(FBDict_isFirstS, isFirstS)
+ # 给过关奖励
+ prizeItemList = __GiveFBPassPrize(curPlayer, False)
+
+ prizeDict = {FBCommon.Over_costTime:costTime, FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(prizeItemList)}
+ __SendZhuXianTowerOverInfo(curPlayer, fbLevel, True if prizeItemList else False, prizeDict)
+
+ #任务
+ #EventShell.EventRespons_ZhuXianTowerCnt(curPlayer, fbLevel)
+
+ 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
+
+ # 发邮件或放入背包
+ needSpace = len(prizeItemList)
+ emptySpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace)
+ isSendMail = int(needSpace > emptySpace) # 是否发送邮件
+ if isSendMail:
+ PlayerControl.SendMailByKey('KillGodTowerReward', [curPlayer.GetPlayerID()], prizeItemList)
+ GameWorld.DebugLog("背包空间不够,发送邮件: mailItemList=%s" % str(prizeItemList), curPlayer.GetPlayerID())
+ else:
+ for itemID, itemCnt, isBind in prizeItemList:
+ ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, isBind, [IPY_GameWorld.rptItem],
+ event=["ZhuXianTower", False, {}])
+
+ FBCommon.AddEnterFBCount(curPlayer, ChConfig.Def_FBMapID_ZhuXianTower, 1)
+
+ gameFB.SetGameFBDict(FBDict_HasGiveAward, 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(100, remainHP * 100 / 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)
+ 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, False)
+ 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 6def013..a7f3b91 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -1249,6 +1249,15 @@
("WORD", "RealmLV", 0),
("DWORD", "ZhuXianScore", 0),
),
+
+ "ZhuXianTower":(
+ ("DWORD", "ID", 1),
+ ("DWORD", "NPCID", 0),
+ ("list", "FirstAward", 0),
+ ("dict", "GradeAward", 0),
+ ("WORD", "UnLockEquipPlace", 0),
+ ("DWORD", "NeedPower", 0),
+ ),
}
@@ -3806,6 +3815,25 @@
def GetKillTime(self): return self.KillTime # 击杀总时间秒
def GetRealmLV(self): return self.RealmLV # 需要境界
def GetZhuXianScore(self): return self.ZhuXianScore # 需要诛仙总评分
+
+# 诛仙塔表
+class IPY_ZhuXianTower():
+
+ def __init__(self):
+ self.ID = 0
+ self.NPCID = 0
+ self.FirstAward = []
+ self.GradeAward = {}
+ self.UnLockEquipPlace = 0
+ self.NeedPower = 0
+ return
+
+ def GetID(self): return self.ID # 塔编号
+ def GetNPCID(self): return self.NPCID # npcid
+ def GetFirstAward(self): return self.FirstAward # 首次S级奖励
+ def GetGradeAward(self): return self.GradeAward # 评级奖励
+ def GetUnLockEquipPlace(self): return self.UnLockEquipPlace # 解锁的装备位
+ def GetNeedPower(self): return self.NeedPower # 推荐战力
def Log(msg, playerID=0, par=0):
@@ -4069,6 +4097,8 @@
self.ipyLoginAwardLen = len(self.ipyLoginAwardCache)
self.ipyZhuXianBossCache = self.__LoadFileData("ZhuXianBoss", IPY_ZhuXianBoss)
self.ipyZhuXianBossLen = len(self.ipyZhuXianBossCache)
+ self.ipyZhuXianTowerCache = self.__LoadFileData("ZhuXianTower", IPY_ZhuXianTower)
+ self.ipyZhuXianTowerLen = len(self.ipyZhuXianTowerCache)
Log("IPY_FuncConfig count=%s" % len(self.ipyFuncConfigDict))
Log("IPY_DataMgr InitOK!")
return
@@ -4473,6 +4503,8 @@
def GetLoginAwardByIndex(self, index): return self.ipyLoginAwardCache[index]
def GetZhuXianBossCount(self): return self.ipyZhuXianBossLen
def GetZhuXianBossByIndex(self, index): return self.ipyZhuXianBossCache[index]
+ def GetZhuXianTowerCount(self): return self.ipyZhuXianTowerLen
+ def GetZhuXianTowerByIndex(self, index): return self.ipyZhuXianTowerCache[index]
IPYData = IPY_DataMgr()
def IPY_Data(): return IPYData
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index 84a8327..ab6f754 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -570,6 +570,8 @@
Def_BT_Campaign_Recharge, #累计充值(开服活动榜)
Def_BT_Campaign_PetLV, #灵宠等级(开服活动榜)
+ Def_BT_ZhuXianTower, #诛仙塔榜
+
Def_BT_HighLadder, #天梯竞技场排行
Def_BT_HighLadder_Yester, #天梯竞技场昨日排行
Def_BT_RechargeTeHuiLast, #充值特惠活动排行榜-上一期记录
@@ -584,7 +586,7 @@
Def_BT_CostTeHuiLast, #消费特惠排行榜上一期
Def_BT_Max, #排行榜最大类型
-) = range(0, 32 + 2)
+) = range(0, 33 + 2)
#职业对应战力排行榜类型
JobFightPowerBillboardDict = {
@@ -596,7 +598,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_FBHelpBattle, Def_BT_ZhuXianTower,
]
##---比率---
--
Gitblit v1.8.0