xdh
2019-01-21 bbca9a1da57c089959d1cf7384813d245290ff23
5924 【后端】【1.5.100】诛仙Boss功能(初版)
20个文件已修改
3个文件已添加
1137 ■■■■■ 已修改文件
PySysDB/PySysDBPY.h 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py 98 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFB.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerZhuXianBoss.py 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 98 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/KillScreenNPC.py 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_ZhuXianBoss.py 664 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_EnterFB.py 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_FBLinePlayerCnt.py 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_ZhuXianBossAward.py 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/PySysDBPY.h
@@ -1580,3 +1580,14 @@
    WORD        SingleTimes;    //单次领奖需要的次数
    list        Reward;    //奖励物品
};
//诛仙BOSS表
struct tagZhuXianBoss
{
    DWORD        NPCID;    //ID
    BYTE        _LineID;
    WORD        KillTime;    //击杀总时间秒
    WORD        RealmLV;    //需要境界
    DWORD        ZhuXianScore;    //需要诛仙总评分
};
ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
@@ -532,6 +532,7 @@
                                ShareDefine.Def_UniversalGameRecType_FamilyRedPacketGrabRecord:10000000,   #仙盟红包已抢信息记录
                                ShareDefine.Def_UniversalGameRecType_DujieHelpAllRecord:500,   #渡劫副本护法总记录
                                ShareDefine.Def_UniversalGameRecType_DujieHelpRecord:10000,   #渡劫副本护法详细记录
                                ShareDefine.Def_UniversalGameRecType_ZhuXianBossRecord:100,   #诛仙BOSS结算记录
                              }
