ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -73,7 +73,8 @@
    if not tagObjList:
        tagObjList = GetSkillTags(turnFight, curBatObj, useSkill)
        rate = useSkill.GetHappenRate()
        if rate and rate != ChConfig.Def_MaxRateValue:
        if rate:
            rate += TurnPassive.GetTriggerEffectValue(turnFight, curBatObj, None, ChConfig.PassiveEff_AddSkillRate, useSkill)
            for tagObj in tagObjList[::-1]:
                if not GameWorld.CanHappen(rate, ChConfig.Def_MaxRateValue):
                    tagObjList.remove(tagObj)
@@ -123,21 +124,20 @@
        curBatObj.SetMainTagIDList(tagIDList)
        
    useTag = ""
    # 主技能额外触发的技能可不下发,前端视为仅释放一个主技能
    if batType != ChConfig.TurnBattleType_Enhance:
        # 因为可能触发连击,所以标记需带上累计使用技能次数,确保唯一
        useTag = "Skill_%s_%s_%s" % (objID, skillID, curBatObj.GetSkillUseCnt(skillID) + 1)
        clientPack = poolMgr.acquire(ChPyNetSendPack.tagSCTurnFightTag)
        clientPack.Tag = useTag
        clientPack.Len = len(clientPack.Tag)
        clientPack.Sign = 0
        turnFight.addBatPack(clientPack)
    #这个技能是Buff
    if SkillCommon.IsBuff(useSkill):
        __doAddBuff(turnFight, curBatObj, useSkill)
    else:
        # 主技能额外触发的技能可不下发,前端视为仅释放一个主技能
        if batType != ChConfig.TurnBattleType_Enhance:
            # 因为可能触发连击,所以标记需带上累计使用技能次数,确保唯一
            useTag = "Skill_%s_%s_%s" % (objID, skillID, curBatObj.GetSkillUseCnt(skillID) + 1)
            clientPack = poolMgr.acquire(ChPyNetSendPack.tagSCTurnFightTag)
            clientPack.Tag = useTag
            clientPack.Len = len(clientPack.Tag)
            clientPack.Sign = 0
            turnFight.addBatPack(clientPack)
        __doUseSkill(turnFight, curBatObj, useSkill)
        
    DoAttackResult(turnFight, curBatObj, useSkill)
@@ -676,6 +676,9 @@
    if not tagObj:
        return
    
    if not tagObj.IsAlive():
        return
    tagID = tagObj.GetID()
    canAtkbackDictTypeList = IpyGameDataPY.GetFuncEvalCfg("ParryCfg", 2)
    if tagObj.GetAtkDistType() not in canAtkbackDictTypeList:
@@ -787,8 +790,10 @@
        if hurtObj.GetSuckHP() > 0:
            isSuckHP = True
            
    curObj.SetLastHurtValue(totalHurtValue) # 记录最后一次总伤害
    # 记录最后一次总伤害,有伤害目标才记录
    if useSkill.GetHurtObjList():
        curObj.SetLastHurtValue(totalHurtValue)
    # 群攻只触发一次特长
    if isSuperHit:
        DoHeroSpecialty(turnFight, curObj, ChConfig.HeroSpecialty_SuperHit, relatedSkillID)
@@ -989,6 +994,7 @@
        GameWorld.DebugLog("继承主技能目标! enhanceSkillID=%s" % enhanceSkillID)
        # 额外触发的技能直接在外层检查概率,如果都没有触发则不需要再处理
        enhanceRate = enhanceSkillData.GetHappenRate()
        enhanceRate += TurnPassive.GetTriggerEffectValue(turnFight, curBatObj, None, ChConfig.PassiveEff_AddSkillRate, connSkillTypeID=enhanceSkillData.GetSkillTypeID())
        enchanceTagObjList = []
        for tagObj in tagObjList:
            tagID = tagObj.GetID()
