From 80f11b590ece01d82d2af052876366bd2c1df2eb Mon Sep 17 00:00:00 2001
From: xdh <xiefantasy@qq.com>
Date: 星期二, 21 八月 2018 16:10:09 +0800
Subject: [PATCH] add:【1891】神兽地界

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ClearCollectNPCCnt.py          |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py                             |    1 
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py                                           |   29 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py                             |   85 ++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py                         |  243 ++++++++++
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py                                                  |   85 ++++
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py                                 |   36 +
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py                                              |  243 ++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py                      |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini                                     |    5 
 ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py                                                     |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py                         |   58 ++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py                           |   72 +++
 ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py                                                  |    1 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Dogz.py |  251 +++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py               |    9 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_NPCCnt.py      |   75 +++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                                |    5 
 18 files changed, 1,146 insertions(+), 59 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py b/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
index 7d9406f..9943950 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
@@ -437,7 +437,7 @@
 Def_Billboard_MaxCnt = 100
 #---------------------------------------------------------------------
 #请求类型(需要和MapServer中的一致)
-Def_QueryType_Count = 54
+Def_QueryType_Count = 55
 (
 queryType_sqtPlayer,                  #查询玩家
 queryType_sqtFamilyWar,               #家族战
@@ -493,6 +493,7 @@
 queryType_ServerRewardNotify,         #全服奖励提示
 queryType_EnterFB,                    #进入副本
 queryType_NPCInfo,                    #查询NPCInfo
+queryType_NPCCnt,                     #查询NPC数量
 ) = range(0, Def_QueryType_Count)
 #------------------------------------------------------------------------------ 
 #家族某行为类型保存的条数
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
index c69e43d..d3818c6 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
@@ -4012,6 +4012,91 @@
 
 
 #------------------------------------------------------
+# A2 27 查询地图NPC数量信息 #tagCMQueryNPCCntInfo
+
+class  tagCMQueryNPCCntInfo(Structure):
+    Head = tagHead()
+    MapID = 0    #(DWORD MapID)// 目标地图ID
+    LineID = 0    #(WORD LineID)// 线路ID
+    IsNoTimeLimit = 0    #(BYTE IsNoTimeLimit)//是否没有查询时间限制,默认有限制
+    NPCIDListLen = 0    #(BYTE NPCIDListLen)
+    NPCIDList = ""    #(String NPCIDList)// 需要查询的NPCID列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xA2
+        self.Head.SubCmd = 0x27
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.MapID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.LineID,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.IsNoTimeLimit,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.NPCIDListLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.NPCIDList,_pos = CommFunc.ReadString(_lpData, _pos,self.NPCIDListLen)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xA2
+        self.Head.SubCmd = 0x27
+        self.MapID = 0
+        self.LineID = 0
+        self.IsNoTimeLimit = 0
+        self.NPCIDListLen = 0
+        self.NPCIDList = ""
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 4
+        length += 2
+        length += 1
+        length += 1
+        length += len(self.NPCIDList)
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.MapID)
+        data = CommFunc.WriteWORD(data, self.LineID)
+        data = CommFunc.WriteBYTE(data, self.IsNoTimeLimit)
+        data = CommFunc.WriteBYTE(data, self.NPCIDListLen)
+        data = CommFunc.WriteString(data, self.NPCIDListLen, self.NPCIDList)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                MapID:%d,
+                                LineID:%d,
+                                IsNoTimeLimit:%d,
+                                NPCIDListLen:%d,
+                                NPCIDList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.MapID,
+                                self.LineID,
+                                self.IsNoTimeLimit,
+                                self.NPCIDListLen,
+                                self.NPCIDList
+                                )
+        return DumpString
+
+
+m_NAtagCMQueryNPCCntInfo=tagCMQueryNPCCntInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMQueryNPCCntInfo.Head.Cmd,m_NAtagCMQueryNPCCntInfo.Head.SubCmd))] = m_NAtagCMQueryNPCCntInfo
+
+
+#------------------------------------------------------
 # A2 13 查询地图NPC信息 #tagCMQueryNPCInfo
 
 class  tagCMQueryNPCInfo(Structure):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index a49e731..610934e 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -2667,6 +2667,114 @@
 
 
 #------------------------------------------------------
+# A9 04 通知神兽副本NPC刷新时间 #tagGCDogzNPCRefreshTime
+
+class  tagDogzTimeInfoObj(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("NPCID", c_int),    # npcid
+                  ("RefreshSecond", c_int),    # 刷新倒计时, 秒
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        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.NPCID = 0
+        self.RefreshSecond = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagDogzTimeInfoObj)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// A9 04 通知神兽副本NPC刷新时间 //tagGCDogzNPCRefreshTime:
+                                NPCID:%d,
+                                RefreshSecond:%d
+                                '''\
+                                %(
+                                self.NPCID,
+                                self.RefreshSecond
+                                )
+        return DumpString
+
+
+class  tagGCDogzNPCRefreshTime(Structure):
+    Head = tagHead()
+    Cnt = 0    #(BYTE Cnt)//信息个数
+    InfoList = list()    #(vector<tagDogzTimeInfoObj> InfoList)//信息列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xA9
+        self.Head.SubCmd = 0x04
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.Cnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.Cnt):
+            temInfoList = tagDogzTimeInfoObj()
+            _pos = temInfoList.ReadData(_lpData, _pos)
+            self.InfoList.append(temInfoList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xA9
+        self.Head.SubCmd = 0x04
+        self.Cnt = 0
+        self.InfoList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        for i in range(self.Cnt):
+            length += self.InfoList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.Cnt)
+        for i in range(self.Cnt):
+            data = CommFunc.WriteString(data, self.InfoList[i].GetLength(), self.InfoList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                Cnt:%d,
+                                InfoList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.Cnt,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagGCDogzNPCRefreshTime=tagGCDogzNPCRefreshTime()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCDogzNPCRefreshTime.Head.Cmd,m_NAtagGCDogzNPCRefreshTime.Head.SubCmd))] = m_NAtagGCDogzNPCRefreshTime
+
+
+#------------------------------------------------------
 # A9 A9 通知好友互赠精力信息 #tagGCFriendSendEnergyInfo
 
 class  tagGCFriendSendEnergyInfo(Structure):
@@ -12856,16 +12964,12 @@
 class  tagMCNPCIDCollectionCnt(Structure):
     _pack_ = 1
     _fields_ = [
-                  ("Cmd", c_ubyte),
-                  ("SubCmd", c_ubyte),
                   ("NPCID", c_int),    #NPCID
                   ("CollectionCnt", c_ubyte),    #已采集次数
                   ]
 
     def __init__(self):
         self.Clear()
-        self.Cmd = 0xA3
-        self.SubCmd = 0x26
         return
 
     def ReadData(self, stringData, _pos=0, _len=0):
@@ -12874,8 +12978,6 @@
         return _pos + self.GetLength()
 
     def Clear(self):
-        self.Cmd = 0xA3
-        self.SubCmd = 0x26
         self.NPCID = 0
         self.CollectionCnt = 0
         return
@@ -12888,14 +12990,10 @@
 
     def OutputString(self):
         DumpString = '''// A3 26 NPCID已采集次数信息 //tagMCNPCIDCollectionCntInfo:
