ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py
@@ -31,13 +31,10 @@
import PlayerControl
import NetPackCommon
import ChPyNetSendPack
import PlayerVip
import AttackCommon
import PyGameData
import PlayerHorse
import BaseAttack
import NPCCommon
import PetControl
import ItemCommon
import FBCommon
@@ -149,87 +146,16 @@
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)
@@ -340,10 +266,6 @@
             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  减印记
@@ -500,38 +422,6 @@
    # 获得被动触发的 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):
@@ -827,23 +717,7 @@
        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)
@@ -862,11 +736,6 @@
        # 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管理器为空,则跳出
@@ -1562,71 +1431,6 @@
            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-初始值),相同技能个数)