@@ -1061,6 +1067,7 @@
    # 继承主技能目标
    if passiveSkill.GetTagAim() == ChConfig.SkillTagAim_MainSkill:
        happenRate = passiveSkill.GetHappenRate()
        happenRate += TurnPassive.GetTriggerEffectValue(turnFight, batObj, None, ChConfig.PassiveEff_AddSkillRate, passiveSkill)
        GameWorld.DebugLog("被动触发技能,继承主技能目标! effSkillID=%s,effectID=%s,passiveSkillID=%s,happenRate=%s,bySkillID=%s" % (effSkillID, effectID, passiveSkillID, happenRate, bySkillID))
        if not tagObj:
            return
@@ -1068,7 +1075,7 @@
        if not tagObj.IsAlive():
            GameWorld.DebugLog("    已被击杀不触发: tagID=%s" % (tagID))
            return
        if happenRate and happenRate != ChConfig.Def_MaxRateValue and not GameWorld.CanHappen(happenRate, ChConfig.Def_MaxRateValue):
        if happenRate and not GameWorld.CanHappen(happenRate, ChConfig.Def_MaxRateValue):
            GameWorld.DebugLog("    概率不触发: tagID=%s,happenRate=%s" % (tagID, happenRate))
            return
        passiveTagObjList = [tagObj]
@@ -1202,10 +1209,7 @@
    dHP, dMaxHP = defObj.GetHP(), defObj.GetMaxHP()
    dDef = 0 if ignoreDef else defObj.GetDef() # 防守方防御力
    
    atkSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddSkillPer, curSkill)
    atkSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddSkillPerByHP, curSkill)
    atkSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddSkillPerByJob, curSkill)
    atkSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddSkillPerByBuffLayer, curSkill)
    atkSkillPer += GetAddSkillPer(turnFight, atkObj, defObj, curSkill)
    
    aFinalDamPer = atkObj.GetBatAttrValue(ChConfig.AttrID_FinalDamPer) # 最终加成
    dFinalDamPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_FinalDamPerDef) # 最终减伤
@@ -1309,6 +1313,15 @@
    hurtValue = max(1, int(hurtValue)) # 负值、保底防范,放最后
    return hurtValue, hurtTypes
def GetAddSkillPer(turnFight, atkObj, defObj, curSkill):
    ## 获取额外增加的技能万分比
    atkSkillPer = 0
    atkSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddSkillPer, curSkill)
    atkSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddSkillPerByHP, curSkill)
    atkSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddSkillPerByJob, curSkill)
    atkSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddSkillPerByBuffLayer, curSkill)
    return atkSkillPer
def CanSuperHit(turnFight, atkObj, defObj, curSkill):
    if TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_MustSuperHit, curSkill):
        GameWorld.DebugLog("目标血量低于百分x时必定暴击: defID=%s,hp:%s/%s" % (defObj.GetID(), defObj.GetHP(), defObj.GetMaxHP()))
@@ -1367,17 +1380,13 @@
    if hurtValue <= 0:
        return 0, 0, hurtTypes
    
    if defObj.CheckInState(ChConfig.BatObjState_Wudi):
    buffMgr = defObj.GetBuffManager()
    wudiBuffList = buffMgr.FindBuffListByState(ChConfig.BatObjState_Wudi)
    if wudiBuffList:
        hurtTypes |= pow(2, ChConfig.HurtType_Immune) # 添加免疫
        buffMgr = defObj.GetBuffManager()
        for index in range(buffMgr.GetBuffCount()):
            buff = buffMgr.GetBuffByIndex(index)
            if not buff:
                continue
        for buff in wudiBuffList:
            skillData = buff.GetSkillData()
            if skillData.GetCurBuffState() != ChConfig.BatObjState_Wudi:
                continue
            # 记录免疫的积攒伤害
            # 记录免疫积攒的伤害
            buffValue = buff.GetValue1() + buff.GetValue2() * ChConfig.Def_PerPointValue
            updBuffValue = buffValue + hurtValue
            buff.SetValue1(updBuffValue % ChConfig.Def_PerPointValue)
