xdh
2019-03-08 a4e9d95f1afee7c045a78e1bed3ede1867eb3a87
6291 【后端】【2.0】限时仙盟boss
18个文件已修改
1个文件已添加
836 ■■■■■ 已修改文件
PySysDB/PySysDBPY.h 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFB.py 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyBoss.py 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_AllFamilyBoss.py 587 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_ZhuXianBoss.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_EnterFB.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/PySysDBPY.h
@@ -1816,4 +1816,13 @@
    WORD        NeedPlusLV;    //需要强化等级
    dict        CostItem;    //消耗材料
    dict        Attr;    //属性
};
//仙盟Boss奖励表
struct tagFamilyBossAward
{
    list        WorldLV;    //世界等级
    list        Rank;    //排名
    list        Award;    //奖励 [[独立概率万分率,[物品ID,数量,拍品分组]],..]
};
ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
@@ -675,6 +675,8 @@
Def_FBMapID_XMZZ = 31010
#仙盟boss副本
Def_FBMapID_FamilyBossMap = 31210
#多仙盟Boss
Def_FBMapID_AllFamilyBoss = 31260
#宗门试炼
Def_FBMapID_MunekadoTrial = 60010
#混乱妖域
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -899,6 +899,58 @@
#------------------------------------------------------
# A4 0C 多仙盟boss活动信息 #tagGCAllFamilyBossInfo
class  tagGCAllFamilyBossInfo(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("IsEnd", c_ubyte),    # 是否已结束
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA4
        self.SubCmd = 0x0C
        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 = 0xA4
        self.SubCmd = 0x0C
        self.IsEnd = 0
        return
    def GetLength(self):
        return sizeof(tagGCAllFamilyBossInfo)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A4 0C 多仙盟boss活动信息 //tagGCAllFamilyBossInfo:
                                Cmd:%s,
                                SubCmd:%s,
                                IsEnd:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.IsEnd
                                )
        return DumpString
m_NAtagGCAllFamilyBossInfo=tagGCAllFamilyBossInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCAllFamilyBossInfo.Cmd,m_NAtagGCAllFamilyBossInfo.SubCmd))] = m_NAtagGCAllFamilyBossInfo
#------------------------------------------------------
# A4 0A 假仙盟信息 #tagGCFakeFamilyInfo
class  tagGCFakeFamilyInfo(Structure):
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
@@ -35,6 +35,7 @@
import PlayerNewFairyCeremony
import PlayerUniversalGameRec
import GameWorldAverageLv
import PlayerFamilyBoss
import GameWorldProcess
import ChPyNetSendPack
import NetPackCommon
@@ -1265,6 +1266,11 @@
    #跨服PK
    elif dictName == ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_CrossReamPK:
        CrossRealmPK.OnCrossRealmPKDailyActionStateChange(isOpen)
    #仙盟BOSS
    elif dictName in [ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_FamilyBoss1,
                      ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_FamilyBoss2,]:
        PlayerFamilyBoss.OnAllFamilyBossStateChange(isOpen)
    return
#-------------------------------------------------------------------------------
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py
@@ -150,6 +150,8 @@
Def_BRServerPlayerCnt = "BRServerPlayerCnt"
#boss复活活动已复活次数
Def_BossRebornCnt = "BossRebornCnt"
#多仙盟Boss击杀时间
Def_AllFamilyBossTime = "AllFamilyBossTime"
#跨服服务器是否维护中
Def_CrossServerClose = "CrossServerClose"
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFB.py
@@ -25,6 +25,7 @@
import PlayerControl
import PyGameData
import IpyGameDataPY
import PlayerDBGSEvent
import PlayerTeam
import GameWorld
import ChConfig
@@ -121,7 +122,14 @@
        if curPlayer.GetFamilyID() in PyGameData.g_swrhJoinRecord:
            PlayerControl.NotifyCode(curPlayer, "TheEmperor1")
            return
    #多仙盟BOSS 是否已结束
    elif tagMapID == ChConfig.Def_FBMapID_AllFamilyBoss:
        if not PlayerFamilyBoss.IsInAllFamilyBoss(tagLineID):
            #活动未开启
            return
        if PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_AllFamilyBossTime):
            #BOSS已被击杀
            return
    # MapServer_QueryPlayer(int srcPlayerID, int queryType, int queryID, int mapID, char *callName, char *cmd,WORD cmdLen, int RouteServerIndex)
    playerManager.MapServer_QueryPlayer(curPlayer.GetPlayerID(), ChConfig.queryType_EnterFB, 0, tagMapID,
                queryCallName, sendCMD, len(sendCMD), curPlayer.GetRouteServerIndex())
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py
@@ -1423,6 +1423,9 @@
    if GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_FamilyRobBoss):        
        PlayerControl.NotifyCode(curPlayer, "FairyGrabBossExitError")
        return
    if PlayerFamilyBoss.IsInAllFamilyBoss():
        PlayerControl.NotifyCode(curPlayer, "LeagueBOSSExitError1")
        return
    
    tagPlayerName = curTagMember.GetName()  # 被踢玩家名
    tagPlayerID = curTagMember.GetPlayerID()  # 被踢玩家ID