#---------------------------------------------------------------------
#比较标识
@@ -671,6 +672,8 @@
Def_FBMapID_FamilyInvade = 31170
#封魔坛
Def_FBMapID_SealDemon = 52010
#诛仙BOSS
Def_FBMapID_ZhuXianBoss = 31380
#仙魔之争
Def_FBMapID_XMZZ = 31010
#仙盟boss副本
@@ -686,6 +689,8 @@
#跨服蓬莱仙境
Def_FBMapID_CrossPenglai = 32020
#需要刷世界BOSS的副本
WorldBossFBMapIDList = [Def_FBMapID_SealDemon, Def_FBMapID_ZhuXianBoss]
#跨服地图
Def_CrossMapIDList = [Def_FBMapID_CrossRealmPK, Def_FBMapID_CrossPenglai]
#跨服对应分区配置表名
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -196,40 +196,60 @@
# A0 07 副本地图功能线路人数 #tagGCFBLinePlayerCnt
class  tagGCFBLineInfo(Structure):
    _pack_ = 1
    _fields_ = [
                  ("FBLineID", c_ubyte),    # 功能线路ID
                  ("PlayerCnt", c_ushort),    # 线路当前玩家数
                  ]
    FBLineID = 0    #(BYTE FBLineID)// 功能线路ID
    PlayerCnt = 0    #(WORD PlayerCnt)// 线路当前玩家数
    ExtraStrLen = 0    #(WORD ExtraStrLen)// 长度
    ExtraStr = ""    #(String ExtraStr)// 额外信息
    data = None
    def __init__(self):
        self.Clear()
        return
    def ReadData(self, stringData, _pos=0, _len=0):
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        memmove(addressof(self), stringData[_pos:], self.GetLength())
        return _pos + self.GetLength()
        self.FBLineID,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.PlayerCnt,_pos = CommFunc.ReadWORD(_lpData, _pos)
        self.ExtraStrLen,_pos = CommFunc.ReadWORD(_lpData, _pos)
        self.ExtraStr,_pos = CommFunc.ReadString(_lpData, _pos,self.ExtraStrLen)
        return _pos
    def Clear(self):
        self.FBLineID = 0
        self.PlayerCnt = 0
        self.ExtraStrLen = 0
        self.ExtraStr = ""
        return
    def GetLength(self):
        return sizeof(tagGCFBLineInfo)
        length = 0
        length += 1
        length += 2
        length += 2
        length += len(self.ExtraStr)
        return length
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
        data = ''
        data = CommFunc.WriteBYTE(data, self.FBLineID)
        data = CommFunc.WriteWORD(data, self.PlayerCnt)
        data = CommFunc.WriteWORD(data, self.ExtraStrLen)
        data = CommFunc.WriteString(data, self.ExtraStrLen, self.ExtraStr)
        return data
    def OutputString(self):
        DumpString = '''// A0 07 副本地图功能线路人数 //tagGCFBLinePlayerCnt:
        DumpString = '''
                                FBLineID:%d,
                                PlayerCnt:%d
                                PlayerCnt:%d,
                                ExtraStrLen:%d,
                                ExtraStr:%s
                                '''\
                                %(
                                self.FBLineID,
                                self.PlayerCnt
                                self.PlayerCnt,
                                self.ExtraStrLen,
                                self.ExtraStr
                                )
        return DumpString
@@ -27341,6 +27361,58 @@
#------------------------------------------------------
# B2 12 诛仙BOSS协助次数 #tagMCZhuXianBossCnt
class  tagMCZhuXianBossCnt(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("Cnt", c_ubyte),    # 剩余可协助次数
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xB2
        self.SubCmd = 0x12
        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 = 0x12
        self.Cnt = 0
        return
    def GetLength(self):
        return sizeof(tagMCZhuXianBossCnt)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// B2 12 诛仙BOSS协助次数 //tagMCZhuXianBossCnt:
                                Cmd:%s,
                                SubCmd:%s,
                                Cnt:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.Cnt
                                )
        return DumpString
m_NAtagMCZhuXianBossCnt=tagMCZhuXianBossCnt()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCZhuXianBossCnt.Cmd,m_NAtagMCZhuXianBossCnt.SubCmd))] = m_NAtagMCZhuXianBossCnt
#------------------------------------------------------
# B4 11 新增恶意攻击玩家 #tagMCAddMaliciousAtkPlayer
class  tagMCAddMaliciousAtkPlayer(Structure):
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py
@@ -485,7 +485,7 @@
        if not isAlive:
            continue
        mapID = ipyData.GetMapID()
        if mapID != ChConfig.Def_FBMapID_SealDemon:
        if mapID not in ChConfig.WorldBossFBMapIDList:
            GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_GameWorldBossReborn % bossID, 1)
    return
ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py
@@ -899,11 +899,13 @@
    fblinePack = ChPyNetSendPack.tagGCFBLinePlayerCnt()
    fblinePack.MapID = tagMapID
    fblinePack.FBLineInfoList = []
    for lineID, playerCnt in fbLinePlayerCntDict.items():
    for lineID, infoList in fbLinePlayerCntDict.items():
        mapLineState = ChPyNetSendPack.tagGCFBLineInfo()
        mapLineState.Clear()
        mapLineState.FBLineID = lineID
        mapLineState.PlayerCnt = playerCnt
        mapLineState.PlayerCnt = infoList[0] if infoList else 0
        mapLineState.ExtraStr = infoList[1] if len(infoList) > 1 else ''
        mapLineState.ExtraStrLen = len(mapLineState.ExtraStr)
        fblinePack.FBLineInfoList.append(mapLineState)
    
    fblinePack.Count = len(fblinePack.FBLineInfoList)
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFB.py
@@ -103,7 +103,7 @@
        return
    
    #封魔坛副本判断里面的BOSS是否到了刷新时间
    if tagMapID == ChConfig.Def_FBMapID_SealDemon:
    if tagMapID in ChConfig.WorldBossFBMapIDList:
        bossID = mapInfo[2]
        if not GameWorldBoss.GetBossIsAliveOrCanReborn(bossID):
            return
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerZhuXianBoss.py
New file
@@ -0,0 +1,45 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
#-------------------------------------------------------------------------------
#
##@package PlayerZhuXianBoss
#
# @todo:诛仙BOSS
# @author xdh
# @date 2019-01-19
# @version 1.0
#
#
# 详细描述: 诛仙BOSS
#
#---------------------------------------------------------------------
"""Version = 2019-01-19 17:00"""
import GameWorld
import PlayerUniversalGameRec
import ShareDefine
import PlayerControl
RecType = ShareDefine.Def_UniversalGameRecType_ZhuXianBossRecord
## 玩家登录
#  @param None
#  @return None
def OnPlayerLogin(curPlayer):
    universalRecMgr = GameWorld.GetUniversalRecMgr()
    recTypeListData = universalRecMgr.GetTypeList(RecType)
    for index in xrange(recTypeListData.Count()):
        recData = recTypeListData.At(index)
        playerID = recData.GetValue1()
        if playerID == curPlayer.GetID():
            lineID = recData.GetValue2()
            recTypeListData.Delete(index)
            result = str(lineID)
            curPlayer.MapServer_QueryPlayerResult(0, 0, "ZhuXianBossAward", result, len(result))
            return
    return
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -878,6 +878,7 @@
GameFuncID_LittleHelper = 146   # 小助手
GameFuncID_TJG = 147            # 脱机挂
GameFuncID_SuperGift = 150      # 超值礼包
GameFuncID_ZhuXianBoss = 163    # 诛仙BOSS
# 以下为暂时无用的
GameFuncID_Truck = 33           # 运镖
GameFuncID_RunDaily = 34        # 日常跑环
@@ -962,7 +963,7 @@
                                Def_UniversalGameRecType_StoreServerCntRecord,  #商店全服购买记录 8,
                                Def_UniversalGameRecType_FBHelpBattleCheckInPlayer, #助战玩家登记记录9
                                Def_UniversalGameRecType_FBHelpBattleRecord, #助战未同步记录10
                                Def_UniversalGameRecType_11,
                                Def_UniversalGameRecType_ZhuXianBossRecord, #诛仙BOSS结算记录11
                                Def_UniversalGameRecType_12,
                                Def_UniversalGameRecType_13,
                                Def_UniversalGameRecType_Reward,    # 通用奖励表(TopBar)14
@@ -1521,7 +1522,8 @@
DailyActionID_IceLode, # 冰晶矿脉
DailyActionID_HelpBattleCheckIn, # 助战登记  20
DailyActionID_CrossReamPK, # 跨服PK  21
) = range(1, 21 + 1)
DailyActionID_ZhuXianBoss, # 诛仙BOSS  22
) = range(1, 22 + 1)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -1782,7 +1782,8 @@
Def_FBMapID_SealDemon = 52010
#单人封魔坛
Def_FBMapID_SealDemonEx = 52020
#诛仙BOSS
Def_FBMapID_ZhuXianBoss = 31380
#仙魔之争
Def_FBMapID_XMZZ = 31010
#神兽副本
@@ -1793,6 +1794,7 @@
Def_FBMapID_CrossRealmPK = 32010
#跨服蓬莱仙境
Def_FBMapID_CrossPenglai = 32020
#注册上传跨服服务器数据后直接进入跨服服务器的地图
RegisterEnter_CrossServerMapIDList = [Def_FBMapID_CrossPenglai]
@@ -1805,7 +1807,7 @@
#副本关闭时未拾取的物品邮件发放给玩家
#这里只有需要的副本才配置,不做默认逻辑,防止某些副本实际不能给导致刷物品,如麒麟之府
Def_SendUnPickItemMailMapIDList = [Def_FBMapID_IceLode, Def_FBMapID_PersonalBoss, Def_FBMapID_MunekadoTrial, 
                                   Def_FBMapID_SealDemon, Def_FBMapID_SealDemonEx]
                                   Def_FBMapID_SealDemon, Def_FBMapID_SealDemonEx, Def_FBMapID_ZhuXianBoss]
#金钱不掉物品直接给玩家的地图
Def_GiveMoneyMapIDList = []
@@ -1819,7 +1821,7 @@
Def_MapID_LineIDToPropertyID = [Def_FBMapID_ElderBattlefield]
                      
# 进入副本需要发送到GameServer的地图
Def_MapID_SendToGameServer = [Def_FBMapID_FamilyInvade, Def_FBMapID_FamilyBossMap, Def_FBMapID_SealDemon, Def_FBMapID_FamilyWar] + Def_MapID_LineIDToPropertyID
Def_MapID_SendToGameServer = [Def_FBMapID_FamilyInvade, Def_FBMapID_FamilyBossMap, Def_FBMapID_SealDemon, Def_FBMapID_FamilyWar, Def_FBMapID_ZhuXianBoss] + Def_MapID_LineIDToPropertyID
## 进入副本需要根据请求的功能线路处理的地图, hxp-改了进入模式,暂不需要了 180320
#Def_MapID_ReqFBFuncLine = [Def_FBMapID_KirinHome, Def_FBMapID_BZZD, Def_FBMapID_SealDemonEx,
@@ -1827,10 +1829,10 @@
#                            + Def_FBMapID_ClearDevil
# 刷新标识点在无玩家的情况下也需要刷新的地图
Def_NoPlayerNeedProcessRefreshPointMap = [Def_FBMapID_SealDemon, Def_FBMapID_GodArea, Def_FBMapID_BossHome, Def_FBMapID_GatherSoul]
Def_NoPlayerNeedProcessRefreshPointMap = [Def_FBMapID_SealDemon, Def_FBMapID_GodArea, Def_FBMapID_BossHome, Def_FBMapID_GatherSoul, Def_FBMapID_ZhuXianBoss]
# 可重复进的副本
Def_NoLimitEnterCntMap = [Def_FBMapID_FamilyParty, Def_FBMapID_FamilyWar, Def_FBMapID_FamilyInvade, Def_FBMapID_ElderBattlefield]
Def_NoLimitEnterCntMap = [Def_FBMapID_FamilyParty, Def_FBMapID_FamilyWar, Def_FBMapID_FamilyInvade, Def_FBMapID_ElderBattlefield, Def_FBMapID_ZhuXianBoss]
# 无玩家时不自动关闭的自伸缩副本
Def_NoPlayerNotCloseAutoSizeMap = [Def_FBMapID_FamilyInvade, Def_FBMapID_FamilyBossMap, Def_FBMapID_GatherSoul]
@@ -1890,6 +1892,7 @@
                'XMZZ':[Def_FBMapID_XMZZ], #仙魔之争
                'CrossRealmPK':[Def_FBMapID_CrossRealmPK], #跨服竞技场
                'GatherSoul':[Def_FBMapID_GatherSoul],#聚魂副本
                'ZhuXianBoss':[Def_FBMapID_ZhuXianBoss],#诛仙BOSS
                }
#特殊副本ID, 由系统分配, 进入时候不验证IsMapCopyFull
@@ -3725,6 +3728,9 @@
Def_PDict_LoginAwardID = "LoginAwardID"  # 玩家身上的BOSS复活活动ID,唯一标识,取活动开始日期time值
Def_PDict_LoginAwardCurTimes = "LoginAwardCurTimes_%s_%s" #当前完成次数 参数(第X天,模板ID)
Def_PDict_LoginAwardGotTimes = "LoginAwardGotTimes_%s_%s" #当前已领次数 参数(第X天,模板ID)
#诛仙BOSS
Def_PDict_ZhuXianBossHelpCnt = "ZhuXianBossHelpCnt"  # 协助次数
#-------------------------------------------------------------------------------
#类型 Def_PDictType_OnlinePrize
Def_PDict1_OnlinePrizeCnt = "OnlinePrizeCnt"  # 新手在线已领取奖励次数
@@ -4985,7 +4991,8 @@
VIPPrivilege_32,    #32 封魔坛自动挑战
VIPPrivilege_XianyuanCoinUpperAdd,    #33 仙缘币上限加成
VIPPrivilege_XianyuanCoinAddPer,    #34 仙缘币获得倍率加成(万分比)
) = range(1, 35)
VIPPrivilege_35,    #35 诛仙BOSS购买次数 - 副本总表统一处理
) = range(1, 36)
(
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -196,40 +196,60 @@
# A0 07 副本地图功能线路人数 #tagGCFBLinePlayerCnt
class  tagGCFBLineInfo(Structure):
    _pack_ = 1
    _fields_ = [
                  ("FBLineID", c_ubyte),    # 功能线路ID
                  ("PlayerCnt", c_ushort),    # 线路当前玩家数
                  ]
    FBLineID = 0    #(BYTE FBLineID)// 功能线路ID
    PlayerCnt = 0    #(WORD PlayerCnt)// 线路当前玩家数
    ExtraStrLen = 0    #(WORD ExtraStrLen)// 长度
    ExtraStr = ""    #(String ExtraStr)// 额外信息
    data = None
    def __init__(self):
        self.Clear()
        return
    def ReadData(self, stringData, _pos=0, _len=0):
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        memmove(addressof(self), stringData[_pos:], self.GetLength())
        return _pos + self.GetLength()
        self.FBLineID,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.PlayerCnt,_pos = CommFunc.ReadWORD(_lpData, _pos)
        self.ExtraStrLen,_pos = CommFunc.ReadWORD(_lpData, _pos)
        self.ExtraStr,_pos = CommFunc.ReadString(_lpData, _pos,self.ExtraStrLen)
        return _pos
    def Clear(self):
        self.FBLineID = 0
        self.PlayerCnt = 0
        self.ExtraStrLen = 0
        self.ExtraStr = ""
        return
    def GetLength(self):
        return sizeof(tagGCFBLineInfo)
        length = 0
        length += 1
        length += 2
        length += 2
        length += len(self.ExtraStr)
        return length
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
        data = ''
        data = CommFunc.WriteBYTE(data, self.FBLineID)
        data = CommFunc.WriteWORD(data, self.PlayerCnt)
        data = CommFunc.WriteWORD(data, self.ExtraStrLen)
        data = CommFunc.WriteString(data, self.ExtraStrLen, self.ExtraStr)
        return data
    def OutputString(self):
        DumpString = '''// A0 07 副本地图功能线路人数 //tagGCFBLinePlayerCnt:
        DumpString = '''
                                FBLineID:%d,
                                PlayerCnt:%d
                                PlayerCnt:%d,
                                ExtraStrLen:%d,
                                ExtraStr:%s
                                '''\
                                %(
                                self.FBLineID,
                                self.PlayerCnt
                                self.PlayerCnt,
                                self.ExtraStrLen,
                                self.ExtraStr
                                )
        return DumpString
