From 9f13daf65e0f6acc43ffab6462b737a70879f5cc Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 29 八月 2018 20:17:08 +0800
Subject: [PATCH] Add: 2961 【后端】仙盟抢Boss活动;

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py                     |  108 +++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py                 |  333 ++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py                     |    6 
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py                                          |  108 +++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AIType_186.py            |   44 +
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py                                      |  333 ++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py                   |    9 
 PySysDB/PySysDBPY.h                                                                                    |    3 
 ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py                                          |    5 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py |    4 
 ServerPython/CoreServerGroup/GameServer/PyNetPack.ini                                                  |    6 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py                     |    5 
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py                                   |    5 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FamilyRobBoss.py    |  555 +++++++++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py            |   73 ++
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py                         |   44 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py |   65 +
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py                                  |   10 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/KillScreenNPC.py       |   12 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintNPCHurt.py        |   10 
 ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py                                           |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini                             |   12 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Boss.py                |   31 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py                   |   78 ++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py       |    7 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                        |    9 
 26 files changed, 1,824 insertions(+), 53 deletions(-)

diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index 968047e..9cdb9c2 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -848,6 +848,9 @@
 	DWORD		_NPCID;	//ID
 	DWORD		MapID;	//地图ID
 	BYTE		RefreshMark;	//刷新标识点
+	BYTE		IsNeedShunt;	//是否需要分流
+	BYTE		RelatedType;	//刷怪关联类型
+	WORD		RelatedID;	//关联ID
 	DWORD		StoneNPCID;	//墓碑NPCID
 };
 
diff --git a/ServerPython/CoreServerGroup/GameServer/PyNetPack.ini b/ServerPython/CoreServerGroup/GameServer/PyNetPack.ini
index fdc6620..6b0a4e7 100644
--- a/ServerPython/CoreServerGroup/GameServer/PyNetPack.ini
+++ b/ServerPython/CoreServerGroup/GameServer/PyNetPack.ini
@@ -319,12 +319,16 @@
 Writer = xdh
 Releaser = xdh
 RegType = 0
-RegisterPackCount = 1
+RegisterPackCount = 2
 
 PacketCMD_1=0xA9
 PacketSubCMD_1=0x03
 PacketCallFunc_1=OnAttentionBoss
 
+PacketCMD_2=0xAC
+PacketSubCMD_2=0x04
+PacketCallFunc_2=OnQueryAllFamilyBossHurt
+
 [PlayerXMZZ]
 ScriptName = Player\PlayerXMZZ.py
 Writer = xdh
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
index d3818c6..80a331a 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
@@ -1485,6 +1485,54 @@
 
 
 #------------------------------------------------------
+# AC 04 查询仙盟抢Boss所有Boss当前进度 #tagCGQueryAllFamilyBossHurt
+
+class  tagCGQueryAllFamilyBossHurt(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xAC
+        self.SubCmd = 0x04
+        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 = 0xAC
+        self.SubCmd = 0x04
+        return
+
+    def GetLength(self):
+        return sizeof(tagCGQueryAllFamilyBossHurt)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AC 04 查询仙盟抢Boss所有Boss当前进度 //tagCGQueryAllFamilyBossHurt:
+                                Cmd:%s,
+                                SubCmd:%s
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd
+                                )
+        return DumpString
+
+
+m_NAtagCGQueryAllFamilyBossHurt=tagCGQueryAllFamilyBossHurt()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCGQueryAllFamilyBossHurt.Cmd,m_NAtagCGQueryAllFamilyBossHurt.SubCmd))] = m_NAtagCGQueryAllFamilyBossHurt
+
+
+#------------------------------------------------------
 # AC 03 仙魔之争信息查询 #tagCGXMZZInfoQuery
 
 class  tagCGXMZZInfoQuery(Structure):
@@ -4012,6 +4060,66 @@
 
 
 #------------------------------------------------------
+# A2 28 查询仙盟抢Boss伤血列表 #tagCMQueryFamilyBossHurt
+
+class  tagCMQueryFamilyBossHurt(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("ObjID", c_int),    
+                  ("NPCID", c_int),    
+                  ("QueryType", c_ubyte),    # 0-实时仙盟伤血,1-历史仙盟伤血,2-实时玩家伤血,3-历史玩家伤血
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xA2
+        self.SubCmd = 0x28
+        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 = 0xA2
+        self.SubCmd = 0x28
+        self.ObjID = 0
+        self.NPCID = 0
+        self.QueryType = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagCMQueryFamilyBossHurt)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// A2 28 查询仙盟抢Boss伤血列表 //tagCMQueryFamilyBossHurt:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                ObjID:%d,
+                                NPCID:%d,
+                                QueryType:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.ObjID,
+                                self.NPCID,
+                                self.QueryType
+                                )
+        return DumpString
+
+
+m_NAtagCMQueryFamilyBossHurt=tagCMQueryFamilyBossHurt()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMQueryFamilyBossHurt.Cmd,m_NAtagCMQueryFamilyBossHurt.SubCmd))] = m_NAtagCMQueryFamilyBossHurt
+
+
+#------------------------------------------------------
 # A2 27 查询地图NPC数量信息 #tagCMQueryNPCCntInfo
 
 class  tagCMQueryNPCCntInfo(Structure):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index 610934e..d989dba 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -4237,6 +4237,162 @@
 
 
 #------------------------------------------------------
+# AC 10 仙盟抢Boss所有Boss伤血进度信息 #tagGCAllFamilyBossHurtInfoList
+
+class  tagGCFamilyBossHurtInfo(Structure):
+    NPCID = 0    #(DWORD NPCID)
+    CurHP = 0    #(DWORD CurHP)
+    CurHPEx = 0    #(DWORD CurHPEx)
+    MaxHP = 0    #(DWORD MaxHP)
+    MaxHPEx = 0    #(DWORD MaxHPEx)
+    FamilyID = 0    #(DWORD FamilyID)// 最大实时伤血仙盟
+    NameLen = 0    #(BYTE NameLen)
+    FamilyName = ""    #(String FamilyName)
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.NPCID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.CurHP,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.CurHPEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.MaxHP,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.MaxHPEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FamilyID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.NameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.FamilyName,_pos = CommFunc.ReadString(_lpData, _pos,self.NameLen)
+        return _pos
+
+    def Clear(self):
+        self.NPCID = 0
+        self.CurHP = 0
+        self.CurHPEx = 0
+        self.MaxHP = 0
+        self.MaxHPEx = 0
+        self.FamilyID = 0
+        self.NameLen = 0
+        self.FamilyName = ""
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 1
+        length += len(self.FamilyName)
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.NPCID)
+        data = CommFunc.WriteDWORD(data, self.CurHP)
+        data = CommFunc.WriteDWORD(data, self.CurHPEx)
+        data = CommFunc.WriteDWORD(data, self.MaxHP)
+        data = CommFunc.WriteDWORD(data, self.MaxHPEx)
+        data = CommFunc.WriteDWORD(data, self.FamilyID)
+        data = CommFunc.WriteBYTE(data, self.NameLen)
+        data = CommFunc.WriteString(data, self.NameLen, self.FamilyName)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                NPCID:%d,
+                                CurHP:%d,
+                                CurHPEx:%d,
+                                MaxHP:%d,
+                                MaxHPEx:%d,
+                                FamilyID:%d,
+                                NameLen:%d,
+                                FamilyName:%s
+                                '''\
+                                %(
+                                self.NPCID,
+                                self.CurHP,
+                                self.CurHPEx,
+                                self.MaxHP,
+                                self.MaxHPEx,
+                                self.FamilyID,
+                                self.NameLen,
+                                self.FamilyName
+                                )
+        return DumpString
+
+
+class  tagGCAllFamilyBossHurtInfoList(Structure):
+    Head = tagHead()
+    NPCCount = 0    #(BYTE NPCCount)// 个数
+    NPCHurtInfo = list()    #(vector<tagGCFamilyBossHurtInfo> NPCHurtInfo)// NPC伤血信息列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xAC
+        self.Head.SubCmd = 0x10
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.NPCCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.NPCCount):
+            temNPCHurtInfo = tagGCFamilyBossHurtInfo()
+            _pos = temNPCHurtInfo.ReadData(_lpData, _pos)
+            self.NPCHurtInfo.append(temNPCHurtInfo)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xAC
+        self.Head.SubCmd = 0x10
+        self.NPCCount = 0
+        self.NPCHurtInfo = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        for i in range(self.NPCCount):
+            length += self.NPCHurtInfo[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.NPCCount)
+        for i in range(self.NPCCount):
+            data = CommFunc.WriteString(data, self.NPCHurtInfo[i].GetLength(), self.NPCHurtInfo[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                NPCCount:%d,
+                                NPCHurtInfo:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.NPCCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagGCAllFamilyBossHurtInfoList=tagGCAllFamilyBossHurtInfoList()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCAllFamilyBossHurtInfoList.Head.Cmd,m_NAtagGCAllFamilyBossHurtInfoList.Head.SubCmd))] = m_NAtagGCAllFamilyBossHurtInfoList
+
+
+#------------------------------------------------------
 # AC 08 boss复活点数通知 #tagGCBossRebornPoint
 
 class  tagGCBossRebornPoint(Structure):
@@ -16349,6 +16505,183 @@
 
 
 #------------------------------------------------------
+# A7 15 通知仙盟抢Boss伤血信息 #tagMCFamilyBossHurtList
+
+class  tagMCFamilyBossHurt(Structure):
+    FamilyID = 0    #(DWORD FamilyID)// 所属仙盟ID
+    HurtID = 0    #(DWORD HurtID)// 伤血的ID, 根据伤血类型表示不同的ID, 如仙盟ID或玩家ID
+    NameLen = 0    #(BYTE NameLen)
+    HurtName = ""    #(String HurtName)
+    HurtValue = 0    #(DWORD HurtValue)// 累计伤血,求余1亿的值
+    HurtValueEx = 0    #(DWORD HurtValueEx)// 累计伤血,整除1亿的值
+    InitTick = 0    #(DWORD InitTick)// 伤血初始tick,用于排序,先按伤血倒序排,再按tick正序排
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.FamilyID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.HurtID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.NameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.HurtName,_pos = CommFunc.ReadString(_lpData, _pos,self.NameLen)
+        self.HurtValue,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.HurtValueEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.InitTick,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        return _pos
+
+    def Clear(self):
+        self.FamilyID = 0
+        self.HurtID = 0
+        self.NameLen = 0
+        self.HurtName = ""
+        self.HurtValue = 0
+        self.HurtValueEx = 0
+        self.InitTick = 0
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 4
+        length += 1
+        length += len(self.HurtName)
+        length += 4
+        length += 4
+        length += 4
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.FamilyID)
+        data = CommFunc.WriteDWORD(data, self.HurtID)
+        data = CommFunc.WriteBYTE(data, self.NameLen)
+        data = CommFunc.WriteString(data, self.NameLen, self.HurtName)
+        data = CommFunc.WriteDWORD(data, self.HurtValue)
+        data = CommFunc.WriteDWORD(data, self.HurtValueEx)
+        data = CommFunc.WriteDWORD(data, self.InitTick)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                FamilyID:%d,
+                                HurtID:%d,
+                                NameLen:%d,
+                                HurtName:%s,
+                                HurtValue:%d,
+                                HurtValueEx:%d,
+                                InitTick:%d
+                                '''\
+                                %(
+                                self.FamilyID,
+                                self.HurtID,
+                                self.NameLen,
+                                self.HurtName,
+                                self.HurtValue,
+                                self.HurtValueEx,
+                                self.InitTick
+                                )
+        return DumpString
+
+
+class  tagMCFamilyBossHurtList(Structure):
+    Head = tagHead()
+    ObjID = 0    #(DWORD ObjID)
+    NPCID = 0    #(DWORD NPCID)
+    HurtType = 0    #(BYTE HurtType)// 0-实时仙盟伤血,1-历史仙盟伤血,2-实时玩家伤血,3-历史玩家伤血
+    IsSort = 0    #(BYTE IsSort)// 是否排序过的,一般boss被击杀后会统一同步一次排序过的最终结果,其他情况下客户端自己排序
+    HurtCount = 0    #(WORD HurtCount)// 伤血个数
+    HurtList = list()    #(vector<tagMCFamilyBossHurt> HurtList)// 伤血列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xA7
+        self.Head.SubCmd = 0x15
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.ObjID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.NPCID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.HurtType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.IsSort,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.HurtCount,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        for i in range(self.HurtCount):
+            temHurtList = tagMCFamilyBossHurt()
+            _pos = temHurtList.ReadData(_lpData, _pos)
+            self.HurtList.append(temHurtList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xA7
+        self.Head.SubCmd = 0x15
+        self.ObjID = 0
+        self.NPCID = 0
+        self.HurtType = 0
+        self.IsSort = 0
+        self.HurtCount = 0
+        self.HurtList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 4
+        length += 4
+        length += 1
+        length += 1
+        length += 2
+        for i in range(self.HurtCount):
+            length += self.HurtList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.ObjID)
+        data = CommFunc.WriteDWORD(data, self.NPCID)
+        data = CommFunc.WriteBYTE(data, self.HurtType)
+        data = CommFunc.WriteBYTE(data, self.IsSort)
+        data = CommFunc.WriteWORD(data, self.HurtCount)
+        for i in range(self.HurtCount):
+            data = CommFunc.WriteString(data, self.HurtList[i].GetLength(), self.HurtList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                ObjID:%d,
+                                NPCID:%d,
+                                HurtType:%d,
+                                IsSort:%d,
+                                HurtCount:%d,
+                                HurtList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.ObjID,
+                                self.NPCID,
+                                self.HurtType,
+                                self.IsSort,
+                                self.HurtCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCFamilyBossHurtList=tagMCFamilyBossHurtList()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCFamilyBossHurtList.Head.Cmd,m_NAtagMCFamilyBossHurtList.Head.SubCmd))] = m_NAtagMCFamilyBossHurtList
+
+
+#------------------------------------------------------
 # A7 03 通知进入副本时间 #tagMCFBEnterTickList
 
 class  tagMCFBEnterTick(Structure):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py
