ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -163,8 +163,8 @@
    angerOverflow = curBatObj.GetAngerOverflow()
    
    bySkillID = bySkill.GetSkillID() if bySkill else 0
    GameWorld.DebugLogEx("◆使用技能: curID=%s,skillID=%s,tagCnt=%s,batType=%s,bySkillID=%s,HP:%s/%s,angerOverflow=%s,curXP=%s,oneActionUseCnt=%s",
                         objID, skillID, len(tagObjList), batType, bySkillID, curBatObj.GetHP(), curBatObj.GetMaxHP(), angerOverflow, curXP, oneActionUseCnt)
    GameWorld.DebugLogEx("◆使用技能: skillID=%s,curID=%s,tagCnt=%s,batType=%s,bySkillID=%s,HP:%s/%s,angerOverflow=%s,curXP=%s,oneActionUseCnt=%s",
                         skillID, objID, len(tagObjList), batType, bySkillID, curBatObj.GetHP(), curBatObj.GetMaxHP(), angerOverflow, curXP, oneActionUseCnt)
    # 以下为技能可以使用的处理,之后的逻辑默认技能使用成功
    
    if isinstance(useSkill, IpyGameDataPY.IPY_Skill):
@@ -1422,6 +1422,7 @@
    relatedSkillID = useSkill.GetSkillID()
    delBuffAfterEffList = [] # buff消失后要触发的被动,一般用于后置处理的逻辑
    beControlledHardDict = {} # 受控目标 {objID:buff, ...}
    beDotBuffDict = {} # 被添加dot的目标 {objID:buff, ...}
    afterLogicList = useSkill.GetAfterLogicList()
    for logicType, logicData in afterLogicList:
        if logicType == ChConfig.AfterLogic_DelBuff:
@@ -1446,6 +1447,8 @@
            if buffOwner.GetID() == curID:
                if triggerType == ChConfig.TriggerWay_BeControlledHard:
                    beControlledHardDict[batObj.GetID()] = buff
                elif triggerType == ChConfig.TriggerWay_AddDOTBuff:
                    beDotBuffDict[batObj.GetID()] = buff
                    
    # 统计击杀
    killObjList = [] # 击杀其他阵营目标列表
@@ -1566,6 +1569,10 @@
    
    # ========== 以下触发被动 ==========
    
    curBatLineup = curObj.GetTFBatLineup()
    curMGObj = curBatLineup.getMinggeObj()
    mgTriggerWayList = [] # 命格本次技能已触发方式列表,命格固定只触发一次
    # buff消失后置处理的被动,优先处理,如破盾,区别于被动方式  ChConfig.TriggerWay_BuffDel(立即触发)
    for buffObjID, buff, tagObjID, afterTriggerData in delBuffAfterEffList:
        triggerWay, effInfoList = afterTriggerData
@@ -1612,6 +1619,9 @@
        TurnBuff.DoBuffByRevive(turnFight, tagObj)
        TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_Revive, curObj, connSkill=useSkill)
        TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_InBattlefield, curObj, connSkill=useSkill)
    if reviveObjList and curMGObj:
        tagObj = reviveObjList[0]
        TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_Revive, tagObj, connSkill=useSkill, byFriendObj=curObj)
        
    # 曹仁防护触发,暂写死
    for tagObj in caorenProtectList:
@@ -1630,8 +1640,6 @@
    triggerOne = False
    batType = useSkill.GetBatType()
    isAttackDirect = (isUseSkill and SkillCommon.isAttackDirectSkill(useSkill)) # 是否直接攻击
    curBatLineup = curObj.GetTFBatLineup()
    curMGObj = curBatLineup.getMinggeObj()
    for tagObj in tagObjListAll:
        tagID = tagObj.GetID()
        