@@ -27341,6 +27361,58 @@
#------------------------------------------------------
# B2 12 诛仙BOSS协助次数 #tagMCZhuXianBossCnt
class  tagMCZhuXianBossCnt(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("Cnt", c_ubyte),    # 剩余可协助次数
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xB2
        self.SubCmd = 0x12
        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 = 0x12
        self.Cnt = 0
        return
    def GetLength(self):
        return sizeof(tagMCZhuXianBossCnt)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// B2 12 诛仙BOSS协助次数 //tagMCZhuXianBossCnt:
                                Cmd:%s,
                                SubCmd:%s,
                                Cnt:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.Cnt
                                )
        return DumpString
m_NAtagMCZhuXianBossCnt=tagMCZhuXianBossCnt()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCZhuXianBossCnt.Cmd,m_NAtagMCZhuXianBossCnt.SubCmd))] = m_NAtagMCZhuXianBossCnt
#------------------------------------------------------
# B4 11 新增恶意攻击玩家 #tagMCAddMaliciousAtkPlayer
class  tagMCAddMaliciousAtkPlayer(Structure):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/KillScreenNPC.py
@@ -25,6 +25,7 @@
import GameObj
import NPCCommon
import GameLogic_SealDemon
import GameLogic_ZhuXianBoss
## GM命令执行入口
#  @param curPlayer 当前玩家
@@ -38,6 +39,12 @@
        lineID = gameWorld.GetPropertyID() - 1
        gameWorld.SetGameWorldDict(GameLogic_SealDemon.FBDict_RemainHP % lineID, 1)
        return
    if curPlayer.GetMapID() == ChConfig.Def_FBMapID_ZhuXianBoss:
        #诛仙BOSS击杀怪
        gameWorld = GameWorld.GetGameWorld()
        lineID = gameWorld.GetPropertyID() - 1
        gameWorld.SetGameWorldDict(GameLogic_ZhuXianBoss.FBDict_RemainHP % lineID, 1)
        return
    
    isMapAllNPC = 0
    if len(playerList) > 0:
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py
@@ -31,7 +31,7 @@
import PlayerFamily
import PlayerActivity
import PlayerSuccess
import PlayerMagicWeapon
import GameFuncComm
import PyGameData
import PlayerVip
import GameObj
@@ -1694,6 +1694,13 @@
            newEnterCnt = max(0, dayTimes - (maxCnt - enterCnt))
            PlayerControl.NomalDictSetProperty(curPlayer, enterCntKey, newEnterCnt)
            GameWorld.DebugLog("        特殊副本已进入次数更新: newEnterCnt=%s" % newEnterCnt)
        elif mapID == ChConfig.Def_FBMapID_ZhuXianBoss:
            if GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_ZhuXianBoss):
                curCnt = min(maxCnt - enterCnt + IpyGameDataPY.GetFuncCfg('ZhuXianBossCntCfg'), IpyGameDataPY.GetFuncCfg('ZhuXianBossCntCfg', 2))
                if curCnt > dayTimes:
                    PlayerControl.NomalDictSetProperty(curPlayer, itemAddCntKey, curCnt - dayTimes)
                elif curCnt < dayTimes:
                    PlayerControl.NomalDictSetProperty(curPlayer, enterCntKey, dayTimes - curCnt)
            
        mapIDInfo.append(mapID)
        
@@ -1759,6 +1766,9 @@
    if mapID == ChConfig.Def_FBMapID_SealDemon and maxDayTimes and maxCnt - enterCnt >= maxDayTimes:
        GameWorld.DebugLog('当前次数已满,无需购买。。')
        return
    if mapID == ChConfig.Def_FBMapID_ZhuXianBoss and maxCnt - enterCnt >= IpyGameDataPY.GetFuncCfg('ZhuXianBossCntCfg', 2):
        return
    if hasBuyCnt >= canBuyCnt:
        GameWorld.DebugLog("购买次数已经用完mapID=%s"%mapID)
        return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_ZhuXianBoss.py
New file
@@ -0,0 +1,664 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package GameWorldLogic.FBProcess.GameLogic_ZhuXianBoss
#
# @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 NPCCommon
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' #开始时间
FBDict_Speed = 'FBDict_Speed%s' #掉血速度 /s
FBDict_RemainHP = 'FBDict_RemainHP%s' #剩余时间
FBPlayerDict_EncourageLV = 'FBPlayerDict_EncourageLV'   # 鼓舞等级
FBDict_IsOver = 'FBDict_IsOver' #是否已结算, 结算时的tick
FBDict_IsReduceing = 'FBDict_IsReduceing%s' #是否掉血中
FBPlayerDict_Rank = "FBPlayerDict_Rank" # 玩家排名
FBDict_BossTotalHP = 'FBDict_BossTotalHP%s' #BOSS血量
g_npcHurtDict = {}
def OnFBPlayerOnLogin(curPlayer):
    NotifyZXHelpCnt(curPlayer)
    return
def OnFBPlayerOnDay(curPlayer):
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ZhuXianBossHelpCnt, IpyGameDataPY.GetFuncCfg('ZhuXianBossCntCfg', 3))
    NotifyZXHelpCnt(curPlayer)
    return
