| | |
| | | char SourceName; //BOSS来源
|
| | | };
|
| | |
|
| | | //Boss首杀
|
| | |
|
| | | struct tagBOSSFirstKill
|
| | | {
|
| | | DWORD _NPCID; //ID
|
| | | list ServerFirstKillPlayerAward; // 全服首杀玩家奖励 [[物品ID,个数,是否拍品], ...]
|
| | | };
|
| | |
|
| | | //宴会题库表
|
| | |
|
| | | struct tagQuestionBank
|
| | |
| | | DWORD StoneNPCID; //墓碑NPCID
|
| | | };
|
| | |
|
| | | //Boss首杀
|
| | |
|
| | | struct tagBOSSFirstKill
|
| | | {
|
| | | DWORD _NPCID; //ID
|
| | | WORD PerPlayerMoneyAward; // 首杀全服玩家奖励灵石额度/人
|
| | | list PersonFirstKillAward; // 个人首次击杀奖励 [[物品ID,个数,是否拍品], ...]
|
| | | };
|
| | |
|
| | | //古神禁地表
|
| | |
|
| | | struct tagElderGodArea
|
| | |
| | | Writer = xdh
|
| | | Releaser = xdh
|
| | | RegType = 0
|
| | | RegisterPackCount = 4
|
| | | RegisterPackCount = 5
|
| | |
|
| | | PacketCMD_1=0xA9
|
| | | PacketSubCMD_1=0x03
|
| | |
| | | PacketSubCMD_4=0x04
|
| | | PacketCallFunc_4=OnQueryBossInfo
|
| | |
|
| | | PacketCMD_5=0xA9
|
| | | PacketSubCMD_5=0x01
|
| | | PacketCallFunc_5=OnGetBossFirstKillAward
|
| | |
|
| | | [GameWorldItem]
|
| | | ScriptName = GameWorldLogic\GameWorldItem.py
|
| | | Writer = hxp
|
| | |
| | | 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, # 运镖
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # 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):
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # 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):
|
| | |
| | | PlayerBillboard.ClearBillboardByIndex(oscBillboardType)
|
| | |
|
| | | # 清除Rec
|
| | | delRecTypeList = []
|
| | | delRecTypeList = [ShareDefine.Def_UniversalGameRecType_BossFirstKill]
|
| | | universalRecMgr = GameWorld.GetUniversalRecMgr()
|
| | | for recType in delRecTypeList:
|
| | | universalRecMgr.Delete(recType)
|
| | |
| | | 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]
|
| | |
| | | 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
|
| | |
| | | horsePetRobBossIDList = IpyGameDataPY.GetFuncEvalCfg("FairyGrabBossID", 1)
|
| | | if bossID in horsePetRobBossIDList:
|
| | | OnFamilyKillHorsePetRobBoss(killPlayerName)
|
| | | |
| | | # boss首杀
|
| | | OnBossFirstKill(bossID, killerIDList)
|
| | | return
|
| | |
|
| | | def __UpdateBossRefreshList(bossID, killedTime=0, refreshTime=0):
|
| | |
| | | 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
|
| | |
|
| | | ## ------------------------------------------------------------------------------------------------
|
| | |
|
| | |
| | | ("char", "SourceName", 0),
|
| | | ),
|
| | |
|
| | | "BOSSFirstKill":(
|
| | | ("DWORD", "NPCID", 1),
|
| | | ("list", "ServerFirstKillPlayerAward", 0),
|
| | | ),
|
| | |
|
| | | "QuestionBank":(
|
| | | ("DWORD", "ID", 1),
|
| | | ("char", "Answer", 0),
|
| | |
| | | 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(): |
| | |
| | | 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)
|
| | |
| | | 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
|
| | |
| | | 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,
|
| | |
| | | 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" #玩家身上的仙界盛典时的世界等级
|
| | |
| | | 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, # 运镖
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # 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):
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # 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):
|
| | |
| | | import OpenServerCampaign
|
| | | import ClearFirstGold
|
| | | import PlayerOnlinePrize
|
| | | import GY_Query_BossFirstKill
|
| | | #---------------------------------------------------------------------
|
| | | ## 执行逻辑
|
| | | # @param curPlayer 当前玩家
|
| | |
| | | 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)
|
| | |
| | | ("DWORD", "StoneNPCID", 0),
|
| | | ),
|
| | |
|
| | | "BOSSFirstKill":(
|
| | | ("DWORD", "NPCID", 1),
|
| | | ("WORD", "PerPlayerMoneyAward", 0),
|
| | | ("list", "PersonFirstKillAward", 0),
|
| | | ),
|
| | |
|
| | | "ElderGodArea":(
|
| | | ("DWORD", "NPCID", 1),
|
| | | ("BYTE", "MonsterAnger", 0),
|
| | |
| | | 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(): |
| | | |
| | |
| | | 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)
|
| | |
| | | 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
|
| | |
| | | import PlayerActivity
|
| | | import PlayerSuccess
|
| | | import BossHurtMng
|
| | | import GY_Query_BossFirstKill
|
| | | import GameLogic_FamilyInvade
|
| | | import GameLogic_GatherSoul
|
| | | import FormulaControl
|
| | |
| | | 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
|
| | |
|
| | | #################################################
|
| | |
| | | import PlayerSpringSale
|
| | | import PlayerFairyCeremony
|
| | | import PlayerNewFairyCeremony
|
| | | import GY_Query_BossFirstKill
|
| | | import PlayerFeastRedPacket
|
| | | import PlayerLuckyTreasure
|
| | | import Item_ResetAttrPoint
|
| | |
| | | PlayerFB.OnLogin(curPlayer)
|
| | | #技能专精信息
|
| | | SkillShell.NotifyElementSkillInfo(curPlayer)
|
| | | #Boss首杀
|
| | | GY_Query_BossFirstKill.OnPlayerLogin(curPlayer)
|
| | |
|
| | | curPlayer.SetState(0) # 脱机挂恢复为正常上线
|
| | | curPlayer.SetFacePic(0) # 通知数据库是否保存还是下线,做一次恢复,1为保存 0为正常下线
|
New file |
| | |
| | | #!/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
|
| | |
|
| | | |
| | |
| | | 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,
|