@@ -1502,6 +1505,9 @@
    if GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_FamilyRobBoss):        
        PlayerControl.NotifyCode(curPlayer, "FairyGrabBossExitError")
        return
    if PlayerFamilyBoss.IsInAllFamilyBoss():
        PlayerControl.NotifyCode(curPlayer, "LeagueBOSSExitError1")
        return
    #判断退出时间间隔
    curTime = int(time.time())
    lastLeaveFamilyTime = PlayerControl.GetLeaveFamilyTime(curPlayer)
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyBoss.py
@@ -24,6 +24,8 @@
import NetPackCommon
import ShareDefine
import IpyGameDataPY
import PlayerDBGSEvent
import PlayerControl
import ChConfig
import time
@@ -88,6 +90,7 @@
#  @return None
def OnLogin(curPlayer):
    NotifyFamilyBossFBInfo(curPlayer)
    NotifyAllFamilyBossState(curPlayer)
    return
@@ -272,4 +275,55 @@
#############################多仙盟BOSS#############################
def OnAllFamilyBossStateChange(isOpen):
    if isOpen:
        #本次开启时间距离上次击杀时间超过1小时则重置
        lastKillTime = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_AllFamilyBossTime)
        curTime = int(time.time())
        if abs(curTime-lastKillTime)> 3600:
            PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_AllFamilyBossTime, 0)
            #֪ͨ
            NotifyAllFamilyBossState()
    return
def AllFamilyBossKilled():
    if PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_AllFamilyBossTime):
        GameWorld.Log('多仙盟Boss已被击杀,不可重复!!')
        return
    curTime = int(time.time())
    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_AllFamilyBossTime, curTime)
    GameWorld.Log('多仙盟Boss被击杀!!')
    NotifyAllFamilyBossState()
    return
def NotifyAllFamilyBossState(curPlayer=None):
    lastKillTime = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_AllFamilyBossTime)
    bossInfo = ChPyNetSendPack.tagGCAllFamilyBossInfo()
    bossInfo.IsEnd = 1 if lastKillTime else 0
    if curPlayer == None:
        playerManager = GameWorld.GetPlayerManager()
        for i in xrange(playerManager.GetActivePlayerCount()):
            curPlayer = playerManager.GetActivePlayerAt(i)
            if curPlayer == None or not curPlayer.GetInitOK():
                continue
            if PlayerControl.GetIsTJG(curPlayer):
                continue
            NetPackCommon.SendFakePack(curPlayer, bossInfo)
    else:
        if PlayerControl.GetIsTJG(curPlayer):
            return
        NetPackCommon.SendFakePack(curPlayer, bossInfo)
    return
#是否在仙盟BOSS活动中
def IsInAllFamilyBoss(lineID=-1):
    state1 = GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_FamilyBoss1)
    state2 = GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_FamilyBoss2)
    if lineID == 0:
        return state1
    elif lineID == 1:
        return state2
    return state1 or state2
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
@@ -851,6 +851,10 @@
    if callName =="AddBossRebornPoint":
        GameWorldBoss.AddBossRebornPoint(eval(resultName))
        return
    #多仙盟BOSS结束
    if callName =="AllFamilyBossOver":
        PlayerFamilyBoss.AllFamilyBossKilled()
        return
    
#---return分割线-----------------------------------------------------------------
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -1536,8 +1536,9 @@
DailyActionID_IceLode, # 冰晶矿脉
DailyActionID_HelpBattleCheckIn, # 助战登记  20
DailyActionID_CrossReamPK, # 跨服PK  21
DailyActionID_ZhuXianBoss, # 诛仙BOSS  22
) = range(1, 22 + 1)
DailyActionID_FamilyBoss1, # 仙盟BOSS第一场  22
DailyActionID_FamilyBoss2, # 仙盟BOSS第二场  23
) = range(1, 23 + 1)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -1844,7 +1844,7 @@
Def_MapID_LineIDToPropertyID = [Def_FBMapID_ElderBattlefield]
                      
# 进入副本需要发送到GameServer的地图
Def_MapID_SendToGameServer = [Def_FBMapID_FamilyInvade, Def_FBMapID_FamilyBossMap, Def_FBMapID_SealDemon, Def_FBMapID_FamilyWar, Def_FBMapID_ZhuXianBoss] + Def_MapID_LineIDToPropertyID
Def_MapID_SendToGameServer = [Def_FBMapID_FamilyInvade, Def_FBMapID_FamilyBossMap, Def_FBMapID_SealDemon, Def_FBMapID_FamilyWar, Def_FBMapID_ZhuXianBoss, Def_FBMapID_AllFamilyBoss] + Def_MapID_LineIDToPropertyID
## 进入副本需要根据请求的功能线路处理的地图, hxp-改了进入模式,暂不需要了 180320
#Def_MapID_ReqFBFuncLine = [Def_FBMapID_KirinHome, Def_FBMapID_BZZD, Def_FBMapID_SealDemonEx,
@@ -1852,7 +1852,7 @@
#                            + Def_FBMapID_ClearDevil
# 刷新标识点在无玩家的情况下也需要刷新的地图
Def_NoPlayerNeedProcessRefreshPointMap = [Def_FBMapID_SealDemon, Def_FBMapID_GodArea, Def_FBMapID_BossHome, Def_FBMapID_GatherSoul, Def_FBMapID_ZhuXianBoss]
Def_NoPlayerNeedProcessRefreshPointMap = [Def_FBMapID_SealDemon, Def_FBMapID_GodArea, Def_FBMapID_BossHome, Def_FBMapID_GatherSoul, Def_FBMapID_ZhuXianBoss, Def_FBMapID_AllFamilyBoss]
# 可重复进的副本
Def_NoLimitEnterCntMap = [Def_FBMapID_FamilyParty, Def_FBMapID_FamilyWar, Def_FBMapID_FamilyInvade, Def_FBMapID_ElderBattlefield, Def_FBMapID_ZhuXianBoss]
@@ -1917,7 +1917,7 @@
                'GatherSoul':[Def_FBMapID_GatherSoul],#聚魂副本
                'ZhuXianBoss':[Def_FBMapID_ZhuXianBoss],#诛仙BOSS
                'ZhuXianTower':[Def_FBMapID_ZhuXianTower],#诛仙塔
                #'AllFamilyBoss':[Def_FBMapID_AllFamilyBoss],#多仙盟BOSS
                'AllFamilyBoss':[Def_FBMapID_AllFamilyBoss],#多仙盟BOSS
                }