-                                Cmd:%s,
-                                SubCmd:%s,
                                 NPCID:%d,
                                 CollectionCnt:%d
                                 '''\
                                 %(
-                                self.Cmd,
-                                self.SubCmd,
                                 self.NPCID,
                                 self.CollectionCnt
                                 )
@@ -16426,6 +16524,121 @@
 
 
 #------------------------------------------------------
+# A7 14 通知查询的NPC数量 #tagMCNPCCntList
+
+class  tagMCNPCCntInfo(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("NPCID", c_int),    
+                  ("Cnt", c_int),    
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        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.NPCID = 0
+        self.Cnt = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCNPCCntInfo)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// A7 14 通知查询的NPC数量 //tagMCNPCCntList:
+                                NPCID:%d,
+                                Cnt:%d
+                                '''\
+                                %(
+                                self.NPCID,
+                                self.Cnt
+                                )
+        return DumpString
+
+
+class  tagMCNPCCntList(Structure):
+    Head = tagHead()
+    MapID = 0    #(DWORD MapID)
+    NPCInfoCnt = 0    #(BYTE NPCInfoCnt)
+    NPCInfoList = list()    #(vector<tagMCNPCCntInfo> NPCInfoList)
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xA7
+        self.Head.SubCmd = 0x14
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.MapID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.NPCInfoCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.NPCInfoCnt):
+            temNPCInfoList = tagMCNPCCntInfo()
+            _pos = temNPCInfoList.ReadData(_lpData, _pos)
+            self.NPCInfoList.append(temNPCInfoList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xA7
+        self.Head.SubCmd = 0x14
+        self.MapID = 0
+        self.NPCInfoCnt = 0
+        self.NPCInfoList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 4
+        length += 1
+        for i in range(self.NPCInfoCnt):
+            length += self.NPCInfoList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.MapID)
+        data = CommFunc.WriteBYTE(data, self.NPCInfoCnt)
+        for i in range(self.NPCInfoCnt):
+            data = CommFunc.WriteString(data, self.NPCInfoList[i].GetLength(), self.NPCInfoList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                MapID:%d,
+                                NPCInfoCnt:%d,
+                                NPCInfoList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.MapID,
+                                self.NPCInfoCnt,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCNPCCntList=tagMCNPCCntList()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCNPCCntList.Head.Cmd,m_NAtagMCNPCCntList.Head.SubCmd))] = m_NAtagMCNPCCntList
+
+
+#------------------------------------------------------
 #A7 01 通知选中对象 # tagMCNotifySelectObj
 
 class  tagMCNotifySelectObj(Structure):
@@ -16491,8 +16704,6 @@
 class  tagMCNPCInfo(Structure):
     _pack_ = 1
     _fields_ = [
-                  ("Cmd", c_ubyte),
-                  ("SubCmd", c_ubyte),
                   ("ObjID", c_int),    
                   ("NPCID", c_int),    
                   ("NPCHP", c_int),    
@@ -16505,8 +16716,6 @@
 
     def __init__(self):
         self.Clear()
-        self.Cmd = 0xA7
-        self.SubCmd = 0x06
         return
 
     def ReadData(self, stringData, _pos=0, _len=0):
@@ -16515,8 +16724,6 @@
         return _pos + self.GetLength()
 
     def Clear(self):
-        self.Cmd = 0xA7
-        self.SubCmd = 0x06
         self.ObjID = 0
         self.NPCID = 0
         self.NPCHP = 0
@@ -16535,8 +16742,6 @@
 
     def OutputString(self):
         DumpString = '''// A7 06 通知查询的NPC信息 //tagMCNPCInfoList:
-                                Cmd:%s,
-                                SubCmd:%s,
                                 ObjID:%d,
                                 NPCID:%d,
                                 NPCHP:%d,
@@ -16547,8 +16752,6 @@
                                 RefreshSecond:%d
                                 '''\
                                 %(
-                                self.Cmd,
-                                self.SubCmd,
                                 self.ObjID,
                                 self.NPCID,
                                 self.NPCHP,
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py
index 97db3c6..aea34b5 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py
@@ -472,6 +472,10 @@
     if IsMapNeedBossShunt(0):
         GameWorld.SendCommMapServerMsg(ShareDefine.Def_Notify_WorldKey_BossShuntPlayer, PyGameData.g_bossShuntPlayerInfo)
         GameWorld.SendCommMapServerMsg(ShareDefine.Def_Notify_WorldKey_BossShuntDeadLine, PyGameData.g_bossShuntDeadLine)
+    #通知一个参数
+    bossID = IpyGameDataPY.GetFuncCfg('DogzFBRefreshCfg', 2)
+    onlineCnt = __GetBossOnlineHeroCnt(bossID)[0]
+    GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_BossOnlineHeroCnt % bossID, onlineCnt)
     return
 
 
@@ -586,6 +590,8 @@
     
     newNum = newOnlieCnt * 100 + unUpdataCnt
     PlayerDBGSEvent.SetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_GameWorldBossOnlineCnt % bossid, newNum)
+    if bossid == IpyGameDataPY.GetFuncCfg('DogzFBRefreshCfg', 2):
+        GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_BossOnlineHeroCnt % bossid, newOnlieCnt)
     GameWorld.DebugLog("设置计算boss刷新时间用的在线人数 Change:bossid=%s, beforeOnlineCnt = %s, newOnlieCnt = %s, unUpdataCnt=%s" % (bossid, beforeOnlineCnt, newOnlieCnt, unUpdataCnt))
     return
 
@@ -1001,3 +1007,33 @@
         NetPackCommon.SendFakePack(curPlayer, packData)
     return
 