@@ -1639,7 +1647,11 @@
        if tagID in missObjIDList:
            TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_BeMiss, tagObj, connSkill=useSkill)
            TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_Miss, curObj, connSkill=useSkill)
            tagMGObj = tagObj.GetTFBatLineup().getMinggeObj()
            if tagMGObj and ChConfig.TriggerWay_Miss not in mgTriggerWayList:
                mgTriggerWayList.append(ChConfig.TriggerWay_Miss)
                TurnPassive.OnTriggerPassiveEffect(turnFight, tagMGObj, ChConfig.TriggerWay_Miss, curObj, connSkill=useSkill, byBatObj=tagObj)
        # 免疫
        if tagID in immuneObjIDList:
            TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_ImmuneHurt, curObj, connSkill=useSkill)
@@ -1687,40 +1699,64 @@
        if tagID in stunObjIDList:
            TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_Stun, tagObj, connSkill=useSkill)
            TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeStun, curObj, connSkill=useSkill)
            if curMGObj and ChConfig.TriggerWay_Stun not in mgTriggerWayList:
                mgTriggerWayList.append(ChConfig.TriggerWay_Stun)
                TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_Stun, tagObj, connSkill=useSkill, byBatObj=curObj)
        # 控制
        if tagID in beControlledHardDict:
            buff = beControlledHardDict[tagID]
            if buff.GetCurBuffState() == ChConfig.BatObjState_Frozen:
                if curMGObj:
                if curMGObj and ChConfig.TriggerWay_Frozen not in mgTriggerWayList:
                    mgTriggerWayList.append(ChConfig.TriggerWay_Frozen)
                    TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_Frozen, tagObj, connSkill=useSkill, byBatObj=curObj)
            TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeControlledHard, curObj, connSkill=useSkill, connBuff=buff)
            
        # 附加dot
        if tagID in beDotBuffDict:
            if curMGObj and ChConfig.TriggerWay_AddDOTBuff not in mgTriggerWayList:
                mgTriggerWayList.append(ChConfig.TriggerWay_AddDOTBuff)
                TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_AddDOTBuff, tagObj, connSkill=useSkill, byBatObj=curObj)
        # 暴击
        if tagID in superHitObjIDList:
            TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_SuperHit, tagObj, connSkill=useSkill)
            TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeSuperHit, curObj, connSkill=useSkill)
            if curMGObj and ChConfig.TriggerWay_SuperHit not in mgTriggerWayList:
                mgTriggerWayList.append(ChConfig.TriggerWay_SuperHit)
                TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_SuperHit, tagObj, connSkill=useSkill, byBatObj=curObj)
        # 格挡
        if tagID in parryObjIDList:
            TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_BeParry, tagObj, connSkill=useSkill)
            TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_Parry, curObj, connSkill=useSkill)
            tagMGObj = tagObj.GetTFBatLineup().getMinggeObj()
            if tagMGObj and ChConfig.TriggerWay_Parry not in mgTriggerWayList:
                mgTriggerWayList.append(ChConfig.TriggerWay_Parry)
                TurnPassive.OnTriggerPassiveEffect(turnFight, tagMGObj, ChConfig.TriggerWay_Parry, curObj, connSkill=useSkill, byBatObj=tagObj)
        # 吸血
        if tagID in suckObjIDList:
            if not triggerOne:
                TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_SuckHPOne, tagObj, connSkill=useSkill)
            TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeSuckHP, curObj, connSkill=useSkill)
            if curMGObj and ChConfig.TriggerWay_SuckHPOne not in mgTriggerWayList:
                mgTriggerWayList.append(ChConfig.TriggerWay_SuckHPOne)
                TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_SuckHPOne, tagObj, connSkill=useSkill, byBatObj=curObj)
        # 连击
        if batType == ChConfig.TurnBattleType_Combo:
            TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_Combo, tagObj, connSkill=useSkill)
            TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeCombo, curObj, connSkill=useSkill)
            if curMGObj and ChConfig.TriggerWay_Combo not in mgTriggerWayList:
                mgTriggerWayList.append(ChConfig.TriggerWay_Combo)
                TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_Combo, tagObj, connSkill=useSkill, byBatObj=curObj)
        # 追击
        elif batType == ChConfig.TurnBattleType_Pursue:
            TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_Pursue, tagObj, connSkill=useSkill)
            if isAttackDirect:
                if curMGObj:
                if curMGObj and ChConfig.TriggerWay_PursueAtk not in mgTriggerWayList:
                    mgTriggerWayList.append(ChConfig.TriggerWay_PursueAtk)
                    TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_PursueAtk, tagObj, connSkill=useSkill, byBatObj=curObj)
            TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BePursue, curObj, connSkill=useSkill)
        # 反击