@@ -1392,18 +1401,14 @@
    # 承伤盾承伤,剩余时间短的优先承伤,承伤不影响输出,相当于额外的HP,仅用于抵扣掉血,仅 改变 realHurtHP
    realHurtHP = hurtValue
    shieldBuffList = []
    buffMgr = defObj.GetBuffManager()
    for index in range(buffMgr.GetBuffCount()):
        buff = buffMgr.GetBuffByIndex(index)
    for buff in buffMgr.FindBuffListByState(ChConfig.BatObjState_DamShield):
        skillData = buff.GetSkillData()
        # 承伤盾
        if SkillCommon.isDamageShieldSkill(skillData):
            remainTime = buff.GetRemainTime() # 剩余回合
            if not skillData.GetLastTime():
                remainTime = 999 # 永久盾
            buffValue = buff.GetValue1() + buff.GetValue2() * ChConfig.Def_PerPointValue # 剩余盾值
            shieldBuffList.append([remainTime, buffValue, buff])
        remainTime = buff.GetRemainTime() # 剩余回合
        if not skillData.GetLastTime():
            remainTime = 999 # 永久盾
        buffValue = buff.GetValue1() + buff.GetValue2() * ChConfig.Def_PerPointValue # 剩余盾值
        shieldBuffList.append([remainTime, buffValue, buff])
    if shieldBuffList:
        shieldBuffList.sort()
        for _, buffValue, buff in shieldBuffList:
@@ -1430,15 +1435,24 @@
def CalcBounceHP(turnFight, atkObj, defObj, hurtObj, curSkill):
    '''计算反弹反弹伤害
    注:反伤/荆棘暂不做属性支持,仅做buff效果支持
    '''
    if not atkObj.GetCanAttack():
        return
    
    bounceHP = int(hurtObj.GetHurtHP() * random.uniform(0.1, 0.2))
    damBackPer = 0
    buffMgr = defObj.GetBuffManager()
    for buff in buffMgr.FindBuffListByState(ChConfig.BatObjState_DamBackShield):
        damBackPer += buff.GetValue1()
    if damBackPer <= 0:
        return
    bounceHP = int(hurtObj.GetHurtHP() * damBackPer / 10000.0)
    if bounceHP <= 0:
        return
    
    GameWorld.DebugLog("    反弹伤害=%s,%s/%s" % (bounceHP, atkObj.GetHP(), atkObj.GetMaxHP()))
    GameWorld.DebugLog("    反弹伤害=%s,%s/%s, damBackPer=%s" % (bounceHP, atkObj.GetHP(), atkObj.GetMaxHP(), damBackPer))
    bounceHP, realBounceHP, _ = CalcHurtHPWithBuff(turnFight, defObj, atkObj, curSkill, bounceHP)
    if bounceHP <= 0:
        GameWorld.DebugLog("        bounceHP=%s" % (bounceHP))
@@ -1487,7 +1501,7 @@
    skillPer = curSkill.GetSkillPer()
    #skillValue = curSkill.GetSkillValue()
    
    skillPer += TurnPassive.GetTriggerEffectValue(turnFight, userObj, tagObj, ChConfig.PassiveEff_AddSkillPer, curSkill)
    skillPer += GetAddSkillPer(turnFight, userObj, tagObj, curSkill)
    
    cureHP = __calcCureHP(turnFight, userObj, tagObj, curSkill, cureType, skillPer, largeNum)
    
@@ -1499,6 +1513,12 @@
        cureHPEx = __calcCureHP(turnFight, userObj, tagObj, curSkill, cureType, skillPer, largeNum)
        cureHP += cureHPEx
        
    hurtShareEff = curSkill.GetEffectByID(ChConfig.SkillEff_HurtShare)
    if hurtShareEff:
        tagCnt = max(1, len(curSkill.GetTagObjList()))
        cureHP = cureHP / tagCnt
        GameWorld.DebugLog("    目标均摊治疗: cureHP=%s,tagCnt=%s" % (cureHP, tagCnt))
    return max(1, int(cureHP)) # 保底1点
def __calcCureHP(turnFight, userObj, tagObj, curSkill, cureType, skillPer, largeNum=False):