+def Sync_DogzNPCRefreshTime(msgList):
+    #同步神兽副本NPC刷新时间
+    playerID, refreshTimeDict = msgList
+    curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID) if playerID else None
+    if playerID and not curPlayer:
+        return
+    if not refreshTimeDict:
+        return
+    packData = ChPyNetSendPack.tagGCDogzNPCRefreshTime()
+    packData.InfoList=[]
+    for npcid, rTime in refreshTimeDict.items():
+        timeInfo = ChPyNetSendPack.tagDogzTimeInfoObj()
+        timeInfo.NPCID = npcid
+        timeInfo.RefreshSecond = rTime
+        packData.InfoList.append(timeInfo)
+    packData.Cnt = len(packData.InfoList)
+    if not playerID:
+        playerManager = GameWorld.GetPlayerManager()
+        for i in xrange(playerManager.GetActivePlayerCount()):
+            curPlayer = playerManager.GetActivePlayerAt(i)
+            if curPlayer == None or not curPlayer.GetInitOK():
+                continue
+            if PlayerControl.GetIsTJG(curPlayer):
+                continue
+            NetPackCommon.SendFakePack(curPlayer, packData)
+    else:
+        if PlayerControl.GetIsTJG(curPlayer):
+            return
+        NetPackCommon.SendFakePack(curPlayer, packData)
+    return
\ No newline at end of file
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
index 84656ef..d777f7e 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
@@ -256,6 +256,10 @@
     elif queryType == ChConfig.queryType_NPCInfo:
         __QueryMapNPCInfo(curPlayer, queryCallName, sendCMD)
         return
+    # 查询地图NPC数量
+    elif queryType == ChConfig.queryType_NPCCnt:
+        __QueryMapNPCCntInfo(curPlayer, queryCallName, sendCMD)
+        return
     else:
         GameWorld.ErrLog('unKnow queryType = %s' % (queryType))
         
@@ -290,6 +294,26 @@
                 queryCallName, sendCMD, len(sendCMD), curPlayer.GetRouteServerIndex())
     return
 
+## 查询目标地图NPC数量
+#  @param curPlayer: 请求玩家
+#  @param queryCallName: 请求回调名
+#  @param sendCMD: 请求的命令 根据请求类型和请求命令来决定最终操作
+#  @return None
+def __QueryMapNPCCntInfo(curPlayer, queryCallName, sendCMD):
+    playerManager = GameWorld.GetPlayerManager()
+    try:
+        mapInfo = eval(sendCMD)
+    except BaseException:
+        GameWorld.ErrLog("__QueryMapNPCCntInfo() sendCMD=%s error" % sendCMD)
+        return
+    
+    if not mapInfo:
+        return
+    
+    tagMapID = mapInfo[0]
+    playerManager.MapServer_QueryPlayer(curPlayer.GetPlayerID(), ChConfig.queryType_NPCCnt, 0, tagMapID,
+                queryCallName, sendCMD, len(sendCMD), curPlayer.GetRouteServerIndex())
+    return
 
 ## 获得家族属性(等级,人数)获得自己所在家族的属性
 #  @param curPlayer 请求的玩家
@@ -727,7 +751,10 @@
     if callName =="AddBossRebornPoint":
         GameWorldBoss.AddBossRebornPoint(eval(resultName))
         return
-    
+    #通知神兽副本NPC刷新时间
+    if callName =="DogzNPCTime":
+        GameWorldBoss.Sync_DogzNPCRefreshTime(eval(resultName))
+        return
 #---return分割线-----------------------------------------------------------------
 
     
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
index 007b2e3..5b228ca 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -185,6 +185,7 @@
 Def_Notify_WorldKey_GameWorldBossOnlineCnt = "GameWorldBossOnlineCnt_%s"  #世界boss重生时间计算 在线人数统计 %s为bossid
 Def_Notify_WorldKey_BossShuntPlayer = 'BossShuntPlayer'   # boss分流玩家信息
 Def_Notify_WorldKey_BossShuntDeadLine = 'BossShuntDeadLine'   # boss分流线路已死亡的线路
+Def_Notify_WorldKey_BossOnlineHeroCnt = 'BossOnlineHeroCnt_%s'  # boss刷新时间用的在线人数, 参数为NPCID
 
 Def_Notify_WorldKey_FamilyActivityDayState = "FamilyActivityDayState"  #战盟相关活动今日开启状态, 按位存储代表今日是否开启过
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
index e1f34d8..1cfb104 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
@@ -330,7 +330,7 @@
 Writer = hxp
 Releaser = hxp
 RegType = 0
-RegisterPackCount = 15
+RegisterPackCount = 16
 
 PacketCMD_1 = 0xA5
 PacketSubCMD_1 = 0x04
@@ -392,6 +392,9 @@
 PacketSubCMD_15=0x05
 PacketCallFunc_15=PYWorldTransPort
 
+PacketCMD_16=0xA2
+PacketSubCMD_16=0x27
+PacketCallFunc_16=OnQueryMapNPCCntInfo
 
 ;购买相关的
 [BuySomething]
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 719c2e0..a1feead 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -1841,7 +1841,7 @@
                 'Guard':[Def_FBMapID_Guard], #守护副本
                 'SealDemon':[Def_FBMapID_SealDemon, Def_FBMapID_SealDemonEx], #封魔坛
                 'XMZZ':[Def_FBMapID_XMZZ], #仙魔之争
-                #'Dogz':[Def_FBMapID_Dogz], #神兽副本
+                'Dogz':[Def_FBMapID_Dogz], #神兽副本
                 }
 
 #特殊副本ID, 由系统分配, 进入时候不验证IsMapCopyFull
@@ -2436,7 +2436,7 @@
 
 #---------------------------------------------------------------------
 #请求类型(需要和GameServer中的一致)
-Def_QueryType_Count = 54
+Def_QueryType_Count = 55
 (
 queryType_sqtPlayer,                  #查询玩家
 queryType_sqtFamilyWar,               #家族战
@@ -2492,6 +2492,7 @@
 queryType_ServerRewardNotify,         #全服奖励提示
 queryType_EnterFB,                    #进入副本
 queryType_NPCInfo,                    #查询NPCInfo
+queryType_NPCCnt,                     #查询NPC数量
 ) = range(0, Def_QueryType_Count)
 #------------------------------------------------------------------------------ 
 #---------------------------------------------------------------------
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
index c69e43d..d3818c6 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -4012,6 +4012,91 @@
 
 
 #------------------------------------------------------