def NotifyZXHelpCnt(curPlayer):
    ##通知协助次数
    packData = ChPyNetSendPack.tagMCZhuXianBossCnt()
    packData.Cnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ZhuXianBossHelpCnt)
    NetPackCommon.SendFakePack(curPlayer, packData)
    return
## 是否能够通过活动查询进入
#  @param curPlayer 玩家实例
#  @param mapID 地图ID
#  @param lineID 线路id
#  @param tick 时间戳
#  @return 布尔值
def OnEnterFBEvent(curPlayer, mapID, lineID, tick):
    #境界要求、诛仙总评分、玩家等级、归属次数不为0或有同盟玩家在副本里协助次数不为0
    ipyData = IpyGameDataPY.GetIpyGameData('ZhuXianBoss', lineID)
    if not ipyData:
        return
    if curPlayer.GetOfficialRank() < ipyData.GetRealmLV():
        return
    #诛仙总评分
    enterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntDay % ChConfig.Def_FBMapID_ZhuXianBoss)
    if enterCnt >= FBCommon.GetEnterFBMaxCnt:
        if not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ZhuXianBossHelpCnt):
            return
        if not curPlayer.GetFamilyID():
            GameWorld.DebugLog("    有归属次数为但没有进仙盟!", curPlayer.GetPlayerID())
            return
    return True
def GetHasSameFamilyMerber(curFamilyID, playerManager):
    ##副本里是否有同盟成员
    GameWorld.Log('检查副本里是否有同盟成员 curFamilyID=%s'%curFamilyID)
    if not curFamilyID:
        return
    for index in range(0 , playerManager.GetPlayerCount()):
        player = playerManager.GetPlayerByIndex(index)
        if not player.GetPlayerID():
            continue
        if player.GetFamilyID() == curFamilyID:
            return True
    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 tick 时间戳
##  @return 布尔值
#def OnCanOpen(tick):
#    return True
##查询是否可以进入地图
# @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
    key = ShareDefine.Def_Notify_WorldKey_GameWorldBossReborn % bossID
    GameWorld.GetGameWorld().SetGameWorldDict(key, 1)
    GameWorld.DebugLog('    ˢBOSSbossID=%s' % bossID)
    ipyData = IpyGameDataPY.GetIpyGameData('ZhuXianBoss', lineID)
    GameWorld.GetGameWorld().SetGameWorldDict(FBDict_BossTotalHP%lineID, ipyData.GetKillTime() * 1000)
    return
## 进副本
#  @param curPlayer
#  @param tick
#  @return None
def DoEnterFB(curPlayer, tick):
    playerID = curPlayer.GetPlayerID()
    mapID = GameWorld.GetMap().GetMapID()
    lineID = GameWorld.GetGameWorld().GetPropertyID() - 1
    playerCnt = GameWorld.GetGameWorld().GetMapCopyPlayerManager().GetPlayerCount()
    GameWorld.DebugLog("DoEnterFB...playerCnt=%s,lineID=%s" % (playerCnt, lineID), playerID)
    if lineID < 0:
        PlayerControl.PlayerLeaveFB(curPlayer)
        return
    hadDelTicket = FBCommon.GetHadDelTicket(curPlayer)
    if not hadDelTicket:
        FBCommon.SetHadDelTicket(curPlayer)
        PyGameData.g_fbPickUpItemDict.pop(playerID, 0)
#        if playerCnt == 1:
#            posX, posY = IpyGameDataPY.GetFuncEvalCfg('ZhuXianBossFirstPos')
#            GameWorld.ResetPlayerPos(curPlayer, posX, posY)
        EventReport.WriteEvent_FB(curPlayer, ChConfig.Def_FBMapID_ZhuXianBoss, 0, ChConfig.CME_Log_Start)
        UpdateHurtInfo(curPlayer, 0, True)
    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()
    lineID = gameWorld.GetPropertyID() - 1
    gameWorld.SetGameWorldDict(FBDict_StartTick % lineID, 0)
    gameWorld.SetGameWorldDict(FBDict_Speed % lineID, 0)
    gameWorld.SetGameWorldDict(FBDict_RemainHP % lineID, 0)
    gameWorld.SetPropertyID(0)
    return
##玩家退出副本
# @param curPlayer 玩家实例
# @param tick 时间戳
# @return 无意义
def DoExitFB(curPlayer, tick):
    global g_npcHurtDict
    gameWorld = GameWorld.GetGameWorld()
    # 清除鼓舞buff
    FBCommon.ClearEncourageBuff(curPlayer, tick)
    #最后一人
    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)
        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_ZhuXianBossPlayerHurtDict.get(lineID, {})
    playerHurtDict.pop(curPlayer.GetPlayerID(), 0)
    PyGameData.g_ZhuXianBossPlayerHurtDict[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):
    #伤害排行信息
    hurtInfo = []
    lineID = GameWorld.GetGameWorld().GetPropertyID() - 1
    playerHurtList = PyGameData.g_ZhuXianBossPlayerHurtDict.get(lineID, {}).items()
    npcHurtList = g_npcHurtDict.get(lineID, {}).items()
    syncHurtList = (playerHurtList + npcHurtList)[:5]
    syncHurtList.sort(key=lambda asd:asd[1][1], reverse=True)
    for i, info in enumerate(syncHurtList, 1):
        playerName, hurt = info[1][:2]
        hurtDict = {}
        hurtDict["rank"] = i
        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)
    remainHP = GetBossRemainHP(lineID, tick)
    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}
    GameWorld.DebugLog("DoFBHelp: %s" % fbHelpDict, curPlayer.GetPlayerID())
    FBCommon.Notify_FBHelp(curPlayer, fbHelpDict)
    return
def __GetSelfHurtRank(curPlayer):
    #获取自己的排名
    playerName = curPlayer.GetName()
    lineID = GameWorld.GetGameWorld().GetPropertyID() - 1
    playerHurtList = __GetSortHurtList(lineID)
    myRank = 0
    for i, info in enumerate(playerHurtList):
        if playerName == info[1][0]:
            myRank = i + 1
            break
    return myRank
## 副本行为
#  @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)
    return
#
def UpdateHurtInfo(curPlayer, hurtHP, isAdd=False):
    enterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntDay % ChConfig.Def_FBMapID_ZhuXianBoss)
    if enterCnt >= FBCommon.GetEnterFBMaxCnt:
        #没归属的不进伤害榜
        return
    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:
        if not isAdd:
            return
        playerHurtDict[playerID] = [playerName, hurtHP, familyID]
    else:
        playerHurtDict[playerID][1] += hurtHP
    PyGameData.g_ZhuXianBossPlayerHurtDict[lineID] = playerHurtDict
    #有人上榜开始掉血
    StartReduceHP(lineID, GameWorld.GetGameWorld().GetTick())
    return
##---副本总逻辑计时器---
# @param tick:时间戳
# @return 无意义
# @remarks 副本总逻辑计时器
def OnProcess(tick):
    gameFB = GameWorld.GetGameFB()
    overTick = gameFB.GetGameFBDictByKey(FBDict_IsOver)
    # 结算20秒后强制关闭副本, 防止玩家不捡东西导致不结算,强关后地板上的东西会邮件发放给玩家
    if overTick and tick - overTick >= ChConfig.Def_FBPickupItemTime:
        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:
        return
    FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 5000)
    __CheckBossHP(tick)
    return
def __GetSortHurtList(lineID):
    playerHurtDict = PyGameData.g_ZhuXianBossPlayerHurtDict.get(lineID, {})
    playerHurtList = sorted(playerHurtDict.iteritems(), key=lambda asd:asd[1][1], reverse=True)
    return playerHurtList
