hxp
2019-09-20 67bcc2ab06912fc3d9cf31ceae533da76e50d5ae
8258 【后端】BOSS首杀
19个文件已修改
1个文件已添加
728 ■■■■■ 已修改文件
PySysDB/PySysDBG.h 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/PySysDBPY.h 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/PyNetPack.ini 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/ClearOpenServerDay.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/ClearRec.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ClearOpenServerAward.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_BossFirstKill.py 182 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/PySysDBG.h
@@ -209,6 +209,14 @@
    char        SourceName;    //BOSS来源
};
//Boss首杀
struct tagBOSSFirstKill
{
    DWORD        _NPCID;    //ID
    list        ServerFirstKillPlayerAward;    // 全服首杀玩家奖励 [[物品ID,个数,是否拍品], ...]
};
//宴会题库表
struct tagQuestionBank
PySysDB/PySysDBPY.h
@@ -909,6 +909,15 @@
    DWORD        StoneNPCID;    //墓碑NPCID
};
//Boss首杀
struct tagBOSSFirstKill
{
    DWORD        _NPCID;    //ID
    WORD        PerPlayerMoneyAward;    // 首杀全服玩家奖励灵石额度/人
    list        PersonFirstKillAward;    // 个人首次击杀奖励 [[物品ID,个数,是否拍品], ...]
};
//古神禁地表
struct tagElderGodArea
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
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, # 运镖
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):
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):
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)
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]
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
## ------------------------------------------------------------------------------------------------
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
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,
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, # 运镖
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):
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):
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)
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
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
    
#################################################
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为正常下线
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_BossFirstKill.py
New file
@@ -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
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,