+# A2 27 查询地图NPC数量信息 #tagCMQueryNPCCntInfo
+
+class  tagCMQueryNPCCntInfo(Structure):
+    Head = tagHead()
+    MapID = 0    #(DWORD MapID)// 目标地图ID
+    LineID = 0    #(WORD LineID)// 线路ID
+    IsNoTimeLimit = 0    #(BYTE IsNoTimeLimit)//是否没有查询时间限制,默认有限制
+    NPCIDListLen = 0    #(BYTE NPCIDListLen)
+    NPCIDList = ""    #(String NPCIDList)// 需要查询的NPCID列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xA2
+        self.Head.SubCmd = 0x27
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.MapID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.LineID,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.IsNoTimeLimit,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.NPCIDListLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.NPCIDList,_pos = CommFunc.ReadString(_lpData, _pos,self.NPCIDListLen)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xA2
+        self.Head.SubCmd = 0x27
+        self.MapID = 0
+        self.LineID = 0
+        self.IsNoTimeLimit = 0
+        self.NPCIDListLen = 0
+        self.NPCIDList = ""
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 4
+        length += 2
+        length += 1
+        length += 1
+        length += len(self.NPCIDList)
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.MapID)
+        data = CommFunc.WriteWORD(data, self.LineID)
+        data = CommFunc.WriteBYTE(data, self.IsNoTimeLimit)
+        data = CommFunc.WriteBYTE(data, self.NPCIDListLen)
+        data = CommFunc.WriteString(data, self.NPCIDListLen, self.NPCIDList)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                MapID:%d,
+                                LineID:%d,
+                                IsNoTimeLimit:%d,
+                                NPCIDListLen:%d,
+                                NPCIDList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.MapID,
+                                self.LineID,
+                                self.IsNoTimeLimit,
+                                self.NPCIDListLen,
+                                self.NPCIDList
+                                )
+        return DumpString
+
+
+m_NAtagCMQueryNPCCntInfo=tagCMQueryNPCCntInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMQueryNPCCntInfo.Head.Cmd,m_NAtagCMQueryNPCCntInfo.Head.SubCmd))] = m_NAtagCMQueryNPCCntInfo
+
+
+#------------------------------------------------------
 # A2 13 查询地图NPC信息 #tagCMQueryNPCInfo
 
 class  tagCMQueryNPCInfo(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index a49e731..610934e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -2667,6 +2667,114 @@
 
 
 #------------------------------------------------------
+# A9 04 通知神兽副本NPC刷新时间 #tagGCDogzNPCRefreshTime
+
+class  tagDogzTimeInfoObj(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("NPCID", c_int),    # npcid
+                  ("RefreshSecond", c_int),    # 刷新倒计时, 秒
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        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.NPCID = 0
+        self.RefreshSecond = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagDogzTimeInfoObj)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// A9 04 通知神兽副本NPC刷新时间 //tagGCDogzNPCRefreshTime:
+                                NPCID:%d,
+                                RefreshSecond:%d
+                                '''\
+                                %(
+                                self.NPCID,
+                                self.RefreshSecond
+                                )
+        return DumpString
+
+
+class  tagGCDogzNPCRefreshTime(Structure):
+    Head = tagHead()
+    Cnt = 0    #(BYTE Cnt)//信息个数
+    InfoList = list()    #(vector<tagDogzTimeInfoObj> InfoList)//信息列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xA9
+        self.Head.SubCmd = 0x04
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.Cnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.Cnt):
+            temInfoList = tagDogzTimeInfoObj()
+            _pos = temInfoList.ReadData(_lpData, _pos)
+            self.InfoList.append(temInfoList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xA9
+        self.Head.SubCmd = 0x04
+        self.Cnt = 0
+        self.InfoList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        for i in range(self.Cnt):
+            length += self.InfoList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.Cnt)
+        for i in range(self.Cnt):
+            data = CommFunc.WriteString(data, self.InfoList[i].GetLength(), self.InfoList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                Cnt:%d,
+                                InfoList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.Cnt,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagGCDogzNPCRefreshTime=tagGCDogzNPCRefreshTime()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCDogzNPCRefreshTime.Head.Cmd,m_NAtagGCDogzNPCRefreshTime.Head.SubCmd))] = m_NAtagGCDogzNPCRefreshTime
+
+
+#------------------------------------------------------
 # A9 A9 通知好友互赠精力信息 #tagGCFriendSendEnergyInfo
 
 class  tagGCFriendSendEnergyInfo(Structure):
@@ -12856,16 +12964,12 @@
 class  tagMCNPCIDCollectionCnt(Structure):
     _pack_ = 1
     _fields_ = [
-                  ("Cmd", c_ubyte),
-                  ("SubCmd", c_ubyte),
                   ("NPCID", c_int),    #NPCID
                   ("CollectionCnt", c_ubyte),    #已采集次数
                   ]
 
     def __init__(self):
         self.Clear()
-        self.Cmd = 0xA3
-        self.SubCmd = 0x26
         return
 
     def ReadData(self, stringData, _pos=0, _len=0):
@@ -12874,8 +12978,6 @@
         return _pos + self.GetLength()
 
     def Clear(self):
-        self.Cmd = 0xA3
-        self.SubCmd = 0x26
         self.NPCID = 0
         self.CollectionCnt = 0
         return
@@ -12888,14 +12990,10 @@
 
     def OutputString(self):
         DumpString = '''// A3 26 NPCID已采集次数信息 //tagMCNPCIDCollectionCntInfo:
-                                Cmd:%s,
-                                SubCmd:%s,
                                 NPCID:%d,
                                 CollectionCnt:%d
                                 '''\
                                 %(
-                                self.Cmd,
-                                self.SubCmd,
                                 self.NPCID,
                                 self.CollectionCnt
                                 )
@@ -16426,6 +16524,121 @@
 
 
 #------------------------------------------------------
+# A7 14 通知查询的NPC数量 #tagMCNPCCntList
+
+class  tagMCNPCCntInfo(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("NPCID", c_int),    
+                  ("Cnt", c_int),    
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        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.NPCID = 0
+        self.Cnt = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCNPCCntInfo)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// A7 14 通知查询的NPC数量 //tagMCNPCCntList:
+                                NPCID:%d,
+                                Cnt:%d
+                                '''\
+                                %(
+                                self.NPCID,
+                                self.Cnt
+                                )
+        return DumpString
+
+
+class  tagMCNPCCntList(Structure):
+    Head = tagHead()
+    MapID = 0    #(DWORD MapID)
+    NPCInfoCnt = 0    #(BYTE NPCInfoCnt)
+    NPCInfoList = list()    #(vector<tagMCNPCCntInfo> NPCInfoList)
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xA7
+        self.Head.SubCmd = 0x14
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.MapID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.NPCInfoCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.NPCInfoCnt):
+            temNPCInfoList = tagMCNPCCntInfo()
+            _pos = temNPCInfoList.ReadData(_lpData, _pos)
+            self.NPCInfoList.append(temNPCInfoList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xA7
+        self.Head.SubCmd = 0x14
+        self.MapID = 0
+        self.NPCInfoCnt = 0
+        self.NPCInfoList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 4
+        length += 1
+        for i in range(self.NPCInfoCnt):
+            length += self.NPCInfoList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.MapID)
+        data = CommFunc.WriteBYTE(data, self.NPCInfoCnt)
+        for i in range(self.NPCInfoCnt):
+            data = CommFunc.WriteString(data, self.NPCInfoList[i].GetLength(), self.NPCInfoList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                MapID:%d,
+                                NPCInfoCnt:%d,
+                                NPCInfoList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.MapID,
+                                self.NPCInfoCnt,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCNPCCntList=tagMCNPCCntList()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCNPCCntList.Head.Cmd,m_NAtagMCNPCCntList.Head.SubCmd))] = m_NAtagMCNPCCntList
+
+
+#------------------------------------------------------
 #A7 01 通知选中对象 # tagMCNotifySelectObj
 
 class  tagMCNotifySelectObj(Structure):
