ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
@@ -22,6 +22,7 @@
import TurnBuffs
import BattleObj
import ObjPool
import TurnPassive
GameWorld.ImportAll("Script\\Skill\\", "TurnBuffs")
@@ -65,17 +66,29 @@
                           % (curID, skillID, ownerID, relatedSkillID))
        return False
    
    #被动触发免疫控制buff
    if buffSkill.GetSkillType() == ChConfig.Def_SkillType_Action:
        if TurnPassive.GetTriggerEffectValue(turnFight, batObj, buffOwner, ChConfig.PassiveEff_ImmuneControlBuff, buffSkill):
            GameWorld.DebugLog("血量低于百分x时免疫控制buff: curID=%s,skillID=%s,ownerID=%s,relatedSkillID=%s,hp:%s/%s"
                               % (curID, skillID, ownerID, relatedSkillID, batObj.GetHP(), batObj.GetMaxHP()))
            return False
    buffValueList = GetAddBuffValue(turnFight, buffOwner, batObj, buffSkill)
    GameWorld.DebugLog("OnAddBuff: curID=%s,skillID=%s,atkType=%s,buffValueList=%s,ownerID=%s,relatedSkillID=%s"
                       % (curID, skillID, buffSkill.GetAtkType(), buffValueList, ownerID, relatedSkillID))
    
    skillTypeID = buffSkill.GetSkillTypeID()
    buffRepeat = buffSkill.GetBuffRepeat()
    addLayerCnt = buffSkill.GetLayerCnt()
    addLayerEff = buffSkill.GetEffectByID(ChConfig.PassiveEff_AddBuffLayerByWeight)
    if addLayerEff:
        addLayerCnt = GameWorld.GetResultByWeightList(addLayerEff.GetEffectValues(), addLayerCnt)
        # 可指定来源技能技能才生效,不指定的话默认生效
        if not addLayerEff.GetTriggerSrc() or addLayerEff.GetTriggerSrc() == relatedSkillID:
            addLayerCnt = GameWorld.GetResultByWeightList(addLayerEff.GetEffectValues(), addLayerCnt)
    maxLayerCnt = buffSkill.GetLayerMax()
    if maxLayerCnt:
        maxLayerCnt += TurnPassive.GetTriggerEffectValue(turnFight, buffOwner, batObj, ChConfig.PassiveEff_AddBuffLayerMax, buffSkill)
        
    GameWorld.DebugLog("OnAddBuff: curID=%s,skillID=%s,atkType=%s,buffValueList=%s,addLayerCnt=%s/%s,ownerID=%s,relatedSkillID=%s"
                       % (curID, skillID, buffSkill.GetAtkType(), buffValueList, addLayerCnt, maxLayerCnt, ownerID, relatedSkillID))
    #buff重复获得时的叠加规则
    #以下规则默认针对的是相同施法者,即相同来源的处理
    #如果有针对不同施法者的规则会说明
@@ -89,7 +102,6 @@
    buffMgr = batObj.GetBuffManager()
    
    if buffRepeat == 4: # 4 独立:回合、效果独立计算
        maxLayerCnt = buffSkill.GetLayerMax()
        # 如果有限制最大层数,达到上限时如果有新的层数进来,就替换掉持续时间最短的,只算相同来源
        if maxLayerCnt:
            buffList = buffMgr.FindBuffListBySkillTypeID(skillTypeID)
@@ -128,11 +140,10 @@
            
            updLayerCnt = addLayerCnt
            if buffRepeat == 3: # 叠加层级
                maxLayerCnt = buffSkill.GetLayerMax()
                updLayerCnt = nowLayerCnt + addLayerCnt
                if maxLayerCnt and updLayerCnt > maxLayerCnt:
                    updLayerCnt = maxLayerCnt
                GameWorld.DebugLog("        叠加层级: nowLayerCnt=%s,addLayerCnt=%s,updLayerCnt=%s" % (nowLayerCnt, addLayerCnt, updLayerCnt))
                GameWorld.DebugLog("        叠加层级: nowLayerCnt=%s,addLayerCnt=%s,updLayerCnt=%s,maxLayerCnt=%s" % (nowLayerCnt, addLayerCnt, updLayerCnt, maxLayerCnt))
            else:
                GameWorld.DebugLog("        默认覆盖")
                
@@ -241,6 +252,19 @@
    buffMgr = batObj.GetBuffManager()
    buffID = curBuff.GetBuffID()
    skillData = curBuff.GetSkillData()
    # 先删除buff再触发其他内容,防止当前要删除的buff影响后续触发的内容,如无敌buff等,理论上触发的后续内容无敌buff不应该再生效
    curBuffState = skillData.GetCurBuffState()
    if curBuffState:
        buffMgr.DelBuffState(curBuffState, buffID)
    buffMgr.DelBuff(buffID, release)
    if isSync:
        SyncBuffDel(turnFight, buffObjID, buffID, relatedSkillID)
    if afterLogic and relatedSkill:
        tagObjID = tagObj.GetID() if tagObj else buffObjID
        relatedSkill.AddAfterLogic(ChConfig.AfterLogic_DelBuff, [buffObjID, curBuff, tagObjID])
    #buff消失的触发
    for effectIndex in range(0, skillData.GetEffectCount()):
        curEffect = skillData.GetEffect(effectIndex)
@@ -249,32 +273,19 @@
        if not effectID:
            continue
        
        if curEffect.GetTriggerWay():
        triggerWay = curEffect.GetTriggerWay()
        if triggerWay:
            if triggerWay == ChConfig.TriggerWay_BuffDel:
                TurnPassive.OnTriggerPassiveEffect(turnFight, batObj, ChConfig.TriggerWay_BuffDel, connBuff=curBuff)
            if curEffect.GetTriggerSrc() not in [ChConfig.TriggerSrc_Skill, ChConfig.TriggerSrc_SkillSelf]:
                haveBuffPassiveEff = True
                
        elif effectID in ChConfig.AttrIDList:
            isRefreshAttr = True
            
        else:
            callFunc = GameWorld.GetExecFunc(TurnBuffs, "Buff_%d.%s" % (effectID, "OnBuffDel"))
            if callFunc:
                callFunc(turnFight, batObj, curBuff, curEffect)
    if haveBuffPassiveEff:
        batObj.GetPassiveEffManager().DelBuffPassiveEffect(buffID)
    curBuffState = skillData.GetCurBuffState()
    if curBuffState:
        buffMgr.DelBuffState(curBuffState, buffID)
    # 最后删除buff、通知
    buffMgr.DelBuff(buffID, release)
    if isSync:
        SyncBuffDel(turnFight, buffObjID, buffID, relatedSkillID)
    if afterLogic and relatedSkill:
        tagObjID = tagObj.GetID() if tagObj else buffObjID
        relatedSkill.AddAfterLogic(ChConfig.AfterLogic_DelBuff, [buffObjID, curBuff, tagObjID])
        
    if isRefreshAttr:
        RefreshBuffAttr(batObj)