#特殊副本ID, 由系统分配, 进入时候不验证IsMapCopyFull
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -899,6 +899,58 @@
#------------------------------------------------------
# A4 0C 多仙盟boss活动信息 #tagGCAllFamilyBossInfo
class  tagGCAllFamilyBossInfo(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("IsEnd", c_ubyte),    # 是否已结束
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA4
        self.SubCmd = 0x0C
        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 = 0xA4
        self.SubCmd = 0x0C
        self.IsEnd = 0
        return
    def GetLength(self):
        return sizeof(tagGCAllFamilyBossInfo)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A4 0C 多仙盟boss活动信息 //tagGCAllFamilyBossInfo:
                                Cmd:%s,
                                SubCmd:%s,
                                IsEnd:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.IsEnd
                                )
        return DumpString
m_NAtagGCAllFamilyBossInfo=tagGCAllFamilyBossInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCAllFamilyBossInfo.Cmd,m_NAtagGCAllFamilyBossInfo.SubCmd))] = m_NAtagGCAllFamilyBossInfo
#------------------------------------------------------
# A4 0A 假仙盟信息 #tagGCFakeFamilyInfo
class  tagGCFakeFamilyInfo(Structure):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_AllFamilyBoss.py
New file
@@ -0,0 +1,587 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package GameWorldLogic.FBProcess.GameLogic_AllFamilyBoss
#
# @todo:多仙盟BOSS
# @author xdh
# @date 2019-01-18
# @version 1.0
#
# 详细描述: 多仙盟BOSS
#
#-------------------------------------------------------------------------------
#"""Version = 2019-01-18 14:30"""
#-------------------------------------------------------------------------------
import FBCommon
import GameWorld
import IPY_GameWorld
import GameWorldProcess
import IpyGameDataPY
import ChConfig
import PyGameData
import PlayerControl
import ShareDefine
import NPCCustomRefresh
import PlayerAuctionHouse
import ItemControler
import PlayerActivity
import EventReport
FBDict_StartTick = 'FBDict_StartTick'  #开始时间
FBDict_Speed = 'FBDict_Speed'  #掉血速度 /s
FBDict_RemainHP = 'FBDict_RemainHP'  #剩余时间
FBPlayerDict_EncourageLV = 'FBPlayerDict_EncourageLV'  # 鼓舞等级
FBDict_IsOver = 'FBDict_IsOver'  #是否已结算, 结算时的tick
FBDict_IsReduceing = 'FBDict_IsReduceing'  #是否掉血中
FBPlayerDict_Rank = "FBPlayerDict_Rank"  # 玩家排名
FBDict_BossTotalHP = 'FBDict_BossTotalHP'  #BOSS血量
FBDict_LastHurtTick = 'FBDict_LastHurtTick'  #上次伤害时间
(
    Def_BossTime, #BOSS时间
    Def_LeaveTime,#离开时间
    ) = range(2)
#当前副本地图的状态
(
FB_Step_Open, # 副本开启
FB_Step_Fighting, # 副本进行中
FB_Step_Over, # 副本结束
FB_Step_Close, # 副本关闭
) = range(4)
def OnFBPlayerOnLogin(curPlayer):
    return
def OnFBPlayerOnDay(curPlayer):
    return
## 是否能够通过活动查询进入
#  @param curPlayer 玩家实例
#  @param mapID 地图ID
#  @param lineID 线路id
#  @param tick 时间戳
#  @return 布尔值
def OnEnterFBEvent(curPlayer, mapID, lineID, tick):
    if not curPlayer.GetFamilyID():
        GameWorld.DebugLog("OnEnterFBEvent not family!")
        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 tick 时间戳
##  @return 布尔值
def OnCanOpen(tick):
    return
##查询是否可以进入地图
# @param ask:请求结构体(IPY_BMChangeMapAsk)
# @param tick:时间戳
# @return IPY_GameWorld.cme 枚举
def OnChangeMapAsk(ask, tick):
    return IPY_GameWorld.cmeAccept
