#!/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  
 | 
        infoPack.BuyCnt = hasBuyCnt  
 | 
        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)  
 | 
    return max(0, limitCnt + itemAddKillCnt + hasBuyCnt - hasKillCnt), limitCnt  
 | 
  
 | 
  
 |