@@ -16491,8 +16704,6 @@
 class  tagMCNPCInfo(Structure):
     _pack_ = 1
     _fields_ = [
-                  ("Cmd", c_ubyte),
-                  ("SubCmd", c_ubyte),
                   ("ObjID", c_int),    
                   ("NPCID", c_int),    
                   ("NPCHP", c_int),    
@@ -16505,8 +16716,6 @@
 
     def __init__(self):
         self.Clear()
-        self.Cmd = 0xA7
-        self.SubCmd = 0x06
         return
 
     def ReadData(self, stringData, _pos=0, _len=0):
@@ -16515,8 +16724,6 @@
         return _pos + self.GetLength()
 
     def Clear(self):
-        self.Cmd = 0xA7
-        self.SubCmd = 0x06
         self.ObjID = 0
         self.NPCID = 0
         self.NPCHP = 0
@@ -16535,8 +16742,6 @@
 
     def OutputString(self):
         DumpString = '''// A7 06 通知查询的NPC信息 //tagMCNPCInfoList:
-                                Cmd:%s,
-                                SubCmd:%s,
                                 ObjID:%d,
                                 NPCID:%d,
                                 NPCHP:%d,
@@ -16547,8 +16752,6 @@
                                 RefreshSecond:%d
                                 '''\
                                 %(
-                                self.Cmd,
-                                self.SubCmd,
                                 self.ObjID,
                                 self.NPCID,
                                 self.NPCHP,
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ClearCollectNPCCnt.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ClearCollectNPCCnt.py
index 13a2df0..bde8871 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ClearCollectNPCCnt.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ClearCollectNPCCnt.py
@@ -49,7 +49,7 @@
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CollNpcCollTime % funcType, 0)
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CollNpcBuyTime % funcType, 0)
     
-        NPCCommon.SyncCollNPCTime(curPlayer)
+    NPCCommon.SyncCollNPCTime(curPlayer)
         
     GameWorld.DebugAnswer(curPlayer, "重置采集NPC成功")
     return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Dogz.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Dogz.py