##开启副本
# @param tick 时间戳
# @return 返回值无意义
# @remarks 开启副本
def OnOpenFB(tick):
    lineID = GameWorld.GetGameWorld().GetPropertyID() - 1
    bossID = CurFBLineBOSSID(lineID)
    if not bossID:
        return
    NPCCustomRefresh.SetNPCRefresh(101, [bossID])
    BossTime = FBCommon.GetFBLineStepTime(ChConfig.Def_FBMapID_AllFamilyBoss, lineID)[Def_BossTime]
    GameWorld.GetGameWorld().SetGameWorldDict(FBDict_BossTotalHP, BossTime * 1000)
    return
def OnAllFamilyBossStateChange(state, tick):
    #活动状态变更
    mapID = GameWorld.GetMap().GetMapID()
    if mapID != ChConfig.Def_FBMapID_AllFamilyBoss:
        return
    GameWorld.DebugLog('    多仙盟BOSS活动状态变更 state=%s' % state)
    if not state:
        if GameWorld.GetGameWorld().GetGameWorldDictByKey(FBDict_StartTick) and not GameWorld.GetGameFB().GetGameFBDictByKey(FBDict_IsOver):
            GameWorld.GetGameFB().SetGameFBDict(FBDict_IsOver, tick)
            __DoLogicAllFamilyBossOver(0, tick)
    return
## 进副本
#  @param curPlayer
#  @param tick
#  @return None
def DoEnterFB(curPlayer, tick):
    playerID = curPlayer.GetPlayerID()
    lineID = GameWorld.GetGameWorld().GetPropertyID() - 1
    playerCnt = GameWorld.GetGameWorld().GetMapCopyPlayerManager().GetPlayerCount()
    GameWorld.DebugLog("DoEnterFB...playerCnt=%s,lineID=%s" % (playerCnt, lineID), playerID)
    hadDelTicket = FBCommon.GetHadDelTicket(curPlayer)
    if not hadDelTicket:
        FBCommon.SetHadDelTicket(curPlayer)
        FBCommon.AddEnterFBCount(curPlayer, ChConfig.Def_FBMapID_AllFamilyBoss, 1)
        if lineID == 0:
            PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_FamilyBoss1, 1)
        else:
            PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_FamilyBoss2, 1)
        if GameWorld.GetGameFB().GetFBStep() == FB_Step_Open:
            FBCommon.SetFBStep(FB_Step_Fighting, tick)
        familyID = curPlayer.GetFamilyID()
        if familyID not in PyGameData.g_allfamilyBossDict:
            PyGameData.g_allfamilyBossDict[familyID] = [curPlayer.GetFamilyName(), 0, [playerID]]
        elif playerID not in PyGameData.g_allfamilyBossDict[familyID][2]:
            PyGameData.g_allfamilyBossDict[familyID][2].append(playerID)
        EventReport.WriteEvent_FB(curPlayer, ChConfig.Def_FBMapID_AllFamilyBoss, 0, ChConfig.CME_Log_Start)
    UpdateHPReduceSpeed(tick)
    gameFB = GameWorld.GetGameFB()
    # 上鼓舞buff
    encourageLV = gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_EncourageLV)
    if encourageLV > 0:
        FBCommon.AddFbEncourageBuff(curPlayer, FBPlayerDict_EncourageLV, tick)
    else:
        FBCommon.SendFBEncourageInfo(curPlayer, encourageLV)
    #DoFBHelp(curPlayer, tick)
    return
##关闭副本
# @param tick 时间戳
# @return 无意义
# @remarks
def OnCloseFB(tick):
    gameWorld = GameWorld.GetGameWorld()
    gameWorld.SetGameWorldDict(FBDict_StartTick, 0)
    gameWorld.SetGameWorldDict(FBDict_Speed, 0)
    gameWorld.SetGameWorldDict(FBDict_RemainHP, 0)
    gameWorld.SetPropertyID(0)
    PyGameData.g_allfamilyBossDict = {}
    return
##玩家退出副本
# @param curPlayer 玩家实例
# @param tick 时间戳
# @return 无意义
def DoExitFB(curPlayer, tick):
    # 清除鼓舞buff
    FBCommon.ClearEncourageBuff(curPlayer, tick)
#    #最后一人
#    if gameWorld.GetMapCopyPlayerManager().GetPlayerCount() == 1:
#        lineID = gameWorld.GetPropertyID() - 1
#        PyGameData.g_AllFamilyBossPlayerHurtDict[lineID] = {}
#        gameWorld.SetGameWorldDict(FBDict_StartTick, 0)
#        GameWorld.GetGameFB().ClearGameFBDict()
#        GameWorldProcess.CloseFB(tick)
#        return
    UpdateHPReduceSpeed(tick, True)
    return
##玩家主动离开副本.
# @param curPlayer 玩家实例
# @param tick 时间戳
# @return 返回值无意义
def DoPlayerLeaveFB(curPlayer, tick):
#    FBCommon.SetHadDelTicket(curPlayer, 0)
#    #主动退出的去掉排行榜信息
#    lineID = GameWorld.GetGameWorld().GetPropertyID() - 1
#    playerHurtDict = PyGameData.g_AllFamilyBossPlayerHurtDict.get(lineID, {})
#    playerHurtDict.pop(curPlayer.GetPlayerID(), 0)
#    PyGameData.g_AllFamilyBossPlayerHurtDict[lineID] = playerHurtDict
#    if not playerHurtDict: #榜上没人,停止掉血
#        StopReduceHP(lineID, tick)
    return
