hch
2019-04-29 9aec240e848ba4bb6b473707ad8f48aee5180141
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
@@ -1401,6 +1401,8 @@
    superHitRate = eval(ReadChConfig.GetChConfig("CalcSuperHitRate"))
    superHitRate += PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, None, 
                                                                       ChConfig.TriggerType_Buff_AddSuperHitRate)
    superHitRate += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, None,
                                                                       ChConfig.TriggerType_Buff_AddSuperHitRate)
    if superHitRate <= 0:
        return
    if GameWorld.CanHappen(superHitRate):
@@ -1672,50 +1674,9 @@
    SetFirstDefender(atkObj, defObj, curSkill)
    
    resultHurtType = HurtType()
    atkObjType = attacker.GetGameObjType()
    defObjType = defObj.GetGameObjType()
    dHP = GameObj.GetHP(defObj)                # 防守方当前血量
    dMaxHP = GameObj.GetMaxHP(defObj)          # 防守方最大血量
    # 当技能表的技能伤害百分比为0,技能伤害增加值定义为直接伤害值,不经过计算
    if atkSkillPer == 0:
        hurtValue, hurtType = int(atkSkillValue), ChConfig.Def_HurtType_Normal
        hurtValue += atkObj.GetDictByKey(ChConfig.Def_PlayerKey_MoreHurtValue)
    elif SkillShell.IsPlayerUseSkill(atkObj, curSkill) and SkillShell.isClientHurtValue(defObj.GetID(), defObjType):
        # 缓存单次攻击中的最大伤害,被动技能概率性增加伤害,此处放大最大伤害
        hurtValue = atkObj.GetDictByKey(ChConfig.Def_PlayerKey_ClientMaxHurtValue)
        if hurtValue == 0:
            #hurtValue, hurtType = CalcHurtHP(atkObj, defObj, curSkill, atkSkillValue, atkSkillPer, tick, None, True)
            # 理论伤害一致, 多加点预算伤害避免计算误差
            #hurtValue = min(ShareDefine.Def_UpperLimit_DWord, hurtValue+10)
            #atkObj.SetDict(ChConfig.Def_PlayerKey_ClientMaxHurtValue, int(hurtValue*1.2))
            hurtValue = atkObj.GetMaxAtk()*atkSkillPer*40   # 加入被动计算不准确改成估算
        clientValue, hurtType = SkillShell.GetClientHurtByObj(defObj.GetID(), defObjType)
        if clientValue <= hurtValue:
            hurtValue = clientValue
        else:
            # 外挂最高伤害基本防范
            GameWorld.DebugLog(atkObj, "%s----客户端伤害 %s 服务端最高伤害 %s"%(atkObj.GetID(), [clientValue, hurtType], hurtValue))
            hurtValue = int(hurtValue*0.8)
        #GameWorld.DebugAnswer(atkObj, "客户端伤害 %s 服务端伤害 %s"%([defObj.GetID(), clientValue, hurtType], hurtValue))
    else:
        hurtValue, hurtType = CalcHurtHP(atkObj, defObj, curSkill, atkSkillValue, atkSkillPer, tick, orgAtkObj=attacker)
    WriteHurtLog(attacker, defObj, curSkill, hurtValue, hurtType, "公式层")
    hurtValue = CalcHurtHPWithBuff(atkObj, defObj, hurtValue, curSkill, tick)
    # buff减少伤害百分比
    reducePer = PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(defObj, atkObj, None, ChConfig.TriggerType_ReduceHurtHPPer)
    # 被攻击被动技能特殊减免 受到单次伤害超过生命上限10%时候,减免50%伤害,CD10秒
    defObj.SetDict(ChConfig.Def_PlayerKey_curHurtValue, hurtValue)
    reducePer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_ReduceHurtHPPer)
    hurtValue = int(hurtValue*(max(ChConfig.Def_MaxRateValue - reducePer, 0))*1.0/ChConfig.Def_MaxRateValue)
    
    # 终极斩杀新效果,必须和斩杀严格区分,会涉及到CD概率,已经触发其他技能等问题
    if PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_ZhongjiZhansha):
