From 67bcc2ab06912fc3d9cf31ceae533da76e50d5ae Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 20 九月 2019 14:19:55 +0800
Subject: [PATCH] 8258 【后端】BOSS首杀

---
 ServerPython/CoreServerGroup/GameServer/PyNetPack.ini                                                            |    6 
 ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py                                                  |   20 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ClearOpenServerAward.py          |    4 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py                               |    4 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py                               |   56 ++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py                           |  108 ++++++++
 ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/ClearRec.py                                           |    2 
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py                                                    |   56 ++++
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py                                   |  119 +++++++++
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py                                                |  108 ++++++++
 ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/ClearOpenServerDay.py                                 |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py                             |   23 +
 ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py                                                       |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py                           |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py                             |    7 
 PySysDB/PySysDBPY.h                                                                                              |    9 
 ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py                                                    |    4 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_BossFirstKill.py |  182 ++++++++++++++
 PySysDB/PySysDBG.h                                                                                               |    8 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                                  |    5 
 20 files changed, 719 insertions(+), 9 deletions(-)

diff --git a/PySysDB/PySysDBG.h b/PySysDB/PySysDBG.h
index 773614f..9542deb 100644
--- a/PySysDB/PySysDBG.h
+++ b/PySysDB/PySysDBG.h
@@ -209,6 +209,14 @@
 	char		SourceName;	//BOSS来源
 };
 
+//Boss首杀
+
+struct tagBOSSFirstKill
+{
+	DWORD		_NPCID;	//ID
+	list		ServerFirstKillPlayerAward;	// 全服首杀玩家奖励 [[物品ID,个数,是否拍品], ...]
+};
+
 //宴会题库表
 
 struct tagQuestionBank
diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index 5824311..6a28fd8 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -909,6 +909,15 @@
 	DWORD		StoneNPCID;	//墓碑NPCID
 };
 
+//Boss首杀
+
+struct tagBOSSFirstKill
+{
+	DWORD		_NPCID;	//ID
+	WORD		PerPlayerMoneyAward;	// 首杀全服玩家奖励灵石额度/人
+	list		PersonFirstKillAward;	// 个人首次击杀奖励 [[物品ID,个数,是否拍品], ...]
+};
+
 //古神禁地表
 
 struct tagElderGodArea
diff --git a/ServerPython/CoreServerGroup/GameServer/PyNetPack.ini b/ServerPython/CoreServerGroup/GameServer/PyNetPack.ini
index ab46a7a..a05a72c 100644
--- a/ServerPython/CoreServerGroup/GameServer/PyNetPack.ini
+++ b/ServerPython/CoreServerGroup/GameServer/PyNetPack.ini
@@ -312,7 +312,7 @@
 Writer = xdh
 Releaser = xdh
 RegType = 0
-RegisterPackCount = 4
+RegisterPackCount = 5
 
 PacketCMD_1=0xA9
 PacketSubCMD_1=0x03
@@ -330,6 +330,10 @@
 PacketSubCMD_4=0x04
 PacketCallFunc_4=OnQueryBossInfo
 
+PacketCMD_5=0xA9
+PacketSubCMD_5=0x01
+PacketCallFunc_5=OnGetBossFirstKillAward
+
 [GameWorldItem]
 ScriptName = GameWorldLogic\GameWorldItem.py
 Writer = hxp
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py b/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
index b680926..6ab6842 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
@@ -830,7 +830,7 @@
 Def_GiveMoney_Warehouse, # 仓库
 Def_GiveMoney_SellPackItem, # 出售背包物品
 Def_GiveMoney_CollectNPC, # 采集NPC
-Def_GiveMoney_20,
+Def_GiveMoney_BossFirstKill, # Boss首杀
 Def_GiveMoney_21,
 Def_GiveMoney_Trade, # 交易
 Def_GiveMoney_Truck, # 运镖
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
index 5b4630e..c9a1ace 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
@@ -1248,6 +1248,62 @@
 
 
 #------------------------------------------------------
+# A9 01 获取Boss首杀奖励 #tagCGGetBossFirstKillAward
+
+class  tagCGGetBossFirstKillAward(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("NPCID", c_int),    
+                  ("AwardType", c_ubyte),    # 0-首杀红包奖励;1-个人首杀奖励
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xA9
+        self.SubCmd = 0x01
+        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 = 0xA9
+        self.SubCmd = 0x01
+        self.NPCID = 0
+        self.AwardType = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagCGGetBossFirstKillAward)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// A9 01 获取Boss首杀奖励 //tagCGGetBossFirstKillAward:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                NPCID:%d,
+                                AwardType:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.NPCID,
+                                self.AwardType
+                                )
+        return DumpString
+
+
+m_NAtagCGGetBossFirstKillAward=tagCGGetBossFirstKillAward()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCGGetBossFirstKillAward.Cmd,m_NAtagCGGetBossFirstKillAward.SubCmd))] = m_NAtagCGGetBossFirstKillAward
+
+
+#------------------------------------------------------
 # A9 04 查询boss信息 #tagCGQueryBossInfo
 
 class  tagCGQueryBossInfo(Structure):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index cf75829..83ba1f1 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -27052,6 +27052,114 @@
 
 
 #------------------------------------------------------