##玩家切换地图
def DoPlayerChangeMapLogic(curPlayer):
    #FBCommon.SetHadDelTicket(curPlayer, 0)
    return
## 是否副本复活
#  @param None
#  @return 是否副本复活
def OnPlayerReborn():
    return True
## 获得副本帮助信息
#  @param curPlayer 当前玩家(被通知对象)
#  @param tick 当前时间
#  @return None
def DoFBHelp(curPlayer, tick):
    #伤害排行信息
    if GameWorld.GetGameFB().GetGameFBDictByKey(FBDict_IsOver):
        return
    hurtInfo = []
    familyHurtList = __GetSortHurtList()
    myFamilyID = curPlayer.GetFamilyID()
    myRank, myHurt, myMenberCnt = 0, 0, 0
    for i, info in enumerate(familyHurtList, 1):
        familyID = info[0]
        name, hurt, menberList = info[1][:3]
        if myFamilyID == familyID:
            myRank, myHurt, myMenberCnt = i, hurt, len(menberList)
        if i <= 3:
            hurtDict = {}
            hurtDict["rank"] = i
            hurtDict["playerName"] = name
            hurtDict["hurt"] = hurt % ChConfig.Def_PerPointValue
            hurtDict["hurtEx"] = hurt / ChConfig.Def_PerPointValue
            hurtInfo.append(hurtDict)
    curSpeed = GameWorld.GetGameWorld().GetGameWorldDictByKey(FBDict_Speed)
    isReduceing = GameWorld.GetGameWorld().GetGameWorldDictByKey(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
    fbHelpDict = {"hurtInfo":hurtInfo, 'hpReduceSpeed':hpReduceSpeed,
                  'remainHPPer':remainHPPer, 'isReduceing':isReduceing, 'myHurt':myHurt % ChConfig.Def_PerPointValue,
                  'myHurtEx':myHurt / ChConfig.Def_PerPointValue, 'myRank':myRank, 'myMenberCnt':myMenberCnt
                  }
    GameWorld.DebugLog("DoFBHelp: %s" % fbHelpDict, curPlayer.GetPlayerID())
    FBCommon.Notify_FBHelp(curPlayer, fbHelpDict)
    return
## 副本行为
#  @param curPlayer 玩家
#  @param actionType 行为类型
#  @param actionInfo 行为信息
#  @param tick 当前时间
#  @return None
def DoFBAction(curPlayer, actionType, actionInfo, tick):
    if actionType == 0:
        FBCommon.FbEncourageBuff(curPlayer, FBPlayerDict_EncourageLV, actionInfo, tick)
    return
## 玩家对NPC造成伤害
#  @param curPlayer 当前玩家
#  @param curNPC
#  @param hurtHP
#  @return None
def DoFB_Player_HurtNPC(curPlayer, curNPC, hurtHP):
    UpdateHurtInfo(curPlayer, hurtHP)
    GameWorld.GetGameFB().SetGameFBDict(FBDict_LastHurtTick, GameWorld.GetGameWorld().GetTick())
    return
#
def UpdateHurtInfo(curPlayer, hurtHP, isAdd=False):
    familyID = curPlayer.GetFamilyID()
    if familyID not in PyGameData.g_allfamilyBossDict:
        GameWorld.DebugLog('PyGameData.g_allfamilyBossDict 没有该家族!!')
        return
    PyGameData.g_allfamilyBossDict[familyID][1] += hurtHP
    #有人上榜开始掉血
    StartReduceHP(GameWorld.GetGameWorld().GetTick())
    return
##---副本总逻辑计时器---
# @param tick:时间戳
# @return 无意义
# @remarks 副本总逻辑计时器
def OnProcess(tick):
    gameFB = GameWorld.GetGameFB()
    gameWorld = GameWorld.GetGameWorld()
    overTick = gameFB.GetGameFBDictByKey(FBDict_IsOver)
    fbStep = gameFB.GetFBStep()
    lineID = gameWorld.GetPropertyID() - 1
    if lineID < 0:
        return
    if fbStep == FB_Step_Over:
        mapID = GameWorld.GetMap().GetMapID()
        leaveTick = FBCommon.GetFBLineStepTime(mapID, lineID)[Def_LeaveTime] * 1000
        if tick - GameWorld.GetGameFB().GetFBStepTick() > leaveTick:
            GameWorld.Log("强制踢出玩家关闭副本: overTick=%s,tick=%s" % (overTick, tick))
            gameWorld.SetGameWorldDict(ShareDefine.Def_Notify_WorldKey_FBCanEnter % ChConfig.Def_FBMapID_AllFamilyBoss, 0)
            GameWorldProcess.CloseFB(tick)
            FBCommon.SetFBStep(FB_Step_Close, tick)
            return
    elif fbStep == FB_Step_Fighting:
        startTick = gameWorld.GetGameWorldDictByKey(FBDict_StartTick)
        if not startTick or overTick:
            return
        lastHurtTick = gameFB.GetGameFBDictByKey(FBDict_LastHurtTick)
        if lastHurtTick and tick - lastHurtTick >= 2000:
            StopReduceHP(tick)
            gameFB.SetGameFBDict(FBDict_LastHurtTick, 0)
        FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 5000)
        __CheckBossHP(tick)
    return