@@ -2031,7 +2067,7 @@
    @param effectID: 被动效果ID
    注:可能由A引起触发B技能的效果释放技能C
    '''
    if not passiveSkill:
    if not passiveSkill or not batObj:
        return
    if isinstance(passiveSkill, int):
        passiveSkillID = passiveSkill
@@ -2048,9 +2084,11 @@
        bySkillID = connBuff.GetSkillID()
    passiveSkillID = passiveSkill.GetSkillID()
    if passiveSkillID == bySkillID:
        #GameWorld.DebugLogEx("###被动触发技能不触发自身,防止死循环! effSkillID=%s,effectID=%s,passiveSkillID=%s", effSkillID, effectID, passiveSkillID)
        return
        if not connSkill or connSkill.GetObjID() == batObj.GetID():
            GameWorld.DebugLogEx("###被动触发技能不触发自身,防止死循环! effSkillID=%s,effectID=%s,passiveSkillID=%s", effSkillID, effectID, passiveSkillID)
            return
        # 不同施法者的相同技能ID可触发,如双方都有相同武将相同技能的情况下,如吕玲绮
    if hasattr(passiveSkill, "GetRemainTime") and passiveSkill.GetRemainTime() > 0:
        #GameWorld.DebugLogEx("被动触发技能CD中! skillID=%s,RemainTime=%s", passiveSkillID, passiveSkill.GetRemainTime())
        return
@@ -2132,23 +2170,31 @@
    isAngerSkill = SkillCommon.isAngerSkill(curSkill)
    isDot = ("damageoftime" in kwargs)
    
    mustHit = False # 是否必命中
    if not isTurnNormalSkill: # 仅普攻判断是否闪避
        mustHit = True
    angerOverflow = atkObj.GetAngerOverflow() # 怒气溢出值
    #命中公式 攻击方类型不同,公式不同
    if not mustHit and not curSkill.GetEffectByID(ChConfig.SkillEff_MustHit) and not defObj.IsInControlledHard():
    # 常规闪避 - 仅针对普攻
    if isTurnNormalSkill and not curSkill.GetEffectByID(ChConfig.SkillEff_MustHit) and not defObj.IsInControlledHard():
        aMissRateDef = atkObj.GetBatAttrValue(ChConfig.AttrID_MissRateDef) #atkObj.GetHit() # 抗闪避率 - 命中
        dMissRate = defObj.GetBatAttrValue(ChConfig.AttrID_MissRate) # 闪避率
        missNum = curSkill.GetTagMissNum(defID)
        missRate = eval(IpyGameDataPY.GetFuncCompileCfg("MissCfg", 1))
        if GameWorld.CanHappen(missRate):
            GameWorld.DebugLogEx("闪避了! missRate=%s,dMissRate=%s,aMissRateDef=%s,missNum=%s", missRate, dMissRate, aMissRateDef, missNum)
            curSkill.SetTagMissNum(defID, missRate + 1)
            curSkill.SetTagMissNum(defID, missNum + 1)
            return 0, pow(2, ChConfig.HurtAtkType_Miss)
        
    # 绝对闪避 - 除dot外的所有技能,因为绝对闪避不触发常规闪避的被动,所以在常规闪避后判断
    if not isDot:
        aMissRateDef = atkObj.GetBatAttrValue(ChConfig.AttrID_AbsoluteMissRateDef)
        dMissRate = defObj.GetBatAttrValue(ChConfig.AttrID_AbsoluteMissRate)
        missNum = curSkill.GetTagMissNum(defID)
        if dMissRate > 0:
            missRate = eval(IpyGameDataPY.GetFuncCompileCfg("MissCfg", 1))
            if GameWorld.CanHappen(missRate):
                GameWorld.DebugLogEx("绝对闪避了! missRate=%s,dAbsoluteMissRate=%s,aAbsoluteMissRateDef=%s,missNum=%s", missRate, dMissRate, aMissRateDef, missNum)
                curSkill.SetTagMissNum(defID, missNum + 1)
                return 0, pow(2, ChConfig.HurtAtkType_AbsoluteMiss)
    angerOverflow = atkObj.GetAngerOverflow() # 怒气溢出值
    hurtTypes = pow(2, ChConfig.HurtAtkType_Hurt)
    
    isSuperHit, isParry, isStun = False, False, False
@@ -2879,7 +2925,7 @@
    damBackPer = 0
    buffMgr = defObj.GetBuffManager()
    for buff in buffMgr.FindBuffListByState(ChConfig.BatObjState_DamBackShield):
        damBackPer += buff.GetValue1()
        damBackPer += buff.GetValue1() * max(1, buff.GetLayer())
        connSkillTypeID = buff.GetSkillTypeID()
        damBackPer += TurnPassive.GetTriggerEffectValue(turnFight, defObj, atkObj, ChConfig.PassiveEff_AddDamBackPerByBuffLayer, connSkillTypeID=connSkillTypeID)
        
@@ -3103,6 +3149,43 @@
    useSkill.ResetUseRec()
    return
def DoHurtExAtk(turnFight, atkObj, defObj, hurtValue, skillID, hurtTypes=0):
    ## 额外结算指定伤害
    skillIpyData = IpyGameDataPY.GetIpyGameData("Skill", skillID)
    if not skillIpyData:
        return
    atkID = atkObj.GetID()
    defID = defObj.GetID()
    # 结算需要同步标签
    useTag = "Skill_%s_%s_Dot_%s" % (atkID, skillID, atkObj.GetIncrementValue()) # 复用dot的标签
    Sync_TurnFightTag(turnFight, useTag, 0)
    dHP = defObj.GetHP()
    dMaxHP = defObj.GetMaxHP()
    GameWorld.DebugLogEx("额外结算指定伤害: atkID=%s,defID=%s,skillID=%s,hurtValue=%s,,dHP=%s/%s",
                         atkID, defID, skillID, hurtValue, dHP, dMaxHP)
    useSkill = BattleObj.PySkill(skillIpyData, atkID)
    useSkill.SetTagObjList([defObj])
    useSkill.SetBatType(ChConfig.TurnBattleType_Dot) # 要修改表现的话等前端同步修改
    hurtTypes |= pow(2, ChConfig.HurtAtkType_Hurt) # 确保有基础的伤害类型
    hurtValue, hurtTypes, immuneHurt = CalcHurtWithBuff(turnFight, atkObj, defObj, hurtValue, hurtTypes)
    calcHurtResults = [[defObj, hurtValue, hurtTypes, immuneHurt]]
    DoSkillHurtHP(turnFight, atkObj, useSkill, calcHurtResults, "HurtExAtk")
    Sync_UseSkill(turnFight, atkObj, useSkill)
    DoBeAttackResult(turnFight, atkObj, useSkill)
    # 通知结束标签
    Sync_TurnFightTag(turnFight, useTag, 1)
    useSkill.ResetUseRec()
    return True
def Sync_TurnFightTag(turnFight, useTag, sign):
    ## 通知技能标签
    clientPack = ChPyNetSendPack.tagSCTurnFightTag()