+# AB 01 Boss首杀玩家奖励信息 #tagMCBossFirstKillStateInfo
+
+class  tagMCBossFirstKillState(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("NPCID", c_int),    
+                  ("FKState", c_int),    # 玩家该boss首杀相关状态,按位存:个位-玩家是否击杀过,十位-是否已领取首杀全服奖励,百位-是否已领取个人首杀奖励
+                  ]
+
+    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.FKState = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCBossFirstKillState)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AB 01 Boss首杀玩家奖励信息 //tagMCBossFirstKillStateInfo:
+                                NPCID:%d,
+                                FKState:%d
+                                '''\
+                                %(
+                                self.NPCID,
+                                self.FKState
+                                )
+        return DumpString
+
+
+class  tagMCBossFirstKillStateInfo(Structure):
+    Head = tagHead()
+    BossCount = 0    #(BYTE BossCount)
+    FirstKillStateList = list()    #(vector<tagMCBossFirstKillState> FirstKillStateList)
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xAB
+        self.Head.SubCmd = 0x01
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.BossCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.BossCount):
+            temFirstKillStateList = tagMCBossFirstKillState()
+            _pos = temFirstKillStateList.ReadData(_lpData, _pos)
+            self.FirstKillStateList.append(temFirstKillStateList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xAB
+        self.Head.SubCmd = 0x01
+        self.BossCount = 0
+        self.FirstKillStateList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        for i in range(self.BossCount):
+            length += self.FirstKillStateList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.BossCount)
+        for i in range(self.BossCount):
+            data = CommFunc.WriteString(data, self.FirstKillStateList[i].GetLength(), self.FirstKillStateList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                BossCount:%d,
+                                FirstKillStateList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.BossCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCBossFirstKillStateInfo=tagMCBossFirstKillStateInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCBossFirstKillStateInfo.Head.Cmd,m_NAtagMCBossFirstKillStateInfo.Head.SubCmd))] = m_NAtagMCBossFirstKillStateInfo
+
+
+#------------------------------------------------------
 # AB 03 Boss复活玩家活动信息 #tagMCBossRebornPlayerInfo
 
 class  tagMCBossRebornData(Structure):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/ClearOpenServerDay.py b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/ClearOpenServerDay.py
index c7e35b6..faed2a0 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/ClearOpenServerDay.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/ClearOpenServerDay.py
@@ -70,7 +70,7 @@
         PlayerBillboard.ClearBillboardByIndex(oscBillboardType)
     
     # 清除Rec
-    delRecTypeList = []
+    delRecTypeList = [ShareDefine.Def_UniversalGameRecType_BossFirstKill]
     universalRecMgr = GameWorld.GetUniversalRecMgr()
     for recType in delRecTypeList:
         universalRecMgr.Delete(recType)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/ClearRec.py b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/ClearRec.py
index 9fd1cab..d0adcc6 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/ClearRec.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/ClearRec.py
@@ -25,7 +25,7 @@
 def OnExec(curPlayer, gmList):
     if not gmList:
         GameWorld.DebugAnswer(curPlayer, "ClearRec 记录类型")
-        GameWorld.DebugAnswer(curPlayer, "    全服寻宝-34")
+        GameWorld.DebugAnswer(curPlayer, "31-Boss首杀,34-全服寻宝")
         return
     
     recType = gmList[0]
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py
index 5b1da6b..135c987 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py
@@ -47,12 +47,21 @@
 import PyGameData
 import PlayerGeTui
 import IPY_GameServer
+import PlayerTeam
 import CrossBoss
 import PlayerFB
 
 import time
 
+''' boss首杀
+ShareDefine.Def_UniversalGameRecType_BossFirstKill
+value1:bossID
+StrValue2:killedTimeStr
+StrValue3:playerName|playerName|...
 '''
+
+
+''' boss击杀信息
 ShareDefine.Def_UniversalGameRecType_BossInfo
 value1:bossID
 value2:killedTime