def __GetSortHurtList():
    playerHurtList = sorted(PyGameData.g_allfamilyBossDict.iteritems(), key=lambda asd:asd[1][1], reverse=True)
    return playerHurtList
def __DoLogicAllFamilyBossOver(isPass, tick):
    #结算
    FBCommon.SetFBStep(FB_Step_Over, tick)
    msgStr = str([])
    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, 'AllFamilyBossOver', msgStr, len(msgStr))
    mapID = GameWorld.GetMap().GetMapID()
    lineID = GameWorld.GetGameWorld().GetPropertyID() - 1
    leaveTick = FBCommon.GetFBLineStepTime(mapID, lineID)[Def_LeaveTime] * 1000
    playerHurtList = __GetSortHurtList()
    if not playerHurtList:
        GameWorld.Log(' __DoLogicAllFamilyBossOver, 伤害榜上没有人!!lineID=%s')
        return
    playerManager = GameWorld.GetMapCopyPlayerManager()
    if isPass:
        worldLV = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv)
        familyAuctionItemDict = {} #{仙盟ID:[[享受收益的成员ID, ...], [[拍品ID,总个数,拍品组数], ...]], ...}
        event=["AllFamilyBoss", False, {}]
        for rank, hurtInfo in enumerate(playerHurtList, 1):
            familyID = hurtInfo[0]
            memberIDList = hurtInfo[1][2]
            familyAuctionItemList, menberItemList = __GetFamilyBossAward(rank, worldLV)
            GameWorld.DebugLog('rank=%s,worldLV=%s,familyAuctionItemList=%s,menberItemList=%s'%(rank, worldLV,familyAuctionItemList,menberItemList), familyID)
            if familyAuctionItemList:#仙盟拍品
                familyAuctionItemDict[familyID] = [memberIDList, familyAuctionItemList]
            if menberItemList: #成员奖励
                overDict = {FBCommon.Over_rank:rank,
                            FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(menberItemList),
                            'AuctionItem':FBCommon.GetJsonItemList(familyAuctionItemList),
                            'memberCnt':len(memberIDList)}
                for memberID in memberIDList:
                    member = playerManager.FindPlayerByID(memberID)
                    if member:
                        ItemControler.GivePlayerItemOrMail(member, menberItemList, 'LeagueBOSS1', event)
                        member.Sync_TimeTick(IPY_GameWorld.tttLeaveMap, 0, leaveTick, True)
                        FBCommon.NotifyFBOver(member, ChConfig.Def_FBMapID_AllFamilyBoss, lineID, isPass, overDict)
                    else:
                        PlayerControl.SendMailByKey('LeagueBOSS2', [memberID], menberItemList)
        if familyAuctionItemDict:
            GameWorld.Log('familyAuctionItemDict=%s'%familyAuctionItemDict)
            PlayerAuctionHouse.DoAddFamilyAuctionItem(familyAuctionItemDict)
    else:
        playerCount = playerManager.GetPlayerCount()
        for index in xrange(playerCount):
            curPlayer = playerManager.GetPlayerByIndex(index)
            if not curPlayer:
                continue
            member.Sync_TimeTick(IPY_GameWorld.tttLeaveMap, 0, leaveTick, True)
            FBCommon.NotifyFBOver(member, ChConfig.Def_FBMapID_AllFamilyBoss, lineID, isPass)
    return
def __GetFamilyBossAward(rank, worldLV):
    familyAuctionItemList, menberItemList = [], []
    awardRateList = []
    ipyMgr = IpyGameDataPY.IPY_Data()
    for i in xrange(ipyMgr.GetFamilyBossAwardCount()):
        ipyData = ipyMgr.GetFamilyBossAwardByIndex(i)
        worldLVList = ipyData.GetWorldLV()
        if worldLV < worldLVList[0] or worldLV > worldLVList[1]:
            continue
        rankList = ipyData.GetRank()
        if rank < rankList[0] or rank > rankList[1]:
            continue
        awardRateList = ipyData.GetAward()
    if not awardRateList:
        GameWorld.ErrLog('仙盟Boss奖励表 未配置该奖励 rank=%s,worldLV=%s'%(rank, worldLV))
        return familyAuctionItemList, menberItemList
    for rate, itemInfo in awardRateList:
        if not GameWorld.CanHappen(rate, 10000):
            continue
        if len(itemInfo) != 3:
            GameWorld.ErrLog('仙盟Boss奖励表配置错误 itemInfo=%s'%itemInfo)
            continue
        if itemInfo[2]:
            familyAuctionItemList.append(itemInfo)
        else:
            menberItemList.append(itemInfo)
    return familyAuctionItemList, menberItemList
def __CheckBossHP(tick):
    gameFB = GameWorld.GetGameFB()
    isOver = gameFB.GetGameFBDictByKey(FBDict_IsOver)
    if not isOver and GetBossRemainHP(tick) == 0:
        #结束 设置BOSS死亡
        FBCommon.ClearFBNPC()
        FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0)
        GameWorld.DebugLog('结束 设置BOSS死亡')
        gameFB.SetGameFBDict(FBDict_IsOver, tick)
        __DoLogicAllFamilyBossOver(1, tick)
    return
