| #!/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 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]  | 
|                     PlayerControl.SendMail(title, mailContent, getDays, [playerID], giveItemList)  | 
|                     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  | 
|         packdata.KillCntInfoList.append(infoPack)  | 
|           | 
|     packdata.Cnt = len(packdata.KillCntInfoList)  | 
|     NetPackCommon.SendFakePack(curPlayer, packdata)  | 
|     return  | 
|   | 
|   | 
| # BOSSÊ£Óà¿É»÷ɱ´ÎÊý  | 
| def GetCanKillBossCnt(curPlayer, bossFuncIndex):  | 
|     hasKillCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Boss_KillCnt%bossFuncIndex, 0)  | 
|     itemAddKillCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Boss_KillCntItemAddCnt%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)  | 
|       | 
|       | 
|     return max(limitCnt + itemAddKillCnt - hasKillCnt, 0)  | 
|   | 
|   |