index aea34b5..dd7e024 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py
@@ -176,6 +176,10 @@
         __SetIsAlive(bossID, isAlive)
         # 全服广播世界boss变更信息
         Sync_BossInfo(None, [bossID])
+        
+    # 仙盟归属boss的重置
+    if bossID in PyGameData.g_familyOwnerBossInfo:
+        PyGameData.g_familyOwnerBossInfo.pop(bossID)
     return
 
 
@@ -1036,4 +1040,42 @@
         if PlayerControl.GetIsTJG(curPlayer):
             return
         NetPackCommon.SendFakePack(curPlayer, packData)
-    return
\ No newline at end of file
+    return
+
+def MapServer_FamilyOwnerBossInfo(msgInfo):
+    ## 地图同步仙盟归属boss信息
+    
+    #GameWorld.DebugLog("地图同步仙盟归属boss信息: %s" % msgInfo)
+    if not isinstance(msgInfo, dict):
+        return
+    
+    PyGameData.g_familyOwnerBossInfo.update(msgInfo)
+    return
+
+#// AC 04 查询仙盟抢Boss所有Boss当前进度 #tagCGQueryAllFamilyBossHurt
+#
+#struct    tagCGQueryAllFamilyBossHurt
+#{
+#    tagHead        Head;
+#};
+def OnQueryAllFamilyBossHurt(index, clientData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    
+    hurtPack = ChPyNetSendPack.tagGCAllFamilyBossHurtInfoList()
+    hurtPack.NPCHurtInfo = []
+    for npcID, hurtInfo in PyGameData.g_familyOwnerBossInfo.items():
+        curHP, maxHP, firstFamilyID, firstFamilyName = hurtInfo
+        hurtInfo = ChPyNetSendPack.tagGCFamilyBossHurtInfo()
+        hurtInfo.NPCID = npcID
+        hurtInfo.CurHP = curHP%ShareDefine.Def_PerPointValue
+        hurtInfo.CurHPEx = curHP/ShareDefine.Def_PerPointValue
+        hurtInfo.MaxHP = maxHP%ShareDefine.Def_PerPointValue
+        hurtInfo.MaxHPEx = maxHP/ShareDefine.Def_PerPointValue
+        hurtInfo.FamilyID = firstFamilyID
+        hurtInfo.FamilyName = firstFamilyName
+        hurtInfo.NameLen = len(hurtInfo.FamilyName)
+        hurtPack.NPCHurtInfo.append(hurtInfo)
+    hurtPack.NPCCount = len(hurtPack.NPCHurtInfo)
+    NetPackCommon.SendFakePack(curPlayer, hurtPack)
+    return
+
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py
index c2db78e..fe9b667 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py
@@ -39,6 +39,7 @@
 import PlayerFamilyParty
 import PlayerFamilySWRH
 import PlayerViewCache
+import GameWorldBoss
 import PlayerTalk
 
 import copy
@@ -1363,6 +1364,10 @@
         PlayerControl.NotifyCode(curPlayer, "DungeonGuardSkyText2")
         return
     
+    if GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_FamilyRobBoss):        
+        PlayerControl.NotifyCode(curPlayer, "FairyGrabBossExitError")
+        return
+    
     tagPlayerName = curTagMember.GetName()  # 被踢玩家名
     tagPlayerID = curTagMember.GetPlayerID()  # 被踢玩家ID
     tagFamilyLV = curTagMember.GetFamilyLV()  # 被踢玩家职位
@@ -1437,6 +1442,11 @@
     if PlayerFamilySWRH.IsInFamilySWRH():
         PlayerControl.NotifyCode(curPlayer, "DungeonGuardSkyText1")
         return
+    
+    if GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_FamilyRobBoss):        
+        PlayerControl.NotifyCode(curPlayer, "FairyGrabBossExitError")
+        return
+    
     #XW_JZ_LeaveFamily   <n color="0,190,255">{%S1%}</n><n color="255,255,0">退出了家族!</n>  25  -   -
     NotifyAllFamilyMemberMsg(curFamily, curPlayer, "XW_JZ_LeaveFamily", [curPlayer.GetName()])
     
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
index d777f7e..bcf2381 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
@@ -621,6 +621,11 @@
         GameWorldBoss.DoGameWorldBossOnReborn(eval(resultName), tick)
         return
     
+    # 仙盟归属boss信息同步
+    if callName =="FamilyOwnerBossInfo":
+        GameWorldBoss.MapServer_FamilyOwnerBossInfo(eval(resultName))
+        return
+    
     # 全局掉落CD
     if callName =="GlobalDropCD":
         GameWorldProcess.UpdGlobalDropCD(eval(resultName))
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py b/ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py
index 36b4bf3..f800d86 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py
@@ -62,6 +62,8 @@
 g_bossShuntDeadLine = {} # boss分流线路boss已死亡的线路 {bossID:[lineID, ...], ...}
 g_bossShuntDeadLineChangeBoss = [] # boss分流已死亡线路有变更的boss列表
 
+g_familyOwnerBossInfo = {} # 地图同步上来的仙盟归属boss信息
+
 g_todayPlayerLVDict = {} #今日玩家等级字典 {playerID:lv,..}
 g_yesterdayPlayerLVDict = {} #昨日玩家等级字典{playerID:lv,..}
 
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
index e538065..0e3b58b 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -1466,9 +1466,10 @@
 DailyActionID_XXX12, # 废弃12
 DailyActionID_Tower, # 符印塔
 DailyActionID_MagicWeapon, # 法宝集魂
-DailyActionID_FBHelp, # 助战副本
+DailyActionID_FBHelp, # 助战副本 15
 DailyActionID_BOSSHome, # BOSS之家
-) = range(1, 16 + 1)
+DailyActionID_FamilyRobBoss, # 仙盟抢boss
+) = range(1, 17 + 1)
 
 
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
index 1cfb104..7a8b725 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
@@ -1245,6 +1245,18 @@
 PacketSubCMD_1=0x03
 PacketCallFunc_1=OnActiveAllEquipAttr
 
+;仙盟抢boss
+[FamilyRobBoss]
+ScriptName = GameWorldLogic\FamilyRobBoss.py
+Writer = hxp
+Releaser = hxp
+RegType = 0
+RegisterPackCount = 1
+
+PacketCMD_1=0xA2
+PacketSubCMD_1=0x28
+PacketCallFunc_1=OnQueryFamilyBossHurt
+
 ;神兽
 [PlayerDogz]
 ScriptName = Player\PlayerDogz.py
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
index 22d3208..b07fa6b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
@@ -41,7 +41,7 @@
 import PlayerTruck
 #import PlayerPrestigeSys
 import PlayerFamily
-import BossHurtMng
+#import BossHurtMng
 import PassiveBuffEffMng
 import PlayerSuccess
 import GameFuncComm
@@ -56,6 +56,7 @@
 import PlayerState
 import ChPyNetSendPack
 import NetPackCommon
+import FamilyRobBoss
 import FBCommon
 
 import datetime
@@ -610,7 +611,7 @@
 #  @remarks 获得curPlayer是否是新手
 def GetIsNewGuy(curPlayer):
     
-    if curPlayer.GetLV() < ReadChConfig.GetEvalChConfig("MinPKLV"):
+    if curPlayer.GetLV() < IpyGameDataPY.GetFuncCfg("PKConfig", 5):
         return True
     
     return False
@@ -679,7 +680,8 @@
     defNPCHurtList = curTagObj.GetPlayerHurtList()
     curObjType = curObj.GetGameObjType()
     if curObjType == IPY_GameWorld.gotPlayer:
-        BossHurtMng.BossAddPlayerInHurtList(curObj, curTagObj, hurtHP)
+        #BossHurtMng.BossAddPlayerInHurtList(curObj, curTagObj, hurtHP)
+        FamilyRobBoss.OnPlayerHurtFamilyOwnerBoss(curObj, curTagObj, hurtHP)
         if curTagObj.GetGameObjType() == IPY_GameWorld.gotNPC:
             FBLogic.DoFB_Player_HurtNPC(curObj, curTagObj, hurtHP)
         if GameObj.GetHP(curTagObj) == 0:
@@ -748,6 +750,10 @@
         if not CheckKillNPCByCnt(attacker, defender):
             return False
         
+        #仙盟归属NPC判断
+        if not CheckCanAttackFamilyOwnerNPC(attacker, defender):
+            return False
+        
     # NPC打玩家,反过来判断
     elif atkObjType == IPY_GameWorld.gotNPC and defObjType == IPY_GameWorld.gotPlayer:
         ##攻击次数判断
@@ -758,12 +764,19 @@
         if not CheckKillNPCByCnt(defender, attacker, False):
             return False
         
+        #仙盟归属NPC判断
+        if not CheckCanAttackFamilyOwnerNPC(defender, attacker, False):
+            return False
         
     # NPC打NPC
     elif atkObjType == IPY_GameWorld.gotNPC and defObjType == IPY_GameWorld.gotNPC:
         if PetControl.IsPet(attacker) or attacker.GetGameNPCObjType()== IPY_GameWorld.gnotSummon:
             #击杀次数判断
             if not CheckKillNPCByCnt(attacker, defender, False):
+                return False
+            
+            #仙盟归属NPC判断
+            if not CheckCanAttackFamilyOwnerNPC(attacker, defender, False):
                 return False
             
     #攻击NPC等级限制
@@ -817,6 +830,34 @@
               
     return False
 
+def CheckCanAttackFamilyOwnerNPC(attacker, defender, isNotify=True):
+    ''' 判断可否攻击仙盟归属的NPC '''
+    if defender.GetGameObjType() != IPY_GameWorld.gotNPC:
+        #GameWorld.DebugLog("只判断被攻击的是NPC的情况")
+        return True
+    
+    if NPCCommon.GetDropOwnerType(defender) != ChConfig.DropOwnerType_Family:
+        return True
+    
+    atkPlayer, npcObjType = GetAttackPlayer(attacker)
+    # 攻击者非玩家不限制
+    if not atkPlayer:
+        #GameWorld.DebugLog("攻击者非玩家不限制")
+        return True
+    
+    atkLimitNotifyMark = ""
+    if GetIsNewGuy(atkPlayer):
+        atkLimitNotifyMark = "FairyGrabBossNotAtk"
+    elif not atkPlayer.GetFamilyID():
+        atkLimitNotifyMark = "FairyGrabBossNoFairy"
+        
+    if atkLimitNotifyMark:
+        if npcObjType is None and isNotify:
+            PlayerControl.NotifyCode(atkPlayer, atkLimitNotifyMark)
+        return False
+    
+    return True
+
 def CheckKillNPCByCnt(attacker, defender, isNotify=True):
     ''' 判断当日击杀该NPC次数是否已满 '''
     if defender.GetGameObjType() != IPY_GameWorld.gotNPC:
@@ -853,9 +894,9 @@
     
     
     if hasKillCnt >= limitCnt + itemAddKillCnt:
-        if BossHurtMng.GetPlayerBossHurt(atkPlayer, defender):
-            GameWorld.DebugLog("攻击过该boss可继续攻击")
-            return True
+        #if BossHurtMng.GetPlayerBossHurt(atkPlayer, defender):
+        #    GameWorld.DebugLog("攻击过该boss可继续攻击")
+        #    return True
         #次数不足
         # 实际攻击者类型None则需要提示玩家
         if npcObjType is None:
@@ -888,9 +929,9 @@
     hasAttackCnt = atkPlayer.NomalDictGetProperty(ChConfig.Def_PDict_WorldBoss_HurtCnt, 0)
     
     if hasAttackCnt >= limitCnt:
-        if BossHurtMng.GetPlayerBossHurt(atkPlayer, defender):
-            GameWorld.DebugLog("攻击过该boss可继续攻击")
-            return True
+        #if BossHurtMng.GetPlayerBossHurt(atkPlayer, defender):
+        #    GameWorld.DebugLog("攻击过该boss可继续攻击")
+        #    return True
         #次数不足
         # 实际攻击者类型None则需要提示玩家
         if npcObjType is None:
@@ -2210,6 +2251,12 @@
     if tagPlayer.GetPlayerAction() == IPY_GameWorld.paSit:
         return ChConfig.Type_Relation_None, ChConfig.Def_PASysMessage_SitNotPK
     
+    if GetIsNewGuy(curPlayer):
+        return ChConfig.Type_Relation_None, ChConfig.Def_PASysMessage_NewGuy
+    
+    if GetIsNewGuy(tagPlayer):
+        return ChConfig.Type_Relation_None, ChConfig.Def_PASysMessage_NotAttackNewGuy
+      
     #攻守双方同一队伍,不可PK,可加增益buff
     #if curPlayerAreaType not in [ShareDefine.gatManor] and CanAlikeTeam(curPlayer, tagPlayer):
     #    #副本队友特殊判断
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index a6ae002..211280b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -1028,13 +1028,13 @@
 ) = range( 0, Def_PA_MaxReason )
 
 #提示原因及对应的提示mark组成的字典
-Def_MessageDic = {Def_PASysMessage_NewGuy:"XW_RY_CancelWay01",            #攻击新手
+Def_MessageDic = {Def_PASysMessage_NewGuy:"FairyGrabBossNewPlayer",            #攻击新手
                   Def_PASysMessage_IsSafeArea: "CannotAtk01",             #安全区域
                   Def_PASysMessage_AttackMode:"AtkModeErr",               #攻击模式
                   Def_PASysMessage_CountrySafe:"PlayerPK_Error_GoalLvLow",#国家保护
                   Def_PASysMessage_IsSafeArea_Country:"Cadres_PK_Lost",   #国家安全区保护
                   Def_PASysMessage_NewGuyNotPK:"PK_lhs_0",                #新手不能PK
-                  Def_PASysMessage_NotAttackNewGuy:"PK_lhs_31379",        #不能攻击新手
+                  Def_PASysMessage_NotAttackNewGuy:"FairyGrabBossNewPlayer",        #不能攻击新手
                   Def_PASysMessage_NotAttackFamily:"Old_andyshao_161795", #不能攻击同家族成员
                   Def_PASysMessage_NotAttackTeam:"PK_lhs_861048",         #不能攻击队友
                   Def_PASysMessage_AttackNotPK:"PK_lhs_202580",           #攻击方PK值过大,不能PK
@@ -1913,6 +1913,7 @@
 Map_Player_AreaReward_GetCnt = "AreaAward_GetCnt%s" # 玩家战场区域福利-累计获得次数
 
 #---地图NPC---
+Map_NPC_ActivityBossRebornCount = 'ActivityBossRebornCount_%s' # 活动boss已刷新只数,参数(标识点)
 Map_NPC_WorldBossLastReBornTick = 'WorldBossLastReBornTick_%s' # 世界boss上次重生时间
 Map_NPC_WorldBossDeadTick = 'WorldBossDeadTick_%s' # 世界boss死亡时间
 Map_NPC_RandomMapNPCID = 'RandMapNPCID_%s' # 当前地图随机NPCID, 参数为标识点mark
@@ -2035,6 +2036,7 @@
 Def_NPCHurtTypeAll    = 4       #所有玩家
 Def_NPCHurtTypeFaction= 5       #阵营
 Def_NPCHurtTypeSpecial= 6       #特殊, 指定某些玩家, 玩家ID取ShareDefine.Def_MapItemInfo_SpecOwner
+Def_NPCHurtTypeFamily = 7       #仙盟 7
 
 #掉落归属类型-NPC表的定义
 DropOwnerType = (
@@ -2045,7 +2047,8 @@
 DropOwnerType_MaxHurtPlayer, # 最大伤血玩家, 伤血不会被重置, 仅限玩家 4
 DropOwnerType_Faction, # 阵营 5
 DropOwnerType_Special, # 特殊 6
-) = range(7)
+DropOwnerType_Family, # 仙盟 7
+) = range(8)
 
 #------------------------------------------------
 #技能类型
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
index d3818c6..80a331a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -1485,6 +1485,54 @@
 
 
 #------------------------------------------------------
+# AC 04 查询仙盟抢Boss所有Boss当前进度 #tagCGQueryAllFamilyBossHurt
+
+class  tagCGQueryAllFamilyBossHurt(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xAC
+        self.SubCmd = 0x04
+        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 = 0xAC
+        self.SubCmd = 0x04
+        return
+
+    def GetLength(self):
+        return sizeof(tagCGQueryAllFamilyBossHurt)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AC 04 查询仙盟抢Boss所有Boss当前进度 //tagCGQueryAllFamilyBossHurt:
+                                Cmd:%s,
+                                SubCmd:%s
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd
+                                )
+        return DumpString
+
+
+m_NAtagCGQueryAllFamilyBossHurt=tagCGQueryAllFamilyBossHurt()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCGQueryAllFamilyBossHurt.Cmd,m_NAtagCGQueryAllFamilyBossHurt.SubCmd))] = m_NAtagCGQueryAllFamilyBossHurt
+
+
+#------------------------------------------------------
 # AC 03 仙魔之争信息查询 #tagCGXMZZInfoQuery
 
 class  tagCGXMZZInfoQuery(Structure):
@@ -4012,6 +4060,66 @@
 
 
 #------------------------------------------------------
