ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -59,13 +59,15 @@
    if not skillID:
        return
    
    byTriggerWay = kwargs["byTriggerWay"] if "byTriggerWay" in kwargs else 0 # 不使用参数名 triggerWay, 防止传递过程中参数混乱
    if not curBatObj.IsAlive():
        if useSkill.GetSkillType() == ChConfig.Def_SkillType_Revive and useSkill.GetTagAim() == ChConfig.SkillTagAim_Self:
            GameWorld.DebugLogEx("死亡时使用复活自己的技能! skillID=%s", skillID)
        else:
            triggerWay = kwargs.get("triggerWay", 0)
            if triggerWay in ChConfig.DeadCanTriggerWayList:
                GameWorld.DebugLogEx("死亡可触发的方式触发技能可释放! skillID=%s,triggerWay=%s", skillID, triggerWay)
            if byTriggerWay in ChConfig.DeadCanTriggerWayList:
                GameWorld.DebugLogEx("死亡可触发的方式触发技能可释放! skillID=%s,byTriggerWay=%s", skillID, byTriggerWay)
            elif batType == ChConfig.TurnBattleType_Enhance:
                GameWorld.DebugLogEx("死亡状态额外技能不限制,主技能能放的话也就能放! skillID=%s", skillID)
            else:
                GameWorld.DebugLogEx("死亡状态下无法释放该技能! skillID=%s", skillID)
                return
@@ -148,6 +150,7 @@
    useSkill.SetBatType(batType)
    useSkill.SetBySkill(bySkill)
    useSkill.SetByBuff(byBuff)
    useSkill.SetByTriggerWay(byTriggerWay)
    
    isTurnNormalSkill = SkillCommon.isTurnNormalSkill(useSkill)
    if isTurnNormalSkill:
@@ -176,7 +179,7 @@
    else:
        __doUseSkill(turnFight, curBatObj, useSkill)
        
    DoAttackResult(turnFight, curBatObj, useSkill)
    DoAttackResult(turnFight, curBatObj, useSkill, **kwargs)
    
    if useTag:
        Sync_TurnFightTag(turnFight, useTag, 1)
@@ -218,7 +221,8 @@
def IsNeedSyncSkill(useSkill):
    ## 使用需要同步B427使用技能
    if useSkill.GetSkillType() in [ChConfig.Def_SkillType_Atk, ChConfig.Def_SkillType_Cure, ChConfig.Def_SkillType_Revive, ChConfig.Def_SkillType_CleanBuff]:
    if useSkill.GetSkillType() in [ChConfig.Def_SkillType_Atk, ChConfig.Def_SkillType_Cure, ChConfig.Def_SkillType_Revive, ChConfig.Def_SkillType_CleanBuff,
                                   ChConfig.Def_SkillType_AtkEx]:
        return True
    if useSkill.GetFuncType() in [ChConfig.Def_SkillFuncType_TurnNormaSkill, ChConfig.Def_SkillFuncType_AngerSkill]:
        return True
@@ -439,6 +443,14 @@
        for aimObj in aimObjList[::-1]:
            if not aimObj.CheckInState(ChConfig.BatObjState_PoisonCure):
                aimObjList.remove(aimObj)
    # 仅流血目标
    elif tagAffect == ChConfig.SkillTagAffect_Bleeding:
        atkBackTagFrist = False
        for aimObj in aimObjList[::-1]:
            if not aimObj.CheckInState(ChConfig.BatObjState_Bleeding):
                aimObjList.remove(aimObj)
    else:
        # 范围目标超过个数,则随机取
        if tagCount and len(aimObjList) > tagCount:
@@ -1120,7 +1132,7 @@
        
    return
def DoAttackResult(turnFight, curBatObj, useSkill):
def DoAttackResult(turnFight, curBatObj, useSkill, **kwargs):
    '''执行攻击结果
    @param curBatObj: 施法方或buff归属方
    '''
@@ -1137,6 +1149,14 @@
    if useSkill.GetCoolDownTime():
        useSkill.SetRemainTime(useSkill.GetCoolDownTime())
        
    if "byEffSkill" in kwargs:
        byEffSkill = kwargs["byEffSkill"]
        cdTime = byEffSkill.GetCoolDownTime()
        if cdTime:
            if hasattr(byEffSkill, "GetRemainTime"):
                byEffSkill.SetRemainTime(cdTime)
                GameWorld.DebugLogEx("提前设置效果技能触发后CD,防止嵌套循环触发! effSkillID=%s,cdTime=%s", byEffSkill.GetSkillID(), cdTime)
    __doCostZhanchui(turnFight, curBatObj, useSkill) # 先扣除再同步技能
    
    # 需先技能使用 - 前端按顺序优先表现技能释放内容,前端需要动作或有伤血则通知
