hxp
2026-03-06 2470d825e304e982261afd240d06ef03cd5366e8
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):
@@ -755,7 +755,7 @@
    #执行添加buff
    
    #光环技能,需先添加施法者
    if useSkill.GetSkillType() == ChConfig.Def_SkillType_Halo:
    if useSkill.GetSkillType() in ChConfig.Def_HaloSkill_List:
        curID = curBatObj.GetID()
        skillID = useSkill.GetSkillID()
        GameWorld.DebugLogEx("光环技能先给施法者添加光源buff! skillID=%s,ownerID=%s", skillID, curID)
@@ -1640,6 +1640,7 @@
    triggerOne = False
    batType = useSkill.GetBatType()
    isAttackDirect = (isUseSkill and SkillCommon.isAttackDirectSkill(useSkill)) # 是否直接攻击
    objTriigerWayInfo = {} # 敌友已触发的列表,一般用于控制每人只触发一次的 {objID:{triggerWay:triggerCnt, ...}}
    for tagObj in tagObjListAll:
        tagID = tagObj.GetID()
        
@@ -1647,7 +1648,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)
@@ -1695,7 +1700,10 @@
        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]
@@ -1715,22 +1723,37 @@
        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:
            if not triggerOne:
                TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_ComboOne, tagObj, connSkill=useSkill)
            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)
@@ -1752,6 +1775,10 @@
                if not lineupObj.IsAlive():
                    continue
                
                if lineupObjID not in objTriigerWayInfo:
                    objTriigerWayInfo[lineupObjID] = {}
                objTriigerWayCntDict = objTriigerWayInfo[lineupObjID]
                # 直接攻击
                if isAttackDirect:
                    if not triggerOne:
@@ -1763,17 +1790,26 @@
                    if not triggerOne:
                        TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendDotHurt, tagObj, connSkill=useSkill, byFriendObj=curObj)
                        
                # 敌方被控时
                # 敌方被控时 - 默认为友军造成的
                if tagID in beControlledHardDict and lineupObj.GetFaction() != tagObj.GetFaction():
                    TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_EnemyBeControlledHard, tagObj, connSkill=useSkill)
                    tagBuff = beControlledHardDict[tagID]
                    # 敌方被冰冻
                    if tagBuff.GetCurBuffState() == ChConfig.BatObjState_Frozen:
                        if ChConfig.TriggerWay_FriendCausesFrozen not in objTriigerWayCntDict:
                            objTriigerWayCntDict[ChConfig.TriggerWay_FriendCausesFrozen] = 1
                            TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendCausesFrozen, tagObj, connSkill=useSkill)
                # 连击
                if batType == ChConfig.TurnBattleType_Combo:
                    TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendCombo, tagObj, connSkill=useSkill, byFriendObj=curObj)
                    if isAttackDirect:
                        TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendComboHurt, tagObj, connSkill=useSkill, byFriendObj=curObj)
                # 追击
                elif batType == ChConfig.TurnBattleType_Pursue:
                    TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendPursue, tagObj, connSkill=useSkill, byFriendObj=curObj)
                    if isAttackDirect:
                        TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendPursueHurt, tagObj, connSkill=useSkill, byFriendObj=curObj)
                    
        triggerOne = True # 设置已经触发过一次
        
@@ -1838,10 +1874,10 @@
    
    fightPoint = max(curPlayer.GetFightPoint(), 1) # 主线战斗消耗倍值,默认1
    costZhanchuiTotal = costZhanchui * fightPoint
    if not PlayerControl.PayMoney(curPlayer, ShareDefine.TYPE_Price_Xiantao, costZhanchuiTotal, isNotify=False):
    if not PlayerControl.PayMoney(curPlayer, ShareDefine.TYPE_Price_Xiantao, costZhanchuiTotal, "UseSkill", isNotify=False):
        # 不足时,有多少扣多少
        nowMoney = PlayerControl.GetMoney(curPlayer, ShareDefine.TYPE_Price_Xiantao)
        PlayerControl.PayMoney(curPlayer, ShareDefine.TYPE_Price_Xiantao, min(nowMoney, costZhanchuiTotal), isNotify=False)
        PlayerControl.PayMoney(curPlayer, ShareDefine.TYPE_Price_Xiantao, min(nowMoney, costZhanchuiTotal), "UseSkill", isNotify=False)
        
    return
@@ -2064,9 +2100,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,6 +2170,8 @@
    pmType = GetPMType(atkObj, curSkill)
    ignoreDef = IsIgnoreDef(curSkill)
    batType = curSkill.GetBatType()
    atkMGObj = atkObj.GetTFBatLineup().getMinggeObj()
    defMGObj = defObj.GetTFBatLineup().getMinggeObj()
    
    changeHurtType = TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_ChangeHurtType, curSkill)
    if not changeHurtType:
@@ -2148,23 +2188,33 @@
    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)
        if defMGObj:
            dMissRate += defMGObj.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
