| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package Skill.PassiveBuffEffMng  | 
| #  | 
| # @todo:±»¶¯buffЧ¹û¹ÜÀí  | 
| # @author hxp  | 
| # @date 2015-3-6  | 
| # @version 1.1  | 
| #  | 
| # @change: "2016-11-16 15:30" hxp Ôö¼Ó»ñȡ˥ÈõЧ¹ûÐÅÏ¢ÁÐ±í  | 
| #  | 
| # ÏêϸÃèÊö: ±»¶¯buffЧ¹û¹ÜÀís  | 
| #  | 
| #---------------------------------------------------------------------  | 
| #"""Version = 2016-11-16 15:30"""  | 
| #---------------------------------------------------------------------  | 
|           | 
| #µ¼Èë  | 
| import IPY_GameWorld  | 
| import PassiveBuff  | 
| import GameWorld  | 
| import ChConfig  | 
| import IpyGameDataPY  | 
| import SkillCommon  | 
| import BuffSkill  | 
| import SkillShell  | 
| import PlayerControl  | 
| import NetPackCommon  | 
| import ChPyNetSendPack  | 
| import PlayerVip  | 
| import AttackCommon  | 
| import PyGameData  | 
| import PlayerHorse  | 
| import BaseAttack  | 
| import EventShell  | 
| import NPCCommon  | 
| import PetControl  | 
| import QuestCommon  | 
| import ItemCommon  | 
| import FBCommon  | 
|   | 
| GameWorld.ImportAll("Script\\Skill\\", "PassiveBuff")  | 
|   | 
| # ±»¶¯¹ØÁªµÄ¼¼ÄÜÄ£¿é  | 
| # »ñµÃ¹ØÁª¼¼ÄÜ,0 È«²¿ 1ÊÇÖ÷¶¯Ðͼ¼ÄÜ£¨·¨±¦£¬ÆÕ¹¥£© 2 ÎªÈË×å·¨±¦¼¼ÄÜ 3ΪÆÕ¹¥  ÆäËû¼¼ÄÜID  | 
| Def_ConnSkill_Template = {  | 
|              ChConfig.Def_SkillFuncType_FbSkill:[1,2],  | 
|              ChConfig.Def_SkillFuncType_NormalAttack:[1,3],  | 
|              }  | 
|   | 
| Def_PassiveSkillValueNoCD = [52000, 57000]      # ÌØÊâ´¦Àí²¿·Ö¼¼ÄÜÔöÇ¿´¥·¢²»ÊÜCDÓ°Ïì   | 
|   | 
|   | 
| # --------±»¶¯¹¦·¨ÉèÖÃ--------------------------------------------------------------------  | 
|   | 
| #===============================================================================  | 
| # // B4 07 ±»¶¯¼¼ÄÜÉèÖ㨹¦·¨£© # tagCMPassiveSet  | 
| #   | 
| # struct    tagCMPassiveSet  | 
| # {  | 
| #    tagHead        Head;  | 
| #    BYTE        Page;    // ·ÖÒ³  | 
| #    BYTE        Index;    // ÐòºÅ  | 
| #    DWORD        SkillID;    // ¼¼ÄÜID  | 
| # };  | 
| #===============================================================================  | 
| def OnPassiveSet(index, clientData, tick):  | 
|     #¸ÄΪ¶¼ÉúЧ£¬²»ÐèÒªÉèÖà  | 
|     return  | 
| #    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
| #    findSkill = None  | 
| #    if clientData.SkillID != 0:  | 
| #        findSkill = curPlayer.GetSkillManager().FindSkillBySkillID(clientData.SkillID)  | 
| #        if not findSkill:  | 
| #            return  | 
| #          | 
| #        if findSkill.GetFuncType() != ChConfig.Def_SkillFuncType_FbPassiveSkill:  | 
| #            return  | 
| #    | 
| #    holeCnt = IpyGameDataPY.GetFuncCfg('PassSkillEquipLimit', 2)  | 
| #    if clientData.Index >= holeCnt:  | 
| #        # ³¬³ö¿×Êý  | 
| #        return  | 
| #      | 
| #    pageCnt = IpyGameDataPY.GetFuncCfg('PassSkillEquipLimit', 3)  | 
| #    if clientData.Page >= pageCnt:  | 
| #        # ³¬³öÒ³Êý  | 
| #        return  | 
| #      | 
| #    tmpDict = IpyGameDataPY.GetFuncEvalCfg('PassSkillEquipLimit', 1)  | 
| #    # Ê£ÓàVIPʱ¼ä  | 
| #    #haveVipTime = PlayerVip.GetCurVIPTime(curPlayer)  | 
| #    strIndex = str(clientData.Index)   | 
| #    if strIndex in tmpDict:  | 
| #        # ÅжÏÌõ¼þ  | 
| #        for key, value in tmpDict[strIndex].items():  | 
| #            if key == "level" and curPlayer.GetLV() < value:  | 
| #                return  | 
| #            if key == "vipLv":  | 
| #                if curPlayer.GetVIPLv() < value:# or haveVipTime <=0:  | 
| #                    return  | 
| #            if key == "MountLv":  | 
| #                if PlayerHorse.GetHorseSumLV(curPlayer) < value:  | 
| #                    return  | 
| #              | 
| #  | 
| #            # ¶à¼ÓÒ»ÖÖÈÎÎñÅÐ¶Ï  | 
| #            if key == "OpenSkillSlots":  | 
| #                # Ö÷ÏßÈÎÎñÍê³Éʱ»áÉèÖñêÖ¾¿É½øµØÍ¼±êÖ¾  | 
| #                mission_1 = QuestCommon.GetCommonMission(curPlayer)  | 
| #                if not mission_1:  | 
| #                    return  | 
| #  | 
| #                if (pow(2, int(strIndex)) & mission_1.GetProperty("OpenSkillSlots")) == 0:  | 
| #                    return  | 
| #                  | 
| #    PlayerControl.NomalDictSetProperty(curPlayer,   | 
| #                                       ChConfig.Def_PDict_GFPassiveIndex%(clientData.Page, clientData.Index),  | 
| #                                       clientData.SkillID,  | 
| #                                       ChConfig.Def_PDictType_GFPassive)  | 
| #      | 
| #    # Í¨Öª¿Í»§¶ËÉèÖóɹ¦  | 
| #    sendPack = ChPyNetSendPack.tagMCPassiveSetAnswer()  | 
| #    sendPack.Page = clientData.Page  | 
| #    sendPack.Index = clientData.Index  | 
| #    sendPack.SkillID = clientData.SkillID  | 
| #    NetPackCommon.SendFakePack(curPlayer, sendPack)  | 
| #      | 
| #    # Ë¢±»¶¯Ð§¹ûºÍÊôÐÔ  | 
| #    page = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GFPassivePage, 0, ChConfig.Def_PDictType_GFPassive)  | 
| #    if clientData.Page == page:  | 
| #        GetPassiveEffManager().RegistPassiveEffSet(curPlayer, True)  | 
| #        PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()  | 
| #          | 
| #    EventShell.EventRespons_PassiveSet(curPlayer)  | 
| #    return  | 
|   | 
|   | 
| #===============================================================================  | 
| # //B4 08 ±»¶¯¼¼ÄÜҳѡÔñ£¨¹¦·¨£© # tagCMPassivePage  | 
| #   | 
| # struct    tagCMPassivePage  | 
| # {  | 
| #    tagHead        Head;  | 
| #    BYTE        Page;    // ·ÖÒ³  | 
| # };  | 
| #===============================================================================  | 
|   | 
| def OnPassivePage(index, clientData, tick):  | 
|     #¸ÄΪ¶¼ÉúЧ£¬²»ÐèÒªÉèÖà  | 
|     return  | 
| #    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
| #    pageCnt = IpyGameDataPY.GetFuncCfg('PassSkillEquipLimit', 3)  | 
| #    if clientData.Page >= pageCnt:  | 
| #        # ³¬³öÒ³Êý  | 
| #        return  | 
| #      | 
| #      | 
| #    PlayerControl.NomalDictSetProperty(curPlayer,   | 
| #                                       ChConfig.Def_PDict_GFPassivePage,  | 
| #                                       clientData.Page,  | 
| #                                       ChConfig.Def_PDictType_GFPassive)  | 
| #      | 
| #    # Í¨Öª¿Í»§¶ËÉèÖóɹ¦  | 
| #    sendPack = ChPyNetSendPack.tagMCPassivePage()  | 
| #    sendPack.Page = clientData.Page  | 
| #    NetPackCommon.SendFakePack(curPlayer, sendPack)  | 
| #      | 
| #    # Ë¢±»¶¯Ð§¹ûºÍÊôÐÔ  | 
| #    GetPassiveEffManager().RegistPassiveEffSet(curPlayer, True)  | 
| #    PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()  | 
| #    return  | 
|   | 
|   | 
| # ¼ì²éÊÇ·ñµ±Ç°ÕýÔÚʹÓõı»¶¯¼¼ÄÜ  | 
| def FindUsePassiveSkills(curPlayer):  | 
|     skills = []  | 
|     skillManager = curPlayer.GetSkillManager()  | 
|     for i in xrange(skillManager.GetSkillCount()):  | 
|         curSkill = skillManager.GetSkillByIndex(i)  | 
|         if not curSkill:  | 
|             continue  | 
|           | 
|         if curSkill.GetFuncType() != ChConfig.Def_SkillFuncType_FbPassiveSkill:  | 
|             continue  | 
|           | 
|         findSkillID = curSkill.GetSkillID()  | 
|         passiveEff = GetPassiveEffManager().GetPassiveEff(curPlayer)  | 
|         if passiveEff:  | 
|             findSkillID = passiveEff.ChangeSkillTypeID(findSkillID)  | 
|               | 
|         skills.append(findSkillID)  | 
|           | 
|     return skills  | 
|   | 
| #¸ÄΪ¶¼ÉúЧ£¬²»ÐèÒªÉèÖà  | 
| #    page = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GFPassivePage, 0, ChConfig.Def_PDictType_GFPassive)  | 
| #    holeCnt = IpyGameDataPY.GetFuncCfg('PassSkillEquipLimit', 2)  | 
| #    skills = []  | 
| #    for i in xrange(holeCnt):  | 
| #        findSkillID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GFPassiveIndex%(page, i), 0,   | 
| #                                                     ChConfig.Def_PDictType_GFPassive)  | 
| #        if findSkillID == 0:  | 
| #            continue  | 
| #          | 
| #        passiveEff = GetPassiveEffManager().GetPassiveEff(curPlayer)  | 
| #        if passiveEff:  | 
| #            findSkillID = passiveEff.ChangeSkillTypeID(findSkillID)  | 
| #              | 
| #        skills.append(findSkillID)  | 
| #          | 
| #    return skills  | 
|   | 
| # µÇ¼֪ͨ£¬²¢¹ýÂ˹ýÆÚVIP¿×  | 
| def OnLoginGFPassive(curPlayer):  | 
|     #¸ÄΪ¶¼ÉúЧ£¬²»ÐèÒªÉèÖà  | 
|     return  | 
| #    # ---֪ͨÿҳÊý¾Ý---  | 
| #    holeCnt = IpyGameDataPY.GetFuncCfg('PassSkillEquipLimit', 2)  | 
| #    pageCnt = IpyGameDataPY.GetFuncCfg('PassSkillEquipLimit', 3)  | 
| #      | 
| #    sendPack = ChPyNetSendPack.tagMCPassiveSet()  | 
| #    sendPack.PageCnt = pageCnt  | 
| #    sendPack.PassiveSkills = []  | 
| #      | 
| #      | 
| #    #tmpDict = IpyGameDataPY.GetFuncEvalCfg('PassSkillEquipLimit', 1)  | 
| #      | 
| #    # Ê£ÓàVIPʱ¼ä  | 
| #    #haveVipTime = PlayerVip.GetCurVIPTime(curPlayer)  | 
| #      | 
| #    for i in xrange(pageCnt):  | 
| #        skills = ChPyNetSendPack.tagMCPassiveSkills()  | 
| #        skills.Count = holeCnt  | 
| #        skills.SkillIDList = []  | 
| #        for j in xrange(holeCnt):  | 
| #  | 
| #            #===================================================================  | 
| #            # # ÅжÏVIP¹ýÆÚµÄÇé¿ö  | 
| #            # for key, value in tmpDict.get(j, {}).items():  | 
| #            #    if key == "vipLv":  | 
| #            #        if curPlayer.GetVIPLv() < value or haveVipTime <=0:  | 
| #            #            PlayerControl.NomalDictSetProperty(curPlayer,   | 
| #            #                                               ChConfig.Def_PDict_GFPassiveIndex%(i, j),   | 
| #            #                                               0,  | 
| #            #                                               ChConfig.Def_PDictType_GFPassive)  | 
| #            #===================================================================  | 
| #          | 
| #            skillID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GFPassiveIndex%(i, j), 0,  | 
| #                                                     ChConfig.Def_PDictType_GFPassive)  | 
| #            skills.SkillIDList.append(skillID)  | 
| #          | 
| #        sendPack.PassiveSkills.append(skills)  | 
| #      | 
| #    NetPackCommon.SendFakePack(curPlayer, sendPack)  | 
| #      | 
| #    # ---֪ͨ¼¤»îÒ³---  | 
| #    page = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GFPassivePage, 0, ChConfig.Def_PDictType_GFPassive)  | 
| #    sendPack = ChPyNetSendPack.tagMCPassivePage()  | 
| #    sendPack.Page = page  | 
| #    NetPackCommon.SendFakePack(curPlayer, sendPack)  | 
| #    return  | 
|   | 
| # Çл»µØÍ¼  | 
| def OnLoadMapGFPassive(curPlayer):  | 
|     # ±»¶¯¼¼ÄÜ  | 
|     GetPassiveEffManager().RegistPassiveEff(curPlayer)  | 
|       | 
|     #tmpDict = IpyGameDataPY.GetFuncEvalCfg('PassSkillEquipLimit', 1)  | 
|     #holeCnt = IpyGameDataPY.GetFuncCfg('PassSkillEquipLimit', 2)  | 
|       | 
|     # Ê£ÓàVIPʱ¼ä  | 
|     #haveVipTime = PlayerVip.GetCurVIPTime(curPlayer)  | 
|       | 
|     #µ±Ç°Ê¹ÓÃÒ³  | 
|     #page = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GFPassivePage, 0, ChConfig.Def_PDictType_GFPassive)  | 
|   | 
| #===============================================================================  | 
| #    for j in xrange(holeCnt):  | 
| #   | 
| #        # ÅжÏVIP¹ýÆÚµÄÇé¿ö  | 
| #        for key, value in tmpDict.get(j, {}).items():  | 
| #            if key != "vipLv":  | 
| #                continue  | 
| #            if curPlayer.GetVIPLv() < value or haveVipTime <= 0:  | 
| #                PlayerControl.NomalDictSetProperty(curPlayer,   | 
| #                                                   ChConfig.Def_PDict_GFPassiveIndex%(page, j),   | 
| #                                                   0,  | 
| #                                                   ChConfig.Def_PDictType_GFPassive)  | 
| #===============================================================================  | 
|       | 
|     # Ä§×å·¨±¦-±»¶¯¼¼ÄÜÒ³  | 
|     GetPassiveEffManager().RegistPassiveEffSet(curPlayer)  | 
|       | 
|     GetPassiveEffManager().RegistPassiveBuff(curPlayer)  | 
|   | 
|     # ÖúÕ½ÉñÊÞ¼¼ÄÜ  | 
|     GetPassiveEffManager().RegistPassiveEffDogz(curPlayer)  | 
|       | 
|     GetPassiveEffManager().RegistSuperEquipSkillDict(curPlayer)  | 
|   | 
| #-±»¶¯Âß¼´¦Àí--------------------------------------------------------------------------------------------------  | 
| ##À뿪µØÍ¼´¦Àí  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @return   | 
| def OnPlayerLeaveMap(curPlayer):  | 
|     GetPassiveEffManager().RemovePassiveEff((curPlayer.GetID(), IPY_GameWorld.gotPlayer))  | 
|     for i in range(1,3):  | 
|         #³èÎï  | 
|         GetPassiveEffManager().RemovePassiveEff((curPlayer.GetID()*10+i, IPY_GameWorld.gotNPC))  | 
|     return  | 
|   | 
| # »ñµÃ¡¾¼¼ÄÜ¡¿±»¶¯Ð§¹û¶ÔÓ¦µÄ ±»¶¯´¥·¢·½Ê½ ÓëGetBuffTriggerTypeByEffectID»¥²¹  | 
| def GetTriggerTypeByEffectID(effectID):  | 
|     # ÁÙʱÅäÖà  | 
|     tdict = {  | 
|              1304:ChConfig.TriggerType_HitValue,    # ÃüÖмǼ 89  | 
|                | 
|              2102:ChConfig.TriggerType_BeAttackOver,   # ±»¹¥»÷ºó´¥·¢ 20  | 
|              2104:ChConfig.TriggerType_LockHP, # ËøÑª´¥·¢¼¼ÄÜ 63  | 
|              2105:ChConfig.TriggerType_BeLuckyHit, # ±»»áÐÄÒ»»÷´¥·¢¼¼ÄÜ 64  | 
|              2106:ChConfig.TriggerType_BeSuperHit,  # ±»±©»÷´¥·¢¼¼ÄÜ  | 
|                | 
|              4000:ChConfig.TriggerType_BuffState,   # ½øÈë4012µÄij¸ö״̬´¥·¢¼¼ÄÜ 2  | 
|              4001:ChConfig.TriggerType_TagBuffState,   # Ä¿±ê½øÈë4012µÄij¸ö״̬´¥·¢¼¼ÄÜ 2  | 
|              4002:ChConfig.TriggerType_SkillValue,  # Ôö¼Ó¼¼ÄÜÉ˺¦¹Ì¶¨Öµ 82  | 
|              4003:ChConfig.TriggerType_AttackOver,  # ¹¥»÷£¨¶ÔµÐ¼¼ÄÜ£©ºó±»¶¯¼¼Äܱ»´¥·¢ 4  | 
|              4004:ChConfig.TriggerType_AttackOver,  # ¹¥»÷£¨¶ÔµÐ¼¼ÄÜ£©ºó±»¶¯¼¼Äܱ»´¥·¢ 4  | 
|              4005:ChConfig.TriggerType_AttackAddSkillPer,  # ËùÓй¥»÷É˺¦(SkillPer)Ôö¼Ó£¬º¬ÆÕ¹¥£¬¼ÆËãʱ 5  | 
|              4006:ChConfig.TriggerType_SuperHit, # ±©»÷ʱ ´¥·¢¼¼ÄÜ6,  | 
|              4007:ChConfig.TriggerType_SuperHitPer, # ±©»÷ʱ Ôö¼Ó±©»÷Öµ°Ù·Ö±È,  | 
|              4008:ChConfig.TriggerType_AttackAddSkillPer,  # ËùÓй¥»÷É˺¦(SkillPer)Ôö¼Ó£¬º¬ÆÕ¹¥£¬¼ÆËãʱ 5  | 
|              4009:ChConfig.TriggerType_HurtObjAddBuff, # »÷ÖÐÍæ¼Ò£¨Èº¹¥¶à´Î´¥·¢£©8,  | 
|              4010:ChConfig.TriggerType_ReduceCD, # ¼õÉÙCD9, #CD  | 
|              4011:ChConfig.TriggerType_SuperHitSkillPer, # ±©»÷ʱ£¬Ôö¼Ó¼¼ÄÜÉ˺¦ 10  | 
|              4013:ChConfig.TriggerType_AttackAddFinalValue,   #¹¥»÷Ôö¼ÓÊä³öÉ˺¦11  | 
|              4014:ChConfig.TriggerType_HappenState,   #±Ø¶¨´¥·¢  | 
|              4015:ChConfig.TriggerType_AttackAddSkillPer,  # ËùÓй¥»÷É˺¦(SkillPer)Ôö¼Ó£¬º¬ÆÕ¹¥£¬¼ÆËãʱ 5  | 
|              #4016:ChConfig.TriggerType_AbsorbShield,  # Ìá¸ß÷è÷ëÓÓÉíµÄ¼õÉÙÉ˺¦Ð§¹ûÌáÉý20% 13  | 
|              4017:ChConfig.TriggerType_BounceHP,   # ·´µ¯É˺¦¹Ì¶¨Öµ14,  | 
|              4018:ChConfig.TriggerType_BuffDisappear,   # buffÏûʧºó´¥·¢¼¼ÄÜ15,  | 
|              4019:ChConfig.TriggerType_BuffTime,   # ÑÓ³¤BUFFʱ¼ä16,  | 
|              4020:ChConfig.TriggerType_BounceHPPer,   # ·´µ¯É˺¦°Ù·Ö±ÈÖµ17,  | 
|              4021:ChConfig.TriggerType_AddSingleSkillPer,   # ³ÖÐøÐÔ¹¥»÷µÄµ¥´Î¹¥»÷Öð´ÎÔö¼Ó¼¼ÄÜÉ˺¦18,  | 
|              4022:ChConfig.TriggerType_SkillOverNoAttack,   # ¼¼ÄÜÊͷźó ÓëTriggerType_AttackOverÏà·´19,  | 
|              4023:ChConfig.TriggerType_BeAttackOver,   # ±»¹¥»÷ºó´¥·¢ 20  | 
|              #4024:ChConfig.TriggerType_AddIceAtkPer,    # ¹¥»÷¸½¼ÓÕæÊµÉ˺¦°Ù·Ö±È 21  | 
|              4025:ChConfig.TriggerType_AddIceAtk,    # ¹¥»÷¸½¼ÓÕæÊµÉ˺¦¹Ì¶¨Öµ 22  | 
|              4026:ChConfig.TriggerType_DebuffOff,    # µÖÏûÒ»´Îdebuff 23  | 
|              4027:ChConfig.TriggerType_AttackKill,   # Õ¶É± 24  | 
|              4028:ChConfig.TriggerType_WillDead,   # ½øÈë±ôËÀ״̬ʱ´¥·¢¼¼ÄÜ 25  | 
|              4029:ChConfig.TriggerType_BuffBoom,   # Öж¾ºó±¬Õ¨ 26  | 
|              4030:ChConfig.TriggerType_ThumpSkillValue, # ÖØ»÷Ôö¼Ó¼¼Ä̶ܹ¨ÖµÉ˺¦ 88  | 
|              4031:ChConfig.TriggerType_HurtObjAddBuff,   # ÔÚËãÉ˺¦Ê±Èº¹¥1¶Ô1¼Óbuff£¬¿ÉÓÃÓÚÒ»¸öÉ˺¦¶à´Î´¥·¢ 28  | 
|              4032:ChConfig.TriggerType_BeBoomSeed,   # ±»¶¯Òý±¬ÊÓÒ°ÄÚ¶ÔÏóµÄbuffÖÖ×Ó 29  | 
|              4033:ChConfig.TriggerType_AttackOver,  # ¹¥»÷£¨¶ÔµÐ¼¼ÄÜ£©ºó±»¶¯¼¼Äܱ»´¥·¢ 4  | 
|              4034:ChConfig.TriggerType_AttackAddSkillPer,  # Ôö¼ÓXP¼¼ÄÜ·ÇС¹ÖÉ˺¦  | 
|              4035:ChConfig.TriggerType_AttackAddSkillPer,  # Ôö¼ÓXP¼¼ÄÜС¹ÖÉ˺¦  | 
|              4036:ChConfig.TriggerType_AttackCnt,  # Ôö¼Ó¼¼Äܹ¥»÷ÊýÁ¿£¨Ð§¹ûID1200£©  | 
|              4037:ChConfig.TriggerType_SuperHitOneByOne, # Ö»¶Ô±©»÷Ä¿±ê´¥·¢¼¼ÄÜ  | 
|              4038:ChConfig.TriggerType_BuffState,   # ½øÈë4012µÄij¸ö״̬´¥·¢¼¼ÄÜ 2  | 
|              4039:ChConfig.TriggerType_AttackOverPassive,  # ¹¥»÷£¨¶ÔµÐ¼¼ÄÜ£©ºó±»¶¯¼¼Äܱ»´¥·¢ÔÚÆäËû±»¶¯Ð§¹û´¦Àíºóµ÷Ó㬴¥·¢Ë³ÐòÔÒò  | 
|              4040:ChConfig.TriggerType_BeSuperHit,  # ±»±©»÷´¥·¢¼¼ÄÜ  | 
|              4041:ChConfig.TriggerType_AddExpRate,  # ¸ÅÂÊÐÔ¼Ó³Éɱ¹Ö¾Ñé  | 
|              4042:ChConfig.TriggerType_DamageReduce,   # ¼õÉÙÉ˺¦  | 
|              4043:ChConfig.TriggerType_DamageReducePVP,   # PVP¼õÉÙÉ˺¦  | 
|              4044:ChConfig.TriggerType_MissPer, # ÉÁ±ÜÌáÉý°Ù·Ö±È  | 
|              4045:ChConfig.TriggerType_SkillDist,   # Ôö¼Ó¼¼Äܹ¥»÷¾àÀë  | 
|              4046:ChConfig.TriggerType_ReduceHurtHPPer,  # °Ù·Ö±È¼õÉÙ¹¥»÷¼ÆËãºóÉ˺¦   | 
|              4047:ChConfig.TriggerType_TimeCalc, # Ò»¶¨Ê±¼äÑ»·Öд¥·¢Êͷż¼ÄÜ  | 
|              4048:ChConfig.TriggerType_MissSkill,   # ÉÁ±Üºó´¥·¢Êͷż¼ÄÜ  | 
|              4049:ChConfig.TriggerType_MissSuccessPer, # ÉÁ±Ü³É¹¦ÂÊÌáÉý  | 
|              4050:ChConfig.TriggerType_OneDamage,   # É˺¦½µµÍµ½1µã  | 
|              4051:ChConfig.TriggerType_LuckyHit, # »áÐÄÒ»»÷ʱÔö¼Ó»áÐÄÉ˺¦¹Ì¶¨Öµ 50  | 
|              4052:ChConfig.TriggerType_Buff_SuckBloodPer,   # ¹¥»÷ °Ù·Ö±ÈÎüѪ  | 
|              4053:ChConfig.TriggerType_AddLayer, # BUFF²ã¼¶Ôö¼Óʱ 52  | 
|              4054:ChConfig.TriggerType_AttackAddSkillPer,  # ËùÓй¥»÷É˺¦(SkillPer)Ôö¼Ó£¬º¬ÆÕ¹¥£¬¼ÆËãʱ 5  | 
|              4055:ChConfig.TriggerType_StormAttackReduceCD, # ÀལÈз籩¹¥»÷ºó´¥·¢Ð§¹û  | 
|              4056:ChConfig.TriggerType_PassiveBuffValue, ## ±»¶¯buffÖµ¼ÆËãÖжþ´Î»ñÈ¡±»¶¯Öµ 54  | 
|              4057:ChConfig.TriggerType_AttackKillHappen, ## ¶Ô±»¶¯¼¼ÄÜնɱµÄ¸ÅÂÊÔöÇ¿ 55  | 
|              4058:ChConfig.TriggerType_AddBuffOver, # Ìí¼ÓbuffÖ®ºó´¥·¢¼¼ÄÜ 56  | 
|              4059:ChConfig.TriggerType_StormAttackOneByOne, # ÀལÈз籩¹¥»÷1¶Ô1´¥·¢¼¼ÄÜ  57  | 
|              4060:ChConfig.TriggerType_StormAttackOver, # ÀལÈз籩¹¥»÷ºó´¥·¢¼¼ÄÜ  57  | 
|              4061:ChConfig.TriggerType_AttackOverPassive,  # ¹¥»÷£¨¶ÔµÐ¼¼ÄÜ£©ºó±»¶¯¼¼Äܱ»´¥·¢ÔÚÆäËû±»¶¯Ð§¹û´¦Àíºóµ÷Ó㬴¥·¢Ë³ÐòÔÒò  | 
|              4062:ChConfig.TriggerType_AttackAddFinalPer, # Ôö¼Ó×îÖÕÉ˺¦°Ù·Ö±È 59  | 
|              4063:ChConfig.TriggerType_SummonDie,   #×ÔÉíÕÙ»½ÊÞËÀÍö´¥·¢¼¼ÄÜ 60  | 
|              4064:ChConfig.TriggerType_GiftReduceCD, # Ì츳¼õÉÙCD9, #CD  | 
|              4065:ChConfig.TriggerType_DamageReducePVP,   # PVP¼õÉÙÉ˺¦  | 
|              4066:ChConfig.TriggerType_AddPVPDamagePer,   # Ìá¸ßPVPÔö¼ÓÉ˺¦ÊôÐÔÖµ£¬¼ÆËãʱ 3  | 
|              4067:ChConfig.TriggerType_ProDefValue, # Éñ±ø»¤¶ÜֵϽµÊ± 62  | 
|              4068:ChConfig.TriggerType_LockHP, # ËøÑª´¥·¢¼¼ÄÜ 63  | 
|              4069:ChConfig.TriggerType_ZhongjiZhansha, # ÖÕ¼«Õ¶É± 64  | 
|              4070:ChConfig.TriggerType_DebuffOff,    # µÖÏûÒ»´Îdebuff 23  | 
|              4071:ChConfig.TriggerType_Buff_SuckBloodPer,   # ¹¥»÷ °Ù·Ö±ÈÎüѪ  | 
|              4072:ChConfig.TriggerType_SuperHitSkipCD, # ±©»÷ÎÞÀäÈ´ 68  | 
|              4073:ChConfig.TriggerType_BuffHurtCnt, # µ±³ÖÐøbuffÉ˺¦µÚX´Îʱ´¥·¢¼¼ÄÜ 69  | 
|              4074:ChConfig.TriggerType_AttackAddSkillPer,  # ËùÓй¥»÷É˺¦(SkillPer)Ôö¼Ó£¬º¬ÆÕ¹¥£¬¼ÆËãʱ 5  | 
|              4075:ChConfig.TriggerType_AddThumpHitPer, # Ôö¼ÓÖØ»÷É˺¦°Ù·Ö±È  | 
|              4076:ChConfig.TriggerType_dFinalHurtReducePer, # ·ÀÊØ·½µÄ×îÖÕÉ˺¦¼õÉٰٷֱȠ71   | 
|              4077:ChConfig.TriggerType_AttackAddFinalPer, # Ôö¼Ó×îÖÕÉ˺¦°Ù·Ö±È 59  | 
|              4078:ChConfig.TriggerType_AttackOver,  # ¹¥»÷£¨¶ÔµÐ¼¼ÄÜ£©ºó±»¶¯¼¼Äܱ»´¥·¢ 4  | 
|              4079:ChConfig.TriggerType_IsDealy,  # ÊÇ·ñ´¥·¢ÖÂÃüÒ»»÷ 72  | 
|              4080:ChConfig.TriggerType_BounceHPPer, # ·´µ¯É˺¦°Ù·Ö±ÈÖµ17,  | 
|              4081:ChConfig.TriggerType_AddThumpHitRate, # Ìá¸ßÖØ»÷¸ÅÂÊ 73  | 
|              4082:ChConfig.TriggerType_ThumpHit, # ¶ÔµÚһĿ±êÖØ»÷´¥·¢¼¼ÄÜ  | 
|              4083:ChConfig.TriggerType_AddThumpHitPer, # Ôö¼ÓÖØ»÷É˺¦°Ù·Ö±È  | 
|              4084:ChConfig.TriggerType_ThumpHit, # ¶ÔµÚһĿ±êÖØ»÷´¥·¢¼¼ÄÜ  | 
|              4085:ChConfig.TriggerType_SkillSuccess,  # Èκμ¼ÄÜÊͷųɹ¦¶¼¿É´¥·¢ 76    ¼ÓÓ¡¼Ç  | 
|              4086:ChConfig.TriggerType_AttackAddSkillPerYinji,  # ËùÓй¥»÷É˺¦(SkillPer)Ôö¼Ó£¬º¬ÆÕ¹¥£¬¼ÆËãʱ ÎªÁËÆ®×ÖʹÓà  | 
|              4087:ChConfig.TriggerType_AttackAddSkillPerYinji,  # ËùÓй¥»÷É˺¦(SkillPer)Ôö¼Ó£¬º¬ÆÕ¹¥£¬¼ÆËãʱ ÎªÁËÆ®×ÖʹÓà  | 
|              4088:ChConfig.TriggerType_AttackAddSkillPerYinji,  # ËùÓй¥»÷É˺¦(SkillPer)Ôö¼Ó£¬º¬ÆÕ¹¥£¬¼ÆËãʱ ÎªÁËÆ®×ÖʹÓà  | 
|              4089:ChConfig.TriggerType_AttackAddSkillPerYinji,  # ËùÓй¥»÷É˺¦(SkillPer)Ôö¼Ó£¬º¬ÆÕ¹¥£¬¼ÆËãʱ ÎªÁËÆ®×ÖʹÓà  | 
|              4090:ChConfig.TriggerType_AttackOver,  # ¹¥»÷£¨¶ÔµÐ¼¼ÄÜ£©ºó±»¶¯¼¼Äܱ»´¥·¢ 4  | 
|              4091:ChConfig.TriggerType_SkillOverNoAttack,   # ¼¼ÄÜÊͷźó ÓëTriggerType_AttackOverÏà·´19,  | 
|              4092:ChConfig.TriggerType_SkillSuccessExpend,  # Èκμ¼ÄÜÊͷųɹ¦¶¼¿É´¥·¢ 76  ¼õÓ¡¼Ç  | 
|              4093:ChConfig.TriggerType_NoControl,   # Ê¹¹ØÁª¼¼Äܲ»ÊÜ¿ØÖÆ 78  | 
|              4094:ChConfig.TriggerType_Buff_AddSuperHitRate, # BUFFÀà:Ôö¼Ó±©»÷ÂÊ  | 
|              4095:ChConfig.TriggerType_SuperHitSuckBloodPer, # BUFFÀࣺ ±©»÷°Ù·Ö±ÈÎüѪ, 79  | 
|              4096:ChConfig.TriggerType_AttackAddSkillPer,  # ËùÓй¥»÷É˺¦(SkillPer)Ôö¼Ó£¬º¬ÆÕ¹¥£¬¼ÆËãʱ 5  | 
|              4097:ChConfig.TriggerType_BurnPer, # ×ÆÉÕÉ˺¦°Ù·Ö±È 80  | 
|              4098:ChConfig.TriggerType_AttackAddSkillPer,  # ËùÓй¥»÷É˺¦(SkillPer)Ôö¼Ó£¬º¬ÆÕ¹¥£¬¼ÆËãʱ 5  | 
|              4099:ChConfig.TriggerType_WillDead,   # ½øÈë±ôËÀ״̬ʱ´¥·¢¼¼ÄÜ 25  | 
|              4100:ChConfig.TriggerType_AttackOver,  # ¹¥»÷£¨¶ÔµÐ¼¼ÄÜ£©ºó±»¶¯¼¼Äܱ»´¥·¢ 4  | 
|              4101:ChConfig.TriggerType_AttackAddSkillPer,  # ËùÓй¥»÷É˺¦(SkillPer)Ôö¼Ó£¬º¬ÆÕ¹¥£¬¼ÆËãʱ 5  | 
|              4102:ChConfig.TriggerType_SkillValue,  # Ôö¼Ó¼¼ÄÜÉ˺¦¹Ì¶¨Öµ 82  | 
|              4103:ChConfig.TriggerType_ThumpHitSuckBloodPer,   # ¹¥»÷ °Ù·Ö±ÈÎüѪ  | 
|              4104:ChConfig.TriggerType_HitSuccess,  # ÃüÖгɹ¦ÂÊ 83  | 
|              4106:ChConfig.TriggerType_AddHP,   # ¼¼ÄÜ»ØÑª 84  | 
|              4107:ChConfig.TriggerType_SkillValue,   # Ôö¼Ó¼¼ÄÜÉ˺¦¹Ì¶¨Öµ 82  | 
|              4108:ChConfig.TriggerType_SkillSuccess,  # Ê¹Óü¼Äܳɹ¦ºó²»´¥·¢¼¼ÄÜ ´¦ÀíÏûºÄµÈÎÊÌâÓà87  | 
|              4109:ChConfig.TriggerType_SkillValue,   # Ôö¼Ó¼¼ÄÜÉ˺¦¹Ì¶¨Öµ 82  | 
|              4110:ChConfig.TriggerType_ChangeSkillEff, # ¸Ä±ä¼¼ÄÜÌØÐ§  | 
|              }  | 
|     return tdict.get(effectID, -1)   | 
|     #===========================================================================  | 
|     # # ´Ë±íÅäÖàӰÏìÀàÐÍ  | 
|     # ipyData = IpyGameDataPY.GetIpyGameData('SkillEffect', effectID)  | 
|     # if not ipyData:  | 
|     #    return -1  | 
|     #   | 
|     # #{(´¥·¢·½Ê½/µã£¬ ¹ØÁª¼¼ÄÜ)£º{buff£º¡¾Ð§¹û¡¿}}  | 
|     #   | 
|     # return ipyData.GetTriggerType()  | 
|     #===========================================================================  | 
|   | 
| # »ñµÃ¡¾BUFF¡¿±»¶¯´¥·¢µÄ·½Ê½ ÓëGetTriggerTypeByEffectID»¥²¹  | 
| def GetBuffTriggerTypeByEffectID(effectID):  | 
|     tdict = {  | 
|              1011:ChConfig.TriggerType_Buff_AttackSubLayer,  # BUFFÀࣺ¹¥»÷¼õbuff²ã£¬0Ïûʧ  | 
|              4500:ChConfig.TriggerType_AttackOver, # BUFFÀࣺ¹¥»÷´¥·¢Ð¼¼ÄÜ  | 
|              4501:ChConfig.TriggerType_AttackAddSkillPer, # BUFFÀࣺÌá¸ßÖ÷¶¯¼¼Äܵļ¼ÄÜÉ˺¦  | 
|              4502:ChConfig.TriggerType_BeAttackOver, # BUFFÀࣺ±»¹¥»÷´¥·¢¼¼ÄÜ  | 
|              4503:ChConfig.TriggerType_AttackOver, # BUFFÀࣺ¹¥»÷´¥·¢Ð¼¼ÄÜ  | 
|              4504:ChConfig.TriggerType_BounceHP,  # BUFFÀࣺ ·´µ¯É˺¦¹Ì¶¨Öµ  | 
|              4505:ChConfig.TriggerType_AttackAddSkillPer, # BUFFÀࣺÌá¸ßÖ÷¶¯¼¼Äܵļ¼ÄÜÉ˺¦  | 
|              4506:ChConfig.TriggerType_BeAttackOver, # BUFFÀࣺ±»¹¥»÷´¥·¢¼¼ÄÜ  Ö»Ë¢ÐÂÊôÐÔ ²»´¥·¢¼¼ÄÜ  | 
|              4507:ChConfig.TriggerType_Buff_AddSuperHitRate, # BUFFÀà:Ôö¼Ó±©»÷ÂÊ  | 
|              4508:ChConfig.TriggerType_Buff_AttackSubLayer,  # BUFFÀࣺ¹¥»÷¼õbuff²ã£¬0Ïûʧ  | 
|              4509:ChConfig.TriggerType_Buff_SuckBloodPer,   # BUFFÀࣺ °Ù·Ö±ÈÎüѪ, ´Ë´¦·ÇÊôÐÔÀà  | 
|              4510:ChConfig.TriggerType_Buff_MustBeHit,   # BUFFÀࣺ ÎÞÊÓÉÁ±Ü±ØÖÐ  | 
|              4511:ChConfig.TriggerType_AttackAddFinalValue,   #¹¥»÷Ôö¼ÓÊä³öÉ˺¦11  | 
|              4512:ChConfig.TriggerType_ReduceHurtHPPer, # °Ù·Ö±È¼õÉÙ¹¥»÷¼ÆËãºóÉ˺¦   | 
|              4513:ChConfig.TriggerType_AttackAddFinalValue,   #¹¥»÷Ôö¼ÓÊä³öÉ˺¦11  | 
|              4514:ChConfig.TriggerType_Buff_BeAttackSubLayer,  # BUFFÀࣺ±»¹¥»÷¼õbuff²ã£¬0Ïûʧ  | 
|              #4515:ChConfig.TriggerType_AddIceAtkPer,    # BUFFÀࣺ¹¥»÷¸½¼ÓÕæÊµÉ˺¦°Ù·Ö±È  | 
|              4516:ChConfig.TriggerType_ChangeHurtToHP,    # BUFFÀࣺbuffÖаÑÊܵ½É˺¦µÄxx%ת»¯ÎªÉúÃüÖµ  | 
|              4517:ChConfig.TriggerType_DebuffOff,   # BUFFÀࣺ µÖÏûdebuff  | 
|              4518:ChConfig.TriggerType_ForbidenCure, # BUFFÀࣺ ½ûÖ¹ÖÎÁÆ 53  | 
|              4519:ChConfig.TriggerType_WillDead,   # BUFFÀࣺ ½øÈë±ôËÀ״̬ 25  | 
|              4520:ChConfig.TriggerType_AddLayer, # BUFFÀࣺ Ä¿±êBUFF²ã¼¶Ôö¼Óʱ 52  | 
|              4521:ChConfig.TriggerType_BeLuckyHitSubPer, # ¼õÉÙÊܵ½µÄ»áÐÄÉ˺¦ 65  | 
|              4522:ChConfig.TriggerType_DebuffOff,   # BUFFÀࣺ µÖÏûdebuff  | 
|              4523:ChConfig.TriggerType_SuperHitSkillPer, # ±©»÷ʱ£¬Ôö¼Ó¼¼ÄÜÉ˺¦ 10  | 
|              4524:ChConfig.TriggerType_SuperHitSubLayer, # ±©»÷¼õ²ã 67  | 
|              4525:ChConfig.TriggerType_SuperHitSkipCD, # ±©»÷ÎÞÀäÈ´ 68  | 
|              4526:ChConfig.TriggerType_AddThumpHitRate, # Ôö¼ÓÖØ»÷¸ÅÂÊ  | 
|              4528:ChConfig.TriggerType_AddThumpHitPer, # ÖØ»÷ʱ Ôö¼ÓÖØ»÷°Ù·Ö±È 75  | 
|              4529:ChConfig.TriggerType_Buff_SuckBloodPer,   # BUFFÀࣺ °Ù·Ö±ÈÎüѪ, ´Ë´¦·ÇÊôÐÔÀà  | 
|              4530:ChConfig.TriggerType_Buff_AttackSubLayer,  # BUFFÀࣺ¹¥»÷¼õbuff²ã£¬0Ïûʧ  | 
|              4531:ChConfig.TriggerType_BounceHPPerByAttacker,  # ·´µ¯É˺¦°Ù·Ö±ÈÖµ, Óɹ¥»÷·½¾ö¶¨ 77  | 
|              4532:ChConfig.TriggerType_AttackOver,    # BUFFÀࣺ¹¥»÷´¥·¢Ð¼¼ÄÜ  | 
|              4533:ChConfig.TriggerType_BurnDisappear, # ×ÆÉÕÏûʧ´¥·¢ 81  | 
|              4534:ChConfig.TriggerType_DebuffOff,   # BUFFÀࣺ µÖÏûdebuff  | 
|              4535:ChConfig.TriggerType_BeAttackAddSkillPer, # buffÖУ¬ ±»¹¥»÷Ìá¸ß¼¼ÄÜÉ˺¦  | 
|              4536:ChConfig.TriggerType_AddBuffOver,   | 
|              4537:ChConfig.TriggerType_BurnPer, # ×ÆÉÕÉ˺¦°Ù·Ö±È 80  | 
|              4538:ChConfig.TriggerType_SkillValue,  # Ôö¼Ó¼¼ÄÜÉ˺¦¹Ì¶¨Öµ 82  | 
|              4539:ChConfig.TriggerType_SkillValue,  # Ôö¼Ó¼¼ÄÜÉ˺¦¹Ì¶¨Öµ 82  | 
|              4540:ChConfig.TriggerType_SuperHitPer, # ±©»÷É˺¦°Ù·Ö±È  | 
|              4541:ChConfig.TriggerType_AttackAddSkillPer, # BUFFÀࣺÌá¸ßÖ÷¶¯¼¼Äܵļ¼ÄÜÉ˺¦  | 
|                | 
|              803:ChConfig.TriggerType_BloodShield,  # Ñª¶Ü  | 
|              806:ChConfig.TriggerType_BloodShield,  # Ñª¶Ü  | 
|              807:ChConfig.TriggerType_BloodShield,  # Ñª¶Ü  | 
|              808:ChConfig.TriggerType_BloodShield,  # Ñª¶Ü  | 
|              }  | 
|     return tdict.get(effectID, -1)  | 
|   | 
|   | 
| #--------±»¶¯Ð§¹û---------------------------  | 
| # ±»¶¯Ð§¹ûµÄÀ´Ô´¿ÉÄÜÊDZ»¶¯¼¼ÄÜ£¬±»¶¯buff£¬»òÕ߯äËûÔöÒæbuff  | 
| # ¸ù¾Ý´¥·¢µã×éÖ¯²»Í¬µÄ´æ´¢  | 
| # Êý¾ÝΪ¿ÕÖØÐÂ×éÖ¯  | 
| class PassiveEff(object):  | 
|     def __init__(self, gameObj):  | 
|         self.gameObj = gameObj  | 
|         #{(´¥·¢Ä£Ê½£¬ ±»Ó°ÏìµÄ¼¼ÄÜID):{BUFFid£º[Ó°ÏìBUFFµÄ¸½´øÐ§¹û]}}  | 
|         self.AffectBuffDict = {}    # µ±Ç°ÕýÊÜÓ°ÏìµÄЧ¹ûbuff, keyΪ´¥·¢µã  | 
|         self.AffectSkillDict = {}    # ±»¶¯¼¼ÄÜ {(´¥·¢Ä£Ê½£¬ ±»Ó°ÏìµÄ¼¼ÄÜID):[±»¶¯¼¼ÄÜID£¬Ð§¹û]  | 
|         self.AffectPassiveSkillSetDict = {}    # ±»¶¯¼¼ÄÜ×°±¸ {(´¥·¢Ä£Ê½£¬ ±»Ó°ÏìµÄ¼¼ÄÜID):[±»¶¯¼¼ÄÜID£¬Ð§¹û]  | 
|         self.AffectDogzSkillDict = {}   # ÉñÊÞÖúÕ½¼¼ÄÜ  | 
|         self.AffectSuperEquipSkillDict = {}   # ÌØÊâ×°±¸³ÖÓм¼ÄÜ£¬Ïàͬ¼¼Äܲ»Öظ´£¬ÊýÖµÔö³¤ÐÔË¥¼õ, ´¥·¢Ê¹Óà  | 
|         self.AffectSuperEquipEffectCntDict = {}  # ÌØÊâ×°±¸¼¼ÄÜЧ¹û¶ÔÓ¦µÄÒѼÆËãºóµÄÊýÖµ£¬Ö±½Óµ÷Óà  | 
|       | 
|         self.ChangeSkill = {}   # ¸Ä±äÊͷŵļ¼ÄÜID£¬·½±ã´¦ÀíÌØÐ§¶¯×÷±íÏÖµÈÎÊÌâ {ÔSkillTypeID: ¸Ä±äºóµÄSkillTypeID}  | 
|         self.IsChangeSkill = False # µ±Ç°ÊÇ·ñˢм¼ÄÜÌæ»»  | 
|       | 
|     #¼Ç¼»áÓ°ÏìÆäËû¼¼ÄÜ»òÕß±»¶¯´¥·¢Êͷż¼ÄܵÄBUFF  | 
|     def AddBuffInfoByEffect(self, effect, skillID, onwerID, onwerType):  | 
|         effectID = effect.GetEffectID()  | 
|           | 
|         #{(´¥·¢·½Ê½/µã£¬ ¹ØÁª¼¼ÄÜ)£º{BUFFID£º¡¾Ð§¹û¡¿}}  | 
|         triggerType = GetBuffTriggerTypeByEffectID(effectID)  | 
|         if triggerType == -1:  | 
|             return  | 
|   | 
|         releaseSkillID = 0  | 
|         keyTuple = (triggerType, releaseSkillID)  | 
|         if keyTuple not in self.AffectBuffDict:  | 
|             self.AffectBuffDict[keyTuple] = {}  | 
|               | 
|         if skillID not in self.AffectBuffDict[keyTuple]:  | 
|             self.AffectBuffDict[keyTuple][skillID] = []  | 
|         self.AffectBuffDict[keyTuple][skillID].append([effect, onwerID, onwerType])  # ´æ´¢ÊÜÓ°ÏìµÄÐÅÏ¢  | 
|         return  | 
|           | 
|   | 
|           | 
|     # ÐèÔÚɾ³ýBUFF´¦Àí  | 
|     def DelBuffInfo(self, skillData):  | 
|         if not skillData:  | 
|             return  | 
|           | 
|         skillID = skillData.GetSkillID()  | 
|         releaseSkillID = 0 # ÔÝÇÒÎÞ¹ØÁª¾ßÌå¼¼ÄÜ  | 
|         for i in range(0, skillData.GetEffectCount()):  | 
|             curEffect = skillData.GetEffect(i)  | 
|             effectID = curEffect.GetEffectID()  | 
|               | 
|             triggerType = GetBuffTriggerTypeByEffectID(effectID)  | 
|             if triggerType == -1:  | 
|                 continue  | 
|               | 
|             if (triggerType, releaseSkillID) not in self.AffectBuffDict:  | 
|                 continue  | 
|               | 
|             if skillID not in self.AffectBuffDict[(triggerType, releaseSkillID)]:  | 
|                 continue  | 
|               | 
|             self.AffectBuffDict[(triggerType, releaseSkillID)].pop(skillID)  | 
|               | 
|         return  | 
|       | 
|       | 
|       | 
|     # »ñµÃ±»¶¯´¥·¢µÄ buff  | 
|     def GetBuffsByTriggerType(self, triggerType, useSkillID=0):  | 
|         return self.AffectBuffDict.get((triggerType, 0), {})  | 
|        | 
|       | 
|     # ÖØË¢ÉñÊÞÖúÕ½¼¼ÄÜ  | 
|     def RefreshDogzBattleSkill(self):  | 
|         self.AffectDogzSkillDict = {}  | 
|         skills = FindDogzBattleSkills(self.gameObj)  | 
|           | 
|         for curSkill in skills:  | 
|             if not SkillCommon.isPassiveTriggerSkill(curSkill):  | 
|                 continue  | 
|               | 
|             skillTypeID = curSkill.GetSkillTypeID()  | 
|               | 
|             connSkillID = SkillShell.GetConnectSkillID(curSkill)    # ¹ØÁª¼¼ÄÜID, 0´ú±í²»ÏÞ¼¼ÄÜ  | 
|             for i in xrange(curSkill.GetEffectCount()):  | 
|                 curEffect = curSkill.GetEffect(i)  | 
|                 effectID = curEffect.GetEffectID()  | 
|                 if effectID == 0:  | 
|                     continue  | 
|                   | 
|                 triggerType = GetTriggerTypeByEffectID(effectID)  | 
|                 if triggerType == -1:  | 
|                     continue  | 
|                   | 
|                 key = (triggerType,connSkillID)  | 
|                 if key not in self.AffectDogzSkillDict:  | 
|                     self.AffectDogzSkillDict[key] = []  | 
|                       | 
|                 self.AffectDogzSkillDict[key].append((skillTypeID, effectID))  | 
|           | 
|         return self.AffectDogzSkillDict  | 
|       | 
|       | 
|     # ÖØË¢ÌØÊâ×°±¸¼¼ÄÜ  | 
|     def RefreshSuperEquipSkillDict(self):  | 
|         self.AffectSuperEquipSkillDict = {}  | 
|         self.AffectSuperEquipEffectCntDict = {}  | 
|         skillsDict = FindSuperEquipSkills(self.gameObj)  | 
|           | 
|         for skillID, value in skillsDict.items():  | 
|             curSkill = GameWorld.GetGameData().GetSkillBySkillID(skillID)  | 
|             if not curSkill:  | 
|                 continue  | 
|             if not SkillCommon.isPassiveTriggerSkill(curSkill):  | 
|                 continue  | 
|               | 
|             skillTypeID = curSkill.GetSkillTypeID()  | 
|               | 
|             connSkillID = SkillShell.GetConnectSkillID(curSkill)    # ¹ØÁª¼¼ÄÜID, 0´ú±í²»ÏÞ¼¼ÄÜ  | 
|             for i in xrange(curSkill.GetEffectCount()):  | 
|                 curEffect = curSkill.GetEffect(i)  | 
|                 effectID = curEffect.GetEffectID()  | 
|                 if effectID == 0:  | 
|                     continue  | 
|                   | 
|                 triggerType = GetTriggerTypeByEffectID(effectID)  | 
|                 if triggerType == -1:  | 
|                     continue  | 
|                   | 
|                 key = (triggerType,connSkillID)  | 
|                 if key not in self.AffectSuperEquipSkillDict:  | 
|                     self.AffectSuperEquipSkillDict[key] = []  | 
|                       | 
|                 self.AffectSuperEquipSkillDict[key].append((skillTypeID, effectID))  | 
|                 # Ð§¹ûµþ¼Ó¸ù¾Ý¼¼ÄܸöÊý»áË¥¼õ = 1-pow((1-³õʼֵ/10000.0),Ïàͬ¼¼ÄܸöÊý)*10000  | 
|                 self.AffectSuperEquipEffectCntDict[effectID] = int((1 - pow((1 - curEffect.GetEffectValue(0)/10000.0),value))*10000)  | 
|           | 
|         GameWorld.DebugLog("RefreshSuperEquipSkillDict %s-%s"%(self.AffectSuperEquipSkillDict, self.AffectSuperEquipEffectCntDict))  | 
|           | 
|         return self.AffectSuperEquipSkillDict  | 
|       | 
|       | 
|     # ÖØË¢¿É×°±¸µÄ±»¶¯¼¼ÄÜ  | 
|     def RefreshPassiveSkillSet(self, isCD=False):  | 
|         self.AffectPassiveSkillSetDict = {}  | 
|         skillManager = self.gameObj.GetSkillManager()  | 
|         skills = FindUsePassiveSkills(self.gameObj)  | 
|           | 
|         tick = GameWorld.GetGameWorld().GetTick()  | 
|           | 
|         for skillID in skills:  | 
|             curSkill = skillManager.FindSkillBySkillID(skillID)  | 
|             if not curSkill:  | 
|                 continue  | 
|               | 
|             if isCD:  | 
|                 # ÖØÇÐÐè½øÈëCD  | 
|                 SkillCommon.SetSkillRemainTime(curSkill, PlayerControl.GetReduceSkillCDPer(self.gameObj), tick, self.gameObj)  | 
|               | 
|             skillTypeID = curSkill.GetSkillTypeID()  | 
|             connSkillID = SkillShell.GetConnectSkillID(curSkill)    # ¹ØÁª¼¼ÄÜID, 0´ú±í²»ÏÞ¼¼ÄÜ  | 
|             for i in xrange(curSkill.GetEffectCount()):  | 
|                 curEffect = curSkill.GetEffect(i)  | 
|                 effectID = curEffect.GetEffectID()  | 
|                 if effectID == 0:  | 
|                     continue  | 
|                   | 
|                 triggerType = GetTriggerTypeByEffectID(effectID)  | 
|                 if triggerType == -1:  | 
|                     continue  | 
|                   | 
|                 key = (triggerType,connSkillID)  | 
|                 if key not in self.AffectPassiveSkillSetDict:  | 
|                     self.AffectPassiveSkillSetDict[key] = []  | 
|                       | 
|                 self.AffectPassiveSkillSetDict[key].append((skillTypeID, effectID))  | 
|           | 
|         return self.AffectPassiveSkillSetDict  | 
|       | 
|     # ¸Ä±ä¼¼ÄÜIDµÄ´¦Àí, ÏÈ´æ´¢ÊͷŵÄʱºòÌæ»», ²¢ÇÒ²»µÇ¼Çµ½±»¶¯´¥·¢  | 
|     def ChangeSkillTypeIDDict(self, curSkill):  | 
|         hasEffect = SkillCommon.GetSkillEffectByEffectID(curSkill, ChConfig.Def_Skill_Effect_ChangeSkillTypeID)  | 
|         if not hasEffect:  | 
|             return  | 
|         changeSkillID = 0  | 
|           | 
|         #ÕÒµ½¶ÔÓ¦·¨±¦¼¼ÄÜ  | 
|         upIpyData = IpyGameDataPY.GetIpyGameData('TreasureUp', hasEffect.GetEffectValue(0), 1)  | 
|         if not upIpyData:  | 
|             return  | 
|         skillIDList = upIpyData.GetUnLockSkill()  | 
|         for skillID in skillIDList:  | 
|             skillData = GameWorld.GetGameData().FindSkillByType(skillID, 1)  | 
|             if not skillData:  | 
|                 continue  | 
|             if not SkillCommon.CheckSkillJob(self.gameObj, skillData):  | 
|                 continue  | 
|             changeSkillID = skillID  | 
|             break  | 
|           | 
|         if changeSkillID == 0:  | 
|             return  | 
|           | 
|         self.ChangeSkill[changeSkillID] = curSkill.GetSkillTypeID()  | 
|           | 
|         self.IsChangeSkill = True  | 
|         GameWorld.DebugLog("self.ChangeSkill  --- %s"%self.ChangeSkill)  | 
|         return True  | 
|       | 
|     # ÕæÊµÌæ»»¼¼ÄÜID  | 
|     def ChangeSkillTypeID(self, skillID):  | 
|         return self.ChangeSkill.get(skillID, skillID)  | 
|       | 
|       | 
|     # ÖØË¢±»¶¯Ðͼ¼ÄÜ£¨º¬sp£¬Ì츳£¬²»º¬±»¶¯¼¼Äܹ¦ÄÜ£©´æ´¢  | 
|     def RefreshPassiveSkill(self):  | 
|         self.AffectSkillDict = {}  | 
|         self.ChangeSkill = {}  | 
|         mapID = FBCommon.GetRecordMapID(GameWorld.GetGameWorld().GetMapID())  | 
|         invalidPassiveSkillFuncTypeDict = IpyGameDataPY.GetFuncEvalCfg("PassiveSkillEffect", 1, {})  | 
|         invalidPassiveSkillFuncTypeList = invalidPassiveSkillFuncTypeDict.get(mapID, [])  | 
|         if invalidPassiveSkillFuncTypeList:  | 
|             GameWorld.Log("±¾µØÍ¼ÎÞЧµÄ±»¶¯¼¼Äܹ¦ÄÜ·ÖÀàÁбí: mapID=%s,%s" % (mapID, str(invalidPassiveSkillFuncTypeList)))  | 
|         skillManager = self.gameObj.GetSkillManager()  | 
|         for i in range(0 , skillManager.GetSkillCount()):  | 
|             curSkill = skillManager.GetSkillByIndex(i)  | 
|             if not curSkill:  | 
|                 continue  | 
|               | 
|             if not SkillCommon.isPassiveTriggerSkill(curSkill):  | 
|                 continue  | 
|               | 
|             if curSkill.GetFuncType() in [ChConfig.Def_SkillFuncType_FbPassiveSkill,  | 
|                                           ChConfig.Def_SkillFuncType_Dogz,  | 
|                                           ChConfig.Def_SkillFuncType_EquipPassiveSkill]:  | 
|                 # ±»¶¯¼¼ÄܺÍÉñÊÞÐèÉèÖòÅÓÐЧ  | 
|                 continue  | 
|               | 
|             # ¸Ä±ä¼¼ÄÜIDµÄ´¦Àí  | 
|             if self.ChangeSkillTypeIDDict(curSkill):  | 
|                 continue  | 
|               | 
|             skillTypeID = curSkill.GetSkillTypeID()  | 
|             connSkillID = SkillShell.GetConnectSkillID(curSkill)    # ¹ØÁª¼¼ÄÜID, 0´ú±í²»ÏÞ¼¼ÄÜ  | 
|             if invalidPassiveSkillFuncTypeList and curSkill.GetFuncType() in invalidPassiveSkillFuncTypeList:  | 
|                 #GameWorld.DebugLog("ÎÞЧµÄ±»¶¯¼¼ÄÜ: skillTypeID=%s,skillID=%s,connSkillID=%s,funcType=%s"   | 
|                 #                   % (skillTypeID, curSkill.GetSkillID(), connSkillID, curSkill.GetFuncType()))  | 
|                 continue  | 
|             for i in xrange(curSkill.GetEffectCount()):  | 
|                 curEffect = curSkill.GetEffect(i)  | 
|                 effectID = curEffect.GetEffectID()  | 
|                 if effectID == 0:  | 
|                     continue  | 
|                   | 
|                 triggerType = GetTriggerTypeByEffectID(effectID)  | 
|                 if triggerType == -1:  | 
|                     continue  | 
|                   | 
|                 key = (triggerType,connSkillID)  | 
|                 if key not in self.AffectSkillDict:  | 
|                     self.AffectSkillDict[key] = []  | 
|                   | 
|                 self.AffectSkillDict[key].append((skillTypeID, effectID))  | 
|           | 
|         return self.AffectSkillDict  | 
|       | 
|     # Ìí¼Ó±»¶¯¼¼ÄÜ  | 
|     def AddPassiveSkill(self, skillID):  | 
|         curSkill = GameWorld.GetGameData().GetSkillBySkillID(skillID)  | 
|         if not curSkill:  | 
|             return  | 
|           | 
|         if not SkillCommon.isPassiveTriggerSkill(curSkill):  | 
|             return  | 
|           | 
|         skillTypeID = curSkill.GetSkillTypeID()  | 
|         connSkillID = SkillShell.GetConnectSkillID(curSkill)    # ¹ØÁª¼¼ÄÜID, 0´ú±í²»ÏÞ¼¼ÄÜ  | 
|         for i in xrange(curSkill.GetEffectCount()):  | 
|             curEffect = curSkill.GetEffect(i)  | 
|             effectID = curEffect.GetEffectID()  | 
|             if effectID == 0:  | 
|                 continue  | 
|               | 
|             triggerType = GetTriggerTypeByEffectID(effectID)  | 
|             if triggerType == -1:  | 
|                 continue  | 
|               | 
|             key = (triggerType,connSkillID)  | 
|             if key not in self.AffectSkillDict:  | 
|                 self.AffectSkillDict[key] = []  | 
|               | 
|             if (skillTypeID, effectID) not in self.AffectSkillDict[key]:  | 
|                 self.AffectSkillDict[key].append((skillTypeID, effectID))  | 
|           | 
|         return self.AffectSkillDict  | 
|       | 
|   | 
|     def GetPassiveSkillsByTriggerType(self, triggerType, connSkill=None):  | 
|         connSkillID = connSkill.GetSkillTypeID() if connSkill else 0  | 
|         skillList = []  | 
|         ## bug:2018-03-15  | 
|         ## skillList=self.AffectSkillDict.get((triggerType, connSkillID), [])ÔÙÓÃextend»áµ¼ÖÂAffectSkillDictÎÞÏÞÔö³¤  | 
|         skillList.extend(self.AffectSkillDict.get((triggerType, connSkillID), []))  | 
|         skillList.extend(self.AffectPassiveSkillSetDict.get((triggerType, connSkillID), []))  | 
|         skillList.extend(self.AffectDogzSkillDict.get((triggerType, connSkillID), []))  | 
|         skillList.extend(self.AffectSuperEquipSkillDict.get((triggerType, connSkillID), []))  | 
|           | 
|         # Ö¸¶¨ÌØÊâÀàÐͿɴ¥·¢  | 
|         # »ñµÃ¹ØÁª¼¼ÄÜ,0 È«²¿ 1ÊÇÖ÷¶¯Ðͼ¼ÄÜ£¨·¨±¦£¬ÆÕ¹¥£© 2 ÎªÈË×å·¨±¦¼¼ÄÜ 3ΪÆÕ¹¥  ÆäËû¼¼ÄÜID  | 
|         if connSkill and connSkill.GetFuncType() in [ChConfig.Def_SkillFuncType_FbSkill, ChConfig.Def_SkillFuncType_NormalAttack]:  | 
|             funcTypeList = Def_ConnSkill_Template.get(connSkill.GetFuncType(), [])  | 
|             for funcType in funcTypeList:  | 
|                 skillList.extend(self.AffectSkillDict.get((triggerType, funcType), []))  | 
|                 skillList.extend(self.AffectPassiveSkillSetDict.get((triggerType, funcType), []))  | 
|                 skillList.extend(self.AffectDogzSkillDict.get((triggerType, funcType), []))  | 
|                 skillList.extend(self.AffectSuperEquipSkillDict.get((triggerType, funcType), []))  | 
|           | 
|         # ±»¶¯ÔÙ´¥·¢±»¶¯ÏÞÖÆÎªÖ¸¶¨  | 
|         if connSkill and SkillCommon.isPassiveSkill(connSkill) and not PassPassiveLimit(connSkill):  | 
|             return skillList  | 
|           | 
|         if connSkillID != 0 and connSkillID != ChConfig.Def_SkillID_Somersault:  | 
|             skillList.extend(self.AffectSkillDict.get((triggerType, 0), []))  | 
|             skillList.extend(self.AffectPassiveSkillSetDict.get((triggerType, 0), []))  | 
|             skillList.extend(self.AffectDogzSkillDict.get((triggerType, 0), []))  | 
|             skillList.extend(self.AffectSuperEquipSkillDict.get((triggerType, 0), []))  | 
|         return skillList  | 
|           | 
| #ËùÓÐobjµÄ±»¶¯Ð§¹û¹ÜÀí  | 
| class PassiveEffManager(object):  | 
|       | 
|     def __init__(self):  | 
|         self.passiveEffClassDict = {}  | 
|           | 
|     # ÊÇ·ñ³õʼ»¯  | 
|     def GetPassiveEff(self, gameObj):  | 
|         key = (gameObj.GetID(), gameObj.GetGameObjType())   | 
|   | 
|         return self.passiveEffClassDict.get(key, None)  | 
|   | 
|       | 
|     def InitObjPassiveEff(self, gameObj):  | 
|         key = (gameObj.GetID(), gameObj.GetGameObjType())   | 
|         if key not in self.passiveEffClassDict:   | 
|             self.passiveEffClassDict[key] = PassiveEff(gameObj)  | 
|         return self.passiveEffClassDict[key]  | 
|       | 
|     def AddPassiveEff(self, gameObj, passiveEff):  | 
|         key = (gameObj.GetID(), gameObj.GetGameObjType())   | 
|         self.passiveEffClassDict[key] = passiveEff  | 
|       | 
|     # ×¢²á±»¶¯¼¼ÄÜ  | 
|     def RegistPassiveEff(self, gameObj, skillID=0):  | 
|         passiveEff = self.GetPassiveEff(gameObj)  | 
|         if not passiveEff or not skillID:  | 
|               | 
|             if passiveEff:  | 
|                 # µ±´ÓÓб»¶¯µ½ÍêȫûÓб»¶¯µÄ¹ý³Ì£¬ÐèÒªÔÚ´ËˢР | 
|                 passiveEff.RefreshPassiveSkill()  | 
|                 return  | 
|               | 
|             # Ç¿ÖÆË¢ÐÂËùÓб»¶¯¼¼ÄÜ  | 
|             passiveEff = PassiveEff(gameObj)  | 
|             if not passiveEff.RefreshPassiveSkill():  | 
|                 # ´Ë´¦ÊÇΪÁ˲»¸øAddPassiveEffÔö¼Ó¿ÕÀà. ¹Ê²»Ã¿´Îµ÷ÓÃAddPassiveEff  | 
|                 # µ«ÁíÒ»ÖÖ´ÓÓб»¶¯µ½ÍêȫûÓб»¶¯»á±»´Ë¹ýÂË£¬µ¼ÖÂɾ³ý²»ÁË£¬ÔÚÉÏÃæ´¦Àí  | 
|                 return  | 
|             self.AddPassiveEff(gameObj, passiveEff)  | 
|         elif skillID:  | 
|             curSkill = GameWorld.GetGameData().GetSkillBySkillID(skillID)  | 
|             if curSkill and passiveEff.ChangeSkillTypeIDDict(curSkill):  | 
|                 # Ìæ»»¼¼Äܲ»Ìí¼Ó  | 
|                 return  | 
|               | 
|             # µ¥¸öÌí¼Ó±»¶¯¼¼ÄÜ  | 
|             passiveEff.AddPassiveSkill(skillID)  | 
|               | 
|         if passiveEff.IsChangeSkill:  | 
|             GameWorld.DebugLog("Ë¢±»¶¯----")  | 
|             # ´æÔÚÌæ»»¼¼ÄܠĿǰÐèҪˢÐÂÏâǶµÄ±»¶¯¼¼ÄÜ£¬´æÔÚ¶àË¢ÏÖÏó  | 
|             self.RegistPassiveEffSet(gameObj)  | 
|             passiveEff.IsChangeSkill = False  | 
|             return True  | 
|         return  | 
|       | 
|     # ÈËÎïÐèͬ²½×¢²á±»¶¯¼¼ÄÜ  | 
|     def RegistPassiveEffSet(self, gameObj, isCD=False):  | 
|         passiveEff = self.GetPassiveEff(gameObj)  | 
|         if not passiveEff:  | 
|             # Ç¿ÖÆË¢ÐÂËùÓб»¶¯¼¼ÄÜ  | 
|             passiveEff = PassiveEff(gameObj)  | 
|             if not passiveEff.RefreshPassiveSkillSet(isCD):  | 
|                 return  | 
|             self.AddPassiveEff(gameObj, passiveEff)  | 
|         else:  | 
|             passiveEff.RefreshPassiveSkillSet(isCD)  | 
|         return  | 
|           | 
|           | 
|     # ÈËÎïÐèͬ²½×¢²áÉñÊÞ¼¼ÄÜ  | 
|     def RegistPassiveEffDogz(self, gameObj):  | 
|         passiveEff = self.GetPassiveEff(gameObj)  | 
|         if not passiveEff:  | 
|             # Ç¿ÖÆË¢ÐÂËùÓб»¶¯¼¼ÄÜ  | 
|             passiveEff = PassiveEff(gameObj)  | 
|             if not passiveEff.RefreshDogzBattleSkill():  | 
|                 return  | 
|             self.AddPassiveEff(gameObj, passiveEff)  | 
|         else:  | 
|             passiveEff.RefreshDogzBattleSkill()  | 
|         return  | 
|           | 
|           | 
|           | 
|     # ÈËÎïÐèͬ²½×¢²á×°±¸¼¼ÄÜ£¬¼¼ÄÜĿǰΪ¿É´¥·¢µÄ±»¶¯À࣬ÈôÓж¨Òå³åÍ»Ôò¿ÉÓù¦ÄÜÀàÐÍ»®·Ö  | 
|     def RegistSuperEquipSkillDict(self, gameObj):  | 
|         passiveEff = self.GetPassiveEff(gameObj)  | 
|         if not passiveEff:  | 
|             # Ç¿ÖÆË¢ÐÂËùÓб»¶¯¼¼ÄÜ  | 
|             passiveEff = PassiveEff(gameObj)  | 
|             if not passiveEff.RefreshSuperEquipSkillDict():  | 
|                 return  | 
|             self.AddPassiveEff(gameObj, passiveEff)  | 
|         else:  | 
|             passiveEff.RefreshSuperEquipSkillDict()  | 
|         return  | 
|           | 
|           | 
|     def RegistPassiveBuff(self, gameObj):  | 
|         # buff # É¸Ñ¡buffType ·ñÔòNPCûÓд˽ӿڻᱨ´í  | 
|         for buffType in [IPY_GameWorld.bfBuff, IPY_GameWorld.bfDeBuff, IPY_GameWorld.bfProcessBuff  | 
|                          , IPY_GameWorld.btPassiveBuf, IPY_GameWorld.bfActionBuff, IPY_GameWorld.bfProcessDeBuff]:  | 
|               | 
|             if buffType == IPY_GameWorld.btPassiveBuf and gameObj.GetGameObjType() == IPY_GameWorld.gotNPC:  | 
|                 # NPCÖ»ÓгèÎïÓб»¶¯BUFF  | 
|                 if not PetControl.IsPet(gameObj):  | 
|                     continue  | 
|               | 
|             buffTuple = SkillCommon.GetBuffManagerByBuffType(gameObj, buffType)  | 
|             #ͨ¹ýÀàÐÍ»ñȡĿ±êµÄbuff¹ÜÀíÆ÷Ϊ¿Õ£¬ÔòÌø³ö  | 
|             if buffTuple == ():  | 
|                 continue  | 
|       | 
|             buffManager = buffTuple[0]  | 
|               | 
|             for i in xrange(buffManager.GetBuffCount()):  | 
|                 curBuff = buffManager.GetBuff(i)  | 
|                 buffSkill = curBuff.GetSkill()  | 
|                 if not buffSkill:  | 
|                     continue  | 
|                   | 
|                 onwerID, onwerType = curBuff.GetOwnerID(), curBuff.GetOwnerType()  | 
|                 for effectIndex in range(0, buffSkill.GetEffectCount()):  | 
|                     curEffect = buffSkill.GetEffect(effectIndex)  | 
|                     effectID = curEffect.GetEffectID()  | 
|                     if effectID == 0:  | 
|                         continue  | 
|                       | 
|                     triggerType = GetBuffTriggerTypeByEffectID(effectID)  | 
|                     if triggerType == -1:  | 
|                         continue  | 
|                     passiveEff = self.InitObjPassiveEff(gameObj)  | 
|                     passiveEff.AddBuffInfoByEffect(curEffect, buffSkill.GetSkillID(), onwerID, onwerType)  | 
|           | 
|         return  | 
|       | 
|       | 
|     def RemovePassiveEff(self, key):  | 
|         if key in self.passiveEffClassDict:  | 
|             self.passiveEffClassDict.pop(key)  | 
|         return  | 
|       | 
|       | 
| def GetPassiveEffManager():  | 
|     if not PyGameData.g_PassiveEffManager:  | 
|         PyGameData.g_PassiveEffManager = PassiveEffManager()  | 
|     return PyGameData.g_PassiveEffManager  | 
|   | 
|   | 
| # ²éÕÒ±»¶¯¼¼ÄÜʱµÄ¶ÔÏó  | 
| def GetPassiveDefender(attacker, defender):  | 
|     # Ñ°ÕÒ±»»÷Õߣ¬1.Ä¿±êÅųýÊÇ×Ô¼º£¨ºóÃæÂß¼»á¸ü»»£© 2. ²é¿Í»§¶ËÉ˺¦¶ÓÁУ¬3.²é·þÎñ¶ËÉ˺¦¶ÓÁР     | 
|     if defender and defender != attacker:  | 
|         return defender  | 
|   | 
|     # Ã»ÓÐÄ¿±êµÄÇé¿öÈ¡É˺¦¶ÓÁÐÖеĵÚÒ»¸ö¶ÔÏó  | 
|     if attacker.GetGameObjType() != IPY_GameWorld.gotPlayer:  | 
|         return  | 
|       | 
|     useSkillTagID = attacker.GetUseSkillTagID()  | 
|     useSkillTagType = attacker.GetUseSkillTagType()  | 
|     defender = GameWorld.GetObj(useSkillTagID, useSkillTagType)  | 
|     if defender:  | 
|         return defender  | 
|       | 
|     curHurt = BaseAttack.GetFirstHurtObj()  | 
|     if not curHurt:  | 
|         return  | 
|       | 
|     return GameWorld.GetObj(curHurt.GetObjID(), curHurt.GetObjType())  | 
|   | 
| # µ±Ç°ÓÐЧ±»¶¯´¥·¢¼¼ÄÜ, ¿ÉÓÃÓÚ»ù´¡Ê¹ÓÃÅж¨     | 
| def IsValidPassiveSkill(curSkill):  | 
|     validMap = SkillShell.GetAttrMapID(curSkill)  | 
|     if validMap and validMap != GameWorld.GetMap().GetMapID():  | 
|         # ÓÐЧµØÍ¼¿É´¥·¢  | 
|         return False  | 
|       | 
|     return True  | 
|   | 
| # ¶àÖÖ±»¶¯¼¼ÄÜÓÅÏÈ´¥·¢ÊÍ·ÅÒ»¸ö£¬Èç±»¶¯ ÑªÁ¿40%´¥·¢Î޵м¼ÄÜ£¬ÑªÁ¿Ò»¶¨ÊÇÍ£ÁôÔÚ40%  | 
| # ÏÈËøÑª£¬ºó´¥·¢¼¼Äܠͬ DelayUsePassiveTriggerSkill Ê¹Óà  | 
| def OnPassiveSkillLockHP(attacker, defender, connSkill, triggerType, tick, isEnhanceSkill=False):  | 
|     attacker = FindRealAttacker(attacker)  | 
|     if not attacker:  | 
|         return 0, 0  | 
|   | 
|     stopPassiveSkill = False   # ±»¶¯¼¼Äܲ»ÄÜÔÙ´¥·¢±»¶¯¼¼ÄÜ£¬µ«¿ÉÒÔ´¥·¢Ì츳¼¼ÄÜ  | 
|     if connSkill:  | 
|         if not connSkill.GetFuncType():  | 
|             # ·Ç¹¦ÄÜÀ༼ÄÜ£¬±ÜÃâËÀÑ»·  | 
|             return 0, 0  | 
|         if SkillCommon.isPassiveSkill(connSkill) and not PassPassiveLimit(connSkill):  | 
|             stopPassiveSkill = True  | 
|           | 
|     if SkillCommon.GetUsingPassiveSkill(attacker) and triggerType != ChConfig.TriggerType_BuffState:  | 
|         # ·À·¶±»¶¯¼¼ÄÜ´¥·¢µÄ ·Ç±»¶¯¼¼ÄÜ  | 
|         stopPassiveSkill = True  | 
|       | 
|     passiveEff = GetPassiveEffManager().GetPassiveEff(attacker)  | 
|     if not passiveEff:  | 
|         return 0, 0  | 
|           | 
|     connSkillID = connSkill.GetSkillTypeID() if connSkill else 0  | 
|     skills = passiveEff.GetPassiveSkillsByTriggerType(triggerType, connSkill)  | 
|     if not skills:  | 
|         return 0, 0  | 
|           | 
|     defender = GetPassiveDefender(attacker, defender)  | 
|   | 
|     # µ±Ç°Õ½¶·¹ØÏµ pvp pve  | 
|     battleRelationType = AttackCommon.GetBattleRelationType(attacker, defender)  | 
|     #GameWorld.DebugLog("OnPriorityPassiveSkillTrigger-----------%s-%s"%(skills, battleRelationType))  | 
|       | 
|     lockHPPerMax = 0  ## È¡ÓÐЧµÄ×î¸ßѪÁ¿  | 
|     lockHPSkillID = 0  | 
|     for skillTypeID, effectID in skills:  | 
|         if connSkillID == skillTypeID:  | 
|             continue  | 
|         curSkill = attacker.GetSkillManager().FindSkillBySkillTypeID(skillTypeID)  | 
|         if not curSkill:  | 
|             continue  | 
|   | 
|         if not IsValidPassiveSkill(curSkill):  | 
|             continue  | 
|           | 
|         if stopPassiveSkill and curSkill.GetFuncType() != ChConfig.Def_SkillFuncType_GiftSkill:  | 
|             # Ö»ÓÐÌ츳²Å¿ÉÒÔÔٴα»´¥·¢  | 
|             continue   | 
|           | 
|         effect = SkillCommon.GetSkillEffectByEffectID(curSkill, effectID)  | 
|         if not effect:  | 
|             continue  | 
|   | 
|         if SkillCommon.RefreshSkillRemainTime(curSkill, tick):  | 
|             continue  | 
|           | 
|         if not AttackCommon.CheckBattleRelationType(attacker, defender, curSkill, battleRelationType):  | 
|             # PKģʽµÄÅж¨  | 
|             continue  | 
|           | 
|         pyName = "PassiveSkill_%s" % effectID  | 
|         callFunc = GameWorld.GetExecFunc(PassiveBuff, "%s.%s" % (pyName, "CheckCanHappen"))  | 
|         if not callFunc:  | 
|             continue  | 
|         if not callFunc(attacker, defender, effect, curSkill):  | 
|             continue  | 
|           | 
|         # ×îÖÕÈ¡×î¸ßÖµÀ´¾ö¶¨µ±Ç°ÉúÃüÖµ£¬¿¨ÑªÉ趨  | 
|         if effect.GetEffectValue(0) > lockHPPerMax:  | 
|             lockHPPerMax = effect.GetEffectValue(0)  | 
|             lockHPSkillID = skillTypeID  | 
|           | 
|     return lockHPSkillID, lockHPPerMax  | 
|   | 
|   | 
| # ËøÑª¹¦Äܵļ¼ÄÜ º¬ÈËÎïºÍ³èÎï  | 
| def OnObjsPassiveSkillLockHP(attacker, defender, connSkill, triggerType, tick,):  | 
|     if attacker.GetGameObjType() != IPY_GameWorld.gotPlayer:  | 
|         return 0  | 
|       | 
|     lockHPSkillID, lockHPPerMax = OnPassiveSkillLockHP(attacker, defender, connSkill, triggerType, tick)  | 
|     rolePet = attacker.GetPetMgr().GetFightPet()  | 
|     if rolePet:  | 
|         lockHPSkillIDPet, lockHPPerMaxPet = OnPassiveSkillLockHP(rolePet, defender, connSkill, triggerType, tick)  | 
|       | 
|         if lockHPPerMax + lockHPPerMaxPet == 0:  | 
|             # ÎÞ´¥·¢  | 
|             return 0  | 
|           | 
|         # ´¥·¢³èÎï¼¼ÄܱêÖ¾  | 
|         if lockHPPerMaxPet > lockHPPerMax:  | 
|             rolePet.SetDict(ChConfig.Def_PlayerKey_LockHPSkillID, lockHPSkillIDPet)  | 
|             return lockHPPerMaxPet  | 
|       | 
|     if lockHPPerMax == 0:  | 
|         return 0  | 
|       | 
|     # ´¥·¢ÈËÎï¼¼ÄܱêÖ¾  | 
|     attacker.SetDict(ChConfig.Def_PlayerKey_LockHPSkillID, lockHPSkillID)  | 
|     return lockHPPerMax  | 
|   | 
|   | 
| # ´ÓÉËѪÑÓºóµ½¼¼ÄܽáÊø´¥·¢±»¶¯¼¼ÄÜ  | 
| def DelayUsePassiveTriggerSkill(attacker, curSkill, defender, tick):  | 
|     if attacker.GetGameObjType() != IPY_GameWorld.gotPlayer:  | 
|         return  | 
|       | 
|     # ¼ì²éÊdzèÎﻹÊÇÈËÎï¼¼ÄÜ  | 
|     skillTypeID = attacker.GetDictByKey(ChConfig.Def_PlayerKey_LockHPSkillID)  | 
|     if not skillTypeID:  | 
|         rolePet = attacker.GetPetMgr().GetFightPet()  | 
|         if not rolePet:  | 
|             return  | 
|         skillTypeID = rolePet.GetDictByKey(ChConfig.Def_PlayerKey_LockHPSkillID)  | 
|         if not skillTypeID:  | 
|             return  | 
|         attacker = rolePet  | 
|         GameWorld.DebugLog("DelayUsePassiveTriggerSkill-----pet")  | 
|       | 
|     # Ò»¶¨ÒªÇå±êÖ¾  | 
|     attacker.SetDict(ChConfig.Def_PlayerKey_LockHPSkillID, 0)  | 
|       | 
|     curSkill = attacker.GetSkillManager().FindSkillBySkillTypeID(skillTypeID)  | 
|     if not curSkill:  | 
|         return  | 
|       | 
|     GameWorld.DebugLog("DelayUsePassiveTriggerSkill-----skillTypeID-%s"%skillTypeID)  | 
|     # ÉèÖñêÖ¾±ÜÃâ±»¶¯¼¼ÄÜ´¥·¢±»¶¯¼¼ÄÜ, ±»¶¯µ±ÖпÉÄܻᴥ·¢¶àÖÖÀàÐͼ¼ÄÜ£¬¹Ê²»ÓÃisPassiveSkill×öÆÁ±Î  | 
|     SkillCommon.SetUsingPassiveSkill(attacker, 1)  | 
|     if not SkillShell.UsePassiveTriggerSkill(attacker, curSkill, defender, tick):  | 
|         # ²»¹Ü¼¼ÄÜÊÇ·ñÊÇ·ñ³É¹¦¶¼±ØÐë½øÈëCD  | 
|         SkillCommon.SetSkillRemainTime(curSkill, PlayerControl.GetReduceSkillCDPer(attacker), tick, attacker)  | 
|           | 
|     SkillCommon.SetUsingPassiveSkill(attacker, 0)  | 
|     return  | 
|   | 
|   | 
| # Áé³è²¿·Ö¼¼ÄÜÐèҪͨ¹ýÖ÷ÈË´¥·¢£¬Áé³è×Ô¼º´¥·¢µÄÂß¼ÒÀÈ»×ß OnPassiveSkillTrigger  | 
| def OnPetPassiveSkillTrigger(attacker, defender, connSkill, triggerType, tick):  | 
|     if attacker.GetGameObjType() != IPY_GameWorld.gotPlayer:  | 
|         return  | 
|       | 
|     rolePet = attacker.GetPetMgr().GetFightPet()  | 
|     #ÎÞ³öÕ½³èÎï  | 
|     if rolePet == None:  | 
|         return  | 
|   | 
|     OnPassiveSkillTrigger(rolePet, defender, connSkill, triggerType, tick)  | 
|   | 
|   | 
| # ±»¶¯¼¼ÄÜ´¥·¢ÊÍ·Å  | 
| def OnPassiveSkillTrigger(attacker, defender, connSkill, triggerType, tick, isEnhanceSkill=False, skillIDSet=None):  | 
|     attacker = FindRealAttacker(attacker)  | 
|     if not attacker:  | 
|         return False  | 
|   | 
|     if connSkill:  | 
|         if not connSkill.GetFuncType():  | 
|             # ·Ç¹¦ÄÜÀ༼ÄÜ£¬±ÜÃâËÀÑ»·  | 
|             return False  | 
|           | 
|     passiveEff = GetPassiveEffManager().GetPassiveEff(attacker)  | 
|     if not passiveEff:  | 
|         return False  | 
|           | 
|     connSkillID = connSkill.GetSkillTypeID() if connSkill else 0  | 
|     skills = passiveEff.GetPassiveSkillsByTriggerType(triggerType, connSkill)  | 
|     if not skills:  | 
|         return False  | 
|           | 
|     defender = GetPassiveDefender(attacker, defender)  | 
|   | 
|     result = False  | 
|     # µ±Ç°Õ½¶·¹ØÏµ pvp pve  | 
|     battleRelationType = AttackCommon.GetBattleRelationType(attacker, defender)  | 
|     #GameWorld.DebugLog("OnPassiveSkillTrigger-----------%s-%s"%(skills, battleRelationType))  | 
|     for skillTypeID, effectID in skills:  | 
|         if connSkillID == skillTypeID:  | 
|             continue  | 
|         curSkill = attacker.GetSkillManager().FindSkillBySkillTypeID(skillTypeID)  | 
|         if not curSkill:  | 
|             continue  | 
|   | 
|         if not IsValidPassiveSkill(curSkill):  | 
|             continue  | 
|           | 
|         effect = SkillCommon.GetSkillEffectByEffectID(curSkill, effectID)  | 
|         if not effect:  | 
|             continue  | 
|   | 
|         if SkillCommon.RefreshSkillRemainTime(curSkill, tick):  | 
|             continue  | 
|         result = True   # ´ú±íÓÐЧ´¥·¢£¬µ«²»¹ØÏµ´¥·¢½á¹û  | 
|           | 
|         if not AttackCommon.CheckBattleRelationType(attacker, defender, curSkill, battleRelationType):  | 
|             # PKģʽµÄÅж¨  | 
|             continue  | 
|           | 
|         pyName = "PassiveSkill_%s" % effectID  | 
|         callFunc = GameWorld.GetExecFunc(PassiveBuff, "%s.%s" % (pyName, "CheckCanHappen"))  | 
|         if callFunc and not callFunc(attacker, defender, effect, curSkill):  | 
|             continue  | 
|           | 
|         # ÉèÖñêÖ¾±ÜÃâ±»¶¯¼¼ÄÜ´¥·¢±»¶¯¼¼ÄÜ, ±»¶¯µ±ÖпÉÄܻᴥ·¢¶àÖÖÀàÐͼ¼ÄÜ£¬¹Ê²»ÓÃisPassiveSkill×öÆÁ±Î  | 
|         SkillCommon.SetUsingPassiveSkill(attacker, 1)  | 
|         if SkillShell.UsePassiveTriggerSkill(attacker, curSkill, defender, tick, isEnhanceSkill):  | 
|             if skillIDSet:   | 
|                 curSkill.SetRemainTime(0)  # Ò»´Î¹¥»÷¶à´Îµ÷Ó࣬ÔÚÍâ²ãͳһµ÷ÓÃCD  | 
|                 skillIDSet.add(skillTypeID)  | 
|         SkillCommon.SetUsingPassiveSkill(attacker, 0)  | 
|         | 
|     # ´ú±íÓÐЧ´¥·¢£¬µ«²»¹ØÏµ´¥·¢½á¹û, Íâ²ã¸ù¾ÝÐèÇóʹÓã¬Èç¼õÉÙÑ»·ÅжϠ   | 
|     return result  | 
|   | 
|   | 
| #ntSummon£º£¨3£©ÆÕͨÕÙ»½ÊÞ£¬¿É¼Ì³ÐÖ÷ÈË»ù´¡ÊôÐÔÈç¹¥»÷   | 
| #ntElf£º£¨4£©Íæ¼ÒÌæÉí£¬ÍêȫӵÓÐÍæ¼ÒÊôÐԺͱ»¶¯¹¦ÄÜ  | 
| #ntFairy £º£¨7£©Í¬ntSummon£¬µ«¼¼Äܿɴ¥·¢±»¶¯¹¦ÄÜ  | 
|   | 
| # ntElf ¶¨ÒåΪÈËÎïʹÓöԵسÖÐøÐÔ¼¼ÄÜ£¬²¢ÇÒÈËÎï¿ÉÒÔÒÆ¶¯£¬ÔòÐèÒªntElf×öÒÀÍÐÎïµÄÇé¿ö  | 
| # ÄÇôntElfÖ´ÐÐÈËÎïµÄÉ˺¦¼ÆËãºÍ±»¶¯´¥·¢Ð§¹û  | 
| # ±»¶¯¼¼ÄÜÖ»´¦ÀíÍæ¼Ò£¬³èÎºÍÁé  | 
| def FindRealAttacker(attacker):  | 
|     if attacker.GetGameObjType() != IPY_GameWorld.gotNPC:  | 
|         # --Íæ¼Ò  | 
|         return attacker  | 
|       | 
|     npcType = attacker.GetType()  | 
|     if npcType not in [IPY_GameWorld.ntPet, IPY_GameWorld.ntElf, IPY_GameWorld.ntFairy]:  | 
|         if attacker.GetIsBoss():  | 
|             return attacker  | 
|         return  | 
|       | 
|     if npcType == IPY_GameWorld.ntPet:  | 
|         # --³èÎï  | 
|         return attacker  | 
|       | 
|     else:  | 
|         # ntElf ¶¨ÒåΪÈËÎïʹÓöԵسÖÐøÐÔ¼¼ÄÜ£¬²¢ÇÒÈËÎï¿ÉÒÔÒÆ¶¯£¬ÔòÐèÒªntElf×öÒÀÍÐÎïµÄÇé¿ö  | 
|         # ÄÇôntElfÖ´ÐÐÈËÎïµÄÉ˺¦¼ÆËãºÍ±»¶¯´¥·¢Ð§¹û  | 
|         attacker = NPCCommon.GetSummonNPCOwner(IPY_GameWorld.gotPlayer, attacker)  | 
|         return attacker  | 
|       | 
|     return  | 
|           | 
| # ±»¶¯¼¼ÄܸıäÖµ  connSkill ÎªÖ÷¶¯Êͷż¼ÄÜ  | 
| def GetPassiveSkillValueByTriggerType(attacker, defender, connSkill, triggerType):  | 
|     attacker = FindRealAttacker(attacker)  | 
|     if not attacker:  | 
|         return 0  | 
|       | 
|     stopPassiveSkill = False   # ±»¶¯¼¼Äܲ»ÄÜÔÙ´¥·¢±»¶¯¼¼ÄÜ£¬µ«¿ÉÒÔ´¥·¢Ì츳¼¼ÄÜ  | 
|     if connSkill and SkillCommon.isPassiveSkill(connSkill):  | 
|         #GameWorld.DebugLog("±»¶¯¼¼Äܲ»ÄÜÔٴδ¥·¢±»¶¯¼¼ÄÜ")  | 
|         #return 0  | 
|         if not PassPassiveLimit(connSkill):  | 
|             stopPassiveSkill = True  | 
|           | 
|     passiveEff = GetPassiveEffManager().GetPassiveEff(attacker)  | 
|     if not passiveEff:  | 
|         return 0  | 
|     connSkillID = connSkill.GetSkillTypeID() if connSkill else 0  | 
|     skills = passiveEff.GetPassiveSkillsByTriggerType(triggerType, connSkill)  | 
|     if not skills:  | 
|         return 0  | 
|       | 
|     # µ±Ç°Õ½¶·¹ØÏµ pvp pve  | 
|     battleRelationType = AttackCommon.GetBattleRelationType(attacker, defender)  | 
|     tick = GameWorld.GetGameWorld().GetTick()  | 
|     curValue = 0  | 
|   | 
|     for skillTypeID, effectID in skills:  | 
|         if connSkillID == skillTypeID:  | 
|             continue  | 
|         curSkill = attacker.GetSkillManager().FindSkillBySkillTypeID(skillTypeID)  | 
|         if not curSkill:  | 
|             continue  | 
|           | 
|         if not IsValidPassiveSkill(curSkill):  | 
|             continue  | 
|           | 
|         if stopPassiveSkill and curSkill.GetFuncType() != ChConfig.Def_SkillFuncType_GiftSkill:  | 
|             # Ö»ÓÐÌ츳²Å¿ÉÒÔÔٴα»´¥·¢  | 
|             continue   | 
|           | 
|         if skillTypeID not in Def_PassiveSkillValueNoCD:  | 
|             # ÌØÊâ¼¼Äܲ»×ßCD´¦Àí  | 
|             if curSkill.GetCoolDownTime() and SkillCommon.RefreshSkillRemainTime(curSkill, tick):  | 
|                 #ÓÐÅäÖÃCDµÄ²ÅÅÐ¶Ï  | 
|                 continue  | 
|           | 
|         effect = SkillCommon.GetSkillEffectByEffectID(curSkill, effectID)  | 
|         if not effect:  | 
|             continue  | 
|         if not AttackCommon.CheckBattleRelationType(attacker, defender, curSkill, battleRelationType):  | 
|             continue  | 
|           | 
|         pyName = "PassiveSkill_%s" % effectID  | 
|   | 
|         callFunc = GameWorld.GetExecFunc(PassiveBuff, "%s.%s" % (pyName, "CheckCanHappen"))  | 
|           | 
|         # Ìõ¼þ²»Âú×ã  | 
|         if callFunc and not callFunc(attacker, defender, effect, curSkill):  | 
|             continue  | 
|           | 
|         callFunc = GameWorld.GetExecFunc(PassiveBuff, "%s.%s" % (pyName, "GetValue"))  | 
|         if callFunc is None:  | 
|             continue  | 
|           | 
|         if triggerType == ChConfig.TriggerType_IsDealy:  | 
|             curValue = callFunc(attacker, defender, effect)  | 
|         else:  | 
|             curValue += callFunc(attacker, defender, effect)  | 
|         if skillTypeID not in Def_PassiveSkillValueNoCD:  | 
|             if curSkill.GetCoolDownTime():  | 
|                 SkillCommon.SetSkillRemainTime(curSkill, 0, tick, attacker)  | 
|           | 
|     return curValue  | 
|   | 
|   | 
| # È¡³öÊÜÓ°ÏìµÄ±»¶¯¼¼ÄÜ£¬Íⲿ´¦Àí  | 
| def GetPassiveSkillByTriggerType(attacker, defender, connSkill, triggerType):  | 
|     attacker = FindRealAttacker(attacker)  | 
|     if not attacker:  | 
|         return []  | 
|     if connSkill and SkillCommon.isPassiveSkill(connSkill):  | 
|         #GameWorld.DebugLog("±»¶¯¼¼Äܲ»ÄÜÔٴδ¥·¢±»¶¯¼¼ÄÜ")  | 
|         return []  | 
|     passiveEff = GetPassiveEffManager().GetPassiveEff(attacker)  | 
|     if not passiveEff:  | 
|         return []  | 
|     connSkillID = connSkill.GetSkillTypeID() if connSkill else 0  | 
|     skills = passiveEff.GetPassiveSkillsByTriggerType(triggerType, connSkill)  | 
|     if not skills:  | 
|         return []  | 
|       | 
|     # µ±Ç°Õ½¶·¹ØÏµ pvp pve  | 
|     battleRelationType = AttackCommon.GetBattleRelationType(attacker, defender)  | 
|     #tick = GameWorld.GetGameWorld().GetTick()  | 
|     skillList = []  | 
|     for skillTypeID, effectID in skills:  | 
|         if connSkillID == skillTypeID:  | 
|             continue  | 
|         curSkill = attacker.GetSkillManager().FindSkillBySkillTypeID(skillTypeID)  | 
|         #if SkillCommon.RefreshSkillRemainTime(curSkill, tick):  | 
|         #    continue  | 
|         if not curSkill:  | 
|             continue  | 
|           | 
|         if not IsValidPassiveSkill(curSkill):  | 
|             continue  | 
|   | 
|         effect = SkillCommon.GetSkillEffectByEffectID(curSkill, effectID)  | 
|         if not effect:  | 
|             continue  | 
|         if not AttackCommon.CheckBattleRelationType(attacker, defender, curSkill, battleRelationType):  | 
|             continue  | 
|           | 
|         pyName = "PassiveSkill_%s" % effectID  | 
|           | 
|         callFunc = GameWorld.GetExecFunc(PassiveBuff, "%s.%s" % (pyName, "CheckCanHappen"))  | 
|           | 
|         # Ìõ¼þ²»Âú×ã  | 
|         if callFunc and not callFunc(attacker, defender, effect, curSkill):  | 
|             continue  | 
|           | 
|         skillList.append(curSkill)  | 
|           | 
|     return skillList  | 
|   | 
|   | 
| # ±»¶¯¼¼ÄÜ´¥·¢µ«ÎÞÐèÊÍ·Å£¬ÈçµÖÏûdebuff£¬Ö»Ðè×ßCD¼´¿É  | 
| def OnPassiveSkillHappen(attacker, defender, connSkill, triggerType, tick):  | 
|     attacker = FindRealAttacker(attacker)  | 
|     if not attacker:  | 
|         return  | 
|     passiveEff = GetPassiveEffManager().GetPassiveEff(attacker)  | 
|     if not passiveEff:  | 
|         return  | 
|     connSkillID = connSkill.GetSkillTypeID() if connSkill else 0  | 
|     skills = passiveEff.GetPassiveSkillsByTriggerType(triggerType, connSkill)  | 
|     if not skills:  | 
|         return  | 
|       | 
|     defender = GetPassiveDefender(attacker, defender)  | 
|           | 
|     # µ±Ç°Õ½¶·¹ØÏµ pvp pve  | 
|     battleRelationType = AttackCommon.GetBattleRelationType(attacker, defender)  | 
|       | 
|     for skillTypeID, effectID in skills:  | 
|         if connSkillID == skillTypeID:  | 
|             continue  | 
|         curSkill = attacker.GetSkillManager().FindSkillBySkillTypeID(skillTypeID)  | 
|         if not curSkill:  | 
|             continue  | 
|           | 
|         if not IsValidPassiveSkill(curSkill):  | 
|             continue  | 
|           | 
|         effect = SkillCommon.GetSkillEffectByEffectID(curSkill, effectID)  | 
|         if not effect:  | 
|             continue  | 
|         if SkillCommon.RefreshSkillRemainTime(curSkill, tick):  | 
|             continue  | 
|         if not AttackCommon.CheckBattleRelationType(attacker, defender, curSkill, battleRelationType):  | 
|             # PKģʽµÄÅж¨  | 
|             continue  | 
|               | 
|         pyName = "PassiveSkill_%s" % effectID  | 
|         callFunc = GameWorld.GetExecFunc(PassiveBuff, "%s.%s" % (pyName, "CheckCanHappen"))  | 
|           | 
|         if callFunc and not callFunc(attacker, defender, effect, curSkill, connSkill):  | 
|             continue  | 
|           | 
|         SkillCommon.SetSkillRemainTime(curSkill, 0, tick, attacker)  | 
|         SkillShell.DoLogic_UseEnhanceSkill(attacker, defender, curSkill, tick)  | 
|           | 
|         return True  | 
|           | 
|     return False  | 
|   | 
|   | 
| # ±»¶¯¼¼ÄÜ´¥·¢µ«ÎÞÐèÊÍ·Å£¬ÈçµÖÏûdebuff£¬Ö»Ðè×ßCD¼´¿É  | 
| def OnPassiveBuffHappen(attacker, defender, tagSkill, triggerType, tick):  | 
|     attacker = FindRealAttacker(attacker)  | 
|     if not attacker:  | 
|         return False  | 
|   | 
|     passiveEff = GetPassiveEffManager().GetPassiveEff(attacker)  | 
|     if not passiveEff:  | 
|         return False  | 
|     buffDict = passiveEff.GetBuffsByTriggerType(triggerType)  | 
|     if not buffDict:  | 
|         return False  | 
|       | 
|     # µ±Ç°Õ½¶·¹ØÏµ pvp pve  | 
|     battleRelationType = AttackCommon.GetBattleRelationType(attacker, defender)  | 
|     if not AttackCommon.CheckBattleRelationType(attacker, defender, tagSkill, battleRelationType):  | 
|         return  | 
|   | 
|       | 
|     for skillID, effectList in buffDict.items():  | 
|           | 
|         curSkill = GameWorld.GetGameData().GetSkillBySkillID(skillID)  | 
|         if not curSkill:  | 
|             continue  | 
|           | 
|         if not IsValidPassiveSkill(curSkill):  | 
|             continue  | 
|         for effectInfo in effectList:  | 
|             passiveEffect = effectInfo[0]  | 
|             # ±»¶¯´¥·¢µÄ¼¼ÄÜ  | 
|             pyName = "PassiveBuff_%s"%passiveEffect.GetEffectID()  | 
|               | 
|             callFunc = GameWorld.GetExecFunc(PassiveBuff, "%s.%s" % (pyName, "CheckCanHappen"))  | 
|             if not callFunc:  | 
|                 continue  | 
|               | 
|             if not callFunc(attacker, defender, passiveEffect, tagSkill, ownerID=effectInfo[1], ownerType=effectInfo[2]):  | 
|                 continue  | 
|               | 
|             callFunc = GameWorld.GetExecFunc(PassiveBuff, "%s.%s" % (pyName, "DoLogic"))  | 
|             if callFunc:  | 
|                 callFunc(attacker, defender, passiveEffect, tagSkill, skillID)  | 
|   | 
|             return True  | 
|           | 
|     return False  | 
| #------------------------BuffÀà ±»¶¯´¥·¢, ²¢·ÇÈ«ÊDZ»¶¯¼¼ÄÜ-----------------------------------------------  | 
|   | 
| #buffÀà´¥·¢Êͷż¼ÄÜ£¬ÎÞCDÑéÖ¤  | 
| def OnPassiveBuffTrigger(attacker, defender, useSkill, triggerType, tick):  | 
|     attacker = FindRealAttacker(attacker)  | 
|     if not attacker:  | 
|         return  | 
|   | 
|     stopPassiveSkill = False   # ±»¶¯¼¼Äܲ»ÄÜÔÙ´¥·¢±»¶¯¼¼ÄÜ£¬µ«¿ÉÒÔ´¥·¢Ì츳¼¼ÄÜ  | 
|     if useSkill:  | 
|         if not useSkill.GetFuncType():  | 
|             # ·Ç¹¦ÄÜÀ༼ÄÜ£¬±ÜÃâËÀÑ»·  | 
|             return  | 
|         if SkillCommon.isPassiveSkill(useSkill) and not PassPassiveLimit(useSkill):  | 
|             #GameWorld.DebugLog("±»¶¯¼¼Äܲ»ÄÜÔٴδ¥·¢±»¶¯¼¼ÄÜ")  | 
|             #return  | 
|             stopPassiveSkill = True  | 
|           | 
|     if SkillCommon.GetUsingPassiveSkill(attacker):  | 
|         # ·À·¶±»¶¯¼¼ÄÜ´¥·¢µÄ ·Ç±»¶¯¼¼ÄÜ  | 
|         #GameWorld.DebugLog("±»¶¯¼¼Äܲ»ÄÜÔٴδ¥·¢±»¶¯¼¼ÄÜ---%s"%triggerType)  | 
|         #return  | 
|         stopPassiveSkill = True  | 
|           | 
|     passiveEff = GetPassiveEffManager().GetPassiveEff(attacker)  | 
|     if not passiveEff:  | 
|         return  | 
|       | 
|     buffDict = passiveEff.GetBuffsByTriggerType(triggerType)  | 
|     if not buffDict:  | 
|         return  | 
|   | 
|     defender = GetPassiveDefender(attacker, defender)  | 
|           | 
|     # µ±Ç°Õ½¶·¹ØÏµ pvp pve  | 
|     battleRelationType = AttackCommon.GetBattleRelationType(attacker, defender)  | 
|     useSkillID = useSkill.GetSkillID() if useSkill else 0  | 
|   | 
|     for skillID, effectList in buffDict.items():  | 
|         if skillID == useSkillID:  | 
|             continue  | 
|         curSkill = GameWorld.GetGameData().GetSkillBySkillID(skillID)  | 
|         if not curSkill:  | 
|             continue  | 
|           | 
|         if stopPassiveSkill and curSkill.GetFuncType() != ChConfig.Def_SkillFuncType_GiftSkill:  | 
|             # Ö»ÓÐÌ츳²Å¿ÉÒÔÔٴα»´¥·¢  | 
|             continue   | 
|           | 
|         if not IsValidPassiveSkill(curSkill):  | 
|             continue  | 
|         for effectInfo in effectList:  | 
|             passiveEffect = effectInfo[0]  | 
|             # ±»¶¯´¥·¢µÄ¼¼ÄÜ  | 
|             pyName = "PassiveBuff_%s"%passiveEffect.GetEffectID()  | 
|             callFunc = GameWorld.GetExecFunc(PassiveBuff, "%s.%s" % (pyName, "CheckCanHappen"))  | 
|             if not callFunc:  | 
|                 continue  | 
|               | 
|             if not callFunc(attacker, defender, passiveEffect, skillID, useSkill=useSkill, ownerID=effectInfo[1], ownerType=effectInfo[2]):  | 
|                 continue  | 
|               | 
|             callFunc = GameWorld.GetExecFunc(PassiveBuff, "%s.%s" % (pyName, "GetSkillData"))  | 
|             if not callFunc:  | 
|                 continue  | 
|               | 
|             skillData = callFunc(passiveEffect)  | 
|             if not skillData:  | 
|                 continue  | 
|               | 
|             if not AttackCommon.CheckBattleRelationType(attacker, defender, skillData, battleRelationType):  | 
|                 # PKģʽµÄÅж¨  | 
|                 continue  | 
|               | 
|             SkillCommon.SetUsingPassiveSkill(attacker, 1)  | 
|             if SkillShell.UsePassiveTriggerSkill(attacker, skillData, defender, tick):  | 
|                 AfterUsePassiveSkill(pyName, attacker, defender, passiveEffect, tick)  | 
|             SkillCommon.SetUsingPassiveSkill(attacker, 0)  | 
|   | 
| def AfterUsePassiveSkill(pyName, attacker, defender, passiveEffect, tick):  | 
|     # ¸½¼Ó´¥·¢ºóÂß¼  | 
|     callFunc = GameWorld.GetExecFunc(PassiveBuff, "%s.%s" % (pyName, "AfterUsePassiveSkill"))  | 
|     if not callFunc:  | 
|         return  | 
|     callFunc(attacker, defender, passiveEffect, tick)  | 
|     return  | 
|   | 
| # buff Ó°ÏìµÄ(¹¥»÷)ÐÐΪֵ  | 
| # ·µ»ØÊýÖµ  | 
| def GetValueByPassiveBuffTriggerType(attacker, defender, useSkill, triggerType, isStopPassiveSkill=True):  | 
|     attacker = FindRealAttacker(attacker)  | 
|     if not attacker:  | 
|         return 0  | 
|       | 
|     stopPassiveSkill = False   # ±»¶¯¼¼Äܲ»ÄÜÔÙ´¥·¢±»¶¯¼¼ÄÜ£¬µ«¿ÉÒÔ´¥·¢Ì츳¼¼ÄÜ  | 
|     if useSkill and SkillCommon.isPassiveSkill(useSkill) and isStopPassiveSkill:  | 
|         #GameWorld.DebugLog("±»¶¯¼¼Äܲ»ÄÜÔٴδ¥·¢±»¶¯¼¼ÄÜ")  | 
|         #return 0  | 
|         if not PassPassiveLimit(useSkill):  | 
|             stopPassiveSkill = True  | 
|   | 
|   | 
|     passiveEff = GetPassiveEffManager().GetPassiveEff(attacker)  | 
|     if not passiveEff:  | 
|         return 0  | 
|     buffDict = passiveEff.GetBuffsByTriggerType(triggerType)  | 
|     if not buffDict:  | 
|         return 0  | 
|       | 
|     # µ±Ç°Õ½¶·¹ØÏµ pvp pve  | 
|     battleRelationType = AttackCommon.GetBattleRelationType(attacker, defender)  | 
|     if not AttackCommon.CheckBattleRelationType(attacker, defender, useSkill, battleRelationType):  | 
|         return 0  | 
|       | 
|     useSkillID = useSkill.GetSkillID() if useSkill else 0  | 
|     #tick = GameWorld.GetGameWorld().GetTick()  | 
|     curValue = 0  | 
|       | 
|     for skillID, effectList in buffDict.items():  | 
|         if skillID == useSkillID:  | 
|             continue  | 
|         curSkill = GameWorld.GetGameData().GetSkillBySkillID(skillID)  | 
|         if not curSkill:  | 
|             continue  | 
|           | 
|         if not IsValidPassiveSkill(curSkill):  | 
|             continue  | 
|           | 
|         for effectInfo in effectList:  | 
|             if stopPassiveSkill and curSkill.GetFuncType() != ChConfig.Def_SkillFuncType_GiftSkill:  | 
|                 # Ö»ÓÐÌ츳²Å¿ÉÒÔÔٴα»´¥·¢  | 
|                 continue   | 
|             passiveEffect = effectInfo[0]  | 
|             # ±»¶¯´¥·¢µÄ¼¼ÄÜ  | 
|             pyName = "PassiveBuff_%s"%passiveEffect.GetEffectID()  | 
|               | 
|             callFunc = GameWorld.GetExecFunc(PassiveBuff, "%s.%s" % (pyName, "CheckCanHappen"))  | 
|             if not callFunc:  | 
|                 continue  | 
|               | 
|             # Ìõ¼þ²»Âú×ã  | 
|             if not callFunc(attacker, defender, passiveEffect, skillID, useSkill=useSkill, ownerID=effectInfo[1], ownerType=effectInfo[2]):  | 
|                 continue  | 
|               | 
|             callFunc = GameWorld.GetExecFunc(PassiveBuff, "%s.%s" % (pyName, "GetValue"))  | 
|             if callFunc is None:  | 
|                 continue  | 
|               | 
|             # Èç±»¶¯¼¼ÄÜ£ºÇ§»ÃÚ¤Ñ×ÕæÊµÉ˺¦´Ó2±ä4±¶  | 
|             #curValue += GetPassiveSkillValueByTriggerType(attacker, defender, curSkill, ChConfig.TriggerType_PassiveBuffValue)  | 
|             curValue += callFunc(attacker, defender, passiveEffect)  | 
|               | 
|     return curValue  | 
|   | 
|   | 
| # ÒòΪҪ¼æÈݵ͵ȼ¶¼¼ÄÜ£¬ËùÒÔ¼¼ÄÜÖ»ÄÜÊÇÔÚÖúÕ½µÄʱºò£¬ÏÈɾ³ýÉñÊÞ¼¼ÄÜÔÙѧϰеÄÖúÕ½ÉñÊÞ¼¼ÄÜ  | 
| def PlayerDogzSkill(curPlayer):  | 
|   | 
|     dogzSkills = [] # ÐèҪѧϰµÄ¼¼ÄÜ  | 
|     ipyDataMgr = IpyGameDataPY.IPY_Data()  | 
|     for i in xrange(ipyDataMgr.GetDogzCount()):  | 
|         ipyData = ipyDataMgr.GetDogzByIndex(i)  | 
|         if not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_DogzFightState, i):  | 
|             continue  | 
|           | 
|         dogzSkills.extend(ipyData.GetHelpBattleSkills())  | 
|       | 
|     delDogzSkills = [] # É¾³ý²»ÔÚÖúÕ½ÉñÊÞ¶ÓÁеļ¼ÄÜ  | 
|     skillManager = curPlayer.GetSkillManager()  | 
|     for i in xrange(skillManager.GetSkillCount()):  | 
|         curSkill = skillManager.GetSkillByIndex(i)  | 
|         if curSkill.GetFuncType() != ChConfig.Def_SkillFuncType_Dogz:  | 
|             continue  | 
|         skillID = curSkill.GetSkillID()  | 
|           | 
|         delDogzSkills.append(skillID)  | 
|           | 
|     GameWorld.DebugLog("PlayerDogzSkill:%s - É¾³ý%s"%(dogzSkills, delDogzSkills))  | 
|       | 
|     # É¾³ýÉñÊÞ¼¼ÄÜ  | 
|     for skillID in delDogzSkills:  | 
|         skillManager.DeleteSkillBySkillID(skillID, False)  | 
|       | 
|     # Ìí¼ÓÖúÕ½¼¼ÄÜ£¬Í¬À༼ÄÜÈ¡×î¸ß  | 
|     dogzSkills.sort()  | 
|     for skillID in dogzSkills:  | 
|         skillData = GameWorld.GetGameData().GetSkillBySkillID(skillID)  | 
|         if not skillData:  | 
|             continue  | 
|         if skillData.GetSkillType() == ChConfig.Def_SkillType_AttrSkillNoLearn:  | 
|             # Í¬¼¼Äܿɶà¸öµþ¼ÓµÄ¼¼Äܲ»ÄÜѧ£¬ËãÊôÐÔʱֱ½ÓÈ¡±í  | 
|             continue  | 
|           | 
|         skillManager.LearnSkillByID(skillID, False)  | 
|       | 
|     # Ë¢±»¶¯Ð§¹û  | 
|     GetPassiveEffManager().RegistPassiveEffDogz(curPlayer)  | 
|     return  | 
|   | 
|   | 
| # »ñÈ¡ÖúÕ½ÉñÊ޵ļ¼ÄÜÁÐ±í  | 
| def FindDogzBattleSkills(gameObj):  | 
|     skills = []  | 
|     if gameObj.GetGameObjType() != IPY_GameWorld.gotPlayer:  | 
|         return skills  | 
|       | 
|     skillManager = gameObj.GetSkillManager()  | 
|     for i in xrange(skillManager.GetSkillCount()):  | 
|         curSkill = skillManager.GetSkillByIndex(i)  | 
|         if not curSkill:  | 
|             continue  | 
|           | 
|         if curSkill.GetFuncType() != ChConfig.Def_SkillFuncType_Dogz:  | 
|             continue  | 
|         skills.append(curSkill)  | 
|           | 
|     return skills  | 
|   | 
|   | 
| # ±éÀúÉíÉÏ×°±¸¼¼ÄÜÒÔ¼°¸÷×Ô¸öÊý£¬×°±¸¼¼Äܲ»ÐèҪѧϰ  | 
| # ±£Ö¤²»Í¬µÄ×°±¸¼¼Äܲ»»áÓÐÏàͬµÄЧ¹û£¬ Ð§¹ûÊýÖµµÄË¥¼õÊǸù¾ÝÏàͬ¼¼ÄܸöÊý¼ÆËã¶ø²»ÊÇЧ¹û¸öÊý 1-pow((1-³õʼֵ),Ïàͬ¼¼ÄܸöÊý)  | 
| def FindSuperEquipSkills(gameObj):  | 
|     skillsDict = {}  | 
|     if gameObj.GetGameObjType() != IPY_GameWorld.gotPlayer:  | 
|         return skillsDict  | 
|       | 
|     equipPack = gameObj.GetItemManager().GetPack(IPY_GameWorld.rptEquip)  | 
|     for i in xrange(equipPack.GetCount()):  | 
|         curEquip = equipPack.GetAt(i)  | 
|           | 
|         if not curEquip or curEquip.IsEmpty():  | 
|             continue  | 
|           | 
|         if curEquip.GetAddSkillCount() <= 0:  | 
|             continue  | 
|           | 
|         if curEquip.GetAddSkill(0) == 0:  | 
|             #ÎÞ¼¼ÄÜ  | 
|             continue  | 
|           | 
|         itemSkillIDList = ItemCommon.GetItemSkillIDList(curEquip)  | 
|         for skillID in itemSkillIDList:  | 
|             skillsDict[skillID] = skillsDict.get(skillID, 0) + 1  | 
|               | 
|     skillManager = gameObj.GetSkillManager()  | 
|     for skillID in PyGameData.EquipItemSkillIDList:  | 
|         hasSkill = skillManager.FindSkillBySkillTypeID(skillID)  | 
|         if skillID in skillsDict:  | 
|             if not hasSkill:  | 
|                 skillManager.LVUpSkillBySkillTypeID(skillID)  | 
|                 #GameWorld.DebugLog("ѧϰװ±¸¼¼ÄÜ: %s" % skillID, gameObj.GetPlayerID())  | 
|         else:  | 
|             if hasSkill:  | 
|                 skillManager.DeleteSkillBySkillTypeID(skillID)  | 
|                 #GameWorld.DebugLog("ɾ³ý×°±¸¼¼ÄÜ: %s" % skillID, gameObj.GetPlayerID())  | 
|                   | 
|     return skillsDict  | 
|   | 
| # Ä¬ÈÏÇé¿öÏ ±»¶¯²»Ó¦¸ÃÔÙ´¥·¢£¨»ò¼ÓÇ¿£©±»¶¯¼¼ÄÜ£¬»áÔì³É¶îÍâ´¥·¢»òÕßËÀÑ»·  | 
| # µ«Ò²ÓÐÒ»Ð©ÌØÊâÇé¿ö ·ÅÔÚ´Ë´¦¹ýÂË  | 
| def PassPassiveLimit(useSkill):  | 
|     # ÈçׯÉÕÊDZ»¶¯¼¼ÄÜ µ«¿ÉÒÔ±»²»¶ÏµÄÇ¿»¯  | 
|     if useSkill.GetSkillType() == ChConfig.Def_SkillType_PassiveLstDepBuff:  | 
|         return True  | 
|       | 
|     if useSkill.GetFuncType() == ChConfig.Def_SkillFuncType_PassiveSkillWithSP:  | 
|         # ÓÐר¾«µÄ±»¶¯¼¼ÄÜ£¬¿ÉÒÔÔٴδ¥·¢±»¶¯Ð§¹û  | 
|         return True  | 
|     return False  | 
|   | 
|   | 
| # ±»¶¯¼¼ÄܸıäÖµ  ÎÞÌõ¼þÏÞÖÆ ´¿È¡Öµ  | 
| def GetPassiveSkillValueByTriggerTypeEx(attacker, defender, connSkill, triggerType):  | 
|     attacker = FindRealAttacker(attacker)  | 
|     if not attacker:  | 
|         return 0  | 
|       | 
|     passiveEff = GetPassiveEffManager().GetPassiveEff(attacker)  | 
|     if not passiveEff:  | 
|         return 0  | 
|     connSkillID = connSkill.GetSkillTypeID() if connSkill else 0  | 
|     skills = passiveEff.GetPassiveSkillsByTriggerType(triggerType, connSkill)  | 
|     if not skills:  | 
|         return 0  | 
|       | 
|     curValue = 0  | 
|   | 
|     for skillTypeID, effectID in skills:  | 
|         if connSkillID == skillTypeID:  | 
|             continue  | 
|         curSkill = attacker.GetSkillManager().FindSkillBySkillTypeID(skillTypeID)  | 
|         if not curSkill:  | 
|             continue  | 
|   | 
|         effect = SkillCommon.GetSkillEffectByEffectID(curSkill, effectID)  | 
|         if not effect:  | 
|             continue  | 
|         pyName = "PassiveSkill_%s" % effectID  | 
|   | 
|         callFunc = GameWorld.GetExecFunc(PassiveBuff, "%s.%s" % (pyName, "CheckCanHappen"))  | 
|           | 
|         # Ìõ¼þ²»Âú×ã  | 
|         if callFunc and not callFunc(attacker, defender, effect, curSkill):  | 
|             continue  | 
|           | 
|         callFunc = GameWorld.GetExecFunc(PassiveBuff, "%s.%s" % (pyName, "GetValue"))  | 
|         if callFunc is None:  | 
|             continue  | 
|           | 
|         curValue += callFunc(attacker, defender, effect, skillTypeID)  | 
|           | 
|     return curValue  |