@@ -1270,13 +1290,14 @@
            return useSkill
    return
def DoBeAttackResult(turnFight, curObj, useSkill, curBuff=None):
def DoBeAttackResult(turnFight, curObj, useSkill, timeBuff=None):
    '''被攻击结果
    @param curObj: 施法方或buff归属方
    @param timeBuff: 持续结算的buff,如持续攻击、持续治疗等
    '''
    
    #curID = curObj.GetID()
    isUseSkill = False if curBuff else True # buff的视为持续性的,否则为直接使用技能的攻击结果
    isUseSkill = False if timeBuff else True # buff的视为持续性的,否则为直接使用技能的攻击结果
    isTurnNormalSkill = SkillCommon.isTurnNormalSkill(useSkill)
    isAngerSkill = SkillCommon.isAngerSkill(useSkill)
    
@@ -1318,9 +1339,7 @@
            TurnAttack.SetObjKilled(turnFight, tagObj, curObj, useSkill)
    useSkill.SetKillObjList(killObjList)
    # 判断自己,因为反弹、平摊伤害的原因,有可能自己干死自己
    selfAlive = curObj.IsAlive()
    if selfAlive and curObj.GetHP() <= 0:
        selfAlive = False
    if curObj.IsAlive() and curObj.GetHP() <= 0:
        dieObjList.append(curObj)
        TurnAttack.SetObjKilled(turnFight, curObj)
        
@@ -1395,7 +1414,7 @@
    effIgnoreObjIDList = missObjIDList + immuneObjIDList
    useSkill.SetEffIgnoreObjIDList(effIgnoreObjIDList)
    # 优先触发本技能额外效果,注:仅该技能释放后该技能的额外效果视为主技能的效果,优先级最高
    if selfAlive:
    if curObj not in dieObjList:
        __DoCurSkillEff(turnFight, curObj, useSkill, effIgnoreObjIDList, isUseSkill)
    
    # ========== 以下触发被动 ==========
@@ -1417,6 +1436,7 @@
    if dieObjList:
        for dieObj in dieObjList:
            TurnPassive.OnTriggerPassiveEffect(turnFight, dieObj, ChConfig.TriggerWay_WhenDie, curObj, connSkill=useSkill)
            __dongbaiRevive(turnFight, dieObj, useSkill) # 写死特殊处理董白复活
            
        for faction in [ChConfig.Def_FactionA, ChConfig.Def_FactionB]:
            batFaction = turnFight.getBatFaction(faction)
@@ -1445,6 +1465,7 @@
    triggerOne = False
    batType = useSkill.GetBatType()
    isAttackDirect = (isUseSkill and SkillCommon.isAttackDirectSkill(useSkill)) # 是否直接攻击
    curBatLineup = None
    for tagObj in tagObjListAll:
        tagID = tagObj.GetID()
        
@@ -1461,6 +1482,7 @@
        # 掉血时
        if tagID in beHurtObjIDList:
            TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeHurt, curObj, connSkill=useSkill)
            #TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_HurtTag, tagObj, connSkill=useSkill) 暂时用不到先屏蔽
            
        #  受到任意效果时(除直接攻击外的任意效果,如buff、dot、治疗、额外怒技)
        if not isAttackDirect:
@@ -1516,12 +1538,62 @@
            TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_AtkBack, tagObj, connSkill=useSkill)
            TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeAtkBack, curObj, connSkill=useSkill)
            
        # 敌友方
        if isAttackDirect or batType in [ChConfig.TurnBattleType_Combo, ChConfig.TurnBattleType_Pursue]:
            if not curBatLineup:
                curBatLineup = curObj.GetBatLineup()
            for lineupObjID in curBatLineup.posObjIDDict.values():
                lineupObj = batObjMgr.getBatObj(lineupObjID)
                if not lineupObj.IsAlive():
                    continue
                # 直接攻击
                if isAttackDirect:
                    if not triggerOne:
                        TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendAttackOverDirectOne, tagObj, connSkill=useSkill, byFriendObj=curObj)
                # 连击
                if batType == ChConfig.TurnBattleType_Combo:
                    TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendCombo, tagObj, connSkill=useSkill, byFriendObj=curObj)
                # 追击
                elif batType == ChConfig.TurnBattleType_Pursue:
                    TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendPursue, tagObj, connSkill=useSkill, byFriendObj=curObj)
        triggerOne = True # 设置已经触发过一次
        
    # 验证是否结算,最后处理
    if dieObjList:
        turnFight.checkOverByKilled()
        
    return