@@ -2183,7 +2233,8 @@
        aSuperDamPer = IpyGameDataPY.GetFuncCfg("SuperHitCfg", 2) * 10000
        aSuperDamPer += atkObj.GetBatAttrValue(ChConfig.AttrID_SuperDamPer)
        aSuperDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.AttrID_SuperDamPer, curSkill)
        if atkMGObj:
            aSuperDamPer += atkMGObj.GetBatAttrValue(ChConfig.AttrID_SuperDamPer)
        dSuperDamPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_SuperDamPerDef)
        
    if isParry:
@@ -2212,6 +2263,9 @@
    aFinalDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddFinalDamPer, curSkill)
    aFinalDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.AttrID_FinalDamPer, curSkill)
    
    if defMGObj:
        dFinalDamPerDef += defMGObj.GetBatAttrValue(ChConfig.AttrID_FinalDamPerDef)
    #招架  - 无视攻击方最终增伤百分比
    dZhaojia = defObj.GetBatAttrValue(ChConfig.AttrID_Zhaojia)
    aZhaojiaDef = atkObj.GetBatAttrValue(ChConfig.AttrID_ZhaojiaDef)
@@ -2259,6 +2313,8 @@
            aDOTPer += atkObj.GetBatAttrValue(ChConfig.AttrID_DOTBurnPer)
            dDOTPerDef += defObj.GetBatAttrValue(ChConfig.AttrID_DOTBurnPerDef)
            GameWorld.DebugLogEx("是灼烧: aDOTPer=%s,dDOTPerDef=%s", aDOTPer, dDOTPerDef)
        if atkMGObj:
            aDOTPer += atkMGObj.GetBatAttrValue(ChConfig.AttrID_DOTPer)
            
    #aAddSkillPer = 0 # 技能增伤
    dBatDamPerDef = 0 # 战斗增减伤
@@ -2266,7 +2322,9 @@
    aBatDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.AttrID_BatDamPer, curSkill)
    aBatDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddBatDamPerByTagLostHP, curSkill)
    aBatDamPer += addBatDamPer
    if atkMGObj:
        aBatDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkMGObj, defObj, ChConfig.AttrID_BatDamPer, curSkill)
    # 物法增减伤
    if pmType == IPY_GameWorld.ghtMag: # 法伤
        aPMDamPer = atkObj.GetBatAttrValue(ChConfig.AttrID_MagDamPer)
@@ -2290,12 +2348,15 @@
    if batType == ChConfig.TurnBattleType_Combo:
        aComboDamPer = atkObj.GetBatAttrValue(ChConfig.AttrID_ComboDamPer)
        dComboDamPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_ComboDamPerDef)
        if atkMGObj:
            aComboDamPer += atkMGObj.GetBatAttrValue(ChConfig.AttrID_ComboDamPer)
    aPursueDamPer, dPursueDamPerDef = 0, 0 # 追击增伤
    if batType == ChConfig.TurnBattleType_Pursue:
        aPursueDamPer = atkObj.GetBatAttrValue(ChConfig.AttrID_PursueDamPer)
        dPursueDamPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_PursueDamPerDef)
        if atkMGObj:
            aPursueDamPer += atkMGObj.GetBatAttrValue(ChConfig.AttrID_PursueDamPer)
    aPVPDamPer, dPVPDamPerDef = 0, 0 # PVP
    if turnFight.isPVP() > 0:
        aPVPDamPer = atkObj.GetBatAttrValue(ChConfig.AttrID_PVPDamPer)
@@ -2410,6 +2471,7 @@
    atkSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddSkillPerByBuffLayer, curSkill)
    atkSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddSkillPerByDeadTeammate, curSkill)
    atkSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddSkillPerByBuffState, curSkill)
    atkSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddSkillPerByBeFrozenCnt, curSkill)
    return atkSkillPer
def CanSuperHit(turnFight, atkObj, defObj, curSkill):
@@ -2895,10 +2957,16 @@
    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)
        
    defMGObj = defObj.GetTFBatLineup().getMinggeObj()
    if defMGObj:
        mgBuffMgr = defMGObj.GetBuffManager()
        for buff in mgBuffMgr.FindBuffListByState(ChConfig.BatObjState_DamBackShield):
            damBackPer += buff.GetValue1() * max(1, buff.GetLayer())
    if damBackPer <= 0:
        return
    
@@ -2927,7 +2995,10 @@
        # dot施法者已死亡不再吸血
        return
    
    atkMGObj = atkObj.GetTFBatLineup().getMinggeObj()
    aSuckHPPer = atkObj.GetBatAttrValue(ChConfig.AttrID_SuckHPPer)
    if atkMGObj:
        aSuckHPPer += atkMGObj.GetBatAttrValue(ChConfig.AttrID_SuckHPPer)
    aCurePer = atkObj.GetBatAttrValue(ChConfig.AttrID_CurePer)
    
    dSuckHPPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_SuckHPPerDef)