def GetFirstOwnerName(lineID):
    ##获取归属者名字
    playerHurtList = __GetSortHurtList(lineID)
    if not playerHurtList:
        return ''
    return playerHurtList[0][1][0]
def __DoLogicZhuXianBossOver(isPass, tick, dropPosX, dropPosY):
    #结算
    gameFB = GameWorld.GetGameFB()
    mapID = GameWorld.GetMap().GetMapID()
    lineID = GameWorld.GetGameWorld().GetPropertyID() - 1
    leaveTick = FBCommon.GetFBLineStepTime(mapID, lineID) * 1000
    playerHurtList = __GetSortHurtList(lineID)
    if not playerHurtList:
        GameWorld.Log(' __DoLogicZhuXianBossOver, 伤害榜上没有人!!lineID=%s'%lineID)
        return
    firsthurtInfo = playerHurtList[0]
    firstPlayerID = firsthurtInfo[0]
    firstPlayerFamilyID = firsthurtInfo[1][2]
    playerManager = GameWorld.GetMapCopyPlayerManager()#GameWorld.GetPlayerManager()
    firstPlayer = playerManager.FindPlayerByID(firstPlayerID)
    if firstPlayer:
        #gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_Rank, rank)
        if not dropPosX or not dropPosY:
            dropPosX, dropPosY = firstPlayer.GetPosX(), firstPlayer.GetPosY()
        prizeItemList = GiveZhuXianBossAward(firstPlayer, lineID, dropItemMapInfo=[dropPosX, dropPosY, True])
        if not prizeItemList:
            # 没有掉落时直接通知结算,防止卡副本
            firstPlayer.Sync_TimeTick(IPY_GameWorld.tttLeaveMap, 0, leaveTick, True)
            overDict = {FBCommon.Over_rank:1, FBCommon.Over_itemInfo:prizeItemList}
            FBCommon.NotifyFBOver(firstPlayer, ChConfig.Def_FBMapID_ZhuXianBoss, lineID, isPass, overDict)
        else:
            firstPlayer.Sync_TimeTick(ChConfig.tttPickupItem, 0, ChConfig.Def_FBPickupItemTime, True)
    else:
        leaveServerTick = PlayerControl.GetPlayerLeaveServerTick(firstPlayerID)
        if leaveServerTick and tick - leaveServerTick < ChConfig.Def_PlayerOfflineProtectTime:
            #离线超过3分钟的不给奖励
            msgStr = str([ShareDefine.Def_UniversalGameRecType_ZhuXianBossRecord, [firstPlayerID, lineID], [], 0, 0])
            playerManager.GameServer_QueryPlayerResult(0, 0, 0, 'AddUniversalGameRec', msgStr, len(msgStr))
    helpItemList = FBCommon.GetFBLineReward(mapID, lineID)
    if helpItemList: #同盟协助奖励
        needSpace = len(helpItemList)
        jsonItemList = FBCommon.GetJsonItemList(helpItemList)
        for index in range(0 , playerManager.GetPlayerCount()):
            curPlayer = playerManager.GetPlayerByIndex(index)
            curPlayerID = curPlayer.GetPlayerID()
            if not curPlayerID:
                continue
            if curPlayerID == firstPlayerID:
                continue
            if curPlayer.GetFamilyID() != firstPlayerFamilyID:
                continue
            remainCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ZhuXianBossHelpCnt)
            if not remainCnt:
                continue
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ZhuXianBossHelpCnt, remainCnt-1)
            NotifyZXHelpCnt(curPlayer)
            curPlayer.Sync_TimeTick(IPY_GameWorld.tttLeaveMap, 0, leaveTick, True)
            overDict = {FBCommon.Over_rank:0, FBCommon.Over_itemInfo:jsonItemList}
            FBCommon.NotifyFBOver(curPlayer, ChConfig.Def_FBMapID_ZhuXianBoss, lineID, isPass, overDict)
            packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace)
            if needSpace > packSpace:
                PlayerControl.SendMailByKey('ZXBossHelperReward', [curPlayerID], helpItemList)
            else:
                for itemID, itemCount, isBind in helpItemList:
                    ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isBind, [IPY_GameWorld.rptItem])
    return
def GiveZhuXianBossAward(curPlayer, lineID, isMail=False, dropItemMapInfo=[]):
    ##给归属者奖励
    addCnt = 1
    equipList = []
    prizeItemDict ={}
    bossID = CurFBLineBOSSID(lineID)
    jsonItemList, totalExp, totalMoney = NPCCommon.GiveKillNPCDropPrize(curPlayer, ChConfig.Def_FBMapID_ZhuXianBoss, {bossID:addCnt},
                                                                        mailTypeKey="ZXBossBelongerReward", isMail=isMail,
                                                                        dropItemMapInfo=dropItemMapInfo)
    for jsonItem in jsonItemList:
        if 'UserData' in jsonItem:
            equipList.append(jsonItem)
        else:
            itemID, itemCnt = jsonItem['ItemID'], jsonItem.get('Count',1)
            prizeItemDict[itemID] = prizeItemDict.get(itemID,0)+itemCnt
    GameWorld.DebugLog("诛仙boss结算奖励: lineID=%s,bossID=%s,totalExp=%s,totalMoney=%s,jsonItemList=%s"
                       % (lineID, bossID, totalExp, totalMoney, jsonItemList), curPlayer.GetPlayerID())
    prizeItemList = equipList + FBCommon.GetJsonItemList(prizeItemDict.items())
    #PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_ZhuXianBoss, addCnt)
    #击杀特定NPC成就
    PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_KillSpecificNPC, addCnt, [bossID])
    FBCommon.AddEnterFBCount(curPlayer, ChConfig.Def_FBMapID_ZhuXianBoss, addCnt)
    # 每日活动
    PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_ZhuXianBoss, addCnt)
    return prizeItemList
def OnPickUpItem(curPlayer, curItem, tick):
    mapItemType = curItem.GetType()
    if mapItemType == ChConfig.Def_ItemType_Money:
        return
    playerID = curPlayer.GetID()
    isEquip = ItemCommon.CheckItemIsEquip(curItem)
    jsonItem = ItemCommon.GetJsonItem(curItem)
    if playerID in PyGameData.g_fbPickUpItemDict:
        if isEquip:
            PyGameData.g_fbPickUpItemDict[playerID].append(jsonItem)
        else:
            isIn = False
            for itemInfo in PyGameData.g_fbPickUpItemDict[playerID]:
                if itemInfo["ItemID"] == jsonItem["ItemID"] and itemInfo.get("IsBind") == jsonItem.get("IsBind"):
                    itemInfo["Count"] = itemInfo.get("Count", 1)+ jsonItem.get("Count", 1)
                    isIn = True
                    break
            if not isIn:
                PyGameData.g_fbPickUpItemDict[playerID].append(jsonItem)
    else:
        PyGameData.g_fbPickUpItemDict[playerID] = [jsonItem]
    playerItemCount = 0
    mapItemManager = GameWorld.GetMapItemManager()
    for index in xrange(mapItemManager.GetMapItemCount()):
        mapItem = mapItemManager.GetMapItemByIndex(index)
        if not mapItem or mapItem.IsEmpty():
            continue
        # 还有属于自己的东西没捡不通知结束
        if mapItem.GetOwnerID() == curPlayer.GetPlayerID():
            playerItemCount += 1
    isItemAllPickUp = (playerItemCount <= 1)
    if not isItemAllPickUp:
        return
    isPass = 1
    lineID = GameWorld.GetGameWorld().GetPropertyID() - 1
    leaveTick = FBCommon.GetFBLineStepTime(ChConfig.Def_FBMapID_ZhuXianBoss, lineID) * 1000
    gameFB = GameWorld.GetGameFB()
    rank = gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_Rank)
    jsonItemList = PyGameData.g_fbPickUpItemDict.get(playerID, [])
    curPlayer.Sync_TimeTick(IPY_GameWorld.tttLeaveMap, 0, leaveTick, True)
    overDict = {FBCommon.Over_rank:rank, FBCommon.Over_itemInfo:jsonItemList}
    FBCommon.NotifyFBOver(curPlayer, ChConfig.Def_FBMapID_ZhuXianBoss, lineID, isPass, overDict)
    return
