ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py
@@ -17,7 +17,10 @@
import GameWorld
import PassiveTrigger
import IpyGameDataPY
import BattleObj
import ChConfig
import TurnSkill
GameWorld.ImportAll("Script\\Skill\\", "PassiveTrigger")
@@ -27,23 +30,40 @@
    passiveEffMgr = batObj.GetPassiveEffManager()
    skillEffInfo = passiveEffMgr.RefreshSkillPassiveEffect()
    buffEffInfo = passiveEffMgr.RefreshBuffPassiveEffect()
    skillEffInfo and GameWorld.DebugLog("    被动技能效果: %s" % skillEffInfo)
    buffEffInfo and GameWorld.DebugLog("    被动Buff效果: %s" % buffEffInfo)
    skillEffInfo and GameWorld.DebugLogEx("    被动技能效果: %s", skillEffInfo)
    buffEffInfo and GameWorld.DebugLogEx("    被动Buff效果: %s", buffEffInfo)
    return
def OnTriggerPassiveEffect(turnFight, batObj, triggerWay, tagObj=None, connSkill=None, connSkillTypeID=0, connBuff=None, **kwargs):
    ''' 触发被动效果,可能触发技能、buff,需根据优先级触发
    '''
    if not batObj.IsAlive():
        if triggerWay not in ChConfig.DeadCanTriggerWayList:
        if triggerWay in ChConfig.DeadCanTriggerWayList:
            pass # 死亡状态下可触发的被动
        elif connSkill:
            if connSkill.GetBatType() == ChConfig.TurnBattleType_Enhance:
                pass # 子技能不限制死亡触发,由主技能决定,主技能能触发了,才会执行到子技能,那么子技能也一定能触发
            elif connSkill.GetByTriggerWay() in ChConfig.DeadCanTriggerWayList:
                pass
                #GameWorld.DebugLogEx("关联技能是由死亡状态下可触发的方式触发的,则也可触发! triggerWay=%s,connSkillID=%s,byTriggerWay=%s",
                #                     triggerWay, connSkill.GetSkillID(), connSkill.GetByTriggerWay())
            else:
                return
        else:
            return
    passiveEffMgr = batObj.GetPassiveEffManager()
    effInfoList = passiveEffMgr.GetPassiveEffByTrigger(triggerWay, connSkill, connSkillTypeID, connBuff)
    if not effInfoList:
        return
    # [["skill/buff", skillID, buffID, effIDList], ...]
    OnTriggerPassiveEffList(turnFight, batObj, triggerWay, tagObj, effInfoList, connSkill, connBuff, **kwargs)
    return
def OnTriggerPassiveEffList(turnFight, batObj, triggerWay, tagObj, effInfoList, connSkill=None, connBuff=None, **kwargs):
    '''触发外部指定的被动效果列表
    @param effInfoList: [["skill/buff", skillID, buffID, effIDList], ...]
    '''
    tagID = tagObj.GetID() if tagObj else 0
    GameWorld.DebugLog("触发被动: triggerWay=%s,objID=%s,tagID=%s,%s" % (triggerWay, batObj.GetID(), tagID, effInfoList))
    GameWorld.DebugLogEx("触发被动: triggerWay=%s,objID=%s,tagID=%s,%s", triggerWay, batObj.GetID(), tagID, effInfoList)
    for effInfo in effInfoList:
        sign = effInfo[0]
        skillID, buffID, effIDList = effInfo[1:]
@@ -63,13 +83,34 @@
    if not effSkill:
        return
    
    if effSkill.GetCoolDownTime():
        if hasattr(effSkill, "GetRemainTime") and effSkill.GetRemainTime() > 0:
            GameWorld.DebugLogEx("被动效果技能CD中! effSkillID=%s,RemainTime=%s", skillID, effSkill.GetRemainTime())
            return
        kwargs["byEffSkill"] = effSkill # 目前用于触发被动技能时,该效果技能提前先设置CD,防止嵌套触发时CD后置才设置,如关羽的怒技追击
    # 没有类型的,纯配被动效果,有类型的技能在 OnUseSkill 统一处理回合次数,这里只处理纯被动效果的
    useCntLimit = None
    if not effSkill.GetSkillType():
        useCntLimit = TurnSkill.CheckSkillUseCntLimit(batObj, effSkill)
        if useCntLimit:
            return
    isOK = False
    kwargs["byTriggerWay"] = triggerWay
    for effID in effIDList:
        curEffect = effSkill.GetEffectByID(effID, triggerWay)
        if not curEffect:
            continue
        DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs)
        if DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs):
            isOK = True # 有效果触发就算
        
    return
    if isOK:
        if useCntLimit != None:
            #GameWorld.DebugLogEx("增加被动效果回合触发次数! skillID=%s", effSkill.GetSkillID())
            batObj.AddSkillUseCnt(effSkill.GetSkillID())
    return isOK
def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff=None, **kwargs):
    effID = curEffect.GetEffectID()
@@ -79,8 +120,17 @@
    callFunc = GameWorld.GetExecFunc(PassiveTrigger, "%s.%s" % (pyName, "DoSkillEffectLogic"))
    if not callFunc:
        return
    callFunc(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs)
    return
    isOK = callFunc(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs)
    if not isOK:
        return
    cdTime = effSkill.GetCoolDownTime()
    if cdTime:
        # 非触发技能的在后面设置CD即可
        if hasattr(effSkill, "GetRemainTime"):
            effSkill.SetRemainTime(cdTime)
    return True
def __doTriggerPassiveEffectByBuff(turnFight, batObj, tagObj, triggerWay, buffID, effIDList, connSkill=None, connBuff=None, **kwargs):
    buffMgr = batObj.GetBuffManager()
@@ -91,6 +141,7 @@
        return
    skillData = effBuff.GetSkillData()
    
    kwargs["byTriggerWay"] = triggerWay
    for effID in effIDList:
        curEffect = skillData.GetEffectByID(effID, triggerWay)
        if not curEffect:
@@ -164,13 +215,14 @@
            callFunc = GameWorld.GetExecFunc(PassiveTrigger, "%s.%s" % (pyName, "GetHappenValue"))
            if not callFunc:
                continue
            kwargs["turnFight"] = turnFight
            value = callFunc(atkObj, defObj, effect, effSkill, effBuff, connSkill, **kwargs)
            if value is None:
                continue
            
            if effID in ChConfig.PassiveEffHappenValueList:
                if value:
                    GameWorld.DebugLog("统计被动效果值: calcEffID=%s,objID=%s,tagID=%s,%s,curValue=%s" % (calcEffID, atkObj.GetID(), tagID, effInfoList, value))
                    GameWorld.DebugLogEx("统计被动效果值: calcEffID=%s,objID=%s,tagID=%s,%s,curValue=%s", calcEffID, atkObj.GetID(), tagID, effInfoList, value)
                    return value
            elif effID in ChConfig.PassiveEffValueMaxList:
                curValue = max(curValue, value) # 取最大值
@@ -185,6 +237,6 @@
            #    if curSkill.GetCoolDownTime():
            #        SkillCommon.SetSkillRemainTime(curSkill, 0, tick, attacker)
            
    GameWorld.DebugLog("统计被动效果值: calcEffID=%s,objID=%s,tagID=%s,%s,curValue=%s" % (calcEffID, atkObj.GetID(), tagID, effInfoList, curValue))
    GameWorld.DebugLogEx("统计被动效果值: calcEffID=%s,objID=%s,tagID=%s,%s,curValue=%s", calcEffID, atkObj.GetID(), tagID, effInfoList, curValue)
    return curValue