ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py
@@ -2423,53 +2423,79 @@
    if not buffStateCount:
        return
    
    turnNum = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightNum) # 回合编号,大于0同时也代表回合制中
    #buff持续效果
    for i in range(0, buffStateCount):
    #buff持续效果,回合下可能删除buff,倒序遍历
    for i in range(0, buffStateCount)[::-1]:
        curBuff = buffState.GetBuff(i)
        ProcessSinglePersistBuff(curObj, buffState, curBuff, tick)
        
        if not curBuff:
            #在以下处理过程中, 对方有可能死亡, 如果死亡, 会清空buff, 导致这里取得None
            #所以一定要continue
            continue
        curBuffSkill = curBuff.GetSkill()
        if not __BuffCanProcess(curObj, curBuffSkill):
            continue
        processBuffTick = GetProcessBuffTick(curBuffSkill, curObj)
        #---验证触发间隔TICK---
        if turnNum > 0:
            GameWorld.DebugLog("    buffProcess: objID=%s,skillID=%s,turnNum=%s" % (curObj.GetID(), curBuffSkill.GetSkillID(), turnNum))
        else:
            if tick - curBuff.GetProcessInterval() <= processBuffTick:
                continue
        curBuff.SetProcessInterval(tick)
        #得到当前buff
        for effIndex in range(0, curBuffSkill.GetEffectCount()):
            #得到当前效果
            curEffect = curBuffSkill.GetEffect(effIndex)
            curEffectID = curEffect.GetEffectID()
            if not curEffectID:
                continue
            processStr = "BuffProcess_%d.%s"%(curEffectID, "ProcessBuff")
            callBuffProcessFunc = GameWorld.GetExecFunc(GameBuffs, processStr)
            if not callBuffProcessFunc:
                continue
            callBuffProcessFunc(curObj, curBuff, curEffect, processBuffTick, tick)
    #执行ProcessBuff中设定的玩家字典
    __DoProcessBuff_PlayerKey(curObj, tick)
    return
def ProcessSinglePersistBuff(curObj, buffState, curBuff, tick, turnForce=False):
    '''处理单个持续性buff,可能会删除buff,调用时如果是循环遍历,需注意遍历顺序,防止buff删除后索引错乱
    @param turnForce: 回合下强制立刻执行
    '''
    if not curBuff:
        return
    curBuffSkill = curBuff.GetSkill()
    if not __BuffCanProcess(curObj, curBuffSkill):
        return
    processBuffTick = GetProcessBuffTick(curBuffSkill, curObj)
    isDel = False
    remainTime = None
    timeLine = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightTimeline)
    #---验证触发间隔TICK---
    if timeLine > 0:
        turnNum, actionNum = timeLine / 100, timeLine % 100
        if not turnForce and actionNum != 0:
            # 持续型buff暂仅支持回合开始时处理
            return
        remainTime = curBuff.GetRemainTime() - ChConfig.Def_PerTurnTick # 每处理一次固定算一回合
        if remainTime <= 0:
            isDel = True
        GameWorld.DebugLog("    回合buffProcess: objID=%s,skillID=%s,remainTime=%s,turnNum=%s" % (curObj.GetID(), curBuffSkill.GetSkillID(), remainTime, turnNum))
    else:
        if tick - curBuff.GetProcessInterval() <= processBuffTick:
            return
    curBuff.SetProcessInterval(tick)
    #得到当前buff
    for effIndex in range(0, curBuffSkill.GetEffectCount()):
        #得到当前效果
        curEffect = curBuffSkill.GetEffect(effIndex)
        curEffectID = curEffect.GetEffectID()
        if not curEffectID:
            continue
        processStr = "BuffProcess_%d.%s"%(curEffectID, "ProcessBuff")
        callBuffProcessFunc = GameWorld.GetExecFunc(GameBuffs, processStr)
        if not callBuffProcessFunc:
            continue
        callBuffProcessFunc(curObj, curBuff, curEffect, processBuffTick, tick)
    # 剩余时间需效果处理后再设置
    if remainTime != None:
        curBuff.SetRemainTime(remainTime)
    if not isDel:
        return
    GameWorld.DebugLog("    buffProcess后删除buff: objID=%s,skillID=%s,turnNum=%s" % (curObj.GetID(), curBuffSkill.GetSkillID(), turnNum))
    skillID = curBuffSkill.GetSkillID()
    skillTypeID = curBuffSkill.GetSkillTypeID()
    ownerID, ownerType = curBuff.GetOwnerID(), curBuff.GetOwnerType()
    BuffSkill.DoBuffDisApper(curObj, curBuff, tick)
    buffState.DeleteBuffByTypeID(skillTypeID)
    SkillShell.ClearBuffEffectBySkillID(curObj, skillID, ownerID, ownerType)
    return
#---------------------------------------------------------------------
##执行ProcessBuff中设定的玩家字典
@@ -3410,10 +3436,23 @@
def CheeckTrigSkillandTag(attacker, exSkill, defender, tick):
    #再次验证附加技能是否对目标可用
    if attacker.GetGameObjType() != IPY_GameWorld.gotPlayer:
        skillTag = GetSkillAffectTag(exSkill)
        #该技能是对自己使用的 防守者应该改为攻击者
        if GetSkillAffectTag(exSkill) in [ChConfig.Def_UseSkillTag_Self,
        if skillTag in [ChConfig.Def_UseSkillTag_Self,
                                          ChConfig.Def_UseSkillTag_SelfAndFriend]:
            return True, attacker
        # 召唤兽对主人释放技能
        if skillTag == ChConfig.Def_UseSkillTag_SummonMaster:
            if not NPCCommon.IsSummonNPC(attacker):
                return False, None
            curSummonOwner =  NPCCommon.GetSummonNPCOwner(IPY_GameWorld.gotPlayer, attacker)
            if curSummonOwner == None:
                curSummonOwner = NPCCommon.GetSummonNPCOwner(IPY_GameWorld.gotNPC, attacker)
            if curSummonOwner == None:
                return False, None
            return True, curSummonOwner
        return True, defender
    
    #该技能是对自己使用的 防守者应该改为攻击者