Implemented: SPA 521 EndAbsorbPctDmg

Implemented
SE_Endurance_Absorb_Pct_Damage 521

Absorb Damage using Endurance: base1 % (base2 End per 1 HP)
Note: Both base1 and base2 need to be divided by 100 for actually value
This commit is contained in:
KayenEQ
2021-07-09 20:01:21 -04:00
parent dace6ebe47
commit d286a34fb6
5 changed files with 36 additions and 10 deletions
+1 -1
View File
@@ -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 //
+15 -2
View File
@@ -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);
+17 -5
View File
@@ -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:
+2 -1
View File
@@ -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
+1 -1
View File
@@ -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 {