@@ -140,6 +149,9 @@
     horsePetRobBossIDList = IpyGameDataPY.GetFuncEvalCfg("FairyGrabBossID", 1)
     if bossID in horsePetRobBossIDList:
         OnFamilyKillHorsePetRobBoss(killPlayerName)
+        
+    # boss首杀
+    OnBossFirstKill(bossID, killerIDList)
     return
 
 def __UpdateBossRefreshList(bossID, killedTime=0, refreshTime=0):
@@ -1249,3 +1261,110 @@
     PlayerControl.FamilyNotify(curFamily.GetID(), "FairyGrabBossHelp", [curPlayer.GetName(), npcID])
     return
 
+## -------------------------------------- boss 首杀 ------------------------------------------------
+def __GetBossFirstKillRecDataList():
+    ## 获取boss首杀记录信息列表
+    return GameWorld.GetUniversalRecMgr() .GetTypeList(ShareDefine.Def_UniversalGameRecType_BossFirstKill)
+
+def __GetBossFirstKillRecDataByID(bossID):
+    ## 获取boss首杀记录信息数据
+    
+    recTypeListData = __GetBossFirstKillRecDataList()
+    # 查找是否已有记录
+    bossFirstKillRec = None
+    for index in xrange(recTypeListData.Count()):
+        universalRecData = recTypeListData.At(index)
+        if universalRecData.GetValue1() == bossID:
+            bossFirstKillRec = universalRecData
+            break
+        
+    if bossFirstKillRec == None:
+        #还未记录,则添加一个记录对象
+        bossFirstKillRec = recTypeListData.AddRec()        
+        bossFirstKillRec.SetValue1(bossID)
+        
+    return bossFirstKillRec
+
+def OnBossFirstKill(bossID, killerIDList):
+    ## 处理boss首杀逻辑
+    
+    maxOSDay = IpyGameDataPY.GetFuncCfg("OSCBossFirstKill", 1)
+    openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1
+    if openServerDay > maxOSDay:
+        GameWorld.DebugLog("超过开服天(%s), 不开放首杀活动!" % maxOSDay)
+        return
+    
+    if not bossID or not killerIDList:
+        return
+    
+    ipyData = IpyGameDataPY.GetIpyGameDataNotLog("BOSSFirstKill", bossID)
+    if not ipyData:
+        return
+    
+    fkRecData = __GetBossFirstKillRecDataByID(bossID)
+    if not fkRecData:
+        return
+    
+    firstKillTimeStr = fkRecData.GetStrValue2()
+    if firstKillTimeStr:
+        GameWorld.DebugLog("已经首杀过了! bossID=%s, %s" % (bossID, firstKillTimeStr))
+        return
+    
+    killPlayerList = []
+    playerMgr = GameWorld.GetPlayerManager()
+    for playerID in killerIDList:
+        player = playerMgr.FindPlayerByID(playerID)
+        if not player:
+            continue
+        teamMemLV = PlayerTeam.__GetPlayerTeamLV(player)
+        killPlayerList.append([teamMemLV, player.GetName()])
+    if not killPlayerList:
+        return
+    
+    killPlayerList.sort(reverse=True)
+    fkPlayerNameList = [nameInfo[1] for nameInfo in killPlayerList]
+    
+    fkRecData.SetStrValue2(GameWorld.GetCurrentDataTimeStr())
+    fkRecData.SetStrValue3(",".join(fkPlayerNameList))
+    
+    # 首杀奖励邮件
+    PlayerCompensation.SendMailByKey("BossFirstKillMail", killerIDList, ipyData.GetServerFirstKillPlayerAward(), [bossID])
+    
+    ## 主动广播全服玩家
+    PlayerUniversalGameRec.SendUniversalGameRecSingle(None, fkRecData)
+    return
+
+
+#// A9 01 获取Boss首杀奖励 #tagCGGetBossFirstKillAward
+#
+#struct    tagCGGetBossFirstKillAward
+#{
+#    tagHead    Head;
+#    DWORD    NPCID;
+#    BYTE    AwardType;    // 0-首杀红包奖励;1-个人首杀奖励
+#};
+def OnGetBossFirstKillAward(index, clientData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    bossID = clientData.NPCID
+    awardType = clientData.AwardType
+    
+    ipyData = IpyGameDataPY.GetIpyGameDataNotLog("BOSSFirstKill", bossID)
+    if not ipyData:
+        return
+    
+    if awardType == 0:
+        fkRecData = __GetBossFirstKillRecDataByID(bossID)
+        if not fkRecData:
+            return
+        
+        firstKillTimeStr = fkRecData.GetStrValue2()
+        if not firstKillTimeStr:
+            GameWorld.DebugLog("Boss还未首杀,不能领取boss首杀公共红包奖励! bossID=%s" % (bossID), curPlayer.GetPlayerID())
+            return
+        
+    msgInfo = str([bossID, awardType])
+    curPlayer.MapServer_QueryPlayerResult(0, 0, "BossFirstKill", msgInfo, len(msgInfo))
+    return
+
+## ------------------------------------------------------------------------------------------------
+
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
index b4d2e6f..1d35e5c 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
@@ -192,6 +192,11 @@
                         ("char", "SourceName", 0),
                         ),
 