def UpdateHPReduceSpeed(tick, isExit=False):
    gameWorld = GameWorld.GetGameWorld()
    playerCnt = gameWorld.GetMapCopyPlayerManager().GetPlayerCount()
    playerCnt = playerCnt - 1 if isExit else playerCnt
    if playerCnt <= 0:
        return
    lineID = GameWorld.GetGameWorld().GetPropertyID() - 1
    if lineID < 0:
        return
    curSpeed = int(min(1 + 0.08 * (playerCnt - 1), 1.8) * 1000)
    gameWorld.SetGameWorldDict(FBDict_Speed, curSpeed)
    if not gameWorld.GetGameWorldDictByKey(FBDict_IsReduceing):
        return
    startTick = gameWorld.GetGameWorldDictByKey(FBDict_StartTick)
    remainHP = gameWorld.GetGameWorldDictByKey(FBDict_RemainHP)
    lastSpeed = gameWorld.GetGameWorldDictByKey(FBDict_Speed)
    if not startTick:
        startTick = tick
        lastSpeed = curSpeed
        remainHP = __GetBossTotalHP()
    remainHP = max(0, int((remainHP - (tick - startTick) / 1000.0 * lastSpeed)))
    gameWorld.SetGameWorldDict(FBDict_StartTick, tick)
    gameWorld.SetGameWorldDict(FBDict_RemainHP, remainHP)
    GameWorld.DebugLog('    curSpeed=%s, remainHP=%s, passTime=%s, lastSpeed=%s' % (curSpeed, remainHP, tick - startTick, lastSpeed))
    FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0)
    return
def StopReduceHP(tick):
    ##暂停BOSS血量减少
    gameWorld = GameWorld.GetGameWorld()
    if not gameWorld.GetGameWorldDictByKey(FBDict_IsReduceing):
        return
    remainHP = GetBossRemainHP(tick)
    if not remainHP:
        return
    gameWorld.SetGameWorldDict(FBDict_IsReduceing, 0)
    gameWorld.SetGameWorldDict(FBDict_RemainHP, remainHP)
    return
def StartReduceHP(tick):
    ##开始BOSS掉血
    gameWorld = GameWorld.GetGameWorld()
    if gameWorld.GetGameWorldDictByKey(FBDict_IsReduceing):
        return
    gameWorld.SetGameWorldDict(FBDict_IsReduceing, 1)
    startTick = gameWorld.GetGameWorldDictByKey(FBDict_StartTick)
    if not startTick:
        gameWorld.SetGameWorldDict(FBDict_RemainHP, __GetBossTotalHP())
    gameWorld.SetGameWorldDict(FBDict_StartTick, tick)
    FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0)
    return
def __GetBossTotalHP():return GameWorld.GetGameWorld().GetGameWorldDictByKey(FBDict_BossTotalHP)
def GetBossRemainHP(tick):
    gameWorld = GameWorld.GetGameWorld()
    startTick = gameWorld.GetGameWorldDictByKey(FBDict_StartTick)
    lastSpeed = gameWorld.GetGameWorldDictByKey(FBDict_Speed)
    remainHP = gameWorld.GetGameWorldDictByKey(FBDict_RemainHP)
    if not gameWorld.GetGameWorldDictByKey(FBDict_IsReduceing):
        return remainHP
    if not startTick:
        startTick = tick
        remainHP = __GetBossTotalHP()
    else:
        remainHP = max(0, int((remainHP - (tick - startTick) / 1000.0 * lastSpeed)))
    return remainHP
def GetBossRemainHPPer(tick):
    remainHP = GetBossRemainHP(tick)
    totalHP = __GetBossTotalHP()
    if not totalHP:
        return 0
    return remainHP * 100 / totalHP
def CurFBLineBOSSID(lineID=-1):
    #该分线刷的BOSSID
    if lineID == -1:
        lineID = GameWorld.GetGameWorld().GetPropertyID() - 1
    refreshNPCInfo = FBCommon.GetFBLineRefreshNPC(ChConfig.Def_FBMapID_AllFamilyBoss, lineID)
    if not refreshNPCInfo:
        return 0
    bossID = int(refreshNPCInfo)
    return bossID
##玩家死亡.
# @param curPlayer:死亡的玩家
# @param tick 时间戳
# @return 返回值无意义
# @remarks 玩家主动离开副本.
def DoPlayerDead(curPlayer):
    return
## 检查是否可攻击, 主判定不可攻击的情况,其他逻辑由外层决定
#  @param attacker 攻击方
#  @param defender 防守方
#  @return bool
def CheckCanAttackTagObjInFB(attacker, defender):
    return True
##处理副本中杀死玩家逻辑
# @param curPlayer 玩家实例
# @param defender 防守者
# @param tick 时间戳
# @return 布尔值
# @remarks 处理副本中杀死玩家逻辑
def DoFBOnKill_Player(atkobj, defender, tick):
    return True
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_ZhuXianBoss.py
@@ -483,7 +483,7 @@
    PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_KillSpecificNPC, addCnt, [bossID])
    FBCommon.AddEnterFBCount(curPlayer, ChConfig.Def_FBMapID_ZhuXianBoss, addCnt)
    # 每日活动
    PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_ZhuXianBoss, addCnt)
    #PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_ZhuXianBoss, addCnt)
    PlayerActLogin.AddLoginAwardActionCnt(curPlayer, ChConfig.Def_LoginAct_ZhuXianBOSS, addCnt)
    return prizeItemList
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -1411,6 +1411,12 @@
                        ("dict", "CostItem", 0),
                        ("dict", "Attr", 0),
                        ),
                "FamilyBossAward":(
                        ("list", "WorldLV", 0),
                        ("list", "Rank", 0),
                        ("list", "Award", 0),
                        ),
                }
