#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # #------------------------------------------------------------------------------- # ##@package GameWorldLogic.BossHurtMng # # @todo:BossÉËѪÁбí¹ÜÀí£¨²»Çå¿Õ£© # @author hxp # @date 2014-10-30 # @version 2.7 # # @change: "2014-11-12 16:30" hxp Ôö¼Ó»÷ɱÊÀ½çBoss³É¾Í # @change: "2014-12-16 16:30" hxp Ö§³Ö²»ÅäÖý±Àø # @change: "2014-12-30 03:30" hxp Ö§³Ö°´Ãû´Î¶ÎÅäÖý±Àø # @change: "2015-01-08 22:00" hxp Ôö¼ÓOnHurtValueOrder¸±±¾Í¨Öª # @change: "2015-01-10 11:30" hxp Ôö¼ÓÇå¿Õ×Ô¶¨ÒåÉËѪÁбí(½öÇå¿ÕÁÐ±í£¬²»´¥·¢½±Àø) # @change: "2015-02-07 15:00" hxp Ôö¼Ó»î¶¯¸ø½±ÀøÎïÆ· # @change: "2015-02-12 10:00" hxp NPC¶ÔÏóÑéÖ¤ # @change: "2015-06-09 16:20" ljd ÐÞ¸ÄÓʼþ²ÎÊýbossÃûΪNPCID # @change: "2015-09-18 19:30" hxp Ôö¼ÓOnHurtListNotify # @change: "2015-10-28 12:00" hxp ÐÞ¸´µ±´æÔÚ¶àÌõÐéÄâ·ÖÏßʱ£¬ÈôÒÔobjIDΪkey¿ÉÄܵ¼ÖÂÉËѪÁÐ±í±»´íÎóÇå¿ÕµÄbug # @change: "2015-10-29 15:30" hxp Ôö¼ÓOnBossHurtListClear; OnHurtListNotify¸ÄΪOnBossKilledHurtList # @change: "2016-06-30 21:30" hxp bossÌôÕ½¿ª·þ»î¶¯£¬Ö§³ÖÃþ¹Ö # @change: "2016-09-29 21:30" xdh ÖÐÁ¢ÒªÈûboos»÷ɱ³É¾Í¸ÄΪÃþ¹Ö´ï³É # @change: "2016-11-08 12:00" xdh Ôö¼ÓÊÀ½çboss×î´ó¹¥»÷´ÎÊýÏÞÖÆ # @change: "2016-11-22 21:00" hxp ¼Ç¼×î´óÉ˺¦µÄÍæ¼ÒID # @change: "2016-12-07 15:00" hxp ÐÞ¸´ÉËѪÁÐ±í²»Î¨Ò»µÄÇé¿öµ¼ÖµÄbug, Ψһkey¸ñʽ¸ÄΪ lineID_objID_npcID # (¿Í»§¶Ë¶àÓà²éѯµ¼ÖÂbossËÀÍöºóÓÖÖØÐÂÉú³ÉÒ»¸ö¿ÕµÄobjID¶ÔÓ¦µÄÉËѪÁбí, µ±ÁíÒ»¸öNPCIDµÄbossÖØÉúºóÇÒ¸ÕºÃÕ¼ÓøÃobjID # Ôò»áµ¼Ö¸ÃobjID¶ÔÓ¦ÉËѪÁбíÖеÄbossIDûÓиüÐÂΪÕýÈ·µÄID, ´Ó¶øµ¼ÖÂÆäËûÂß¼­´íÎóµÄ¿ÉÄÜÐÔ) # @change: "2017-01-19 00:30" xdh ÊÀ½çBOSSµÄÐèÒª»÷ɱ²Å¼ÆËã½ø¿ª·þºÏ·þBOSS»î¶¯ # ÏêϸÃèÊö: BossÉËѪÁбí¹ÜÀí£¨²»Çå¿Õ£¬Ö±µ½boss±»»÷ɱ£© # #--------------------------------------------------------------------- #"""Version = 2017-01-19 00:30""" #--------------------------------------------------------------------- import GameWorld import ReadChConfig import IPY_GameWorld import NetPackCommon import PlayerControl import ChPyNetSendPack import DataRecordPack import IpyGameDataPY import ItemControler import CrossRealmPlayer import ShareDefine import ChConfig import FBLogic import PlayerVip import PlayerGoldInvest import operator import json ## ÉËÑªÍæ¼Ò # ## ÉËÑªÍæ¼Ò class HurtPlayer(): ## ¹¹Ô캯Êý # @param None: # @return def __init__(self, playerID, playerName): self.playerID = playerID self.playerName = playerName self.hurtValue = 0 GameWorld.DebugLog("HurtPlayer __init__ playerID=%s, playerName=%s" % (playerID, playerName)) return ## Ôö¼ÓÉËѪ # @param value: Ôö¼ÓµÄÉËѪÊýÖµ # @return def AddHurtValue(self, value): self.hurtValue += value return ## ¶ÔÓ¦BossÉËѪÁбí # ## ¶ÔÓ¦BossÉËѪÁбí class BossHurtValueList(): ## ¹¹Ô캯Êý # @param None: # @return def __init__(self, objID, bossID): self.ClearHurtValue(objID, bossID) GameWorld.DebugLog("BossHurtValueList __init__ objID=%s, bossID=%s" % (objID, bossID)) return ## Çå³ýÉËѪÁбí # @param None: # @return def ClearHurtValue(self, objID, bossID): self.objID = objID self.bossID = bossID self.hurtList = [] self.queryPlayerIDList = [] # Óвéѯ¹ýÉËѪÁбíµÄÍæ¼ÒIDÁÐ±í£¬ÕâÀïµÄÍæ¼Ò²»Ò»¶¨¶ÔbossÓйýÉ˺¦ return ## Ìí¼Ó²éѯ¹ý¸ÃbossÉËѪÁбíµÄÍæ¼Ò£¨boss±»»÷ɱºóͬ²½×îÖÕ½á¹û¸ø¸ÃÍæ¼Ò£¬Èç¹û»¹Ôڴ˵ØÍ¼µÄ»°£© # @param None: # @return # @remarks ÓÐЩÊÇÕ¾ÔÚÅԱ߿´Ï·µÄ£¬µ«ÊÇÒ»ÑùÒª¿ÉÒÔ²éѯµ½ÉËѪÁбí def AddQueryPlayer(self, playerID): if playerID in self.queryPlayerIDList: return self.queryPlayerIDList.append(playerID) return ## Ìí¼ÓÍæ¼Ò¶ÔÓ¦bossÉËѪÊýÖµ # @param None: # @return def AddPlayerHurtValue(self, curPlayer, hurtValue): playerID = curPlayer.GetPlayerID() playerName = curPlayer.GetPlayerName() isFind = False for hurtPlayer in self.hurtList: if hurtPlayer.playerID == playerID: isFind = True break if not isFind: hurtPlayer = HurtPlayer(playerID, playerName) self.hurtList.append(hurtPlayer) GameWorld.DebugLog("ÐÂÔöBossÉËÑªÍæ¼Ò, objID=%s,bossID=%s,playerID=%s,name=%s,value=%s" % (self.objID, self.bossID, playerID, playerName, hurtValue)) limitBossIDList, limitCnt = ReadChConfig.GetEvalChConfig("AttackBossCntLimit") if self.bossID in limitBossIDList: #½ñÈÕÃþ¹Ö´ÎÊý+1 key = ChConfig.Def_PDict_WorldBoss_HurtCnt newCnt = curPlayer.NomalDictGetProperty(key, 0) + 1 PlayerControl.NomalDictSetProperty(curPlayer, key, newCnt) NotifyAttackBossCnt(curPlayer) GameWorld.DebugLog("½ñÈÕÃþ¹Ö´ÎÊý playerID=%s, playerName=%s, newCnt=%s" % (playerID, playerName, newCnt)) dataDict = {"objID":self.objID, "bossID":self.bossID, "touchCnt":newCnt, "AccID":curPlayer.GetAccID(), "PlayerID":curPlayer.GetPlayerID()} DataRecordPack.SendEventPack("AddTouchBossCnt", dataDict, curPlayer) else: curValue = hurtPlayer.hurtValue GameWorld.DebugLog("ÀÛ¼ÓBossÉËѪ, objID=%s,bossID=%s,playerID=%s,name=%s,curValue=%s,addValue=%s" % (self.objID, self.bossID, playerID, playerName, curValue, hurtValue)) hurtPlayer.AddHurtValue(hurtValue) return ## »ñÈ¡¸ÃbossÅÅÐòºóµÄÉËѪÁбí # @param None: # @return def GetPlayerHurtValue(self, playerID): isFind = False for hurtPlayer in self.hurtList: if hurtPlayer.playerID == playerID: isFind = True break if not isFind: return 0 curValue = hurtPlayer.hurtValue return curValue ## »ñÈ¡¸ÃbossÅÅÐòºóµÄÉËѪÁбí # @param None: # @return def GetSortHurtList(self): self.hurtList = sorted(self.hurtList, key=operator.attrgetter('hurtValue'), reverse=True) return self.hurtList ## ÉËѪ¹ÜÀí # ## ÉËѪ¹ÜÀí class HurtValueMng(): ## ¹¹Ô캯Êý # @param None: # @return def __init__(self): self.objHurtListDict = {} GameWorld.DebugLog("HurtValueMng 222__init__£¡") return ## Çå³ý¶ÔÓ¦objIDÉËѪÁбí # @param objID: # @return def ClearBossHurtList(self, objID, bossID): key = self.__GetObjHurtListDictKey(objID, bossID) if key not in self.objHurtListDict: return self.objHurtListDict.pop(key) GameWorld.DebugLog("ClearBossHurtList key=%s" % key) return True ## ²éÕÒboss¶ÔÓ¦ÉËѪÁбí # @param None: # @return def FindBossHurtList(self, objID, bossID): key = self.__GetObjHurtListDictKey(objID, bossID) hurtList = self.objHurtListDict.get(key) if not hurtList: hurtList = BossHurtValueList(objID, bossID) self.objHurtListDict[key] = hurtList GameWorld.DebugLog("AddBossHurtList key=%s" % key) return hurtList ## »ñÈ¡obj¶ÔÓ¦ÉËѪÁбí×Öµäkey£¬ÐèÒÔ·ÖÏßID+objID+npcIDÈ·±£keyΨһ def __GetObjHurtListDictKey(self, objID, bossID): lineID = GameWorld.GetGameWorld().GetLineID() return "%s_%s_%s" % (lineID, objID, bossID) ## Ìí¼ÓÍæ¼Ò¶ÔÓ¦bossÉËѪ # @param None: # @return def BossAddPlayerInHurtList(self, curPlayer, curBoss, hurtValue): if hurtValue <= 0: return if not curPlayer or not curBoss: return curObjType = curPlayer.GetGameObjType() if curObjType != IPY_GameWorld.gotPlayer: return curBossType = curBoss.GetGameObjType() if curBossType != IPY_GameWorld.gotNPC: return objID = curBoss.GetID() bossID = curBoss.GetNPCID() bossHurtList = self.FindBossHurtList(objID, bossID) bossHurtList.AddPlayerHurtValue(curPlayer, hurtValue) return ## »ñÈ¡Íæ¼Ò¶ÔÓ¦bossÉËѪ # @param None: # @return def GetPlayerBossHurt(self, curPlayer, curBoss): if not curPlayer or not curBoss: return 0 curObjType = curPlayer.GetGameObjType() if curObjType != IPY_GameWorld.gotPlayer: return 0 curBossType = curBoss.GetGameObjType() if curBossType != IPY_GameWorld.gotNPC: return 0 objID = curBoss.GetID() bossID = curBoss.GetNPCID() bossHurtList = self.FindBossHurtList(objID, bossID) return bossHurtList.GetPlayerHurtValue(curPlayer.GetPlayerID()) ## Ö´ÐÐboss±»»÷ɱºóÂß¼­ # @param None: # @return def DoLogicOnBossKilled(self, curBoss): objID = curBoss.GetID() bossID = curBoss.GetNPCID() GameWorld.Log("HurtValueMng __DoLogicOnBossKilled objID=%s, bossID=%s" % (objID, bossID)) bossHurtList = self.FindBossHurtList(objID, bossID) sortHurtList = bossHurtList.GetSortHurtList() # ¼Ç¼×î¸ßÉ˺¦µÄÍæ¼Ò, ÆäËû½áËãÂß¼­Óõ½ if len(sortHurtList) > 0: maxHurtPlayer = sortHurtList[0] playerID = maxHurtPlayer.playerID curBoss.SetDict(ChConfig.Def_NPC_Dict_BossMaxHurtID % (objID, bossID), playerID) else: curBoss.SetDict(ChConfig.Def_NPC_Dict_BossMaxHurtID % (objID, bossID), 0) playerMng = GameWorld.GetPlayerManager() # ǰ¼¸Ãû·¢Ëͽ±ÀøÓʼþ bossAwardDict = ReadChConfig.GetEvalChConfig("GameWorldBossAward") awardDict = bossAwardDict.get(bossID) if awardDict != None: bossAwardMailInfo = ReadChConfig.GetEvalChConfig("GameWorldBossAwardMail") title, content, getDays = bossAwardMailInfo prizeOrderList = awardDict.keys() prizeOrderList.sort() isFB = GameWorld.GetMap().GetMapFBType() != IPY_GameWorld.fbtNull preOrder = 0 for prizeOrder in prizeOrderList: for prizeIndex in range(preOrder, prizeOrder): if prizeIndex > len(sortHurtList) - 1: GameWorld.DebugLog("½±ÀøË÷Òý(%s)´óÓÚ ÉËѪÁбílen=%s break range(%s,%s)" % (prizeIndex, len(sortHurtList), preOrder, prizeOrder)) break hurtPlayer = sortHurtList[prizeIndex] playerID = hurtPlayer.playerID order = prizeIndex + 1 mailContent = content % (bossID, order) giveItemList = awardDict[prizeOrder] #ɾ³ý¾É°æ·¢ËÍÓʼþ£¬Èç¹û¹¦ÄÜ»¹ÓÐÐèÒª£¬¿ÉʹÓÃа汾·¢ËÍÓʼþ PlayerMail GameWorld.Log(" SendMail order=%s,playerID=%s,giveItemList=%s,isFB=%s" % (order, playerID, str(giveItemList), isFB)) if isFB: curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID) if curPlayer: FBLogic.OnHurtValueOrder(curPlayer, bossID, hurtPlayer.hurtValue, order, giveItemList) preOrder = prizeOrder # ͬ²½×îÖÕ½á¹û¸ø²éѯ¹ýµÄÍæ¼Ò queryPlayerList = bossHurtList.queryPlayerIDList sendPack = self.GetBossHurtListPack(objID, bossID, sortHurtList, True) GameWorld.DebugLog("ͬ²½×îÖÕ½á¹û¸ø²éѯ¹ý¸ÃbossµÄÍæ¼Ò queryPlayerList=%s" % str(queryPlayerList)) for playerID in queryPlayerList: curPlayer = playerMng.FindPlayerByID(playerID) if curPlayer: GameWorld.DebugLog(" playerID=%s" % playerID) NetPackCommon.SendFakePack(curPlayer, sendPack) # »î¶¯½±Àø±ýͼ¸ÅÂÊÁбí actionRandAwardList = [] gameWorldMgr = GameWorld.GetGameWorld() bossActionAwardDict = ReadChConfig.GetEvalChConfig("GameWorldBossActionAward") for keyInfo, bossAwardDict in bossActionAwardDict.items(): if len(keyInfo) != 2: continue if gameWorldMgr.GetGameWorldDictByKey(keyInfo[0]) != keyInfo[1]: continue if bossID in bossAwardDict: actionRandAwardList = bossAwardDict[bossID] break # ÉËÑªÍæ¼Ò¶îÍâ´¦Àí for hurtPlayer in sortHurtList: playerID = hurtPlayer.playerID curPlayer = playerMng.FindPlayerByID(playerID) if not curPlayer: continue # ¸ø»î¶¯½±Àø if actionRandAwardList: randAwardList = GameWorld.GetResultByRandomList(actionRandAwardList) if randAwardList: for itemID, itemCnt, isBind in randAwardList: ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, 0, [IPY_GameWorld.rptItem, IPY_GameWorld.rptAnyWhere]) # ͬ²½É˺¦Áбí FBLogic.OnBossKilledHurtList(objID, bossID, sortHurtList) # Çå¿ÕÉËѪÁбíÊý¾Ý bossHurtList.ClearHurtValue(objID, bossID) return ## »ñÈ¡bossÉËѪÁбíͬ²½·â°ü½á¹¹ # @param None: # @return def GetBossHurtListPack(self, objID, bossID, hurtList, isSort): if isSort: GameWorld.DebugLog("BossÉËѪÁÐ±í£ºobjID=%s,bossID=%s,isSort=%s,hurtList=%s" % (objID, bossID, isSort, hurtList)) bossHurtPack = ChPyNetSendPack.tagMCBossHurtList() bossHurtPack.Clear() bossHurtPack.ObjID = objID bossHurtPack.BossID = bossID bossHurtPack.IsSort = isSort bossHurtPack.HurtPlayerList = [] for hurtPlayer in hurtList: hPlayer = ChPyNetSendPack.tagMCHurtPlayer() hPlayer.PlayerID = hurtPlayer.playerID hPlayer.PlayerName = hurtPlayer.playerName hPlayer.NameLen = len(hPlayer.PlayerName) hPlayer.HurtValue = hurtPlayer.hurtValue bossHurtPack.HurtPlayerList.append(hPlayer) if isSort: GameWorld.DebugLog(" playerID=%s,playerName=%s,hurtValue=%s" % (hurtPlayer.playerID, hurtPlayer.playerName, hurtPlayer.hurtValue)) bossHurtPack.HurtCnt = len(bossHurtPack.HurtPlayerList) return bossHurtPack g_hurtValueMng = HurtValueMng() ## Ìí¼ÓÍæ¼Ò¶ÔÓ¦bossÉËѪ£¬Íⲿµ÷Óøú¯Êý # @param None: # @return def BossAddPlayerInHurtList(curPlayer, curBoss, hurtValue): if not __CheckIsNeedProcessBoss(curBoss): return g_hurtValueMng.BossAddPlayerInHurtList(curPlayer, curBoss, hurtValue) return ## »ñÈ¡Íæ¼Ò¶ÔÓ¦bossÉËѪ£¬Íⲿµ÷Óøú¯Êý # @param None: # @return def GetPlayerBossHurt(curPlayer, curBoss): if not __CheckIsNeedProcessBoss(curBoss): return 0 return g_hurtValueMng.GetPlayerBossHurt(curPlayer, curBoss) ## boss±»»÷ɱ£¬Íⲿµ÷Óøú¯Êý # @param None: # @return def BossOnKilled(curBoss): if not __CheckIsNeedProcessBoss(curBoss): return g_hurtValueMng.DoLogicOnBossKilled(curBoss) return ## Íæ¼Ò²éѯ¶ÔÓ¦bossµÄÉËѪÁбí # @param None: # @return def OnQueryBossHurtList(curPlayer, clientData): objID = clientData.ObjID bossID = clientData.BossID if not __IsNeedProcess(bossID): return bossHurtList = g_hurtValueMng.FindBossHurtList(objID, bossID) # ´æ´¢¸ÃÍæ¼Ò²éѯ¹ý£¬boss±»»÷ɱʱ£¬Í¬²½×îÖÕÉËѪÁÐ±í¸ø¸ÃÍæ¼Ò bossHurtList.AddQueryPlayer(curPlayer.GetPlayerID()) sendPack = g_hurtValueMng.GetBossHurtListPack(objID, bossID, bossHurtList.hurtList, False) NetPackCommon.SendFakePack(curPlayer, sendPack) return ## Çå³ý¶ÔÓ¦objIDÉËѪÁбí # @param curNPC: # @return def ClearHurtValueList(curNPC): if not __CheckIsNeedProcessBoss(curNPC): return objID = curNPC.GetID() bossID = curNPC.GetNPCID() bossHurtList = g_hurtValueMng.FindBossHurtList(objID, bossID) sortHurtList = bossHurtList.GetSortHurtList() FBLogic.OnBossHurtListClear(objID, bossID, sortHurtList) g_hurtValueMng.ClearBossHurtList(objID, bossID) return def __CheckIsNeedProcessBoss(curBoss): ''' ¼ì²éÊÇ·ñΪÐèÒª´¦ÀíµÄboss ''' curBossType = curBoss.GetGameObjType() if curBossType != IPY_GameWorld.gotNPC: return False if not ChConfig.IsGameBoss(curBoss): return False if not __IsNeedProcess(curBoss.GetNPCID()): return False return True ## ÊÇ·ñÐèÒª´¦Àí # @param bossID: # @return def __IsNeedProcess(bossID): bossAwardDict = ReadChConfig.GetEvalChConfig("GameWorldBossAward") if bossID in bossAwardDict: return True gameWorldMgr = GameWorld.GetGameWorld() bossActionAwardDict = ReadChConfig.GetEvalChConfig("GameWorldBossActionAward") for keyInfo, bossAwardDict in bossActionAwardDict.items(): if len(keyInfo) != 2: continue if gameWorldMgr.GetGameWorldDictByKey(keyInfo[0]) != keyInfo[1]: continue if bossID in bossAwardDict: return True return False ## ¹ýÌì def OnDay(curPlayer): #Çå¿Õµ±ÌìÃþboss´ÎÊý setCrossDict = {} PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_WorldBoss_HurtCnt, 0) killBossCntLimitDict = IpyGameDataPY.GetFuncEvalCfg('KillBossCntLimit', 2, {}) for index, limitCnt in killBossCntLimitDict.items(): killCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Boss_KillCnt%index, 0) #hasBuyKillCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Boss_KillCntBuyCnt%index, 0) # if killCnt >= limitCnt: # itemAddKillCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Boss_KillCntItemAddCnt%index, 0) # updItemAddCnt = max(0, limitCnt + hasBuyKillCnt + vipAddKillCnt + itemAddKillCnt -killCnt) # PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Boss_KillCntItemAddCnt%index, updItemAddCnt) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Boss_KillCntItemAddCnt % index, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Boss_KillCnt % index, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Boss_KillCntBuyCnt % index, 0) if index == ShareDefine.Def_Boss_Func_Dogz: setCrossDict.update({ChConfig.Def_PDict_Boss_KillCntItemAddCnt % index:0, ChConfig.Def_PDict_Boss_KillCnt % index:0, ChConfig.Def_PDict_Boss_KillCntBuyCnt % index:0, }) NotifyAttackBossCnt(curPlayer) CrossRealmPlayer.SetCrossPlayerNomalDict(curPlayer, setCrossDict) return ## µÇ¼´¦Àí # @param curPlayer # @return None def OnLogin(curPlayer): NotifyAttackBossCnt(curPlayer) return ## ֪ͨ¿Í»§¶Ë¹¥»÷boss´ÎÊý def NotifyAttackBossCnt(curPlayer, limitIndex=-1): packdata = ChPyNetSendPack.tagMCBOSSAttactCnt() packdata.Clear() packdata.KillCntInfoList = [] killBossCntLimitDict = IpyGameDataPY.GetFuncEvalCfg('KillBossCntLimit', 2, {}) for index in killBossCntLimitDict.keys(): if limitIndex !=-1 and index != limitIndex: continue killCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Boss_KillCnt % index, 0) hasBuyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Boss_KillCntBuyCnt % index, 0) itemAddCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Boss_KillCntItemAddCnt % index, 0) infoPack = ChPyNetSendPack.tagMCBossCntInfo() infoPack.BossType = index infoPack.KillCnt = killCnt infoPack.ItemAddCnt = itemAddCnt infoPack.BuyCnt = hasBuyCnt infoPack.KillCntTotal = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Boss_KillCntTotal % index, 0) packdata.KillCntInfoList.append(infoPack) packdata.Cnt = len(packdata.KillCntInfoList) NetPackCommon.SendFakePack(curPlayer, packdata) return # BOSSÊ£Óà¿É»÷ɱ´ÎÊý def GetCanKillBossCnt(curPlayer, bossFuncIndex): #»ñÈ¡BOSSÊ£Óà¿É»÷ɱÊýÁ¿Óë×î´óÊýÁ¿ hasKillCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Boss_KillCnt%bossFuncIndex, 0) itemAddKillCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Boss_KillCntItemAddCnt%bossFuncIndex, 0) hasBuyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Boss_KillCntBuyCnt%bossFuncIndex, 0) killLimitPrivilege = IpyGameDataPY.GetFuncEvalCfg('KillBossCntLimit', 4, {}).get(bossFuncIndex, 0) if killLimitPrivilege: limitCnt = PlayerVip.GetPrivilegeValue(curPlayer, killLimitPrivilege) else: limitCnt = IpyGameDataPY.GetFuncEvalCfg('KillBossCntLimit', 2, {}).get(bossFuncIndex, 0) limitCnt += PlayerGoldInvest.GetAddBossCnt(curPlayer, bossFuncIndex) # Ͷ×Ê¿¨¼ÓÉÏÏÞ return max(0, limitCnt + itemAddKillCnt + hasBuyCnt - hasKillCnt), limitCnt