+# A2 28 查询仙盟抢Boss伤血列表 #tagCMQueryFamilyBossHurt
+
+class  tagCMQueryFamilyBossHurt(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("ObjID", c_int),    
+                  ("NPCID", c_int),    
+                  ("QueryType", c_ubyte),    # 0-实时仙盟伤血,1-历史仙盟伤血,2-实时玩家伤血,3-历史玩家伤血
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xA2
+        self.SubCmd = 0x28
+        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 = 0xA2
+        self.SubCmd = 0x28
+        self.ObjID = 0
+        self.NPCID = 0
+        self.QueryType = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagCMQueryFamilyBossHurt)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// A2 28 查询仙盟抢Boss伤血列表 //tagCMQueryFamilyBossHurt:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                ObjID:%d,
+                                NPCID:%d,
+                                QueryType:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.ObjID,
+                                self.NPCID,
+                                self.QueryType
+                                )
+        return DumpString
+
+
+m_NAtagCMQueryFamilyBossHurt=tagCMQueryFamilyBossHurt()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMQueryFamilyBossHurt.Cmd,m_NAtagCMQueryFamilyBossHurt.SubCmd))] = m_NAtagCMQueryFamilyBossHurt
+
+
+#------------------------------------------------------
 # A2 27 查询地图NPC数量信息 #tagCMQueryNPCCntInfo
 
 class  tagCMQueryNPCCntInfo(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index 610934e..d989dba 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -4237,6 +4237,162 @@
 
 
 #------------------------------------------------------
+# AC 10 仙盟抢Boss所有Boss伤血进度信息 #tagGCAllFamilyBossHurtInfoList
+
+class  tagGCFamilyBossHurtInfo(Structure):
+    NPCID = 0    #(DWORD NPCID)
+    CurHP = 0    #(DWORD CurHP)
+    CurHPEx = 0    #(DWORD CurHPEx)
+    MaxHP = 0    #(DWORD MaxHP)
+    MaxHPEx = 0    #(DWORD MaxHPEx)
+    FamilyID = 0    #(DWORD FamilyID)// 最大实时伤血仙盟
+    NameLen = 0    #(BYTE NameLen)
+    FamilyName = ""    #(String FamilyName)
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.NPCID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.CurHP,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.CurHPEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.MaxHP,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.MaxHPEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FamilyID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.NameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.FamilyName,_pos = CommFunc.ReadString(_lpData, _pos,self.NameLen)
+        return _pos
+
+    def Clear(self):
+        self.NPCID = 0
+        self.CurHP = 0
+        self.CurHPEx = 0
+        self.MaxHP = 0
+        self.MaxHPEx = 0
+        self.FamilyID = 0
+        self.NameLen = 0
+        self.FamilyName = ""
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 1
+        length += len(self.FamilyName)
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.NPCID)
+        data = CommFunc.WriteDWORD(data, self.CurHP)
+        data = CommFunc.WriteDWORD(data, self.CurHPEx)
+        data = CommFunc.WriteDWORD(data, self.MaxHP)
+        data = CommFunc.WriteDWORD(data, self.MaxHPEx)
+        data = CommFunc.WriteDWORD(data, self.FamilyID)
+        data = CommFunc.WriteBYTE(data, self.NameLen)
+        data = CommFunc.WriteString(data, self.NameLen, self.FamilyName)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                NPCID:%d,
+                                CurHP:%d,
+                                CurHPEx:%d,
+                                MaxHP:%d,
+                                MaxHPEx:%d,
+                                FamilyID:%d,
+                                NameLen:%d,
+                                FamilyName:%s
+                                '''\
+                                %(
+                                self.NPCID,
+                                self.CurHP,
+                                self.CurHPEx,
+                                self.MaxHP,
+                                self.MaxHPEx,
+                                self.FamilyID,
+                                self.NameLen,
+                                self.FamilyName
+                                )
+        return DumpString
+
+
+class  tagGCAllFamilyBossHurtInfoList(Structure):
+    Head = tagHead()
+    NPCCount = 0    #(BYTE NPCCount)// 个数
+    NPCHurtInfo = list()    #(vector<tagGCFamilyBossHurtInfo> NPCHurtInfo)// NPC伤血信息列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xAC
+        self.Head.SubCmd = 0x10
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.NPCCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.NPCCount):
+            temNPCHurtInfo = tagGCFamilyBossHurtInfo()
+            _pos = temNPCHurtInfo.ReadData(_lpData, _pos)
+            self.NPCHurtInfo.append(temNPCHurtInfo)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xAC
+        self.Head.SubCmd = 0x10
+        self.NPCCount = 0
+        self.NPCHurtInfo = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        for i in range(self.NPCCount):
+            length += self.NPCHurtInfo[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.NPCCount)
+        for i in range(self.NPCCount):
+            data = CommFunc.WriteString(data, self.NPCHurtInfo[i].GetLength(), self.NPCHurtInfo[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                NPCCount:%d,
+                                NPCHurtInfo:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.NPCCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagGCAllFamilyBossHurtInfoList=tagGCAllFamilyBossHurtInfoList()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCAllFamilyBossHurtInfoList.Head.Cmd,m_NAtagGCAllFamilyBossHurtInfoList.Head.SubCmd))] = m_NAtagGCAllFamilyBossHurtInfoList
+
+
+#------------------------------------------------------
 # AC 08 boss复活点数通知 #tagGCBossRebornPoint
 
 class  tagGCBossRebornPoint(Structure):
@@ -16349,6 +16505,183 @@
 
 
 #------------------------------------------------------
+# A7 15 通知仙盟抢Boss伤血信息 #tagMCFamilyBossHurtList
+
+class  tagMCFamilyBossHurt(Structure):
+    FamilyID = 0    #(DWORD FamilyID)// 所属仙盟ID
+    HurtID = 0    #(DWORD HurtID)// 伤血的ID, 根据伤血类型表示不同的ID, 如仙盟ID或玩家ID
+    NameLen = 0    #(BYTE NameLen)
+    HurtName = ""    #(String HurtName)
+    HurtValue = 0    #(DWORD HurtValue)// 累计伤血,求余1亿的值
+    HurtValueEx = 0    #(DWORD HurtValueEx)// 累计伤血,整除1亿的值
+    InitTick = 0    #(DWORD InitTick)// 伤血初始tick,用于排序,先按伤血倒序排,再按tick正序排
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.FamilyID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.HurtID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.NameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.HurtName,_pos = CommFunc.ReadString(_lpData, _pos,self.NameLen)
+        self.HurtValue,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.HurtValueEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.InitTick,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        return _pos
+
+    def Clear(self):
+        self.FamilyID = 0
+        self.HurtID = 0
+        self.NameLen = 0
+        self.HurtName = ""
+        self.HurtValue = 0
+        self.HurtValueEx = 0
+        self.InitTick = 0
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 4
+        length += 1
+        length += len(self.HurtName)
+        length += 4
+        length += 4
+        length += 4
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.FamilyID)
+        data = CommFunc.WriteDWORD(data, self.HurtID)
+        data = CommFunc.WriteBYTE(data, self.NameLen)
+        data = CommFunc.WriteString(data, self.NameLen, self.HurtName)
+        data = CommFunc.WriteDWORD(data, self.HurtValue)
+        data = CommFunc.WriteDWORD(data, self.HurtValueEx)
+        data = CommFunc.WriteDWORD(data, self.InitTick)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                FamilyID:%d,
+                                HurtID:%d,
+                                NameLen:%d,
+                                HurtName:%s,
+                                HurtValue:%d,
+                                HurtValueEx:%d,
+                                InitTick:%d
+                                '''\
+                                %(
+                                self.FamilyID,
+                                self.HurtID,
+                                self.NameLen,
+                                self.HurtName,
+                                self.HurtValue,
+                                self.HurtValueEx,
+                                self.InitTick
+                                )
+        return DumpString
+
+
+class  tagMCFamilyBossHurtList(Structure):
+    Head = tagHead()
+    ObjID = 0    #(DWORD ObjID)
+    NPCID = 0    #(DWORD NPCID)
+    HurtType = 0    #(BYTE HurtType)// 0-实时仙盟伤血,1-历史仙盟伤血,2-实时玩家伤血,3-历史玩家伤血
+    IsSort = 0    #(BYTE IsSort)// 是否排序过的,一般boss被击杀后会统一同步一次排序过的最终结果,其他情况下客户端自己排序
+    HurtCount = 0    #(WORD HurtCount)// 伤血个数
+    HurtList = list()    #(vector<tagMCFamilyBossHurt> HurtList)// 伤血列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xA7
+        self.Head.SubCmd = 0x15
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.ObjID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.NPCID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.HurtType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.IsSort,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.HurtCount,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        for i in range(self.HurtCount):
+            temHurtList = tagMCFamilyBossHurt()
+            _pos = temHurtList.ReadData(_lpData, _pos)
+            self.HurtList.append(temHurtList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xA7
+        self.Head.SubCmd = 0x15
+        self.ObjID = 0
+        self.NPCID = 0
+        self.HurtType = 0
+        self.IsSort = 0
+        self.HurtCount = 0
+        self.HurtList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 4
+        length += 4
+        length += 1
+        length += 1
+        length += 2
+        for i in range(self.HurtCount):
+            length += self.HurtList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.ObjID)
+        data = CommFunc.WriteDWORD(data, self.NPCID)
+        data = CommFunc.WriteBYTE(data, self.HurtType)
+        data = CommFunc.WriteBYTE(data, self.IsSort)
+        data = CommFunc.WriteWORD(data, self.HurtCount)
+        for i in range(self.HurtCount):
+            data = CommFunc.WriteString(data, self.HurtList[i].GetLength(), self.HurtList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                ObjID:%d,
+                                NPCID:%d,
+                                HurtType:%d,
+                                IsSort:%d,
+                                HurtCount:%d,
+                                HurtList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.ObjID,
+                                self.NPCID,
+                                self.HurtType,
+                                self.IsSort,
+                                self.HurtCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCFamilyBossHurtList=tagMCFamilyBossHurtList()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCFamilyBossHurtList.Head.Cmd,m_NAtagMCFamilyBossHurtList.Head.SubCmd))] = m_NAtagMCFamilyBossHurtList
+
+
+#------------------------------------------------------
 # A7 03 通知进入副本时间 #tagMCFBEnterTickList
 
 class  tagMCFBEnterTick(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Boss.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Boss.py
index 4be72f3..e9213c6 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Boss.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Boss.py
@@ -40,21 +40,22 @@
     mapID = GameWorld.GetMap().GetMapID()
 
     dataList = IpyGameDataPY.GetIpyGameDataByCondition('BOSSInfo', {"MapID":mapID}, returnList=True)
-    if not dataList:
-        return
-    for ipyData in dataList:
-        bossID = ipyData.GetNPCID()
-        if not bossID:
-            continue
-        
-        key = ShareDefine.Def_Notify_WorldKey_GameWorldBossReborn % bossID
-        GameWorld.GetGameWorld().SetGameWorldDict(key, 1)
-        
-        bossKey = ChConfig.Map_NPC_WorldBossLastReBornTick % bossID
-        GameWorld.GetGameFB().SetGameFBDict(bossKey, 0)
-        
-        bossKey = ChConfig.Map_NPC_WorldBossLastReBornTick % ipyData.GetStoneNPCID()
-        GameWorld.GetGameFB().SetGameFBDict(bossKey, 0)
+    if dataList:
+        for ipyData in dataList:
+            bossID = ipyData.GetNPCID()
+            if not bossID:
+                continue
+            
+            key = ShareDefine.Def_Notify_WorldKey_GameWorldBossReborn % bossID
+            GameWorld.GetGameWorld().SetGameWorldDict(key, 1)
+            
+            bossKey = ChConfig.Map_NPC_WorldBossLastReBornTick % bossID
+            GameWorld.GetGameFB().SetGameFBDict(bossKey, 0)
+            
+            bossKey = ChConfig.Map_NPC_WorldBossLastReBornTick % ipyData.GetStoneNPCID()
+            GameWorld.GetGameFB().SetGameFBDict(bossKey, 0)
+            
+            GameWorld.GetGameFB().SetGameFBDict(ChConfig.Map_NPC_ActivityBossRebornCount % ipyData.GetRefreshMark(), 0)
         
     gameNPCManager = GameWorld.GetNPCManager()
     tick = GameWorld.GetGameWorld().GetTick()
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/KillScreenNPC.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/KillScreenNPC.py
index 1d9e8f3..3675312 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/KillScreenNPC.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/KillScreenNPC.py
@@ -88,11 +88,13 @@
         return
     
     curHP = GameObj.GetHP(curNPC)
-    if curPlayer.GetTeamID() > 0:
-        AttackCommon.AddHurtValue(curNPC, curPlayer.GetTeamID(), ChConfig.Def_NPCHurtTypeTeam, curHP)
-        AttackCommon.AddTeamPlayerHurtValue(curNPC, curPlayer.GetTeamID(), curPlayer.GetPlayerID(), curHP)
-    else:
-        AttackCommon.AddHurtValue(curNPC, curPlayer.GetPlayerID(), ChConfig.Def_NPCHurtTypePlayer, curHP)
+    AttackCommon.NPCAddObjInHurtList(curPlayer, curNPC, curHP, curHP)
+    
+    #if curPlayer.GetTeamID() > 0:
+    #    AttackCommon.AddHurtValue(curNPC, curPlayer.GetTeamID(), ChConfig.Def_NPCHurtTypeTeam, curHP)
+    #    AttackCommon.AddTeamPlayerHurtValue(curNPC, curPlayer.GetTeamID(), curPlayer.GetPlayerID(), curHP)
+    #else:
+    #    AttackCommon.AddHurtValue(curNPC, curPlayer.GetPlayerID(), ChConfig.Def_NPCHurtTypePlayer, curHP)
     
     #统一调用攻击结束动作
     GameObj.SetHP(curNPC, 0)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintNPCHurt.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintNPCHurt.py
index ba34515..fb307e5 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintNPCHurt.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintNPCHurt.py
@@ -16,6 +16,8 @@
 #-------------------------------------------------------------------------------
 import GameWorld
 import IPY_GameWorld
+import FamilyRobBoss
+import NPCCommon
 import ChConfig
 
 ##查看点选的NPC仇恨列表
@@ -36,7 +38,13 @@
         GameWorld.DebugAnswer(curPlayer, "objID(%s) 错误 找不到对应NPC" % objID)
         return
     
-    GameWorld.DebugAnswer(curPlayer, "-------------------------------")
+    GameWorld.DebugAnswer(curPlayer, "---%s,ID=%s,team=%s,family=%s" 
+                          % (GameWorld.GetGameWorld().GetTick()%1000, curPlayer.GetPlayerID(), curPlayer.GetTeamID(), curPlayer.GetFamilyID()))
+    
+    # 归属仙盟的,取仙盟伤血统计
+    if NPCCommon.GetDropOwnerType(curNPC) == ChConfig.DropOwnerType_Family:
+        FamilyRobBoss.OnGMPrintFamilyOwnerBossHurt(curPlayer, curNPC)
+        return
     
     npcHurtList = curNPC.GetPlayerHurtList()
     if isSort:
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FamilyRobBoss.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FamilyRobBoss.py
new file mode 100644
index 0000000..63e03d9
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FamilyRobBoss.py
@@ -0,0 +1,555 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package GameWorldLogic.FamilyRobBoss
+#
+# @todo:仙盟抢boss
+# @author hxp
+# @date 2018-08-29
+# @version 1.0
+#
+# 详细描述: 仙盟抢boss
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2018-08-29 20:00"""
+#-------------------------------------------------------------------------------
+
+import GameWorld
+import ShareDefine
+import IPY_GameWorld
+import NetPackCommon
+import ChPyNetSendPack
+import PlayerControl
+import IpyGameDataPY
+import NPCCommon
+import ChConfig
+import GameObj
+    
+FamilyHurtObjType_Family = 1
+FamilyHurtObjType_Player = 2
+
+## 伤血对象类
+class FamilyHurtObj():
+    
+    def __init__(self, familyID, objType, objID, name):
+        self.familyID = familyID
+        self.objType = objType
+        self.objID = objID
+        self.name = name
+        self.hurtValue = 0
+        self.initTick = GameWorld.GetGameWorld().GetTick()
+        self.startProtectTick = 0 # 伤血开始保护tick, 默认0为不需要保护
+        return
+    
+## 伤血信息类
+class FamilyOwnerBossHurt():
+    
+    def __init__(self):
+        # key = (lineID, objID, npcID)
+        
+        self.familyNowHurtSort = {} # 仙盟当前伤血,排完序的, 伤血类型是仙盟  {key:[FamilyHurtObj, ...], ...}
+        self.familyNowHurtDict = {} # 仙盟当前伤血,伤血可能清除 {key:{familyID:FamilyHurtObj, ...}, ...}
+        
+        self.familyHisHurtDict = {} # 仙盟历史伤血,伤血不会清除 {key:{familyID:FamilyHurtObj, ...}, ...}
+        self.playerHisHurtDict = {} # 玩家历史伤血,伤血不会清除 {key:{playerID:FamilyHurtObj, ...}, ...}
+        
+        self.familyPlayerIDDict = {} # 仙盟成员ID列表字典,{key:{familyID:[playerID, ...], ...}, ...}
+
+        self.bossHPInfo = {} # boss当前血量信息,{key:[curHP, maxHP], ...},用于同步GameServer
+        
+        self.lastSortTick = 0
+        GameWorld.DebugLog("FamilyBossHurtMgr __init__")
+        return
+    
+    def ClearNPCHurt(self, key):
+        self.familyNowHurtSort.pop(key, 0)
+        self.familyNowHurtDict.pop(key, 0)
+        self.familyHisHurtDict.pop(key, 0)
+        self.playerHisHurtDict.pop(key, 0)
+        self.familyPlayerIDDict.pop(key, 0)
+        self.bossHPInfo = {}
+        return
+    
+    def GetPlayerHisHurtDict(self):
+        return
+    
+g_familyOwnerBossHurt = None
+def GetFamilyHurtMgr():
+    global g_familyOwnerBossHurt
+    if not g_familyOwnerBossHurt:
+        g_familyOwnerBossHurt = FamilyOwnerBossHurt()
+    return g_familyOwnerBossHurt
+
+def OnGMPrintFamilyOwnerBossHurt(curPlayer, curNPC):
+    ## GM显示仙盟归属boss伤血信息
+    
+    lineID = GameWorld.GetGameWorld().GetLineID()
+    objID = curNPC.GetID()
+    bossID = curNPC.GetNPCID()
+    key = (lineID, objID, bossID)
+    
+    GameWorld.DebugAnswer(curPlayer, "NPCID(%s,%s), HP: %s/%s" % (objID, bossID, GameObj.GetHP(curNPC), GameObj.GetMaxHP(curNPC)))
+    
+    hurtMgr = GetFamilyHurtMgr()
+    npcFamilyNowHurtDict = hurtMgr.familyNowHurtDict.get(key, {})
+    npcFamilyHisHurtDict = hurtMgr.familyHisHurtDict.get(key, {})
+    npcPlayerHisHurtDict = hurtMgr.playerHisHurtDict.get(key, {})
+    
+    npcNowHurtFamilyList = npcFamilyNowHurtDict.values()
+    npcNowHurtFamilyList.sort(cmp=CmpFamilyOwnerBossHurtSort)
+    
+    npcHisHurtFamilyList = npcFamilyHisHurtDict.values()
+    npcHisHurtFamilyList.sort(cmp=CmpFamilyOwnerBossHurtSort)
+    
+    npcHisHurtPlayerList = npcPlayerHisHurtDict.values()
+    npcHisHurtPlayerList.sort(cmp=CmpFamilyOwnerBossHurtSort)
+    
+    GameWorld.DebugAnswer(curPlayer, "实时伤血仙盟数: %s" % len(npcNowHurtFamilyList))
+    for i, hurtObj in enumerate(npcNowHurtFamilyList, 1):
+        GameWorld.DebugAnswer(curPlayer, "%s,仙盟ID=%s,伤血=%s" % (i, hurtObj.objID, hurtObj.hurtValue))
+        
+    GameWorld.DebugAnswer(curPlayer, "历史伤血仙盟数: %s" % (len(npcHisHurtFamilyList)))
+    for i, hurtObj in enumerate(npcHisHurtFamilyList, 1):
+        GameWorld.DebugAnswer(curPlayer, "%s,仙盟ID=%s,伤血=%s" % (i, hurtObj.objID, hurtObj.hurtValue))
+    
+    GameWorld.DebugAnswer(curPlayer, "历史伤血玩家数: %s" % (len(npcHisHurtPlayerList)))
+    for i, hurtObj in enumerate(npcHisHurtPlayerList, 1):
+        GameWorld.DebugAnswer(curPlayer, "%s,玩家ID=%s,伤血=%s,仙盟ID=%s" % (i, hurtObj.objID, hurtObj.hurtValue, hurtObj.familyID))
+        
+    return
+
+def OnPlayerHurtFamilyOwnerBoss(curPlayer, curBoss, hurtValue):
+    ## 仙盟玩家对仙盟归属boss造成伤害
+    
+    GameWorld.DebugLog("OnPlayerHurtFamilyOwnerBoss hurtValue=%s" % hurtValue)
+    if hurtValue <= 0:
+        return
+    
+    if not curPlayer or not curBoss:
+        return
+    
+    curObjType = curPlayer.GetGameObjType()
+    if curObjType != IPY_GameWorld.gotPlayer:
+        return
+    
+    curBossType = curBoss.GetGameObjType()
+    if curBossType != IPY_GameWorld.gotNPC:
+        return
+    
+    if NPCCommon.GetDropOwnerType(curBoss) != ChConfig.DropOwnerType_Family:
+        return
+    
+    lineID = GameWorld.GetGameWorld().GetLineID()
+    objID = curBoss.GetID()
+    bossID = curBoss.GetNPCID()
+    
+    playerID = curPlayer.GetPlayerID()
+    familyID = curPlayer.GetFamilyID()
+    GameWorld.DebugLog("仙盟抢Boss增加伤血: lineID=%s,objID=%s,bossID=%s,familyID=%s,hurtValue=%s" 
+                       % (lineID, objID, bossID, familyID, hurtValue), playerID)
+    
+    key = (lineID, objID, bossID)
+    hurtMgr = GetFamilyHurtMgr()
+    
+    AddPlayerHurtFamilyOwnerBoss(curPlayer, curBoss, hurtMgr, key, hurtValue)
+    return
+
+def AddPlayerHurtFamilyOwnerBoss(curPlayer, curBoss, hurtMgr, key, hurtValue):
+    ## 添加仙盟成员伤血
+    
+    if hurtValue < 0:
+        return
+    
+    playerID = curPlayer.GetPlayerID()
+    familyID = curPlayer.GetFamilyID()
+    playerName = curPlayer.GetPlayerName()
+    familyName = curPlayer.GetFamilyName()
+    
+    addHurtDict = {"FamilyNowHurt":[hurtMgr.familyNowHurtDict, FamilyHurtObjType_Family],
+                   "FamilyHisHurt":[hurtMgr.familyHisHurtDict, FamilyHurtObjType_Family],
+                   "PlayerHisHurt":[hurtMgr.playerHisHurtDict, FamilyHurtObjType_Player],
+                   }
+    
+    for mark, hurtInfo in addHurtDict.items():
+        hurtDict, hurtType = hurtInfo
+        if key not in hurtDict:
+            hurtDict[key] = {}
+        objHurtDict = hurtDict[key]
+        hurtID = familyID if hurtType == FamilyHurtObjType_Family else playerID
+        if hurtID not in objHurtDict:
+            hurtName = familyName if hurtType == FamilyHurtObjType_Family else playerName
+            objHurtDict[hurtID] = FamilyHurtObj(familyID, hurtType, hurtID, hurtName)
+        hurtObj = objHurtDict[hurtID]
+        hurtObj.hurtValue += hurtValue
+        GameWorld.DebugLog("    更新伤血%s: hurtType=%s,hurtID=%s,hurtValue=%s" 
+                           % (mark, hurtType, hurtID, hurtObj.hurtValue), playerID)
+        
+    # 加入关联的仙盟成员ID列表
+    npcFamilyPlayerIDDict = hurtMgr.familyPlayerIDDict.get(key, {})
+    npcFamilyPlayerIDList = npcFamilyPlayerIDDict.get(familyID, [])
+    if playerID not in npcFamilyPlayerIDList:
+        npcFamilyPlayerIDList.append(playerID)
+        npcFamilyPlayerIDDict[familyID] = npcFamilyPlayerIDList
+        hurtMgr.familyPlayerIDDict[key] = npcFamilyPlayerIDDict
+        
+    # 更新boss当前血量信息
+    npcHP = GameObj.GetHP(curBoss)
+    npcMaxHP = GameObj.GetMaxHP(curBoss)
+    hurtMgr.bossHPInfo[key] = [npcHP, npcMaxHP]
+    
+    # 血量百分比广播
+    npcHPPerNotifyList = IpyGameDataPY.GetFuncEvalCfg("FairyGrabBoss", 4)
+    hpPerLogicMark = curBoss.GetDictByKey(ChConfig.Def_NPC_Dict_HPPerLogicMark)
+    logicHPPerList = npcHPPerNotifyList[hpPerLogicMark:]
+    if logicHPPerList:
+        npcHPPer = int(npcHP * 100.0 / npcMaxHP)
+        notifyPer, notifyKey = logicHPPerList[0]
+        if npcHPPer <= notifyPer:
+            curBoss.SetDict(ChConfig.Def_NPC_Dict_HPPerLogicMark, hpPerLogicMark + 1)
+            PlayerControl.WorldNotify(0, notifyKey, [curBoss.GetNPCID()])
+            
+    return
+
+def FamilyOwnerBossOnReborn(curBoss):
+    ## 仙盟归属boss重生
+    lineID = GameWorld.GetGameWorld().GetLineID()
+    objID = curBoss.GetID()
+    bossID = curBoss.GetNPCID()
+    key = (lineID, objID, bossID)
+    
+    hurtMgr = GetFamilyHurtMgr()
+    hurtMgr.ClearNPCHurt(key)
+    hurtMgr.bossHPInfo[key] = [GameObj.GetHP(curBoss), GameObj.GetMaxHP(curBoss)]
+    return
+
+def FamilyOwnerBossOnKilled(curBoss, ownerFamilyID):
+    '''仙盟归属boss被击杀
+                     归属ID由外层归属算好传入,不由伤血决定,防止归属逻辑修改时改到逻辑
+                     因为有伤血保护,如果伤血第一不算归属的话,逻辑就需要修改
+    '''
+    
+    lineID = GameWorld.GetGameWorld().GetLineID()
+    objID = curBoss.GetID()
+    bossID = curBoss.GetNPCID()
+    key = (lineID, objID, bossID)
+    maxHP = GameObj.GetMaxHP(curBoss)
+    
+    GameWorld.Log("FamilyOwnerBossOnKilled lineID=%s,objID=%s,bossID=%s,maxHP=%s,ownerFamilyID=%s" 
+                  % (lineID, objID, bossID, maxHP, ownerFamilyID))
+    
+    hurtMgr = GetFamilyHurtMgr()
+    
+    npcPlayerHisHurtDict = hurtMgr.playerHisHurtDict.get(key, {})
+    npcFamilyHisHurtDict = hurtMgr.familyHisHurtDict.get(key, {})
+    npcFamilyPlayerIDDict = hurtMgr.familyPlayerIDDict.get(key, {})
+    
+    if ownerFamilyID in npcFamilyHisHurtDict:
+        ownerFamilyHisHurt = npcFamilyHisHurtDict[ownerFamilyID]
+        PlayerControl.WorldNotify(0, "FairyGrabBossDead", [ownerFamilyHisHurt.name, bossID])
+        
+    # 击杀结算前强制排序历史玩家伤血
+    npcHisHurtPlayerList = npcPlayerHisHurtDict.values()
+    npcHisHurtPlayerList.sort(cmp=CmpFamilyOwnerBossHurtSort)
+    
+    # 归属仙盟前x名玩家额外奖励,算历史伤血
+    batchPlayerIDList, batchAddItemList, batchParamList = [], [], []
+    ownerFamilyPlayerOrderAwardDict = IpyGameDataPY.GetFuncEvalCfg("FairyGrabBoss", 1, {})
+    curNPCPlayerOrderAwardDict = ownerFamilyPlayerOrderAwardDict.get(bossID, {})
+    maxOrder = max(curNPCPlayerOrderAwardDict) if curNPCPlayerOrderAwardDict else 0
+    curOrder = 0
+    #orderPlayerNameList = []
+    for hurtPlayer in npcHisHurtPlayerList:
+        # 只算归属仙盟的
+        if hurtPlayer.familyID != ownerFamilyID:
+            continue
+        curOrder += 1
+        awardItemList = GameWorld.GetDictValueByRangeKey(curNPCPlayerOrderAwardDict, curOrder, [])
+        batchPlayerIDList.append([hurtPlayer.objID])
+        batchAddItemList.append(awardItemList)
+        batchParamList.append([bossID, curOrder])
+        #orderPlayerNameList.append(hurtPlayer.name)
+        GameWorld.Log("    归属仙盟第%s名额外奖励: %s" % (curOrder, awardItemList))
+        if curOrder >= maxOrder:
+            break
+    if batchPlayerIDList:
+        PlayerControl.SendMailBatch("FairyGrabBoss2", batchPlayerIDList, batchAddItemList, batchParamList)
+        #PlayerControl.WorldNotify(0, "FairyGrabBossRank", orderPlayerNameList + [bossID])
+        
+    # 参与仙盟历史伤血奖励, 算历史伤血
+    joinAwardNeedHurtHPPer = IpyGameDataPY.GetFuncCfg("FairyGrabBoss", 2)
+    joinFamilyAwardDict = IpyGameDataPY.GetFuncEvalCfg("FairyGrabBoss", 3, {})
+    curNPCJoinFamilyAwardList = joinFamilyAwardDict.get(bossID, [])
+    joinAwardPlayerIDList = []
+    GameWorld.Log("    参与奖需求伤血比例: %s%%, 参与奖励:%s" % (joinAwardNeedHurtHPPer, curNPCJoinFamilyAwardList))
+    for familyID, hurtFamily in npcFamilyHisHurtDict.items():
+        familyHisHurt = hurtFamily.hurtValue
+        hurtPer = int(familyHisHurt * 100.0 / maxHP)
+        familyPlayerIDList = npcFamilyPlayerIDDict.get(familyID, [])
+        GameWorld.Log("    仙盟ID=%s, 历史伤血=%s, 伤血比例: %s%%, 参与玩家ID=%s" % (familyID, familyHisHurt, hurtPer, familyPlayerIDList))
+        if hurtPer < joinAwardNeedHurtHPPer:
+            continue
+        joinAwardPlayerIDList += familyPlayerIDList
+    if joinAwardPlayerIDList:
+        PlayerControl.SendMailByKey("FairyGrabBoss1", joinAwardPlayerIDList, curNPCJoinFamilyAwardList, [bossID, joinAwardNeedHurtHPPer])
+        
+    # 同步最终结果给所有参与过的玩家
+    hurtPack = __GetFamilyOwnerBossHurtPack(hurtMgr, key, objID, bossID, 0)
+    copyPlayerMng = GameWorld.GetMapCopyPlayerManager()
+    npcFamilyPlayerIDDict = hurtMgr.familyPlayerIDDict.get(key, {})
+    for playerIDList in npcFamilyPlayerIDDict.values():
+        for playerID in playerIDList:
+            curPlayer = copyPlayerMng.FindPlayerByID(playerID)
+            if curPlayer:
+                NetPackCommon.SendFakePack(curPlayer, hurtPack)
+                
+    # 伤血在NPCCommon统一清
+    return
+
+def RefreshFamilyOwnerNPCHurt(npcControl, curNPC, tick, refreshInterval):
+    ## 仙盟归属boss刷新伤血列表
+    
+    lineID = GameWorld.GetGameWorld().GetLineID()
+    objID = curNPC.GetID()
+    bossID = curNPC.GetNPCID()
+    key = (lineID, objID, bossID)
+    
+    hurtMgr = GetFamilyHurtMgr()
+    refreshPoint = curNPC.GetRefreshPosAt(curNPC.GetCurRefreshPointIndex())
+    
+    # refreshInterval 0时立即刷新
+    if tick - curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_LastRefreshHurtTick) < refreshInterval:
+        return GetFamilyOwnerAtkObj(npcControl, refreshPoint, hurtMgr, key)
+    curNPC.SetDict(ChConfig.Def_NPC_Dict_LastRefreshHurtTick, tick)
+    
+    npcPlayerHisHurtDict = hurtMgr.playerHisHurtDict.get(key, {}) # 玩家历史伤血,伤血不会清除 {key:{playerID:FamilyHurtObj, ...}, ...}
+    
+    # 1. 把NPC视野中没有造成伤害的玩家初始化伤血
+    seePlayerCount = curNPC.GetInSightObjCount()
+    for i in xrange(seePlayerCount):
+        seeObj = curNPC.GetInSightObjByIndex(i)
+        if seeObj == None :
+            continue
+        
+        if not seeObj.GetVisible():
+            continue
+        
+        seeObjType = seeObj.GetGameObjType()
+        if seeObjType != IPY_GameWorld.gotPlayer:
+            continue
+        seePlayer = GameWorld.GetObj(seeObj.GetID(), seeObjType)
+        
+        if seePlayer.GetPlayerID() not in npcPlayerHisHurtDict:
+            GameWorld.DebugLog("仙盟归属Boss看到玩家,加入伤血!lineID=%s, objID=%s, bossID=%s,playerID=%s" 
+                               % (lineID, objID, bossID, seePlayer.GetPlayerID()))
+            AddPlayerHurtFamilyOwnerBoss(seePlayer, curNPC, hurtMgr, key, 0)
+            
+    npcFamilyNowHurtDict = hurtMgr.familyNowHurtDict.get(key, {}) # 仙盟当前伤血,伤血可能清除 {key:{familyID:FamilyHurtObj, ...}, ...}
+    npcPlayerHisHurtDict = hurtMgr.playerHisHurtDict.get(key, {}) # 玩家历史伤血,伤血不会清除 {key:{playerID:FamilyHurtObj, ...}, ...}
+    
+    npcFamilyPlayerIDDict = hurtMgr.familyPlayerIDDict.get(key, {}) # 仙盟成员ID列表字典,{key:{familyID:[playerID, ...], ...}, ...}
+    
+    clearHurtFamilyIDList = [] # 要清除伤血的仙盟ID列表
+    
+    for familyID in npcFamilyNowHurtDict.keys():
+        
+        if familyID not in npcFamilyPlayerIDDict:
+            continue
+        
+        isInProtect = False
+        
+        familyPlayerIDList = npcFamilyPlayerIDDict[familyID]
+        for playerID in familyPlayerIDList:
+            
+            if playerID not in npcPlayerHisHurtDict:
+                continue
+            
+            playerHurtObj = npcPlayerHisHurtDict[playerID]
+            hurtPlayer = GameWorld.GetObj(playerID, IPY_GameWorld.gotPlayer)
+            
+            # 玩家在该boss范围内
+            if hurtPlayer and npcControl.GetIsInRefreshPoint(hurtPlayer.GetPosX(), hurtPlayer.GetPosY(), refreshPoint):
+                isInProtect = True
+                playerHurtObj.startProtectTick = 0 # 重置保护tick
+                #GameWorld.DebugLog("有成员在boss范围内,保护中!familyID=%s,playerID=%s" % (familyID, playerID))
+                break
+            
+            startProtectTick = playerHurtObj.startProtectTick
+            # 此boss与世界boss保护逻辑不一样,该boss只要是不在范围内的均视为开始保护
+            if not startProtectTick:
+                #说明: 这里为了减少循环次数,有满足保护条件的就直接break了,所以理论上最大保护延迟为所有成员都不满足条件后才激活保护tick判断
+                playerHurtObj.startProtectTick = tick # 激活开始保护tick
+                #GameWorld.DebugLog("激活成员开始保护tick!familyID=%s,playerID=%s,startProtectTick=%s" % (familyID, playerID, tick))
+                isInProtect = True
+                break
+            
+            elif tick - startProtectTick < IpyGameDataPY.GetFuncCfg("BossHurtValue", 1) * 1000:
+                isInProtect = True
+                #GameWorld.DebugLog("有成员在保护时间内,保护中!familyID=%s,playerID=%s,startProtectTick=%s,%s" 
+                #                   % (familyID, playerID, startProtectTick, tick - startProtectTick))
+                break
+            
+        if not isInProtect:
+            clearHurtFamilyIDList.append(familyID)
+                
+    for clearHurtFamilyID in clearHurtFamilyIDList:
+        npcFamilyNowHurtDict.pop(clearHurtFamilyID, 0)
+        npcFamilyPlayerIDDict.pop(clearHurtFamilyID, 0)
+        GameWorld.Log("清除仙盟伤血: lineID=%s,objID=%s,bossID=%s" % (lineID, objID, bossID))
+        
+    # 排序
+    npcNowHurtFamilyList = npcFamilyNowHurtDict.values()
+    npcNowHurtFamilyList.sort(cmp=CmpFamilyOwnerBossHurtSort)
+    hurtMgr.familyNowHurtSort[key] = npcNowHurtFamilyList # 注意伤血第一名不一定是归属, 因为有伤血保护
+    
+    return GetFamilyOwnerAtkObj(npcControl, refreshPoint, hurtMgr, key)
+
+def CmpFamilyOwnerBossHurtSort(hurtObj1, hurtObj2):
+    
+    # 伤血倒序
+    ret = cmp(hurtObj2.hurtValue, hurtObj1.hurtValue)
+    if ret != 0:
+        return ret
+    
+    # 创建时间正序
+    ret = cmp(hurtObj1.initTick, hurtObj2.initTick)
+    if ret != 0:
+        return ret
+    
+    return 0
+
+def GetFamilyOwnerAtkObj(npcControl, refreshPoint, hurtMgr, key):
+    '''获取仙盟归属boss攻击目标, 攻击在boss范围内的归属仙盟成员,至于打谁,随便
+    '''
+    
+    if key not in hurtMgr.familyNowHurtSort or key not in hurtMgr.familyPlayerIDDict:
+        return
+    
+    npcFamilyNowHurtSortList = hurtMgr.familyNowHurtSort[key]
+    npcFamilyPlayerIDDict = hurtMgr.familyPlayerIDDict[key]
+    ownerFamilyID = 0
+    
+    for i, hurtFamily in enumerate(npcFamilyNowHurtSortList):
+        familyID = hurtFamily.familyID
+        if i == 0:
+            ownerFamilyID = familyID # 策划伤血第一就是归属仙盟ID
+            
+        if familyID not in npcFamilyPlayerIDDict:
+            continue
+        familyPlayerIDList = npcFamilyPlayerIDDict[familyID]
+        for playerID in familyPlayerIDList:
+            hurtPlayer = GameWorld.GetObj(playerID, IPY_GameWorld.gotPlayer)
+            if hurtPlayer and npcControl.GetIsInRefreshPoint(hurtPlayer.GetPosX(), hurtPlayer.GetPosY(), refreshPoint):
+                return hurtPlayer, ownerFamilyID
+    return
+
+def OnFamilyOwnerBossProcess(tick):
+    ''' 仙盟归属boss伤血定时处理,同步GameServer
+    '''
+    
+    hurtMgr = GetFamilyHurtMgr()
+    # 没有boss血量信息,不需要处理排序
+    if not hurtMgr.bossHPInfo:
+        return
+    
+    if not hurtMgr.lastSortTick:
+        hurtMgr.lastSortTick = tick
+        return
+    
+    # 10秒同步一次, 排序间隔由NPCAI决定
+    if tick - hurtMgr.lastSortTick < 10000:
+        return
+    hurtMgr.lastSortTick = tick
+    
+    syncMsg = {}
+    for key, bossHPInfo in hurtMgr.bossHPInfo.items():
+        lineID, objID, bossID = key
+        curHP, maxHP = bossHPInfo
+        
+        firstFamilyID = 0
+        firstFamilyName = ""
+        
+        nowHurtList = hurtMgr.familyNowHurtSort.get(key, [])
+        if nowHurtList:
+            firstFamilyHurtObj = nowHurtList[0]
+            firstFamilyID = firstFamilyHurtObj.familyID
+            firstFamilyName = firstFamilyHurtObj.name
+            
+        syncMsg[bossID] = [curHP, maxHP, firstFamilyID, firstFamilyName]
+        
+    #GameWorld.DebugLog("同步GameServer仙盟归属boss汇总信息: %s" % syncMsg, GameWorld.GetGameWorld().GetLineID())
+    syncMsg = str(syncMsg)
+    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "FamilyOwnerBossInfo", syncMsg, len(syncMsg))
+    return
+
+def ClearFamilyOwnerBossHurt(curBoss):
+    ## 清除对应objID伤血
+    
+    lineID = GameWorld.GetGameWorld().GetLineID()
+    objID = curBoss.GetID()
+    bossID = curBoss.GetNPCID()
+    
+    key = (lineID, objID, bossID)
+    hurtMgr = GetFamilyHurtMgr()
+    hurtMgr.ClearNPCHurt(key)
+    
+    GameWorld.DebugLog("ClearFamilyOwnerBossHurt lineID=%s, objID=%s, bossID=%s" % (lineID, objID, bossID))
+    return
+
+#// A2 28 查询仙盟抢Boss伤血列表 #tagCMQueryFamilyBossHurt
+#
+#struct    tagCMQueryFamilyBossHurt
+#{
+#    tagHead         Head;
+#    DWORD        ObjID;
+#    DWORD        NPCID;
+#    BYTE        QueryType;    // 0-实时仙盟伤血,1-历史仙盟伤血,2-实时玩家伤血,3-历史玩家伤血
+#};
+def OnQueryFamilyBossHurt(index, clientData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    
+    lineID = GameWorld.GetGameWorld().GetLineID()
+    objID = clientData.ObjID
+    npcID = clientData.NPCID
+    queryType = clientData.QueryType
+    
+    key = (lineID, objID, npcID)
+    hurtMgr = GetFamilyHurtMgr()
+    
+    hurtPack = __GetFamilyOwnerBossHurtPack(hurtMgr, key, objID, npcID, queryType)
+    if hurtPack:
+        NetPackCommon.SendFakePack(curPlayer, hurtPack)
+    return
+
+def __GetFamilyOwnerBossHurtPack(hurtMgr, key, objID, npcID, queryType=0):
+    ## @param queryType: 0-实时仙盟伤血,1-历史仙盟伤血,2-实时玩家伤血,3-历史玩家伤血
+    isSort = 0
+    if queryType == 0:
+        hurtObjList = hurtMgr.familyNowHurtSort.get(key, [])
+        isSort = 1
+    else:
+        # 赶时间,暂不支持
+        return
+    
+    hurtPack = ChPyNetSendPack.tagMCFamilyBossHurtList()
+    hurtPack.Clear()
+    hurtPack.ObjID = objID
+    hurtPack.NPCID = npcID
+    hurtPack.HurtType = queryType
+    hurtPack.IsSort = isSort
+    hurtPack.HurtList = []
+    for hurtObj in hurtObjList:
+        hurtInfo = ChPyNetSendPack.tagMCFamilyBossHurt()
+        hurtInfo.FamilyID = hurtObj.familyID
+        hurtInfo.HurtID = hurtObj.objID
+        hurtInfo.HurtName = hurtObj.name
+        hurtInfo.NameLen = len(hurtInfo.HurtName)
+        hurtInfo.InitTick = hurtObj.initTick
+        hurtInfo.HurtValue = hurtObj.hurtValue%ShareDefine.Def_PerPointValue
+        hurtInfo.HurtValueEx = hurtObj.hurtValue/ShareDefine.Def_PerPointValue
+        hurtPack.HurtList.append(hurtInfo)
+    hurtPack.HurtCount = len(hurtPack.HurtList)
+    return hurtPack
+
+
+
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py
index e3ddad5..ae3e662 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py
@@ -39,6 +39,7 @@
 import GameWorld
 import ChConfig
 import PlayerControl
+import FamilyRobBoss
 import EventShell
 import FBLogic
 import FBCommon
@@ -501,6 +502,9 @@
     __RefreshOnFiveMinute(tick)
     #定时检测关闭超时文件
     EventReport.OnTimeCloseScribeTxt()
+    
+    #仙盟归属boss定时处理
+    FamilyRobBoss.OnFamilyOwnerBossProcess(tick)
     return
 
 ## 通知RouteServer 消息
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index e2e3052..a3e0660 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -697,6 +697,9 @@
                         ("DWORD", "NPCID", 1),
                         ("DWORD", "MapID", 0),
                         ("BYTE", "RefreshMark", 0),
+                        ("BYTE", "IsNeedShunt", 0),
+                        ("BYTE", "RelatedType", 0),
+                        ("WORD", "RelatedID", 0),
                         ("DWORD", "StoneNPCID", 0),
                         ),
 
@@ -2348,12 +2351,18 @@
         self.NPCID = 0
         self.MapID = 0
         self.RefreshMark = 0
+        self.IsNeedShunt = 0
+        self.RelatedType = 0
+        self.RelatedID = 0
         self.StoneNPCID = 0
         return
         
     def GetNPCID(self): return self.NPCID # ID
     def GetMapID(self): return self.MapID # 地图ID
     def GetRefreshMark(self): return self.RefreshMark # 刷新标识点
+    def GetIsNeedShunt(self): return self.IsNeedShunt # 是否需要分流
+    def GetRelatedType(self): return self.RelatedType # 刷怪关联类型
+    def GetRelatedID(self): return self.RelatedID # 关联ID
     def GetStoneNPCID(self): return self.StoneNPCID # 墓碑NPCID
 
 # 古神禁地表
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py
index 7e9c809..a17cfa3 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py
@@ -1225,6 +1225,12 @@
         if curPlayer.GetPlayerID() not in ownerIDList:
             #GameWorld.Log("该物品不属于你,不能拾取6! ownerIDList=%s" % ownerIDList, curPlayer.GetPlayerID())
             return False
+    #仙盟归属
+    elif itemOwnerType == ChConfig.Def_NPCHurtTypeFamily:
+        if mapItem.GetOwnerID() != curPlayer.GetFamilyID():
+            #GameWorld.Log("该物品不属于你仙盟的,不能拾取7! ownerFamilyID=%s,curFamilyID=%s" 
+            #              % (mapItem.GetOwnerID(), curPlayer.GetFamilyID()), curPlayer.GetPlayerID())
+            return False
         
     return True
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AIType_186.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AIType_186.py
index a460007..271e488 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AIType_186.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AIType_186.py
@@ -31,6 +31,7 @@
 import NPCCommon
 import AICommon
 import IPY_GameWorld
+import FamilyRobBoss
 import AttackCommon
 import GameWorld
 import BaseAttack
@@ -110,6 +111,12 @@
             elif ownerType == ChConfig.Def_NPCHurtTypePlayer:
                 tagObj = GameWorld.GetObj(ownerID, IPY_GameWorld.gotPlayer)
                 
+    elif dropOwnerType == ChConfig.DropOwnerType_Family:
+        ownerInfo = FamilyRobBoss.RefreshFamilyOwnerNPCHurt(npcControl, curNPC, tick, refreshInterval)
+        if ownerInfo:
+            tagObj, ownerFamilyID = ownerInfo
+            ownerType, ownerID = ChConfig.Def_NPCHurtTypeFamily, ownerFamilyID
+            
     # 没有攻击目标,则刷新仇恨,支持主动怪
     if not tagObj:
         angryObjType, maxAngryObj = None, None
@@ -122,7 +129,7 @@
             maxAngryObj = GameWorld.GetObj(angryID, angryObjType)
             
         tagObj = maxAngryObj
-        if angryObjType == IPY_GameWorld.gotPlayer and maxAngryObj:
+        if angryObjType == IPY_GameWorld.gotPlayer and maxAngryObj and not ownerType:
             teamID = maxAngryObj.GetTeamID()
             if teamID:
                 ownerType, ownerID = ChConfig.Def_NPCHurtTypeTeam, teamID
@@ -149,7 +156,7 @@
 def __RefreshBossDropOwnerObjBuff(curNPC, npcControl, tick, ownerType=0, ownerID=0, isDead=False):
     npcID = curNPC.GetNPCID()
     dropOwnerType = NPCCommon.GetDropOwnerType(curNPC)
-    if dropOwnerType not in [ChConfig.DropOwnerType_MaxHurt, ChConfig.DropOwnerType_MaxAngry]:
+    if dropOwnerType not in [ChConfig.DropOwnerType_MaxHurt, ChConfig.DropOwnerType_MaxAngry, ChConfig.DropOwnerType_Family]:
         #GameWorld.DebugLog("不需要展示掉落归属的NPC! npcID=%s,dropOwnerType=%s" % (npcID, dropOwnerType))
         return
     
@@ -202,12 +209,35 @@
                 if isOk:
                     GameWorld.DebugLog("删除归属队员buff: teamID=%s,playerID=%s" % (ownerID, curTeamPlayer.GetPlayerID()))
                     
+    elif ownerType == ChConfig.Def_NPCHurtTypeFamily:
+        
+        hurtType, hurtID = ChConfig.Def_NPCHurtTypeFamily, ownerID
+        refreshPoint = curNPC.GetRefreshPosAt(curNPC.GetCurRefreshPointIndex())
+        copyPlayerMgr = GameWorld.GetMapCopyPlayerManager()
+        for index in xrange(copyPlayerMgr.GetPlayerCount()):
+            player = copyPlayerMgr.GetPlayerByIndex(index)
+            if not player:
+                continue
+            
+            # 归属仙盟 且 在boss区域内
+            if player.GetFamilyID() == ownerID and npcControl.GetIsInRefreshPoint(player.GetPosX(), player.GetPosY(), refreshPoint):
+                __AddBossDropOwnerPlayerBuff(player, tick, curNPC)
+                
+            else:
+                isOk = BuffSkill.DelBuffBySkillID(player, ChConfig.Def_SkillID_DropOwnerBuff, tick, buffOwner=curNPC)
+                if isOk:
+                    GameWorld.DebugLog("删除非归属仙盟成员buff: teamID=%s,playerID=%s" % (ownerID, player.GetPlayerID()))
+            
     if isDead:
         key = (GameWorld.GetGameWorld().GetLineID(), curNPC.GetID(), npcID)
         teamID = curTeam.GetTeamID() if curTeam else 0
         if killerDict:
             PyGameData.g_npcKillerInfo[key] = killerDict, curTeam, hurtType, hurtID
-        GameWorld.Log("Boss被击杀: npcID=%s,key=%s,playerIDList=%s,teamID=%s" % (npcID, key, killerDict.keys(), teamID))
+        elif ownerType == ChConfig.Def_NPCHurtTypeFamily:
+            PyGameData.g_npcKillerInfo[key] = {}, None, hurtType, hurtID
+            
+        GameWorld.Log("Boss被击杀: npcID=%s,key=%s,playerIDList=%s,teamID=%s,hurtType=%s,hurtID=%s" 
+                      % (npcID, key, killerDict.keys(), teamID, hurtType, hurtID))
     return
 
 def __AddBossDropOwnerPlayerBuff(curPlayer, tick, curNPC):
@@ -259,6 +289,14 @@
             if curTeamPlayer == None or curTeamPlayer.GetPlayerID() == 0:
                 continue
             __SetBossDropOwnerBuffDisappearTime(curTeamPlayer, curNPC)
+    elif ownerType == ChConfig.Def_NPCHurtTypeFamily:
+        copyPlayerMgr = GameWorld.GetMapCopyPlayerManager()
+        for index in xrange(copyPlayerMgr.GetPlayerCount()):
+            player = copyPlayerMgr.GetPlayerByIndex(index)
+            if not player:
+                continue
+            __SetBossDropOwnerBuffDisappearTime(player, curNPC)
+            
     return
 
 def __SetBossDropOwnerBuffDisappearTime(curPlayer, curNPC):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
index 7224177..4ce8874 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -52,6 +52,7 @@
 import PlayerMagicWeapon
 import PlayerBossReborn
 import PlayerFairyCeremony
+import FamilyRobBoss
 import IpyGameDataPY
 import PyGameData
 import PlayerTeam
@@ -1946,11 +1947,14 @@
             #因为存在boss分流,所以用gameFB字典,但是存活状态还是用GameWorld字典
             GameWorld.GetGameFB().SetGameFBDict(ChConfig.Map_NPC_WorldBossDeadTick % npcid, GameWorld.GetGameWorld().GetTick())
         
+            if GetDropOwnerType(curNPC) == ChConfig.DropOwnerType_Family:
+                FamilyRobBoss.ClearFamilyOwnerBossHurt(curNPC)
+        
     
     # 清除队伍成员伤血列表
     AttackCommon.ClearTeamPlayerHurtValue(curNPC)
     # 清除自定义伤血列表
-    BossHurtMng.ClearHurtValueList(curNPC)
+    #BossHurtMng.ClearHurtValueList(curNPC)
 
     # C++设置npc死亡
     curNPC.SetDead(curNPC.GetDictByKey(ChConfig.Def_NPCDead_Reason),
@@ -1984,6 +1988,9 @@
         self.__Killer = None # 击杀者, 由各种规则得出, 一般也是物品归属的代表, 用于广播、记录等确保与归属一致
         self.__AllKillerDict = {} # 所有击杀的玩家ID对应字典, 非队伍, 一般也是归属的拥有者
         self.__FeelPlayerList = [] # 所有摸怪玩家列表,处理任务及某些逻辑用
+        
+        self.__OwnerHurtType = 0
+        self.__OwnerHurtID = 0
         return
     #---------------------------------------------------------------------
     ## 移动到某一个点的附近点
@@ -3359,6 +3366,9 @@
                 GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, 'GameWorldBossState',
                                                             '%s' % (msgList), len(str(msgList)))
                 
+                if GetDropOwnerType(curNPC) == ChConfig.DropOwnerType_Family:
+                    FamilyRobBoss.FamilyOwnerBossOnReborn(curNPC)
+                    
         # 检查是否有光环, 在重生时处理,不然可能导致有些无战斗逻辑的怪物无法套上光环buff
         skillManager = curNPC.GetSkillManager()
         for index in xrange(skillManager.GetSkillCount()):
@@ -3736,7 +3746,7 @@
         #=====================================================================================================
         
         #boss伤血排行榜击杀逻辑
-        BossHurtMng.BossOnKilled(curNPC)
+        #BossHurtMng.BossOnKilled(curNPC)
         
         #掉落需要用到摸怪,所以在处理掉落奖励之前设置
         self.__SetFeelNPCPlayerList()
@@ -3752,6 +3762,8 @@
         # 记录boss击杀信息的NPC
         bossIpyData = IpyGameDataPY.GetIpyGameDataListNotLog('BOSSInfo', npcID)
         if bossIpyData:
+            if GetDropOwnerType(curNPC) == ChConfig.DropOwnerType_Family:
+                killerName = FamilyRobBoss.FamilyOwnerBossOnKilled(curNPC, self.__OwnerHurtID)
             #KillerJob = 0 if not self.__Killer else self.__Killer.GetJob()
             GameServer_KillGameWorldBoss(curNPC.GetNPCID(), killerName, 0)
         #===========================================================================================
@@ -4197,7 +4209,8 @@
         self.__MaxHurtPlayer = self.__FindBossMaxHurtObj() # py自定义伤血所得到的Boss最大伤血玩家
         
         self.__AllKillerDict, curTeam, hurtType, hurtID = self.__FindNPCKillerInfo()
-                    
+        self.__OwnerHurtType, self.__OwnerHurtID = hurtType, hurtID
+        
         #最后一击处理
         self.__DoLastTimeHurtLogic()
         
@@ -4227,6 +4240,10 @@
         elif curTeam != None:
             self.__KilledByTeamSetPrize(curTeam, hurtType, hurtID)
         
+        #被仙盟杀死
+        elif hurtType == ChConfig.Def_NPCHurtTypeFamily:
+            self.__KilledByFamilySetPrize(hurtType, hurtID)
+            
         else:
             GameWorld.ErrLog("NPC归属异常:npcID=%s,hurtType=%s,hurtID=%s" % (npcID, hurtType, hurtID))
             
@@ -4621,7 +4638,60 @@
         self.__NPCDropItem(dropPlayer, hurtType, hurtID, ownerPlayerList)
         #GameWorld.Log("队伍杀死怪物奖励,逻辑成功结束")
         return
-
+    
+    def __KilledByFamilySetPrize(self, hurtType, hurtID):
+        ## 仙盟杀死NPC奖励逻辑
+        curNPC = self.__Instance
+        
+        maxLV = 0
+        dropPlayer = None
+        ownerPlayerList = []
+        refreshPoint = curNPC.GetRefreshPosAt(curNPC.GetCurRefreshPointIndex())
+        copyPlayerMgr = GameWorld.GetMapCopyPlayerManager()
+        for index in xrange(copyPlayerMgr.GetPlayerCount()):
+            player = copyPlayerMgr.GetPlayerByIndex(index)
+            if not player:
+                continue
+            
+            if player.GetFamilyID() != hurtID or not self.GetIsInRefreshPoint(player.GetPosX(), player.GetPosY(), refreshPoint):
+                continue
+            
+            curPlayerLV = player.GetLV()
+            if maxLV < curPlayerLV:
+                maxLV = curPlayerLV
+                dropPlayer = player
+            ownerPlayerList.append(player)
+            
+        if not ownerPlayerList:
+            GameWorld.Log("奖励归属仙盟,但是不存在可获得该奖励的成员!npcID=%s,hurtType=%s,hurtID=%s" 
+                          % (curNPC.GetNPCID(), hurtType, hurtID))
+            
+        # 因为仙盟归属boss归属伤血第一的仙盟,仙盟伤血有保护,可能存在伤血第一仙盟在boss死亡的时候都不在
+        # 此时掉落计算玩家算最后一击玩家,归属还是算伤血第一仙盟的
+        if not dropPlayer:
+            dropPlayer = self.__LastHurtPlayer
+            
+        if not dropPlayer:
+            GameWorld.ErrLog("奖励归属仙盟,找不到掉落玩家!npcID=%s,hurtType=%s,hurtID=%s" 
+                             % (curNPC.GetNPCID(), hurtType, hurtID))
+            return
+        
+        # 赶时间,先简单处理直接取最大等级的,之后可按实际情况来
+        if not self.__LastHurtPlayer:
+            self.__LastHurtPlayer = dropPlayer
+        if not self.__MaxHurtPlayer:
+            self.__MaxHurtPlayer = dropPlayer
+        if not self.__Killer:
+            self.__Killer = dropPlayer
+        maxHurtID = dropPlayer.GetPlayerID()
+        
+        for curPlayer in ownerPlayerList:
+            self.__KillNPCFuncEx(curPlayer, curNPC, maxHurtID, False)
+            
+        #调用物品掉落
+        self.__NPCDropItem(dropPlayer, hurtType, hurtID, ownerPlayerList)
+        return
+    
     ## 队伍或自己击杀NPC扩展功能
     #  @param curPlayer
     #  @return None
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py
index 92db14a..6d5e05c 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py
@@ -17,6 +17,7 @@
 import ShareDefine
 import ReadChConfig
 import GameLogic_SealDemon
+import PlayerControl
 import IPY_GameWorld
 import IpyGameDataPY
 import GameWorld
@@ -337,6 +338,18 @@
 def NPCRefresh_100(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick)
 
 
+def ResetActivityBossRefreshCount():
+    ## 重置活动boss刷怪个数
+    gameFB = GameWorld.GetGameFB()
+    gameNPC = GameWorld.GetNPCManager()
+    for i in xrange(gameNPC.GetCustomNPCRefreshCount()):
+        npcRefresh = gameNPC.GetCustomNPCRefreshAt(i)
+        refreshMark = npcRefresh.GetRefreshMark()
+        if gameFB.GetGameFBDictByKey(ChConfig.Map_NPC_ActivityBossRebornCount % refreshMark):
+            gameFB.SetGameFBDict(ChConfig.Map_NPC_ActivityBossRebornCount % refreshMark, 0)
+            GameWorld.DebugLog("重置活动boss刷怪点刷怪个数: refreshMark=%s" % refreshMark)
+    return
+
 ## 世界boss刷怪
 #  @param npcRefresh 刷新实例
 #  @param tick 当前时间
@@ -363,9 +376,42 @@
     
     gameFB = GameWorld.GetGameFB()
     gameWorldMgr = GameWorld.GetGameWorld()
-    bosskey = ShareDefine.Def_Notify_WorldKey_GameWorldBossReborn % bossID
-    rebornBossState = gameWorldMgr.GetGameWorldDictByKey(bosskey)
-    isNeedShunt = NPCCommon.IsMapNeedBossShunt(mapID)
+    relatedType = ipyData.GetRelatedType()
+    relatedID = ipyData.GetRelatedID()
+    isActivityBoss = False
+    # 关联日常活动
+    if relatedType == 1:
+        actionKey = ShareDefine.Def_Notify_WorldKey_DailyActionState % relatedID
+        rebornBossState = 1 if gameWorldMgr.GetGameWorldDictByKey(actionKey) else 0
+        isActivityBoss = True
+    # 关联运营活动,待扩展
+    elif relatedType == 2:
+        pass
+    else:
+        bosskey = ShareDefine.Def_Notify_WorldKey_GameWorldBossReborn % bossID
+        rebornBossState = gameWorldMgr.GetGameWorldDictByKey(bosskey)
+        
+    rebornLineID = 0
+    activityLineID = 0 # 活动线, 默认1线
+    activityMapLineDict = IpyGameDataPY.GetFuncEvalCfg("MapLine", 2, {})
+    if mapID in activityMapLineDict:
+        activityLineID = max(0, activityMapLineDict[mapID] - 1)
+        
+    # 活动boss只在活动线路刷
+    if isActivityBoss:
+        activityBossRebornCount = gameFB.GetGameFBDictByKey(ChConfig.Map_NPC_ActivityBossRebornCount % refreshMark)
+        rebornLineID = activityLineID # 活动boss只刷在活动线
+        # 不是活动线 
+        if rebornBossState and lineID != rebornLineID:
+            rebornBossState = 0
+            
+    # 非活动boss活动线不刷, 1线除外
+    else:
+        if activityLineID and lineID == activityLineID:
+            rebornBossState = 0
+            stoneNPCID = 0 # 活动线暂不刷墓碑
+            
+    isNeedShunt = NPCCommon.IsMapNeedBossShunt(mapID) and ipyData.GetIsNeedShunt()
     
     curNPC = None
     if npcRefresh.GetCount() > 0:
@@ -379,8 +425,13 @@
             #去掉非bossNPC
             NPCCommon.SetDeadEx(curNPC)
             
-        # 非一线 且 不需要分流的地图 且 不是封魔坛  不允许复活
-        if lineID != 0 and not isNeedShunt and mapID != ChConfig.Def_FBMapID_SealDemon:
+        # 非复活线 且 不需要分流的地图 且 不是封魔坛  不允许复活
+        if lineID != rebornLineID and not isNeedShunt and mapID != ChConfig.Def_FBMapID_SealDemon:
+            return
+        
+        if isActivityBoss and activityBossRebornCount > 0:
+            #GameWorld.DebugLog("活动线已经刷过不再刷活动boss: lineID=%s,rebornLineID=%s,refreshMark=%s,bossID=%s,activityBossRebornCount=%s" 
+            #                   % (lineID, rebornLineID, refreshMark, bossID, activityBossRebornCount))
             return
         
     # 死亡状态
@@ -391,6 +442,11 @@
                 return
             if curNPC.GetNPCID() == stoneNPCID:
                 return 
+            # 活动的boss
+            if curNPC.GetNPCID() == bossID and isActivityBoss:
+                GameWorld.Log("活动boss,活动结束,系统设置boss死亡!bossID=%s" % bossID)
+                PlayerControl.FBNotify("FairyGrabBossNoDead", [bossID])
+                
             #去掉非墓碑NPC
             NPCCommon.SetDeadEx(curNPC)
         
@@ -415,7 +471,12 @@
     #初始化NPC
     __InitNewBornNPC(npcRefresh, tick)
     gameFB.SetGameFBDict(key, tick)
-    GameWorld.DebugLog("BossRefresh mapID=%s,refreshMark=%s,rebornNPCID=%s,isNeedShunt=%s,OK!" % (mapID, refreshMark, rebornNPCID, isNeedShunt), lineID)
+    
+    if isActivityBoss and rebornBossState:
+        gameFB.SetGameFBDict(ChConfig.Map_NPC_ActivityBossRebornCount % refreshMark, activityBossRebornCount + 1)
+        
+    GameWorld.DebugLog("BossRefresh mapID=%s,rebornLineID=%s,refreshMark=%s,rebornNPCID=%s,isNeedShunt=%s,OK!" 
+                       % (mapID, rebornLineID, refreshMark, rebornNPCID, isNeedShunt), lineID)
     return
 
 def IsShuntBossNeedProcess(curNPC):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
index e79c69e..973b23a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -1354,7 +1354,12 @@
                 if curPlayer.GetID() == 0:
                     continue
                 PlayerWorldAverageLv.UpdatePlayerWorldAverageLv(curPlayer)
-                
+            
+    # 日常活动
+    elif key.startswith(ShareDefine.Def_Notify_WorldKey_DailyActionState[:-2]):
+        if value and gameWorldMgr.GetGameWorldDictByKey(key) != value:
+            NPCCustomRefresh.ResetActivityBossRefreshCount()
+            
     #通用设置
     gameWorldMgr.SetGameWorldDict(key, value)
     
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index e538065..0e3b58b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -1466,9 +1466,10 @@
 DailyActionID_XXX12, # 废弃12
 DailyActionID_Tower, # 符印塔
 DailyActionID_MagicWeapon, # 法宝集魂
-DailyActionID_FBHelp, # 助战副本
+DailyActionID_FBHelp, # 助战副本 15
 DailyActionID_BOSSHome, # BOSS之家
-) = range(1, 16 + 1)
+DailyActionID_FamilyRobBoss, # 仙盟抢boss
+) = range(1, 17 + 1)
 
 
 

--
Gitblit v1.8.0