def __CheckBossHP(tick):
    gameFB = GameWorld.GetGameFB()
    isOver = gameFB.GetGameFBDictByKey(FBDict_IsOver)
    lineID = GameWorld.GetGameWorld().GetPropertyID() - 1
    if not isOver and GetBossRemainHP(lineID, tick) == 0:
        bossID = CurFBLineBOSSID(lineID)
        curBoss = GameWorld.FindNPCByNPCID(bossID)
        dropPosX, dropPosY = 0, 0
        if curBoss:
            dropPosX, dropPosY = curBoss.GetPosX(), curBoss.GetPosY()
        #结束 设置BOSS死亡
        FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0)
        GameWorld.DebugLog('结束 设置BOSS死亡 lineID=%s' % lineID)
        playerHurtList = __GetSortHurtList(lineID)
        if playerHurtList:
            killerName, hurtValue = playerHurtList[0][1][:2]
            NPCCommon.GameServer_KillGameWorldBoss(bossID, killerName, hurtValue)
        NPCCommon.GameServe_GameWorldBossState(bossID, 0)
        __DoLogicZhuXianBossOver(1, tick, dropPosX, dropPosY)
        gameFB.SetGameFBDict(FBDict_IsOver, 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 % lineID, curSpeed)
    if not gameWorld.GetGameWorldDictByKey(FBDict_IsReduceing%lineID):
        return
    startTick = gameWorld.GetGameWorldDictByKey(FBDict_StartTick % lineID)
    remainHP = gameWorld.GetGameWorldDictByKey(FBDict_RemainHP % lineID)
    lastSpeed = gameWorld.GetGameWorldDictByKey(FBDict_Speed % lineID)
    if not startTick:
        startTick = tick
        lastSpeed = curSpeed
        remainHP = __GetBossTotalHP(lineID)
    remainHP = max(0, int((remainHP - (tick - startTick) / 1000.0 * lastSpeed)))
    gameWorld.SetGameWorldDict(FBDict_StartTick % lineID, tick)
    gameWorld.SetGameWorldDict(FBDict_RemainHP % lineID, remainHP)
    GameWorld.DebugLog('    curSpeed=%s, remainHP=%s, passTime=%s, lastSpeed=%s' % (curSpeed, remainHP, tick - startTick, lastSpeed))
    FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0)
    return
def StopReduceHP(lineID, tick):
    ##暂停BOSS血量减少
    gameWorld = GameWorld.GetGameWorld()
    if not gameWorld.GetGameWorldDictByKey(FBDict_IsReduceing%lineID):
        return
    remainHP = GetBossRemainHP(lineID, tick)
    if not remainHP:
        return
    gameWorld.SetGameWorldDict(FBDict_IsReduceing % lineID, 0)
    gameWorld.SetGameWorldDict(FBDict_RemainHP % lineID, remainHP)
    return
def StartReduceHP(lineID, tick):
    ##开始BOSS掉血
    gameWorld = GameWorld.GetGameWorld()
    if gameWorld.GetGameWorldDictByKey(FBDict_IsReduceing%lineID):
        return
    gameWorld.SetGameWorldDict(FBDict_IsReduceing % lineID, 1)
    startTick = gameWorld.GetGameWorldDictByKey(FBDict_StartTick % lineID)
    if not startTick:
        gameWorld.SetGameWorldDict(FBDict_RemainHP % lineID, __GetBossTotalHP(lineID))
    gameWorld.SetGameWorldDict(FBDict_StartTick % lineID, tick)
    return
def __GetBossTotalHP(lineID):return GameWorld.GetGameWorld().GetGameWorldDictByKey(FBDict_BossTotalHP%lineID)
def GetBossRemainHP(lineID, tick):
    gameWorld = GameWorld.GetGameWorld()
    startTick = gameWorld.GetGameWorldDictByKey(FBDict_StartTick % lineID)
    lastSpeed = gameWorld.GetGameWorldDictByKey(FBDict_Speed % lineID)
    remainHP = gameWorld.GetGameWorldDictByKey(FBDict_RemainHP % lineID)
    if not gameWorld.GetGameWorldDictByKey(FBDict_IsReduceing%lineID):
        return remainHP
    if not startTick:
        startTick = tick
        remainHP = __GetBossTotalHP(lineID)
    else:
        remainHP = max(0, int((remainHP - (tick - startTick) / 1000.0 * lastSpeed)))
    return remainHP
def GetBossRemainHPPer(lineID, tick):
    remainHP = GetBossRemainHP(lineID, tick)
    totalHP = __GetBossTotalHP(lineID)
    if not totalHP:
        return 0
    return remainHP * 100 / totalHP
def CurFBLineBOSSID(lineID= -1):
    #该分线刷的BOSSID
    if lineID == -1:
        lineID = GameWorld.GetGameWorld().GetPropertyID() - 1
    if lineID == -1:
        return 0
    ipyData = IpyGameDataPY.GetIpyGameData('ZhuXianBoss', lineID)
    if not ipyData:
        return 0
    bossID = ipyData.GetNPCID()
    return bossID
##玩家死亡.
# @param curPlayer:死亡的玩家
# @param tick 时间戳
# @return 返回值无意义
# @remarks 玩家主动离开副本.
def DoPlayerDead(curPlayer):
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -1241,6 +1241,14 @@
                        ("WORD", "SingleTimes", 0),
                        ("list", "Reward", 0),
                        ),
                "ZhuXianBoss":(
                        ("DWORD", "NPCID", 0),
                        ("BYTE", "LineID", 1),
                        ("WORD", "KillTime", 0),
                        ("WORD", "RealmLV", 0),
                        ("DWORD", "ZhuXianScore", 0),
                        ),
                }
@@ -3782,6 +3790,23 @@
    def GetSingleTimes(self): return self.SingleTimes # 单次领奖需要的次数
    def GetReward(self): return self.Reward # 奖励物品
# 诛仙BOSS表
class IPY_ZhuXianBoss():
    def __init__(self):
        self.NPCID = 0
        self.LineID = 0
        self.KillTime = 0
        self.RealmLV = 0
        self.ZhuXianScore = 0
        return
    def GetNPCID(self): return self.NPCID # ID
    def GetLineID(self): return self.LineID
    def GetKillTime(self): return self.KillTime # 击杀总时间秒
    def GetRealmLV(self): return self.RealmLV # 需要境界
    def GetZhuXianScore(self): return self.ZhuXianScore # 需要诛仙总评分
def Log(msg, playerID=0, par=0):
    LogUI.Msg("%s\t%s\t%s" % (par, playerID, msg))
@@ -4042,6 +4067,8 @@
        self.ipyActLoginAwardLen = len(self.ipyActLoginAwardCache)
        self.ipyLoginAwardCache = self.__LoadFileData("LoginAward", IPY_LoginAward)
        self.ipyLoginAwardLen = len(self.ipyLoginAwardCache)
        self.ipyZhuXianBossCache = self.__LoadFileData("ZhuXianBoss", IPY_ZhuXianBoss)
        self.ipyZhuXianBossLen = len(self.ipyZhuXianBossCache)
        Log("IPY_FuncConfig count=%s" % len(self.ipyFuncConfigDict))
        Log("IPY_DataMgr InitOK!")
        return