@@ -4313,6 +4319,19 @@
    def GetNeedPlusLV(self): return self.NeedPlusLV # 需要强化等级
    def GetCostItem(self): return self.CostItem # 消耗材料
    def GetAttr(self): return self.Attr # 属性
# 仙盟Boss奖励表
class IPY_FamilyBossAward():
    def __init__(self):
        self.WorldLV = []
        self.Rank = []
        self.Award = []
        return
    def GetWorldLV(self): return self.WorldLV # 世界等级
    def GetRank(self): return self.Rank # 排名
    def GetAward(self): return self.Award # 奖励 [[独立概率万分率,[物品ID,数量,拍品分组]],..]
def Log(msg, playerID=0, par=0):
@@ -4618,6 +4637,8 @@
        self.ipyEquipStarUpLen = len(self.ipyEquipStarUpCache)
        self.ipyEquipPlusEvolveCache = self.__LoadFileData("EquipPlusEvolve", IPY_EquipPlusEvolve)
        self.ipyEquipPlusEvolveLen = len(self.ipyEquipPlusEvolveCache)
        self.ipyFamilyBossAwardCache = self.__LoadFileData("FamilyBossAward", IPY_FamilyBossAward)
        self.ipyFamilyBossAwardLen = len(self.ipyFamilyBossAwardCache)
        Log("IPY_FuncConfig count=%s" % len(self.ipyFuncConfigDict))
        Log("IPY_DataMgr InitOK!")
        return
@@ -5064,6 +5085,8 @@
    def GetEquipStarUpByIndex(self, index): return self.ipyEquipStarUpCache[index]
    def GetEquipPlusEvolveCount(self): return self.ipyEquipPlusEvolveLen
    def GetEquipPlusEvolveByIndex(self, index): return self.ipyEquipPlusEvolveCache[index]
    def GetFamilyBossAwardCount(self): return self.ipyFamilyBossAwardLen
    def GetFamilyBossAwardByIndex(self, index): return self.ipyFamilyBossAwardCache[index]
IPYData = IPY_DataMgr()
def IPY_Data(): return IPYData
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -72,6 +72,7 @@
import PlayerFamilyRedPacket
import GameLogic_FamilyInvade
import GameLogic_ElderBattlefield
import GameLogic_AllFamilyBoss
import GameLogic_FamilyBoss
import GameLogic_FamilyWar
import OpenServerCampaign
@@ -1381,6 +1382,12 @@
    elif key == ShareDefine.Def_Notify_WorldKey_FBFuncState % ChConfig.Def_FBMapID_ElderBattlefield:
        if gameWorldMgr.GetGameWorldDictByKey(key) != value:
            GameLogic_ElderBattlefield.OnElderBattlefieldStateChange(value, tick)
    # 多仙盟BOSS
    elif key in [ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_FamilyBoss1,
                 ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_FamilyBoss2,]:
        if gameWorldMgr.GetGameWorldDictByKey(key) != value:
            GameLogic_AllFamilyBoss.OnAllFamilyBossStateChange(value, tick)
    # OnDayEx
    elif key == ShareDefine.Def_Notify_WorldKey_OnDayEx:
        if value and gameWorldMgr.GetGameWorldDictByKey(key) != value:
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_EnterFB.py
@@ -145,7 +145,7 @@
#            GameWorld.DebugLog("    创建新战盟家园: tagFamilyID=%s,tagFamilyHomeLV=%s,resultLineID=%s" 
#                               % (tagFamilyID, tagFamilyHomeLV, resultLineID))
#===================================================================================================
    elif tagMapID in [ChConfig.Def_FBMapID_SealDemon, ChConfig.Def_FBMapID_ZhuXianBoss]:
    elif tagMapID in [ChConfig.Def_FBMapID_SealDemon, ChConfig.Def_FBMapID_ZhuXianBoss, ChConfig.Def_FBMapID_AllFamilyBoss]:
        tagMapPropertyID = tagMapLineID + 1 # 因为PropertyID默认是0,所以使用时从1开始
        resultLineID = -1  # 结果lineID
        
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
@@ -94,3 +94,5 @@
g_zhuXianSkillReducePerDict = {} # 诛仙装备对技能减伤缓存 {playerID:{技能TypeID:数值, ...}, ...}
g_Qudao_DoubleBill = {} # 渠道删档充值返利
g_allfamilyBossDict = {} # 多仙盟boss信息 {familyID:[familyName, 伤害, [playerID], ...}
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -1536,8 +1536,9 @@
DailyActionID_IceLode, # 冰晶矿脉
DailyActionID_HelpBattleCheckIn, # 助战登记  20
DailyActionID_CrossReamPK, # 跨服PK  21
DailyActionID_ZhuXianBoss, # 诛仙BOSS  22
) = range(1, 22 + 1)
DailyActionID_FamilyBoss1, # 仙盟BOSS第一场  22
DailyActionID_FamilyBoss2, # 仙盟BOSS第二场  23
) = range(1, 23 + 1)