@@ -1742,13 +1703,43 @@
        remainHP = 0 # 剩余血量
    else:
        # 当技能表的技能伤害百分比为0,技能伤害增加值定义为直接伤害值,不经过计算
        if atkSkillPer == 0:
            hurtValue, hurtType = int(atkSkillValue), ChConfig.Def_HurtType_Normal
            hurtValue += atkObj.GetDictByKey(ChConfig.Def_PlayerKey_MoreHurtValue)
        elif SkillShell.IsPlayerUseSkill(atkObj, curSkill) and SkillShell.isClientHurtValue(defObj.GetID(), defObjType):
            # 缓存单次攻击中的最大伤害,被动技能概率性增加伤害,此处放大最大伤害
            hurtValue = atkObj.GetDictByKey(ChConfig.Def_PlayerKey_ClientMaxHurtValue)
            if hurtValue == 0:
                #hurtValue, hurtType = CalcHurtHP(atkObj, defObj, curSkill, atkSkillValue, atkSkillPer, tick, None, True)
                # 理论伤害一致, 多加点预算伤害避免计算误差
                #hurtValue = min(ShareDefine.Def_UpperLimit_DWord, hurtValue+10)
                #atkObj.SetDict(ChConfig.Def_PlayerKey_ClientMaxHurtValue, int(hurtValue*1.2))
                hurtValue = atkObj.GetMaxAtk()*atkSkillPer*40   # 加入被动计算不准确改成估算
            clientValue, hurtType = SkillShell.GetClientHurtByObj(defObj.GetID(), defObjType)
            if clientValue <= hurtValue:
                hurtValue = clientValue
            else:
                # 外挂最高伤害基本防范
                GameWorld.DebugLog(atkObj, "%s----客户端伤害 %s 服务端最高伤害 %s"%(atkObj.GetID(), [clientValue, hurtType], hurtValue))
                hurtValue = int(hurtValue*0.8)
            #GameWorld.DebugAnswer(atkObj, "客户端伤害 %s 服务端伤害 %s"%([defObj.GetID(), clientValue, hurtType], hurtValue))
        else:
            hurtValue, hurtType = CalcHurtHP(atkObj, defObj, curSkill, atkSkillValue, atkSkillPer, tick, orgAtkObj=attacker)
        WriteHurtLog(attacker, defObj, curSkill, hurtValue, hurtType, "公式层")
        # 各种减伤 吸收盾处理
        hurtValue = CalcHurtHPWithBuff(atkObj, defObj, hurtValue, curSkill, tick)
        #伤害结构体
        resultHurtType.HurtHP = hurtValue
        resultHurtType.HurtType = hurtType
        resultHurtType.RealHurtHP = hurtValue
        
        # 血盾
        hurtValue = CalcBloodShield(atkObj, defObj, hurtValue)
        remainHP = min(dMaxHP, max(0, dHP - hurtValue)) # 剩余血量
    
    remainHP = int(remainHP)    #防范
@@ -1872,16 +1863,6 @@
    # 伤害吸收盾回血型
    buffManager = defObj.GetBuffState()
    curEffect, plusValue, skillID = BuffSkill.FindBuffEffectPlusByEffectID(buffManager, ChConfig.Def_Skill_Effect_AbsorbShieldXMZJ)
    if skillID:
        absortValue = hurtValue*curEffect.GetEffectValue(0)/ShareDefine.Def_MaxRateValue
        if absortValue:
            hurtValue -= absortValue
            findBuff = SkillCommon.FindBuffByID(defObj, skillID)[0]
            if findBuff:
                # 用于回血
                findBuff.SetValue(int(findBuff.GetValue() + absortValue))
    
    curEffect, plusValue, skillID = BuffSkill.FindBuffEffectPlusByEffectID(buffManager, ChConfig.Def_Skill_Effect_AbsorbShield)
    if skillID:
@@ -1897,15 +1878,38 @@
                    findBuff.SetRemainTime(1)
    
        
    # 天罡护法,将期间受到的伤害总值用于回血,不改变伤害
    curEffect, plusValue, skillID2 = BuffSkill.FindBuffEffectPlusByEffectID(buffManager, ChConfig.Def_Skill_Effect_StoreBlood)
    if skillID2:
    # 天罡护法,将期间受到的伤害总值用于回血,不改变伤害,暂且不用
    #===========================================================================
    # curEffect, plusValue, skillID2 = BuffSkill.FindBuffEffectPlusByEffectID(buffManager, ChConfig.Def_Skill_Effect_StoreBlood)
    # if skillID2:
    #    absortValue = hurtValue*curEffect.GetEffectValue(0)/ShareDefine.Def_MaxRateValue
    #    if absortValue:
    #        findBuff = SkillCommon.FindBuffByID(defObj, skillID2)[0]
    #        if findBuff:
    #            # 用于回血
    #            findBuff.SetValue(int(findBuff.GetValue() + absortValue))
    #===========================================================================
    curEffect, plusValue, skillID = BuffSkill.FindBuffEffectPlusByEffectID(buffManager, ChConfig.Def_Skill_Effect_AbsorbShieldXMZJ)
    if skillID:
        absortValue = hurtValue*curEffect.GetEffectValue(0)/ShareDefine.Def_MaxRateValue
        if absortValue:
            findBuff = SkillCommon.FindBuffByID(defObj, skillID2)[0]
            hurtValue -= absortValue
            findBuff = SkillCommon.FindBuffByID(defObj, skillID)[0]
            if findBuff:
                # 用于回血
                findBuff.SetValue(int(findBuff.GetValue() + absortValue))
    # buff减少伤害百分比
    reducePer = PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(defObj, atkObj, None, ChConfig.TriggerType_ReduceHurtHPPer)
    # 被攻击被动技能特殊减免 受到单次伤害超过生命上限10%时候,减免50%伤害,CD10秒
    defObj.SetDict(ChConfig.Def_PlayerKey_curHurtValue, hurtValue)
    reducePer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_ReduceHurtHPPer)
    hurtValue = int(hurtValue*(max(ChConfig.Def_MaxRateValue - reducePer, 0))*1.0/ChConfig.Def_MaxRateValue)
    hurtValue = CalcBloodShield(atkObj, defObj, hurtValue)
    return hurtValue