@@ -4444,6 +4471,8 @@
    def GetActLoginAwardByIndex(self, index): return self.ipyActLoginAwardCache[index]
    def GetLoginAwardCount(self): return self.ipyLoginAwardLen
    def GetLoginAwardByIndex(self, index): return self.ipyLoginAwardCache[index]
    def GetZhuXianBossCount(self): return self.ipyZhuXianBossLen
    def GetZhuXianBossByIndex(self, index): return self.ipyZhuXianBossCache[index]
IPYData = IPY_DataMgr()
def IPY_Data(): return IPYData
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -2068,7 +2068,7 @@
    if ChConfig.IsGameBoss(curNPC): 
        # 通知GameServer boss状态 封魔坛在副本里单独处理
        ipyData = IpyGameDataPY.GetIpyGameDataNotLog('BOSSInfo', npcid)
        if ipyData and ipyData.GetMapID() != ChConfig.Def_FBMapID_SealDemon:
        if ipyData and ipyData.GetMapID() not in [ChConfig.Def_FBMapID_SealDemon, ChConfig.Def_FBMapID_ZhuXianBoss]:
            GameServe_GameWorldBossState(npcid, 0)
            #GameWorld.GetGameWorld().SetGameWorldDict(ChConfig.Map_NPC_WorldBossDeadTick % npcid, GameWorld.GetGameWorld().GetTick())
            #因为存在boss分流,所以用gameFB字典,但是存活状态还是用GameWorld字典
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py
@@ -17,6 +17,7 @@
import ShareDefine
import ReadChConfig
import GameLogic_SealDemon
import GameLogic_ZhuXianBoss
import PlayerControl
import IPY_GameWorld
import IpyGameDataPY
@@ -401,6 +402,9 @@
    if mapID == ChConfig.Def_FBMapID_SealDemon:
        bossID = GameLogic_SealDemon.CurFBLineBOSSID()
        stoneNPCID = 0
    elif mapID == ChConfig.Def_FBMapID_ZhuXianBoss:
        bossID = GameLogic_ZhuXianBoss.CurFBLineBOSSID()
        stoneNPCID = 0
    else:
        ipyData = IpyGameDataPY.GetIpyGameDataByCondition('BOSSInfo', {'RefreshMark':refreshMark, 'MapID':mapID}, isLogNone=False)
        if not ipyData:
@@ -412,7 +416,6 @@
        isNeedShunt = ipyData.GetIsNeedShunt()
    if not bossID and not stoneNPCID:
        return
    gameFB = GameWorld.GetGameFB()
    gameWorldMgr = GameWorld.GetGameWorld()
    isActivityBoss = False # 是否活动boss
@@ -463,7 +466,7 @@
            NPCCommon.SetDeadEx(curNPC)
            
        # 非复活线 且 不需要分流的地图 且 不是封魔坛  不允许复活
        if lineID != rebornLineID and not isNeedShunt and mapID != ChConfig.Def_FBMapID_SealDemon:
        if lineID != rebornLineID and not isNeedShunt and mapID not in [ChConfig.Def_FBMapID_SealDemon, ChConfig.Def_FBMapID_ZhuXianBoss]:
            return
        
        if isActivityBoss and activityBossRebornCount > 0:
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -76,6 +76,7 @@
import PyGameData
import PlayerMagicWeapon
import GameLogic_SealDemon
import GameLogic_ZhuXianBoss
import PlayerTJG
import PlayerVip
import PlayerRefineStove
@@ -1699,6 +1700,14 @@
            else:
                bossID = GameLogic_SealDemon.CurFBLineBOSSID(lineID)
                extendParamList = [bossID]
        elif mapID == ChConfig.Def_FBMapID_ZhuXianBoss:
            bossID = GameLogic_ZhuXianBoss.CurFBLineBOSSID(lineID)
            extendParamList = [bossID, -1]
            enterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntDay % ChConfig.Def_FBMapID_ZhuXianBoss)
            if enterCnt >= FBCommon.GetEnterFBMaxCnt:
                if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ZhuXianBossHelpCnt):
                    extendParamList = [bossID, curPlayer.GetFamilyID()]
        SendToGameServerEnterFB(curPlayer, mapID, lineID, tick, extendParamList)
        return
    
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py
@@ -113,6 +113,10 @@
    enterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntDay % ChConfig.Def_FBMapID_SealDemon)
    maxCnt = FBCommon.GetEnterFBMaxCnt(curPlayer, ChConfig.Def_FBMapID_SealDemon)
    curPlayerPropDict['CntMark_%s'%ChConfig.Def_FBMapID_SealDemon] = max(maxCnt - enterCnt, 0)
    # 诛仙BOSS剩余次数
    enterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntDay % ChConfig.Def_FBMapID_ZhuXianBoss)
    maxCnt = FBCommon.GetEnterFBMaxCnt(curPlayer, ChConfig.Def_FBMapID_ZhuXianBoss)
    curPlayerPropDict['CntMark_%s'%ChConfig.Def_FBMapID_ZhuXianBoss] = max(maxCnt - enterCnt, 0)
    # 世界BOSS剩余次数
    curPlayerPropDict['CntMark_%s'%ShareDefine.Def_Boss_Func_World] = BossHurtMng.GetCanKillBossCnt(curPlayer, ShareDefine.Def_Boss_Func_World)
    # BOSS之家剩余次数
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_EnterFB.py
@@ -24,6 +24,7 @@
#导入
import FBLogic
import GameLogic_SealDemon
import GameLogic_ZhuXianBoss
import IPY_GameWorld
import PlayerControl
import GameWorld
@@ -57,7 +58,7 @@
    tagMapID = packCMDList[0]  # 目标地图id
    tagMapLineID = packCMDList[1]  # 目标地图线路属性,从0开始
    resultLineID = -1  # 结果lineID
    notifyMark = 'GeRen_chenxin_500807' #不能进的提示
    if tagMapID in ChConfig.Def_MapID_LineIDToPropertyID:        
        GameWorld.Log("    DoLogic() tagMapID in ChConfig.Def_MapID_LineIDToPropertyID")
        tagMapPropertyID = tagMapLineID + 1 # 因为PropertyID默认是0,所以使用时从1开始
@@ -144,13 +145,14 @@
#            GameWorld.DebugLog("    创建新战盟家园: tagFamilyID=%s,tagFamilyHomeLV=%s,resultLineID=%s" 
#                               % (tagFamilyID, tagFamilyHomeLV, resultLineID))
#===================================================================================================
    elif tagMapID == ChConfig.Def_FBMapID_SealDemon:
    elif tagMapID in [ChConfig.Def_FBMapID_SealDemon, ChConfig.Def_FBMapID_ZhuXianBoss]:
        tagMapPropertyID = tagMapLineID + 1 # 因为PropertyID默认是0,所以使用时从1开始
        resultLineID = -1  # 结果lineID
        
        gameWorldManager = GameWorld.GetGameWorld()
        GameWorld.Log("    DoLogic()  tagMapID=%s,tagMapLineID=%s" % (tagMapID, tagMapLineID))
        findGameWord = None
        findPlayerManager = None
        for index in range(gameWorldManager.GetGameWorldCount()):
            gameWorld = IPY_GameWorld.IPY_GameWorld(index)
            playerManager = gameWorld.GetMapCopyPlayerManagerByFbIndex(index)