new file mode 100644
index 0000000..6dc06e1
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Dogz.py
@@ -0,0 +1,251 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package GameWorldLogic.FBProcess.GameLogic_Dogz
+#
+# @todo:神兽地界
+# @author xdh
+# @date 2018-08-17
+# @version 1.0
+#
+# 详细描述: 神兽地界
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2018-08-17 16:30"""
+#-------------------------------------------------------------------------------
+
+import GameWorld
+import IpyGameDataPY
+import IPY_GameWorld
+import ShareDefine
+import NPCCustomRefresh
+import SkillCommon
+import GameObj
+import time
+import random
+
+
+#{(标识点):[npcid,单个点数量,刷新间隔秒, 每次刷新只数, 第一次刷新只数]}
+#{(101,102,103):[20302001,1,'20', 2, 10]}
+(
+Def_NPCID,
+Def_MaxCnt,
+Def_TimeFormula,
+Def_RefreshCnt,
+Def_FirstRefreshCnt
+) = range(5)
+
+Map_Dogzfb_LastRefreshTime = "Dogzfb_LastRefreshTime%s"  # 刷新时间 参数npcid
+Map_Dogzfb_NextNeedTime = "NextNeedTime%s"  # 下次刷新需要时间 参数npcid
+Map_Dogzfb_LastCheckTick = "LastCheckTick"  # 上次检查时间
+Map_Dogzfb_NPCRemainCnt = 'NPCRemainCnt_%s'   # NPC剩余数量
+Map_Dogzfb_CollectLostHPTick = 'CollectLostHPTick'   # 采集掉线Tick
+
+
+## 是否能够通过活动查询进入
+#  @param curPlayer 玩家实例
+#  @param mapID 地图ID
+#  @param lineID 线路id
+#  @param tick 时间戳
+#  @return 布尔值
+def OnEnterFBEvent(curPlayer, mapID, lineID, tick):
+    return True
+
+
+## 查询地图是否开启
+#  @param tick 时间戳
+#  @return 布尔值
+def OnCanOpen(tick):
+    return True
+
+
+##查询是否可以进入地图
+# @param ask:请求结构体(IPY_BMChangeMapAsk)
+# @param tick:时间戳
+# @return IPY_GameWorld.cme 枚举
+def OnChangeMapAsk(ask, tick):
+    return IPY_GameWorld.cmeAccept
+
+
+## 进副本
+#  @param curPlayer
+#  @param tick
+#  @return None
+def DoEnterFB(curPlayer, tick):
+
+    return
+
+
+
+### 是否副本复活
+##  @param None
+##  @return 是否副本复活
+#def OnPlayerReborn():
+#    return False
+
+
+## 获得副本帮助信息
+#  @param curPlayer 当前玩家(被通知对象)
+#  @param tick 当前时间
+#  @return None
+def DoFBHelp(curPlayer, tick, isEnter=False):
+
+    return
+
+
+## 副本行为
+#  @param curPlayer 玩家
+#  @param actionType 行为类型
+#  @param actionInfo 行为信息
+#  @param tick 当前时间
+#  @return None
+def DoFBAction(curPlayer, actionType, actionInfo, tick):
+    
+    return
+
+
+## 收集中
+def OnCollecting(curPlayer, tick):
+    tagObj = curPlayer.GetActionObj()
+    if not tagObj:
+        return
+    if tagObj.GetGameObjType() != IPY_GameWorld.gotNPC:
+        return
+    
+    curNPC = GameWorld.GetNPCManager().GetNPCByIndex(tagObj.GetIndex())
+    npcID = curNPC.GetNPCID()
+    playerID = curPlayer.GetID()
+    gameFB = GameWorld.GetGameFB()
+    collectLostHPTick = gameFB.GetPlayerGameFBDictByKey(playerID, Map_Dogzfb_CollectLostHPTick)
+
+    lostCD = IpyGameDataPY.GetFuncEvalCfg('DogzFBCollect', 1, {}).get(npcID, 1)
+    lostTime = (tick - collectLostHPTick) / 1000/lostCD # 掉血次数
+    if lostTime >3:
+        gameFB.SetPlayerGameFBDict(playerID, Map_Dogzfb_CollectLostHPTick, tick)
+        return
+    
+    if not lostTime:
+        return
+    gameFB.SetGameFBDict(Map_Dogzfb_CollectLostHPTick, tick)
+        
+   
+    lostHPPer = IpyGameDataPY.GetFuncEvalCfg('DogzFBCollect', 2, {}).get(npcID, 1)
+    skillTypeID, buffOwner = 0, None
+    lostValue = min(int(GameObj.GetMaxHP(curPlayer) * lostHPPer / 100.0) * lostTime, GameObj.GetHP(curPlayer)-1)
+    if lostValue <=0:
+        return
+    #GameWorld.DebugLog("OnCollecting npcID=%s, lostHPPer=%s,lostTime=%s,lostValue=%s" % (npcID, lostHPPer, lostTime, lostValue))
+    SkillCommon.SkillLostHP(curPlayer, skillTypeID, buffOwner, lostValue, tick)
+    return
+
+
+##---副本总逻辑计时器---
+# @param tick:时间戳
+# @return 无意义
+# @remarks 副本总逻辑计时器
+def OnProcess(tick):
+    CheckRefreshBoss(tick)
+    return
+
+
+def CheckRefreshBoss(tick, isFirst=False):
+    gameFB = GameWorld.GetGameFB()
+    lastCheckTick = gameFB.GetGameFBDictByKey(Map_Dogzfb_LastCheckTick)
+    if not (isFirst or (lastCheckTick and tick - lastCheckTick > 1000)):
+        return
+    gameFB.SetGameFBDict(Map_Dogzfb_LastCheckTick, tick)
+    
+    dogzRefreshCfg = IpyGameDataPY.GetFuncEvalCfg('DogzFBRefreshCfg', 1, {})
+    curTime = int(time.time())
+    gameWorld = GameWorld.GetGameWorld()
+    refreshDict = {}
+    for markInfo, refreshInfo in dogzRefreshCfg.items():
+        npcID = refreshInfo[Def_NPCID]
+        
+        nextNeedTime = gameWorld.GetGameWorldDictByKey(Map_Dogzfb_NextNeedTime % npcID)
+        if not nextNeedTime:
+            continue
+        lastRefreshTime = gameWorld.GetGameWorldDictByKey(Map_Dogzfb_LastRefreshTime % npcID)
+        if lastRefreshTime and curTime - lastRefreshTime < nextNeedTime:
+            #时间未到
+            continue
+        refreshDict[markInfo] = refreshInfo
+    if not refreshDict:
+        return
+    
+    npcCntDict = {}  #标识点对应数量
+    gameNPC = GameWorld.GetNPCManager()
+    for i in xrange(0, gameNPC.GetCustomNPCRefreshCount()):
+        npcRefresh = gameNPC.GetCustomNPCRefreshAt(i)
+        npcCnt = npcRefresh.GetCount()
+        if not npcCnt:
+            continue
+        rmark = npcRefresh.GetRefreshMark()
+        npcCntDict[rmark] = npcCntDict.get(rmark, 0) + npcRefresh.GetCount()
+        
+    for markInfo, refreshInfo in refreshDict.items():
+        npcID = refreshInfo[Def_NPCID]
+        refreshCnt = refreshInfo[Def_FirstRefreshCnt] if isFirst else refreshInfo[Def_RefreshCnt]
+        gameWorld.SetGameWorldDict(Map_Dogzfb_LastRefreshTime % npcID, curTime)
+        maxCnt = refreshInfo[Def_MaxCnt]
+        markList = [markInfo] if isinstance(markInfo, int) else list(markInfo)
+        random.shuffle(markList)
+        for rMark in markList:
+            if refreshCnt <=0:
+                break
+            curCnt = npcCntDict.get(rMark, 0)
+            if curCnt >= maxCnt:
+                continue
+            needRefreshCnt = min(refreshCnt, maxCnt - curCnt)
+            refreshCnt -= needRefreshCnt
+            NPCCustomRefresh.SetNPCRefresh(rMark, [(npcID, needRefreshCnt)], needRefreshCnt + curCnt, needRefreshCnt)
+        
+        #计算下次多久刷新
+        __UpdateBossTime(npcID, refreshInfo[Def_TimeFormula])
+        
+    #通知时间
+    SyncNPCRefreshTime()
+    
+    return
+
+def OnOnlineCntChange(key, tick):
+    bossid = IpyGameDataPY.GetFuncCfg('DogzFBRefreshCfg', 2)
+    if str(bossid) not in key:
+        return
+    gameFB = GameWorld.GetGameFB()
+    lastCheckTick = gameFB.GetGameFBDictByKey(Map_Dogzfb_LastCheckTick)
+    if not lastCheckTick:
+        dogzRefreshCfg = IpyGameDataPY.GetFuncEvalCfg('DogzFBRefreshCfg', 1, {})
+        for refreshInfo in dogzRefreshCfg.values():
+            npcID = refreshInfo[Def_NPCID]
+            __UpdateBossTime(npcID, refreshInfo[Def_TimeFormula])
+        CheckRefreshBoss(tick, True)
+    return
+
+def __UpdateBossTime(npcID, formula):
+    gameWorldMgr = GameWorld.GetGameWorld()
+    onlineCnt = gameWorldMgr.GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_BossOnlineHeroCnt)
+    nextTime = eval(formula)
+    gameWorldMgr.SetGameWorldDict(Map_Dogzfb_NextNeedTime % npcID, nextTime)
+    #GameWorld.DebugLog('    怪刷新间隔  npcID=%s, nextTime=%s'%(npcID, nextTime))
+    return
+
+def GetDogzNPCRefreshTime(curTime, npcID):
+    #获取NPC剩余刷新时间
+    gameWorldMgr = GameWorld.GetGameWorld()
+    lastRefreshTime = gameWorldMgr.GetGameWorldDictByKey(Map_Dogzfb_LastRefreshTime % npcID)
+    nextNeedTime = gameWorldMgr.GetGameWorldDictByKey(Map_Dogzfb_NextNeedTime % npcID)
+    return max(0, nextNeedTime - curTime + lastRefreshTime)
+
+def SyncNPCRefreshTime(playerid=0):
+    curTime = int(time.time())
+    syncNPCIDList = IpyGameDataPY.GetFuncEvalCfg('DogzFBRefreshCfg', 3)
+    syncDict = {}
+    for npcID in syncNPCIDList:
+        refreshTime = GetDogzNPCRefreshTime(curTime, npcID)
+        syncDict[npcID] = refreshTime
+    msgStr = str([playerid, syncDict])
+    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, 'DogzNPCTime', msgStr, len(msgStr))
+    return
+
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 7b8d579..2f075dd 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -5332,6 +5332,7 @@
 #  @param None
 #  @param None
 def SyncCollectionItemInfo(curPlayer, addExp, addMoney, addZhenQi, syncItemInfoList, collectNPCID=0):
+    return #暂不同步
     if addExp <= 0 and addMoney <= 0 and addZhenQi <= 0 and not syncItemInfoList:
         return
     
@@ -5419,15 +5420,15 @@
         collectNPCIDTimeLimit = ReadChConfig.GetEvalChConfig('CollectNPCIDTimeLimit')
         npcIDList = collectNPCIDTimeLimit.keys()
     
-    if funcTypeList:
-        collection = ChPyNetSendPack.tagMCFuncNPCCollectionCnt()
-        for fType in funcTypeList:
-            todayCollTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CollNpcCollTime % fType)
-            collection.Clear()
-            collection.FuncType = fType
-            collection.CollectionCnt = todayCollTime
-            collection.BuyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CollNpcBuyTime % fType)
-            NetPackCommon.SendFakePack(curPlayer, collection)
+#    if funcTypeList:
+#        collection = ChPyNetSendPack.tagMCFuncNPCCollectionCnt()
+#        for fType in funcTypeList:
+#            todayCollTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CollNpcCollTime % fType)
+#            collection.Clear()
+#            collection.FuncType = fType
+#            collection.CollectionCnt = todayCollTime
+#            collection.BuyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CollNpcBuyTime % fType)
+#            NetPackCommon.SendFakePack(curPlayer, collection)
         
     if npcIDList:
         npcIDCollInfo = ChPyNetSendPack.tagMCNPCIDCollectionCntInfo()
@@ -5542,6 +5543,59 @@
     NetPackCommon.SendFakePack(curPlayer, npcInfoPack)
     return
 
+
+## 获取本地图NPC数量
+#  @param queryNPCIDList:查询的NPCID列表
+#  @param tick
+#  @return {NPCID:cnt}
+def GetNPCCntInfo(queryNPCIDList, tick):
+    npcCntDict = {}
+
+    if not queryNPCIDList:
+        return npcCntDict
+    
+    gameNPCManager = GameWorld.GetNPCManager()
+    GameWorld.DebugLog("GetNPCCntInfo...queryNPCIDList=%s" % (str(queryNPCIDList)))
+
+    for index in xrange(gameNPCManager.GetNPCCount()):
+        curNPC = gameNPCManager.GetNPCByIndex(index)
+        curID = curNPC.GetID()
+        if curID == 0:
+            continue
+        
+        curNPCID = curNPC.GetNPCID()
+        
+        if curNPCID not in queryNPCIDList:
+            continue
+        if curNPC.GetCurAction() == IPY_GameWorld.laNPCDie or not curNPC.IsAlive():
+            continue
+        npcCntDict[curNPCID] = npcCntDict.get(curNPCID, 0) + 1
+                
+    GameWorld.DebugLog("    npcCntDict=%s" % (str(npcCntDict)))
+    return npcCntDict
+
+## 同步地图NPC数量信息
+#  @param curPlayer:采集玩家实例
+#  @param mapID:
+#  @param npcInfoDict:
+#  @return None
+def SyncNPCCntInfo(curPlayer, mapID, npcCntDict):
+    npcInfoPack = ChPyNetSendPack.tagMCNPCCntList()
+    npcInfoPack.Clear()
+    npcInfoPack.MapID = mapID
+    npcInfoPack.NPCInfoList = []
+
+    for npcid, npcCnt in npcCntDict.items():
+        npcInfo = ChPyNetSendPack.tagMCNPCCntInfo()
+        npcInfo.Clear()
+        npcInfo.NPCID = npcid
+        npcInfo.Cnt = npcCnt
+        npcInfoPack.NPCInfoList.append(npcInfo)
+        
+    npcInfoPack.NPCInfoCnt = len(npcInfoPack.NPCInfoList)
+    NetPackCommon.SendFakePack(curPlayer, npcInfoPack)
+    return
+
 def SendGameServerGoodItemRecord(mapID, npcID, playerName, playerID, itemID, equipInfo=[]):
     # @param equipInfo: [equipPlace, itemClassLV, itemColor, itemQuality, itemUserData]
 #    GameWorld.DebugLog("检查物品是否发送GameServer: mapID=%s, npcID=%s, playerName=%s, itemID=%s" 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
index 6ed28d3..ac6ef1d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -102,6 +102,7 @@
 import PlayerTJG
 import GameLogic_XMZZ
 import GameLogic_SealDemon
+import GameLogic_Dogz
 import PlayerFlashGiftbag
 import PlayerCostRebate
 import PlayerSpringSale
@@ -427,7 +428,7 @@
     # 古神禁地
     GameLogic_GodArea.GodAreaOnLogin(curPlayer)
 #    # 采集NPC次数通知
-#    NPCCommon.SyncCollNPCTime(curPlayer)
+    NPCCommon.SyncCollNPCTime(curPlayer)
 #        
 #    # 特惠活动
 #    PlayerTeHui.PlayerLogin_TeHui(curPlayer)
@@ -536,8 +537,11 @@
     SyncPackDownloadAward(curPlayer)
     # 登录触发功能开启(老号处理)
     GameFuncComm.DoFuncOpenLogic(curPlayer)
-    # 神兽
+	# 神兽
     PlayerDogz.OnPlayerLogin(curPlayer)
+	# 神兽副本
+    GameLogic_Dogz.SyncNPCRefreshTime(curPlayer.GetID())
+
     # 上线查询一次充值订单
     curPlayer.SendDBQueryRecharge()
     
@@ -5217,6 +5221,56 @@
     return
 
 
+
+## 地图NPC数量查询封包 A2 27 查询地图NPC数量信息 #tagCMQueryNPCCntInfo
+#  @param curPlayer
+#  @return None
+def OnQueryMapNPCCntInfo(index, clientData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    if not curPlayer:
+        return
+    
+    # 查询间隔控制
+    if not clientData.IsNoTimeLimit:
+        if not GameWorld.CheckPlayerTick(curPlayer, ChConfig.TYPE_Player_Tick_QueryMapNPCInfo, tick):
+            GameWorld.DebugLog("OnQueryMapNPCCntInfo 查询过于频繁!")
+            return
+       
+    tagMapID = clientData.MapID
+    tagLineID = clientData.LineID
+    queryNPCStr = clientData.NPCIDList
+    npcIDList = []
+    if queryNPCStr:
+        try:       
+            npcIDList = eval(clientData.NPCIDList)
+        except BaseException:
+            GameWorld.ErrLog("OnQueryMapNPCCntInfo, npcIDList=%s" % clientData.NPCIDList)
+            return
+        
+        if not isinstance(npcIDList, list):
+            GameWorld.ErrLog("OnQueryMapNPCCntInfo, npcIDList=%s is not list!" % str(npcIDList))
+            return
+    
+    GameWorld.DebugLog("OnQueryMapNPCCntInfo tagMapID=%s,tagLineID=%s,npcIDList=%s" 
+                       % (tagMapID, tagLineID, str(npcIDList)))
+    
+    curMapID = GameWorld.GetMap().GetMapID()
+    
+    # 如果是同张地图,直接查询通知
+    if curMapID == tagMapID:
+        npcInfoDict = NPCCommon.GetNPCCntInfo(npcIDList, tick)
+
+        GameWorld.DebugLog("    同地图查询curMapID=%s,tagLineID=%s,npcInfoDict=%s" 
+                           % (curMapID, tagLineID, str(npcInfoDict)))
+        NPCCommon.SyncNPCCntInfo(curPlayer, tagMapID, npcInfoDict)
+    else:
+        # 请求GameServer目标地图NPC信息
+        sendMsg = "%s" % str([tagMapID, tagLineID, npcIDList])
+        curPlayer.GameServer_QueryPlayerByID(ChConfig.queryType_NPCCnt, 0,
+                                 'NPCCntInfo', sendMsg, len(sendMsg))
+    return
+
+
 ## 跨服赛报名状态
 #  @param index 玩家索引
 #  @param tick 当前时间
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 37601ae..e79c69e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -83,6 +83,7 @@
 import GameLogic_ElderBattlefield
 import GameLogic_FamilyBoss
 import GameLogic_FamilyWar
+import GameLogic_Dogz
 import OpenServerCampaign
 import PlayerCostRebate
 import PlayerSpringSale
@@ -510,6 +511,7 @@
         
         #法宝
         PlayerMagicWeapon.OnDay(curPlayer)
+        PlayerGoldGift.OnDay(curPlayer)
         
     # 特殊时间点X点过天
     elif onEventType == ShareDefine.Def_OnEventTypeEx:
@@ -529,6 +531,9 @@
         ChItem.ResetItemUseCntToday(curPlayer)
         # 极品白拿
         PlayerFreeGoods.OnDay(curPlayer)
+        #采集次数重置
+        NPCCommon.CollNPCTimeOnDay(curPlayer)
+        
     
     # 以下为支持两种重置模式切换配置的
     FBCommon.FBOnDay(curPlayer, onEventType)
@@ -1369,7 +1374,9 @@
     # 活动buff状态变更
     elif key.startswith(ShareDefine.Def_Notify_WorldKey_ActionBuffState[:-2]):            
         PlayerAction.OnActionBuffStateChange(key, tick)
-
+    #boss刷新时间参数
+    elif key.startswith(ShareDefine.Def_Notify_WorldKey_BossOnlineHeroCnt[:-2]):
+        GameLogic_Dogz.OnOnlineCntChange(key, tick)
 #===============================================================================
 #    ---修改为上述的 统一字典处理
 #    if msg == ChConfig.Def_Notify_Key_PurTalk:
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py
index 339cda7..df8668c 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py
@@ -532,7 +532,7 @@
     
     if tick - curPlayer.GetPlayerActionTick() < curPlayer.GetPrepareTime():
         #时间间隔没有到
-        if prepareState == IPY_GameWorld.pstCollecting:
+        if prepareState in [IPY_GameWorld.pstCollecting, IPY_GameWorld.pstMissionCollecting]:
             FBLogic.OnCollecting(curPlayer, tick)
         
         return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_NPCCnt.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_NPCCnt.py
new file mode 100644
index 0000000..c0808c4
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_NPCCnt.py
@@ -0,0 +1,75 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+#-------------------------------------------------------------------------------
+#
+##@package Player.RemoteQuery.GY_Query_NPCCnt
+#
+# @todo:查询地图NPC数量
+# @author xdh
+# @date 2018-08-20
+# @version 1.0
+#
+# 详细描述: 查询地图NPC数量
+#
+#---------------------------------------------------------------------
+"""Version = 2018-08-20 17:00"""
+
+
+#导入
+import NPCCommon
+import GameWorld
+#---------------------------------------------------------------------
+#全局变量
+#---------------------------------------------------------------------
+
+
+#---------------------------------------------------------------------
+#逻辑实现
+## 请求逻辑
+#  @param query_Type 请求类型
+#  @param query_ID 请求的玩家ID
+#  @param packCMDList 发包命令 [ ]
+#  @param tick 当前时间
+#  @return "True" or "False" or ""
+#  @remarks 函数详细说明.
+def DoLogic(query_Type, query_ID, packCMDList, tick):
+    GameWorld.DebugLog("GY_Query_NPCCnt DoLogic() query_Type=%s,query_ID=%s,packCMDList=%s,tick=%s" % \
+                  (query_Type, query_ID, packCMDList, tick))
+    
+    if not packCMDList or len(packCMDList) < 3:
+        GameWorld.DebugLog("    DoLogic() return []")
+        return []
+    
+    tagMapID = packCMDList[0]  # 目标地图id
+    tagLineID = packCMDList[1]  # 线路id
+    queryNPCIDList = packCMDList[2]  # 查询的NPCID列表
+    
+    npcInfoDict = NPCCommon.GetNPCInfo(queryNPCIDList, tick)
+
+    return [tagMapID, npcInfoDict]
+#---------------------------------------------------------------------
+
+
+#执行结果
+## 执行结果
+#  @param curPlayer 发出请求的玩家
+#  @param callFunName 功能名称
+#  @param funResult 查询的结果
+#  @param tick 当前时间
+#  @return None
+#  @remarks 函数详细说明.
+def DoResult(curPlayer, callFunName, funResult, tick):
+    GameWorld.DebugLog("GY_Query_NPCCnt DoResult() funResult=%s" % str(funResult))
+    #还原格式 '[]' -> []
+    funResult = eval(funResult)
+    if not funResult or len(funResult) < 2:
+        return
+    
+    tagMapID = funResult[0]
+    npcInfoDict = funResult[1]
+    # 发包
+    NPCCommon.SyncNPCCntInfo(curPlayer, tagMapID, npcInfoDict)
+    return
+
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index 007b2e3..5b228ca 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -185,6 +185,7 @@
 Def_Notify_WorldKey_GameWorldBossOnlineCnt = "GameWorldBossOnlineCnt_%s"  #世界boss重生时间计算 在线人数统计 %s为bossid
 Def_Notify_WorldKey_BossShuntPlayer = 'BossShuntPlayer'   # boss分流玩家信息
 Def_Notify_WorldKey_BossShuntDeadLine = 'BossShuntDeadLine'   # boss分流线路已死亡的线路
+Def_Notify_WorldKey_BossOnlineHeroCnt = 'BossOnlineHeroCnt_%s'  # boss刷新时间用的在线人数, 参数为NPCID
 
 Def_Notify_WorldKey_FamilyActivityDayState = "FamilyActivityDayState"  #战盟相关活动今日开启状态, 按位存储代表今日是否开启过
 

--
Gitblit v1.8.0