diff --git a/common/spdat.h b/common/spdat.h index 32ed30ce2..0fe8bd3cd 100644 --- a/common/spdat.h +++ b/common/spdat.h @@ -861,7 +861,7 @@ typedef enum { //#define SE_Attack_Accuracy_Max_Percent 518 // //#define SE_Luck_Amount 519 // //#define SE_Luck_Percent 520 // -//#define SE_Endurance_Absorb_Pct_Damage 521 // +#define SE_Endurance_Absorb_Pct_Damage 521 // #define SE_Instant_Mana_Pct 522 // #define SE_Instant_Endurance_Pct 523 // #define SE_Duration_HP_Pct 524 // diff --git a/zone/attack.cpp b/zone/attack.cpp index d7450c341..8b0def2bc 100644 --- a/zone/attack.cpp +++ b/zone/attack.cpp @@ -3323,8 +3323,8 @@ int32 Mob::ReduceAllDamage(int32 damage) if (damage <= 0) return damage; - if (spellbonuses.ManaAbsorbPercentDamage[0]) { - int32 mana_reduced = damage * spellbonuses.ManaAbsorbPercentDamage[0] / 100; + if (spellbonuses.ManaAbsorbPercentDamage) { + int32 mana_reduced = damage * spellbonuses.ManaAbsorbPercentDamage / 100; if (GetMana() >= mana_reduced) { damage -= mana_reduced; SetMana(GetMana() - mana_reduced); @@ -3332,6 +3332,19 @@ int32 Mob::ReduceAllDamage(int32 damage) } } + if (spellbonuses.EnduranceAbsorbPercentDamage[0]) { + int32 damage_reduced = damage * spellbonuses.EnduranceAbsorbPercentDamage[0] / 10000; + int32 endurance_drain = damage_reduced * spellbonuses.EnduranceAbsorbPercentDamage[1] / 10000; + if (endurance_drain < 1) + endurance_drain = 1; + + if (IsClient() && CastToClient()->GetEndurance() >= endurance_drain) { + damage -= damage_reduced; + CastToClient()->SetEndurance(CastToClient()->GetEndurance() - endurance_drain); + TryTriggerOnValueAmount(false, false, true); + } + } + CheckNumHitsRemaining(NumHit::IncomingDamage); return(damage); diff --git a/zone/bonuses.cpp b/zone/bonuses.cpp index 0c25c5b92..2be2bd39c 100644 --- a/zone/bonuses.cpp +++ b/zone/bonuses.cpp @@ -2692,9 +2692,17 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne case SE_ManaAbsorbPercentDamage: { - if (new_bonus->ManaAbsorbPercentDamage[0] < effect_value){ - new_bonus->ManaAbsorbPercentDamage[0] = effect_value; - new_bonus->ManaAbsorbPercentDamage[1] = buffslot; + if (new_bonus->ManaAbsorbPercentDamage < effect_value){ + new_bonus->ManaAbsorbPercentDamage = effect_value; + } + break; + } + + case SE_Endurance_Absorb_Pct_Damage: + { + if (new_bonus->EnduranceAbsorbPercentDamage[0] < effect_value) { + new_bonus->EnduranceAbsorbPercentDamage[0] = effect_value; + new_bonus->EnduranceAbsorbPercentDamage[1] = base2; } break; } @@ -4356,8 +4364,12 @@ void Mob::NegateSpellsBonuses(uint16 spell_id) break; case SE_ManaAbsorbPercentDamage: - spellbonuses.ManaAbsorbPercentDamage[0] = effect_value; - spellbonuses.ManaAbsorbPercentDamage[1] = -1; + spellbonuses.ManaAbsorbPercentDamage = effect_value; + break; + + case SE_Endurance_Absorb_Pct_Damage: + spellbonuses.EnduranceAbsorbPercentDamage[0] = effect_value; + spellbonuses.EnduranceAbsorbPercentDamage[1] = effect_value; break; case SE_ShieldBlock: diff --git a/zone/common.h b/zone/common.h index fd513bdde..e1c6b1787 100644 --- a/zone/common.h +++ b/zone/common.h @@ -494,7 +494,8 @@ struct StatBonuses { uint32 MitigateDotRune[4]; // 0 = Mitigation value 1 = Buff Slot 2 = Max mitigation per tick 3 = Rune Amt bool TriggerMeleeThreshold; // Has Melee Threshhold bool TriggerSpellThreshold; // Has Spell Threshhold - uint32 ManaAbsorbPercentDamage[2]; // 0 = Mitigation value 1 = Buff Slot + uint32 ManaAbsorbPercentDamage; // 0 = Mitigation value + int32 EnduranceAbsorbPercentDamage[2]; // 0 = Mitigation value 1 = Percent Endurance drain per HP lost int32 ShieldBlock; // Chance to Shield Block int32 BlockBehind; // Chance to Block Behind (with our without shield) bool CriticalRegenDecay; // increase critical regen chance, decays based on spell level cast diff --git a/zone/lua_stat_bonuses.cpp b/zone/lua_stat_bonuses.cpp index d311cf123..b6561199b 100644 --- a/zone/lua_stat_bonuses.cpp +++ b/zone/lua_stat_bonuses.cpp @@ -1162,7 +1162,7 @@ uint32 Lua_StatBonuses::GetMitigateDotRune(int idx) const { uint32 Lua_StatBonuses::GetManaAbsorbPercentDamage(int idx) const { Lua_Safe_Call_Int(); - return self->ManaAbsorbPercentDamage[idx]; + return self->ManaAbsorbPercentDamage; } int32 Lua_StatBonuses::GetImprovedTaunt(int idx) const {