@@ -163,13 +165,32 @@
#                          % (index, propertyID, playerManager.GetPlayerCount()))
            # 如果不是同一线路属性的,则跳过
            if propertyID == tagMapPropertyID:
                if tagMapID == ChConfig.Def_FBMapID_SealDemon:
                if GameLogic_SealDemon.GetBossRemainHPPer(tagMapLineID, tick) < 15:
                    findGameWord = None
                        findPlayerManager = None
                        notifyMark = "DemonJar_Text4"
                    break
                elif tagMapID == ChConfig.Def_FBMapID_ZhuXianBoss:
                    if GameLogic_ZhuXianBoss.GetBossRemainHPPer(tagMapLineID, tick) < 15:
                        findGameWord = None
                        findPlayerManager = None
                        notifyMark = "DemonJar_Text4"
                        break
                findGameWord = gameWorld
                findPlayerManager = gameWorld
                break
            if not findGameWord and propertyID == 0:
                findGameWord = gameWorld
                findPlayerManager = gameWorld
        if findPlayerManager and tagMapID == ChConfig.Def_FBMapID_ZhuXianBoss:
            if packCMDList[3] !=-1 and not GameLogic_ZhuXianBoss.GetHasSameFamilyMerber(packCMDList[3], findPlayerManager):
                notifyMark = "TryEnterJadeDynastyBossError_6"
                findGameWord = None
                GameWorld.DebugLog("    归属次数为0且没有同盟玩家在副本里!")
        if findGameWord:
            if findGameWord.GetPropertyID() == 0:
                findGameWord.SetFBFirstOpen(1) # 开启副本
@@ -180,7 +201,7 @@
        #resultLineID = tagMapLineID
        resultLineID = 0
        
    return ['%s' % packCMDList, '%d' % resultLineID]
    return ['%s' % packCMDList, '%d' % resultLineID, notifyMark]
#---------------------------------------------------------------------
@@ -196,22 +217,19 @@
    
    #还原格式 '[]' -> []
    funResult = eval(funResult)
    if not funResult or len(funResult) < 2:
    if not funResult or len(funResult) < 3:
        GameWorld.Log("GY_Query_EnterFB DoResult() return []")
        return
    
    tagMapInfo = eval(funResult[0])
    backFBID = int(funResult[1]) # 返回的切图线路id(0~N)
    notifyMark = funResult[2]
    mapID = tagMapInfo[0] # 请求的切图id
    funcLineID = tagMapInfo[1]   # 请求的场次线路id(0~6)
    GameWorld.Log("GY_Query_EnterFB DoResult() mapID=%s,funcLineID=%s,backFBID=%s" % (mapID, funcLineID, backFBID), curPlayer.GetPlayerID())
    
    if backFBID == -1: # 未找到可进入的分线,则返回,提示人数已满
        if mapID == ChConfig.Def_FBMapID_SealDemon:
            PlayerControl.NotifyCode(curPlayer, "DemonJar_Text4")
        else:
            PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_500807")
        PlayerControl.NotifyCode(curPlayer, notifyMark)
        return
    
    if curPlayer.GetMapID() == mapID:
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_FBLinePlayerCnt.py
@@ -19,7 +19,7 @@
#导入
import NPCCommon
import GameLogic_ZhuXianBoss
import GameWorld
import IPY_GameWorld
import ChConfig
@@ -51,7 +51,7 @@
    gameWorldManager = GameWorld.GetGameWorld()
    fbLinePlayerCntDict = {}
    if tagMapID == ChConfig.Def_FBMapID_SealDemon:
        for index in range(gameWorldManager.GetGameWorldCount()):
        for index in xrange(gameWorldManager.GetGameWorldCount()):
            gameWorld = IPY_GameWorld.IPY_GameWorld(index)
            playerManager = gameWorld.GetMapCopyPlayerManagerByFbIndex(index)
            fblineID = gameWorld.GetPropertyID() - 1
@@ -60,7 +60,20 @@
            if not isAllLine and tagFBLineID != fblineID:
                continue
            playerCnt = playerManager.GetPlayerCount()
            fbLinePlayerCntDict[fblineID] = playerCnt
            fbLinePlayerCntDict[fblineID] = [playerCnt]
    elif tagMapID == ChConfig.Def_FBMapID_ZhuXianBoss:
        for index in xrange(gameWorldManager.GetGameWorldCount()):
            gameWorld = IPY_GameWorld.IPY_GameWorld(index)
            playerManager = gameWorld.GetMapCopyPlayerManagerByFbIndex(index)
            fblineID = gameWorld.GetPropertyID() - 1
            if fblineID < 0:
                continue
            if not isAllLine and tagFBLineID != fblineID:
                continue
            playerCnt = playerManager.GetPlayerCount()
            ownerName = GameLogic_ZhuXianBoss.GetFirstOwnerName(fblineID)
            fbLinePlayerCntDict[fblineID] = [playerCnt, ownerName]
    else:
        return
    return [tagMapID, fbLinePlayerCntDict]
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_ZhuXianBossAward.py
New file
@@ -0,0 +1,48 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#---------------------------------------------------------------------
#
#---------------------------------------------------------------------
##@package GY_Query_ZhuXianBossAward
# @todo: 诛仙BOSS奖励处理
#
# @author: xdh
# @date 2019-01-19 16:30
# @version 1.0
#
# @note: 诛仙BOSS奖励处理
#---------------------------------------------------------------------
#"""Version = 2017-12-28 16:30"""
#---------------------------------------------------------------------
import GameWorld
import GameLogic_ZhuXianBoss
#---------------------------------------------------------------------
## XX
#  @param query_Type 请求类型
#  @param query_ID 请求的玩家ID
#  @param packCMDList 发包命令
#  @param tick 当前时间
#  @return "True" or "False" or ""
def DoLogic(query_Type, query_ID, packCMDList, tick):
    return ''
## 登陆信息
#  @param curPlayer 发出请求的玩家
#  @param callFunName 功能名称
#  @param funResult 查询的结果
#  @param tick 当前时间
#  @return None
def DoResult(curPlayer, callFunName, funResult, tick):
    playerID = curPlayer.GetPlayerID()
    GameWorld.DebugLog("GY_Query_ZhuXianBossAward funResult=%s" % funResult, playerID)
    lineID = GameWorld.ToIntDef(funResult, -1)
    if lineID == -1:
        return
    GameLogic_ZhuXianBoss.GiveZhuXianBossAward(curPlayer, lineID, True)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
@@ -87,3 +87,5 @@
g_crossPlayerDienstgradChangeInfo = {} #跨服玩家称号变化信息 {playerID:{id:isAdd, ...}, ...}
g_crossPlayerItemsChangeInfo = {} #跨服玩家物品变化信息 {playerID:{"背包类型-物品位":itemMD5, ...}, ...}
g_crossPlayerSkillsChangeInfo = {} #跨服玩家技能变化信息 {playerID:[技能ID], ...}
g_ZhuXianBossPlayerHurtDict = {} #诛仙BOSS玩家伤害排行信息
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -878,6 +878,7 @@
GameFuncID_LittleHelper = 146   # 小助手
GameFuncID_TJG = 147            # 脱机挂
GameFuncID_SuperGift = 150      # 超值礼包
GameFuncID_ZhuXianBoss = 163    # 诛仙BOSS
# 以下为暂时无用的
GameFuncID_Truck = 33           # 运镖
GameFuncID_RunDaily = 34        # 日常跑环
@@ -962,7 +963,7 @@
                                Def_UniversalGameRecType_StoreServerCntRecord,  #商店全服购买记录 8,
                                Def_UniversalGameRecType_FBHelpBattleCheckInPlayer, #助战玩家登记记录9
                                Def_UniversalGameRecType_FBHelpBattleRecord, #助战未同步记录10
                                Def_UniversalGameRecType_11,
                                Def_UniversalGameRecType_ZhuXianBossRecord, #诛仙BOSS结算记录11
                                Def_UniversalGameRecType_12,
                                Def_UniversalGameRecType_13,
                                Def_UniversalGameRecType_Reward,    # 通用奖励表(TopBar)14
@@ -1521,7 +1522,8 @@
DailyActionID_IceLode, # 冰晶矿脉
DailyActionID_HelpBattleCheckIn, # 助战登记  20
DailyActionID_CrossReamPK, # 跨服PK  21
) = range(1, 21 + 1)
DailyActionID_ZhuXianBoss, # 诛仙BOSS  22
) = range(1, 22 + 1)