@@ -1942,7 +1946,7 @@
                        msg, attackerID, attackerName, defenderID, defenderName,
                        skillID, skillName, hurtValue, hurtType))
# 血盾支持多个同时存在
# 血盾支持多个同时存在, 反弹也会被吸收
def CalcBloodShield(atkObj, defObj, hurtValue):
    # 伤害值用于血盾抵消
    defObj.SetDict(ChConfig.Def_PlayerKey_BloodShiledHurt, hurtValue)
@@ -1955,9 +1959,11 @@
# 计算攻击伤害
# maxHurt参数用于模拟计算最大伤害,防范客户端攻击伤害过高
def CalcHurtHP(atkObj, defObj, curSkill, atkSkillValue, atkSkillPer, tick, happenState=None, **atkwargs):
    # 翻滚闪避特殊处理
    if tick - defObj.GetDictByKey(ChConfig.Def_PlayerKey_SomersaultTime) < 500:
        return 0, ChConfig.Def_HurtType_Miss
    #===========================================================================
    # # 翻滚闪避特殊处理
    # if tick - defObj.GetDictByKey(ChConfig.Def_PlayerKey_SomersaultTime) < 500:
    #    return 0, ChConfig.Def_HurtType_Miss
    #===========================================================================
    
    summonAtkPer = 1    # 召唤继承提高基础攻击力,取表
    summonAtkObj = atkwargs.get('orgAtkObj', None) if atkwargs.get('orgAtkObj', None) else atkObj
@@ -2107,8 +2113,10 @@
            
    #  atkSkillPer 包含普攻,所以不是用技能增强处理
    atkSkillPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AttackAddSkillPer)
    atkSkillPer += PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AttackAddSkillPer)
    if hurtType == ChConfig.Def_HurtType_SuperHit:
        atkSkillPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_SuperHitAddSkillPer)
    
    if isSuperHit:
        addASuperHit = PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_SuperHitValue)
@@ -2271,7 +2279,14 @@
    if hurtFormulaKey not in hurtDist:
        GameWorld.ErrLog("CalcAttackValue.txt 伤害公式未配置, key=%s" % (hurtFormulaKey))
        return 0, ChConfig.Def_HurtType_Miss
    hurtFormula = hurtDist[hurtFormulaKey]
    if atkwargs.get('hurtFormulaKey', None):
        # 指定公式
        aBurnValue = atkwargs.get('burnValue', 0)
        aBurnPer = atkwargs.get('burnPer', 0)
        hurtFormula = hurtDist[atkwargs.get('hurtFormulaKey', None)]
    else:
        hurtFormula = hurtDist[hurtFormulaKey]
    hurtValue = int(eval(FormulaControl.GetCompileFormula(hurtFormulaKey, hurtFormula)))
    if hurtType == ChConfig.Def_HurtType_Normal and SuppressValueRealmRate > 10000:
@@ -2334,7 +2349,7 @@
    #反弹伤害
    CalcBounceHP(atkObj, defObj, resultHurtType.LostHP, resultHurtType.HurtType, curSkill)
    #吸血
    CalcSuckBlood(atkObj, defObj, curSkill, resultHurtType.RealHurtHP, tick)
    CalcSuckBlood(atkObj, defObj, curSkill, resultHurtType, tick)
        
    if atkObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
        # 记录最后一次伤害值
@@ -2466,10 +2481,12 @@
#  @param atkObj 攻击者
#  @param defObj 防守者
#  @return None
def CalcSuckBlood(atkObj, defObj, curSkill, hurtValue, tick):
def CalcSuckBlood(atkObj, defObj, curSkill, resultHurtType, tick):
    if atkObj.GetGameObjType() != IPY_GameWorld.gotPlayer:
        return
    hurtValue, hurtType = resultHurtType.RealHurtHP, resultHurtType.HurtType,
    if not hurtValue:
        return
    
@@ -2495,6 +2512,9 @@
        atkBackHPPer = PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_Buff_SuckBloodPer)
        atkBackHPPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_Buff_SuckBloodPer)
        
        if hurtType == ChConfig.Def_HurtType_SuperHit:
            atkBackHPPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_SuperHitSuckBloodPer)
        atkBackHP += int(hurtValue * atkBackHPPer*1.0 / ChConfig.Def_MaxRateValue)
        
    suckHP += atkBackHP