+                "BOSSFirstKill":(
+                        ("DWORD", "NPCID", 1),
+                        ("list", "ServerFirstKillPlayerAward", 0),
+                        ),
+
                 "QuestionBank":(
                         ("DWORD", "ID", 1),
                         ("char", "Answer", 0),
@@ -886,6 +891,17 @@
     def GetStoneNPCID(self): return self.StoneNPCID # 墓碑NPCID
     def GetRebornPreNotifyTime(self): return self.RebornPreNotifyTime # 复活前X秒通知
     def GetSourceName(self): return self.SourceName # BOSS来源
+
+# Boss首杀
+class IPY_BOSSFirstKill():
+    
+    def __init__(self):
+        self.NPCID = 0
+        self.ServerFirstKillPlayerAward = []
+        return
+        
+    def GetNPCID(self): return self.NPCID # ID
+    def GetServerFirstKillPlayerAward(self): return self.ServerFirstKillPlayerAward #  全服首杀玩家奖励 [[物品ID,个数,是否拍品], ...]
 
 # 宴会题库表
 class IPY_QuestionBank():
@@ -1689,6 +1705,8 @@
         self.ipyChinMapLen = len(self.ipyChinMapCache)
         self.ipyBOSSInfoCache = self.__LoadFileData("BOSSInfo", IPY_BOSSInfo)
         self.ipyBOSSInfoLen = len(self.ipyBOSSInfoCache)
+        self.ipyBOSSFirstKillCache = self.__LoadFileData("BOSSFirstKill", IPY_BOSSFirstKill)
+        self.ipyBOSSFirstKillLen = len(self.ipyBOSSFirstKillCache)
         self.ipyQuestionBankCache = self.__LoadFileData("QuestionBank", IPY_QuestionBank)
         self.ipyQuestionBankLen = len(self.ipyQuestionBankCache)
         self.ipyFamilyRedPackCache = self.__LoadFileData("FamilyRedPack", IPY_FamilyRedPack)
@@ -1953,6 +1971,8 @@
     def GetChinMapByIndex(self, index): return self.ipyChinMapCache[index]
     def GetBOSSInfoCount(self): return self.ipyBOSSInfoLen
     def GetBOSSInfoByIndex(self, index): return self.ipyBOSSInfoCache[index]
+    def GetBOSSFirstKillCount(self): return self.ipyBOSSFirstKillLen
+    def GetBOSSFirstKillByIndex(self, index): return self.ipyBOSSFirstKillCache[index]
     def GetQuestionBankCount(self): return self.ipyQuestionBankLen
     def GetQuestionBankByIndex(self, index): return self.ipyQuestionBankCache[index]
     def GetFamilyRedPackCount(self): return self.ipyFamilyRedPackLen
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
index e15e43c..8e13cd9 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -1040,8 +1040,8 @@
                                 Def_UniversalGameRecType_27,
                                 Def_UniversalGameRecType_28,
                                 Def_UniversalGameRecType_BossInfo,  # boss信息29
-                                Def_UniversalGameRecType_CrossBossInfo,  # 跨服boss信息
-                                Def_UniversalGameRecType_31,
+                                Def_UniversalGameRecType_CrossBossInfo,  # 跨服boss信息 30
+                                Def_UniversalGameRecType_BossFirstKill, # boss首杀 31
                                 Def_UniversalGameRecType_32,              
                                 Def_UniversalGameRecType_33,
                                 Def_UniversalGameRecType_34,
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index c811fcd..a29c2d1 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3666,6 +3666,9 @@
 Def_PDict_BRActionGotTimes = "BRActionGotTimes_%s" #当前已领次数 参数BOSS复活活动ID
 Def_PDict_BRActionWorldLV = "BRActionWorldLV" #BOSS复活活动开启时世界等级
 
+#Boss首杀
+Def_PDict_BossFirstKillState = "BossFirstKillState_%s" # boss首杀相关状态记录
+
 #仙界盛典
 Def_PDict_FairyCeremonyID = "FairyCeremonyID"  # 玩家身上的仙界盛典活动ID,唯一标识,取活动开始日期time值
 Def_PDict_FCActionWorldLV = "FCActionWorldLV" #玩家身上的仙界盛典时的世界等级
@@ -4751,7 +4754,7 @@
 Def_GiveMoney_Warehouse, # 仓库
 Def_GiveMoney_SellPackItem, # 出售背包物品
 Def_GiveMoney_CollectNPC, # 采集NPC
-Def_GiveMoney_20,
+Def_GiveMoney_BossFirstKill, # Boss首杀
 Def_GiveMoney_21,
 Def_GiveMoney_Trade, # 交易
 Def_GiveMoney_Truck, # 运镖
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
index 5b4630e..c9a1ace 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -1248,6 +1248,62 @@
 
 
 #------------------------------------------------------
+# A9 01 获取Boss首杀奖励 #tagCGGetBossFirstKillAward
+
+class  tagCGGetBossFirstKillAward(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("NPCID", c_int),    
+                  ("AwardType", c_ubyte),    # 0-首杀红包奖励;1-个人首杀奖励
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xA9
+        self.SubCmd = 0x01
+        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 = 0xA9
+        self.SubCmd = 0x01
+        self.NPCID = 0
+        self.AwardType = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagCGGetBossFirstKillAward)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// A9 01 获取Boss首杀奖励 //tagCGGetBossFirstKillAward:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                NPCID:%d,
+                                AwardType:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.NPCID,
+                                self.AwardType
+                                )
+        return DumpString
+
+
+m_NAtagCGGetBossFirstKillAward=tagCGGetBossFirstKillAward()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCGGetBossFirstKillAward.Cmd,m_NAtagCGGetBossFirstKillAward.SubCmd))] = m_NAtagCGGetBossFirstKillAward
+
+
+#------------------------------------------------------
 # A9 04 查询boss信息 #tagCGQueryBossInfo
 
 class  tagCGQueryBossInfo(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index cf75829..83ba1f1 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -27052,6 +27052,114 @@
 
 
 #------------------------------------------------------
+# AB 01 Boss首杀玩家奖励信息 #tagMCBossFirstKillStateInfo
+
+class  tagMCBossFirstKillState(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("NPCID", c_int),    
+                  ("FKState", c_int),    # 玩家该boss首杀相关状态,按位存:个位-玩家是否击杀过,十位-是否已领取首杀全服奖励,百位-是否已领取个人首杀奖励
+                  ]
+
+    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.FKState = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCBossFirstKillState)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AB 01 Boss首杀玩家奖励信息 //tagMCBossFirstKillStateInfo:
+                                NPCID:%d,
+                                FKState:%d
+                                '''\
+                                %(
+                                self.NPCID,
+                                self.FKState
+                                )
+        return DumpString
+
+
+class  tagMCBossFirstKillStateInfo(Structure):
+    Head = tagHead()
+    BossCount = 0    #(BYTE BossCount)
+    FirstKillStateList = list()    #(vector<tagMCBossFirstKillState> FirstKillStateList)
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xAB
+        self.Head.SubCmd = 0x01
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.BossCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.BossCount):
+            temFirstKillStateList = tagMCBossFirstKillState()
+            _pos = temFirstKillStateList.ReadData(_lpData, _pos)
+            self.FirstKillStateList.append(temFirstKillStateList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xAB
+        self.Head.SubCmd = 0x01
+        self.BossCount = 0
+        self.FirstKillStateList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        for i in range(self.BossCount):
+            length += self.FirstKillStateList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.BossCount)
+        for i in range(self.BossCount):
+            data = CommFunc.WriteString(data, self.FirstKillStateList[i].GetLength(), self.FirstKillStateList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                BossCount:%d,
+                                FirstKillStateList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.BossCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCBossFirstKillStateInfo=tagMCBossFirstKillStateInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCBossFirstKillStateInfo.Head.Cmd,m_NAtagMCBossFirstKillStateInfo.Head.SubCmd))] = m_NAtagMCBossFirstKillStateInfo
+
+
+#------------------------------------------------------
 # AB 03 Boss复活玩家活动信息 #tagMCBossRebornPlayerInfo
 
 class  tagMCBossRebornData(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ClearOpenServerAward.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ClearOpenServerAward.py
index 1012701..fda51d0 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ClearOpenServerAward.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ClearOpenServerAward.py
@@ -26,6 +26,7 @@
 import OpenServerCampaign
 import ClearFirstGold
 import PlayerOnlinePrize
+import GY_Query_BossFirstKill
 #---------------------------------------------------------------------
 ## 执行逻辑
 #  @param curPlayer 当前玩家
@@ -49,6 +50,9 @@
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OSC_EndMailState, 0)
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OSC_BillAwardRecord, 0)
     
+    #boss首杀
+    GY_Query_BossFirstKill.OnGMResetBossFirstKillState(curPlayer)
+    
     if len(cmdList) == 0:
         for i in ShareDefine.Def_Campaign_Type_List:
             __DoOSCReset(curPlayer, i)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index f7c3a8e..4017062 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -744,6 +744,12 @@
                         ("DWORD", "StoneNPCID", 0),
                         ),
 
+                "BOSSFirstKill":(
+                        ("DWORD", "NPCID", 1),
+                        ("WORD", "PerPlayerMoneyAward", 0),
+                        ("list", "PersonFirstKillAward", 0),
+                        ),
+
                 "ElderGodArea":(
                         ("DWORD", "NPCID", 1),
                         ("BYTE", "MonsterAnger", 0),
@@ -2978,6 +2984,19 @@
     def GetRelatedID(self): return self.RelatedID # 关联ID
     def GetStoneNPCID(self): return self.StoneNPCID # 墓碑NPCID
 
+# Boss首杀
+class IPY_BOSSFirstKill():
+    
+    def __init__(self):
+        self.NPCID = 0
+        self.PerPlayerMoneyAward = 0
+        self.PersonFirstKillAward = []
+        return
+        
+    def GetNPCID(self): return self.NPCID # ID
+    def GetPerPlayerMoneyAward(self): return self.PerPlayerMoneyAward #  首杀全服玩家奖励灵石额度/人
+    def GetPersonFirstKillAward(self): return self.PersonFirstKillAward #  个人首次击杀奖励 [[物品ID,个数,是否拍品], ...]
+
 # 古神禁地表
 class IPY_ElderGodArea():
     
@@ -4707,6 +4726,8 @@
         self.ipyAlchemyResultLen = len(self.ipyAlchemyResultCache)
         self.ipyBOSSInfoCache = self.__LoadFileData("BOSSInfo", IPY_BOSSInfo)
         self.ipyBOSSInfoLen = len(self.ipyBOSSInfoCache)
+        self.ipyBOSSFirstKillCache = self.__LoadFileData("BOSSFirstKill", IPY_BOSSFirstKill)
+        self.ipyBOSSFirstKillLen = len(self.ipyBOSSFirstKillCache)
         self.ipyElderGodAreaCache = self.__LoadFileData("ElderGodArea", IPY_ElderGodArea)
         self.ipyElderGodAreaLen = len(self.ipyElderGodAreaCache)
         self.ipyPersonalBossCache = self.__LoadFileData("PersonalBoss", IPY_PersonalBoss)
@@ -5173,6 +5194,8 @@
     def GetAlchemyResultByIndex(self, index): return self.ipyAlchemyResultCache[index]
     def GetBOSSInfoCount(self): return self.ipyBOSSInfoLen
     def GetBOSSInfoByIndex(self, index): return self.ipyBOSSInfoCache[index]
+    def GetBOSSFirstKillCount(self): return self.ipyBOSSFirstKillLen
+    def GetBOSSFirstKillByIndex(self, index): return self.ipyBOSSFirstKillCache[index]
     def GetElderGodAreaCount(self): return self.ipyElderGodAreaLen
     def GetElderGodAreaByIndex(self, index): return self.ipyElderGodAreaCache[index]
     def GetPersonalBossCount(self): return self.ipyPersonalBossLen
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 6ff5ef8..a1b5b03 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -44,6 +44,7 @@
 import PlayerActivity
 import PlayerSuccess
 import BossHurtMng
+import GY_Query_BossFirstKill
 import GameLogic_FamilyInvade
 import GameLogic_GatherSoul
 import FormulaControl
@@ -2370,6 +2371,12 @@
     elif mapID == ChConfig.Def_FBMapID_CrossPenglai:
         #跨服蓬莱仙境
         PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_CrossPenglai)
+        
+    # 个人首杀记录
+    ipyData = IpyGameDataPY.GetIpyGameDataNotLog("BOSSFirstKill", npcID)
+    if ipyData:
+        GY_Query_BossFirstKill.SetPlayerFirstKillBoss(curPlayer, npcID)
+        
     return
     
 #################################################
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 a19af85..0cd43f2 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -103,6 +103,7 @@
 import PlayerSpringSale
 import PlayerFairyCeremony
 import PlayerNewFairyCeremony
+import GY_Query_BossFirstKill
 import PlayerFeastRedPacket
 import PlayerLuckyTreasure
 import Item_ResetAttrPoint
@@ -711,6 +712,8 @@
     PlayerFB.OnLogin(curPlayer)
     #技能专精信息
     SkillShell.NotifyElementSkillInfo(curPlayer)
+    #Boss首杀
+    GY_Query_BossFirstKill.OnPlayerLogin(curPlayer)
     
     curPlayer.SetState(0)   # 脱机挂恢复为正常上线
     curPlayer.SetFacePic(0) # 通知数据库是否保存还是下线,做一次恢复,1为保存 0为正常下线
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_BossFirstKill.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_BossFirstKill.py
new file mode 100644
index 0000000..e62d046
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_BossFirstKill.py
@@ -0,0 +1,182 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Player.RemoteQuery.GY_Query_BossFirstKill
+#
+# @todo:Boss首杀
+# @author hxp
+# @date 2019-09-20
+# @version 1.0
+#
+# 详细描述: Boss首杀
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2019-09-20 14:00"""
+#-------------------------------------------------------------------------------
+
+import ChConfig
+import GameWorld
+import PlayerControl
+import IpyGameDataPY
+import IPY_GameWorld
+import ItemControler
+import ChPyNetSendPack
+import NetPackCommon
+import ShareDefine
+import ItemCommon
+
+# boss首杀状态位定义
+(
+BossFKState_IsKill, # 是否已经击杀过该boss
+BossFKState_PubAward, # 是否领取过全服首杀奖励
+BossFKState_PriAward, # 是否领取过个人首杀奖励
+) = range(3)
+
+def OnPlayerLogin(curPlayer):
+    maxBossFKDay = IpyGameDataPY.GetFuncCfg("OSCBossFirstKill", 1)
+    openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1
+    if openServerDay > maxBossFKDay:
+        return
+        
+    Sync_BossFirstKillState(curPlayer, [])
+    return
+
+def SetPlayerFirstKillBoss(curPlayer, bossID):
+    fkState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BossFirstKillState % bossID)
+    if GameWorld.GetDataByDigitPlace(fkState, BossFKState_IsKill):
+        GameWorld.DebugLog("已经击杀过该boss!")
+        return
+    updFKState = GameWorld.ChangeDataByDigitPlace(fkState, BossFKState_IsKill, 1)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BossFirstKillState % bossID, updFKState)
+    GameWorld.DebugLog("设置首杀过该boss: bossID=%s,fkState=%s,updFKState=%s" % (bossID, fkState, updFKState))
+    Sync_BossFirstKillState(curPlayer, [bossID])
+    return
+
+#------------------------------------------------------------------------------ 
+## 跨服赛报名调用接口
+#  @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): 
+    return
+
+
+#------------------------------------------------------------------------------ 
+## 执行结果
+#  @param curPlayer 发出请求的玩家
+#  @param callFunName 功能名称
+#  @param funResult 查询的结果
+#  @param tick 当前时间
+#  @return None
+#  @remarks 函数详细说明.
+def DoResult(curPlayer, callFunName, funResult, tick):
+    bossID, awardType = eval(funResult)
+    GameWorld.DebugLog("GY_Query_BossFirstKill bossID=%s, awardType=%s" % (bossID, awardType), curPlayer.GetPlayerID())
+    if not curPlayer:
+        return
+    
+    ipyData = IpyGameDataPY.GetIpyGameDataNotLog("BOSSFirstKill", bossID)
+    if not ipyData:
+        return
+    
+    if awardType == 0:
+        __DoGiveBossFirstKill_PubAward(curPlayer, bossID, ipyData)
+    elif awardType == 1:
+        __DoGiveBossFirstKill_PriAward(curPlayer, bossID, ipyData)
+        
+    return
+
+def __DoGiveBossFirstKill_PubAward(curPlayer, bossID, ipyData):
+    ## 首杀全服公共奖励
+    
+    bitIndex = BossFKState_PubAward
+    fkState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BossFirstKillState % bossID)
+    if GameWorld.GetDataByDigitPlace(fkState, bitIndex):
+        GameWorld.DebugLog("已经领取过该首杀全服奖励!fkState=%s,bitIndex=%s" % (fkState, bitIndex))
+        return
+    updFKState = GameWorld.ChangeDataByDigitPlace(fkState, bitIndex, 1)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BossFirstKillState % bossID, updFKState)
+    GameWorld.DebugLog("更新Boss首杀全服奖励领奖记录!fkState=%s,bitIndex=%s,updFKState=%s" 
+                       % (fkState, bitIndex, updFKState))
+    
+    awardGoldPaper = ipyData.GetPerPlayerMoneyAward()
+    addDataDict = {"bossID":bossID}
+    PlayerControl.GiveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Paper, awardGoldPaper, ChConfig.Def_GiveMoney_BossFirstKill, addDataDict)
+    Sync_BossFirstKillState(curPlayer, [bossID]) 
+    return
+
+def __DoGiveBossFirstKill_PriAward(curPlayer, bossID, ipyData):
+    ## 个人首杀奖励
+    
+    fkState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BossFirstKillState % bossID)
+    if not GameWorld.GetDataByDigitPlace(fkState, BossFKState_IsKill):
+        GameWorld.DebugLog("还未击杀过该boss,无法领取个人首杀奖励!fkState=%s,bitIndex=%s" % (fkState, BossFKState_IsKill))
+        return
+    
+    awardItemList = ipyData.GetPersonFirstKillAward()
+    needSpace = len(awardItemList)
+    emptySpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace)
+    if emptySpace < needSpace:
+        PlayerControl.NotifyCode(curPlayer, "GeRen_lhs_202580")
+        return
+    
+    bitIndex = BossFKState_PriAward
+    if GameWorld.GetDataByDigitPlace(fkState, bitIndex):
+        GameWorld.DebugLog("已经领取过该个人首杀奖励!fkState=%s,bitIndex=%s" % (fkState, bitIndex))
+        return
+    updFKState = GameWorld.ChangeDataByDigitPlace(fkState, bitIndex, 1)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BossFirstKillState % bossID, updFKState)
+    GameWorld.DebugLog("更新Boss首杀个人奖励领奖记录!fkState=%s,bitIndex=%s,updFKState=%s" 
+                       % (fkState, bitIndex, updFKState))
+    
+    for itemID, itemCount, isAuctionItem in awardItemList:
+        ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, [IPY_GameWorld.rptItem])
+        
+    Sync_BossFirstKillState(curPlayer, [bossID])
+    return
+
+def Sync_BossFirstKillState(curPlayer, syncBossIDList=[], isForce=False):
+    if not syncBossIDList:
+        ipyDataMgr = IpyGameDataPY.IPY_Data()
+        for index in xrange(ipyDataMgr.GetBOSSFirstKillCount()):
+            ipyData = ipyDataMgr.GetBOSSFirstKillByIndex(index)
+            syncBossIDList.append(ipyData.GetNPCID())
+            
+    firstKillStateList = []
+    for bossID in syncBossIDList:
+        fkState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BossFirstKillState % bossID)
+        if not fkState and not isForce:
+            continue
+        fkStatePack = ChPyNetSendPack.tagMCBossFirstKillState()
+        fkStatePack.NPCID = bossID
+        fkStatePack.FKState = fkState
+        firstKillStateList.append(fkStatePack)
+        
+    if not firstKillStateList:
+        return
+    
+    clientPack = ChPyNetSendPack.tagMCBossFirstKillStateInfo()
+    clientPack.FirstKillStateList = firstKillStateList
+    clientPack.BossCount = len(clientPack.FirstKillStateList)
+    NetPackCommon.SendFakePack(curPlayer, clientPack)
+    return
+
+def OnGMResetBossFirstKillState(curPlayer):
+    syncBossIDList = []
+    ipyDataMgr = IpyGameDataPY.IPY_Data()
+    for index in xrange(ipyDataMgr.GetBOSSFirstKillCount()):
+        ipyData = ipyDataMgr.GetBOSSFirstKillByIndex(index)
+        bossID = ipyData.GetNPCID()
+        fkState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BossFirstKillState % bossID)
+        if not fkState:
+            continue
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BossFirstKillState % bossID, 0)
+        syncBossIDList.append(bossID)
+    Sync_BossFirstKillState(curPlayer, syncBossIDList, isForce=True)
+    return
+
+    
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index e15e43c..8e13cd9 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -1040,8 +1040,8 @@
                                 Def_UniversalGameRecType_27,
                                 Def_UniversalGameRecType_28,
                                 Def_UniversalGameRecType_BossInfo,  # boss信息29
-                                Def_UniversalGameRecType_CrossBossInfo,  # 跨服boss信息
-                                Def_UniversalGameRecType_31,
+                                Def_UniversalGameRecType_CrossBossInfo,  # 跨服boss信息 30
+                                Def_UniversalGameRecType_BossFirstKill, # boss首杀 31
                                 Def_UniversalGameRecType_32,              
                                 Def_UniversalGameRecType_33,
                                 Def_UniversalGameRecType_34,

--
Gitblit v1.8.0