diff --git a/Source/Game/Entities/StatSystem.cs b/Source/Game/Entities/StatSystem.cs index 670a4d6a3..9706db9cd 100644 --- a/Source/Game/Entities/StatSystem.cs +++ b/Source/Game/Entities/StatSystem.cs @@ -779,10 +779,13 @@ namespace Game.Entities else chance += victim.GetTotalAuraModifier(AuraType.ModAttackerMeleeCritChance); - chance += victim.GetTotalAuraModifier(AuraType.ModCritChanceForCaster, aurEff => - { - return aurEff.GetCasterGUID() == GetGUID(); - }); + chance += GetTotalAuraModifier(AuraType.ModCritChanceVersusTargetHealth, aurEff => !victim.HealthBelowPct(aurEff.GetMiscValueB())); + + chance += victim.GetTotalAuraModifier(AuraType.ModCritChanceForCaster, aurEff => aurEff.GetCasterGUID() == GetGUID()); + + TempSummon tempSummon = ToTempSummon(); + if (tempSummon) + chance += victim.GetTotalAuraModifier(AuraType.ModCritChanceForCasterPet, aurEff => aurEff.GetCasterGUID() == tempSummon.GetSummonerGUID()); chance += victim.GetTotalAuraModifier(AuraType.ModAttackerSpellAndWeaponCritChance); diff --git a/Source/Game/Entities/Unit/Unit.Spells.cs b/Source/Game/Entities/Unit/Unit.Spells.cs index 3b38108a2..d155a64c6 100644 --- a/Source/Game/Entities/Unit/Unit.Spells.cs +++ b/Source/Game/Entities/Unit/Unit.Spells.cs @@ -595,6 +595,18 @@ namespace Game.Entities TakenTotal += (int)(TakenAdvertisedBenefit * coeff * stack); } + if (damagetype == DamageEffectType.DOT) + { + // Healing over time taken percent + float minval_hot = (float)GetMaxNegativeAuraModifier(AuraType.ModHotPct); + if (minval_hot != 0) + MathFunctions.AddPct(ref TakenTotalMod, minval_hot); + + float maxval_hot = (float)GetMaxPositiveAuraModifier(AuraType.ModHotPct); + if (maxval_hot != 0) + MathFunctions.AddPct(ref TakenTotalMod, maxval_hot); + } + TakenTotalMod *= GetTotalAuraMultiplier(AuraType.ModHealingReceived, aurEff => { if (caster.GetGUID() == aurEff.GetCasterGUID() && aurEff.IsAffectingSpell(spellProto)) @@ -745,14 +757,15 @@ namespace Game.Entities // for this types the bonus was already added in GetUnitCriticalChance, do not add twice if (spellProto.DmgClass != SpellDmgClass.Melee && spellProto.DmgClass != SpellDmgClass.Ranged) { - crit_chance += victim.GetTotalAuraModifier(AuraType.ModCritChanceForCasterWithAbilities, aurEff => - { - return aurEff.GetCasterGUID() == GetGUID() && aurEff.IsAffectingSpell(spellProto); - }); - crit_chance += victim.GetTotalAuraModifier(AuraType.ModCritChanceForCaster, aurEff => - { - return aurEff.GetCasterGUID() != GetGUID(); - }); + crit_chance += victim.GetTotalAuraModifier(AuraType.ModCritChanceForCasterWithAbilities, aurEff => aurEff.GetCasterGUID() == GetGUID() && aurEff.IsAffectingSpell(spellProto)); + + crit_chance += victim.GetTotalAuraModifier(AuraType.ModCritChanceForCaster, aurEff => aurEff.GetCasterGUID() != GetGUID()); + + crit_chance += GetTotalAuraModifier(AuraType.ModCritChanceVersusTargetHealth, aurEff => !victim.HealthBelowPct(aurEff.GetMiscValueB())); + + TempSummon tempSummon = ToTempSummon(); + if (tempSummon != null) + crit_chance += victim.GetTotalAuraModifier(AuraType.ModCritChanceForCasterPet, aurEff => aurEff.GetCasterGUID() == tempSummon.GetSummonerGUID()); } return Math.Max(crit_chance, 0.0f);