def __dongbaiRevive(turnFight, batObj, useSkill):
    '''特殊处理董白复活: 董白死亡之后的时间,若有敌方单位阵亡,董白以50%血量复活
    '''
    faction = batObj.GetFaction()
    batFaction = turnFight.getBatFaction(ChConfig.Def_FactionA if faction == ChConfig.Def_FactionB else ChConfig.Def_FactionB)
    if not batFaction:
        return
    batLineup = batFaction.getBatlineup(1)
    if ChConfig.HeroID_Dongbai not in batLineup.heroObjIDDict:
        return
    dongbaiObj = BattleObj.GetBatObjMgr().getBatObj(batLineup.heroObjIDDict[ChConfig.HeroID_Dongbai])
    if not dongbaiObj or dongbaiObj.IsAlive():
        return
    skill = dongbaiObj.GetSkillManager().FindSkillByID(ChConfig.SkillID_DongbaiRevive)
    if not skill:
        GameWorld.DebugLogEx("董白还还未学习特殊复活技能! %s", ChConfig.SkillID_DongbaiRevive)
        return
    enemyDeadCnt = dongbaiObj.GetDictByKey("EnemyDeadCnt") + 1
    dongbaiObj.SetDict("EnemyDeadCnt", enemyDeadCnt)
    GameWorld.DebugLogEx("董白记录自身死亡后的敌方阵亡单位数: %s" % enemyDeadCnt)
    needDeadCnt = skill.GetEffect(0).GetEffectValue(0) # 固定配置在效果1值
    if enemyDeadCnt < needDeadCnt:
        return
    dongbaiObj.SetDict("EnemyDeadCnt", 0)
    OnUseSkill(turnFight, dongbaiObj, skill, batType=ChConfig.TurnBattleType_Passive, bySkill=useSkill)
    return
def __doCostZhanchui(turnFight, curBatObj, useSkill):
@@ -1797,6 +1869,14 @@
            return
        passiveTagObjList = connSkill.GetTagObjList()
        isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff, **kwargs)
    elif tagAim == ChConfig.SkillTagAim_MainSkillFriend:
        if "byFriendObj" not in kwargs:
            return
        byFriendObj = kwargs["byFriendObj"]
        passiveTagObjList = [byFriendObj]
        GameWorld.DebugLogEx("被动触发技能,针对来源友军! effSkillID=%s,effectID=%s,passiveSkillID=%s,bySkillID=%s,byFriendID=%s",
                             effSkillID, effectID, passiveSkillID, bySkillID, byFriendObj.GetID())
        isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff, **kwargs)
    else:
        GameWorld.DebugLogEx("被动触发技能,重新锁定目标! effSkillID=%s,effectID=%s,passiveSkillID=%s,bySkillID=%s", effSkillID, effectID, passiveSkillID, bySkillID)
        isOK = OnUseSkill(turnFight, batObj, passiveSkill, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff, **kwargs)
@@ -1894,6 +1974,7 @@
    dFinalDamPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_FinalDamPerDef) # 最终减伤
    
    aFinalDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddFinalDamPer, curSkill)
    aFinalDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.AttrID_FinalDamPer, curSkill)
    
    aNormalSkillPer, dNormalSkillPerDef = 0, 0
    if isTurnNormalSkill:
@@ -2015,6 +2096,7 @@
        
    hurtAtkPerMax = curSkill.GetHurtAtkPerMax() # 最大万分比,限制最终伤害不超过攻击力万分率
    if hurtAtkPerMax:
        hurtAtkPerMax += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddHurtAtkPerMax, curSkill)
        aAtk = atkObj.GetAtk()
        hurtValueMax = aAtk * hurtAtkPerMax / 10000.0
        hurtValue = min(hurtValue, hurtValueMax)