Core/Auras: Corrected aura types and attributes used for absorb value calculation

Signed-off-by: luis <[email protected]>
This commit is contained in:
Shauren
2026-02-04 21:26:36 -03:00
committed by luis
parent b8bf2f48b7
commit f5da2170d9
5 changed files with 154 additions and 64 deletions
+7 -49
View File
@@ -7636,8 +7636,7 @@ int32 Unit::SpellAbsorbBonusDone(Unit* victim, SpellInfo const* spellProto, int3
return owner->SpellAbsorbBonusDone(victim, spellProto, absorbamount, spellEffectInfo, stack, aurEff);
if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS)
|| spellProto->HasAttribute(SPELL_ATTR6_IGNORE_HEALING_MODIFIERS)
|| spellProto->HasAttribute(SPELL_ATTR9_IGNORE_CASTER_HEALING_MODIFIERS))
|| spellProto->HasAttribute(SPELL_ATTR11_IGNORE_CASTER_ABSORB_MODIFIERS))
return absorbamount;
int32 doneTotal = 0;
@@ -7707,64 +7706,23 @@ float Unit::SpellAbsorbPctDone(Unit* victim, SpellInfo const* spellProto) const
if (Player* modOwner = GetSpellModOwner())
AddPct(doneTotalMod, modOwner->GetRatingBonusValue(CR_VERSATILITY_DAMAGE_DONE) + modOwner->GetTotalAuraModifier(SPELL_AURA_MOD_VERSATILITY));
if (Player const* thisPlayer = ToPlayer())
{
float maxModHealingPercentSchool = 0.f;
for (uint32 i = 0; i < MAX_SPELL_SCHOOL; ++i)
if (spellProto->GetSchoolMask() & (1 << i))
maxModHealingPercentSchool = std::max(maxModHealingPercentSchool, thisPlayer->m_activePlayerData->ModHealingDonePercent[i]);
doneTotalMod *= maxModHealingPercentSchool;
}
else
doneTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_HEALING_DONE_PERCENT);
doneTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_ABSORB_DONE_PCT);
return doneTotalMod;
}
int32 Unit::SpellAbsorbBonusTaken(Unit* caster, SpellInfo const* spellProto, int32 absorbamount) const
int32 Unit::SpellAbsorbBonusTaken(Unit* /*caster*/, SpellInfo const* spellProto, int32 absorbamount) const
{
bool allowPositive = !spellProto->HasAttribute(SPELL_ATTR6_IGNORE_HEALING_MODIFIERS);
bool allowNegative = !spellProto->HasAttribute(SPELL_ATTR6_IGNORE_HEALING_MODIFIERS) || spellProto->HasAttribute(SPELL_ATTR13_ALWAYS_ALLOW_NEGATIVE_HEALING_PERCENT_MODIFIERS);
if (!allowPositive && !allowNegative)
if (spellProto->HasAttribute(SPELL_ATTR11_IGNORE_TARGET_ABSORB_MODIFIERS))
return absorbamount;
int32 doneTotal = 0;
float takenTotalMod = 1.f;
if (allowNegative)
{
float minval = float(GetMaxNegativeAuraModifier(SPELL_AURA_MOD_HEALING_PCT));
if (minval)
AddPct(takenTotalMod, minval);
}
takenTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_ABSORB_TAKEN_PCT);
if (allowPositive)
{
float maxval = float(GetMaxPositiveAuraModifier(SPELL_AURA_MOD_HEALING_PCT));
if (maxval)
AddPct(takenTotalMod, maxval);
}
float absorb = float(absorbamount + doneTotal) * takenTotalMod;
if (caster)
{
takenTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_HEALING_RECEIVED, [caster, spellProto, allowPositive, allowNegative](AuraEffect const* aurEff)
{
if (caster->GetGUID() != aurEff->GetCasterGUID() || !aurEff->IsAffectingSpell(spellProto))
return false;
if (aurEff->GetAmount() > 0)
{
if (!allowPositive)
return false;
}
else if (!allowNegative)
return false;
return true;
});
}
float absorb = absorbamount * takenTotalMod;
return static_cast<int32>(std::round(absorb));
}
@@ -859,8 +859,8 @@ enum SpellAttr11 : uint32
SPELL_ATTR11_UNK15 = 0x00008000, // TITLE Unknown attribute 15@Attr11
SPELL_ATTR11_NOT_USABLE_IN_CHALLENGE_MODE = 0x00010000, // TITLE Not in Mythic+ Mode (Challenge Mode)
SPELL_ATTR11_UNK17 = 0x00020000, // TITLE Unknown attribute 17@Attr11
SPELL_ATTR11_UNK18 = 0x00040000, // TITLE Unknown attribute 18@Attr11
SPELL_ATTR11_UNK19 = 0x00080000, // TITLE Unknown attribute 19@Attr11
SPELL_ATTR11_IGNORE_CASTER_ABSORB_MODIFIERS = 0x00040000, // TITLE Ignore Caster Absorb Modifiers
SPELL_ATTR11_IGNORE_TARGET_ABSORB_MODIFIERS = 0x00080000, // TITLE Ignore Target Absorb Modifiers
SPELL_ATTR11_UNK20 = 0x00100000, // TITLE Unknown attribute 20@Attr11
SPELL_ATTR11_UNK21 = 0x00200000, // TITLE Unknown attribute 21@Attr11
SPELL_ATTR11_UNK22 = 0x00400000, // TITLE Unknown attribute 22@Attr11
@@ -1714,8 +1714,8 @@ TC_API_EXPORT EnumText EnumUtils<SpellAttr11>::ToString(SpellAttr11 value)
case SPELL_ATTR11_UNK15: return { "SPELL_ATTR11_UNK15", "Unknown attribute 15@Attr11", "" };
case SPELL_ATTR11_NOT_USABLE_IN_CHALLENGE_MODE: return { "SPELL_ATTR11_NOT_USABLE_IN_CHALLENGE_MODE", "Not in Mythic+ Mode (Challenge Mode)", "" };
case SPELL_ATTR11_UNK17: return { "SPELL_ATTR11_UNK17", "Unknown attribute 17@Attr11", "" };
case SPELL_ATTR11_UNK18: return { "SPELL_ATTR11_UNK18", "Unknown attribute 18@Attr11", "" };
case SPELL_ATTR11_UNK19: return { "SPELL_ATTR11_UNK19", "Unknown attribute 19@Attr11", "" };
case SPELL_ATTR11_IGNORE_CASTER_ABSORB_MODIFIERS: return { "SPELL_ATTR11_IGNORE_CASTER_ABSORB_MODIFIERS", "Ignore Caster Absorb Modifiers", "" };
case SPELL_ATTR11_IGNORE_TARGET_ABSORB_MODIFIERS: return { "SPELL_ATTR11_IGNORE_TARGET_ABSORB_MODIFIERS", "Ignore Target Absorb Modifiers", "" };
case SPELL_ATTR11_UNK20: return { "SPELL_ATTR11_UNK20", "Unknown attribute 20@Attr11", "" };
case SPELL_ATTR11_UNK21: return { "SPELL_ATTR11_UNK21", "Unknown attribute 21@Attr11", "" };
case SPELL_ATTR11_UNK22: return { "SPELL_ATTR11_UNK22", "Unknown attribute 22@Attr11", "" };
@@ -1758,8 +1758,8 @@ TC_API_EXPORT SpellAttr11 EnumUtils<SpellAttr11>::FromIndex(size_t index)
case 15: return SPELL_ATTR11_UNK15;
case 16: return SPELL_ATTR11_NOT_USABLE_IN_CHALLENGE_MODE;
case 17: return SPELL_ATTR11_UNK17;
case 18: return SPELL_ATTR11_UNK18;
case 19: return SPELL_ATTR11_UNK19;
case 18: return SPELL_ATTR11_IGNORE_CASTER_ABSORB_MODIFIERS;
case 19: return SPELL_ATTR11_IGNORE_TARGET_ABSORB_MODIFIERS;
case 20: return SPELL_ATTR11_UNK20;
case 21: return SPELL_ATTR11_UNK21;
case 22: return SPELL_ATTR11_UNK22;
@@ -1799,8 +1799,8 @@ TC_API_EXPORT size_t EnumUtils<SpellAttr11>::ToIndex(SpellAttr11 value)
case SPELL_ATTR11_UNK15: return 15;
case SPELL_ATTR11_NOT_USABLE_IN_CHALLENGE_MODE: return 16;
case SPELL_ATTR11_UNK17: return 17;
case SPELL_ATTR11_UNK18: return 18;
case SPELL_ATTR11_UNK19: return 19;
case SPELL_ATTR11_IGNORE_CASTER_ABSORB_MODIFIERS: return 18;
case SPELL_ATTR11_IGNORE_TARGET_ABSORB_MODIFIERS: return 19;
case SPELL_ATTR11_UNK20: return 20;
case SPELL_ATTR11_UNK21: return 21;
case SPELL_ATTR11_UNK22: return 22;
@@ -2333,6 +2333,135 @@ TC_API_EXPORT size_t EnumUtils<SpellAttr15>::ToIndex(SpellAttr15 value)
}
}
/*******************************************************************\
|* data for enum 'SpellAttr16' in 'SharedDefines.h' auto-generated *|
\*******************************************************************/
template <>
TC_API_EXPORT EnumText EnumUtils<SpellAttr16>::ToString(SpellAttr16 value)
{
switch (value)
{
case SPELL_ATTR16_UNK0: return { "SPELL_ATTR16_UNK0", "Unknown attribute 0@Attr16", "" };
case SPELL_ATTR16_UNK1: return { "SPELL_ATTR16_UNK1", "Unknown attribute 1@Attr16", "" };
case SPELL_ATTR16_UNK2: return { "SPELL_ATTR16_UNK2", "Unknown attribute 2@Attr16", "" };
case SPELL_ATTR16_UNK3: return { "SPELL_ATTR16_UNK3", "Unknown attribute 3@Attr16", "" };
case SPELL_ATTR16_UNK4: return { "SPELL_ATTR16_UNK4", "Unknown attribute 4@Attr16", "" };
case SPELL_ATTR16_UNK5: return { "SPELL_ATTR16_UNK5", "Unknown attribute 5@Attr16", "" };
case SPELL_ATTR16_UNK6: return { "SPELL_ATTR16_UNK6", "Unknown attribute 6@Attr16", "" };
case SPELL_ATTR16_UNK7: return { "SPELL_ATTR16_UNK7", "Unknown attribute 7@Attr16", "" };
case SPELL_ATTR16_UNK8: return { "SPELL_ATTR16_UNK8", "Unknown attribute 8@Attr16", "" };
case SPELL_ATTR16_UNK9: return { "SPELL_ATTR16_UNK9", "Unknown attribute 9@Attr16", "" };
case SPELL_ATTR16_UNK10: return { "SPELL_ATTR16_UNK10", "Unknown attribute 10@Attr16", "" };
case SPELL_ATTR16_UNK11: return { "SPELL_ATTR16_UNK11", "Unknown attribute 11@Attr16", "" };
case SPELL_ATTR16_UNK12: return { "SPELL_ATTR16_UNK12", "Unknown attribute 12@Attr16", "" };
case SPELL_ATTR16_UNK13: return { "SPELL_ATTR16_UNK13", "Unknown attribute 13@Attr16", "" };
case SPELL_ATTR16_UNK14: return { "SPELL_ATTR16_UNK14", "Unknown attribute 14@Attr16", "" };
case SPELL_ATTR16_UNK15: return { "SPELL_ATTR16_UNK15", "Unknown attribute 15@Attr16", "" };
case SPELL_ATTR16_UNK16: return { "SPELL_ATTR16_UNK16", "Unknown attribute 16@Attr16", "" };
case SPELL_ATTR16_UNK17: return { "SPELL_ATTR16_UNK17", "Unknown attribute 17@Attr16", "" };
case SPELL_ATTR16_UNK18: return { "SPELL_ATTR16_UNK18", "Unknown attribute 18@Attr16", "" };
case SPELL_ATTR16_UNK19: return { "SPELL_ATTR16_UNK19", "Unknown attribute 19@Attr16", "" };
case SPELL_ATTR16_UNK20: return { "SPELL_ATTR16_UNK20", "Unknown attribute 20@Attr16", "" };
case SPELL_ATTR16_UNK21: return { "SPELL_ATTR16_UNK21", "Unknown attribute 21@Attr16", "" };
case SPELL_ATTR16_UNK22: return { "SPELL_ATTR16_UNK22", "Unknown attribute 22@Attr16", "" };
case SPELL_ATTR16_UNK23: return { "SPELL_ATTR16_UNK23", "Unknown attribute 23@Attr16", "" };
case SPELL_ATTR16_UNK24: return { "SPELL_ATTR16_UNK24", "Unknown attribute 24@Attr16", "" };
case SPELL_ATTR16_UNK25: return { "SPELL_ATTR16_UNK25", "Unknown attribute 25@Attr16", "" };
case SPELL_ATTR16_UNK26: return { "SPELL_ATTR16_UNK26", "Unknown attribute 26@Attr16", "" };
case SPELL_ATTR16_UNK27: return { "SPELL_ATTR16_UNK27", "Unknown attribute 27@Attr16", "" };
case SPELL_ATTR16_UNK28: return { "SPELL_ATTR16_UNK28", "Unknown attribute 28@Attr16", "" };
case SPELL_ATTR16_UNK29: return { "SPELL_ATTR16_UNK29", "Unknown attribute 29@Attr16", "" };
case SPELL_ATTR16_UNK30: return { "SPELL_ATTR16_UNK30", "Unknown attribute 30@Attr16", "" };
case SPELL_ATTR16_UNK31: return { "SPELL_ATTR16_UNK31", "Unknown attribute 31@Attr16", "" };
default: throw std::out_of_range("value");
}
}
template <>
TC_API_EXPORT size_t EnumUtils<SpellAttr16>::Count() { return 32; }
template <>
TC_API_EXPORT SpellAttr16 EnumUtils<SpellAttr16>::FromIndex(size_t index)
{
switch (index)
{
case 0: return SPELL_ATTR16_UNK0;
case 1: return SPELL_ATTR16_UNK1;
case 2: return SPELL_ATTR16_UNK2;
case 3: return SPELL_ATTR16_UNK3;
case 4: return SPELL_ATTR16_UNK4;
case 5: return SPELL_ATTR16_UNK5;
case 6: return SPELL_ATTR16_UNK6;
case 7: return SPELL_ATTR16_UNK7;
case 8: return SPELL_ATTR16_UNK8;
case 9: return SPELL_ATTR16_UNK9;
case 10: return SPELL_ATTR16_UNK10;
case 11: return SPELL_ATTR16_UNK11;
case 12: return SPELL_ATTR16_UNK12;
case 13: return SPELL_ATTR16_UNK13;
case 14: return SPELL_ATTR16_UNK14;
case 15: return SPELL_ATTR16_UNK15;
case 16: return SPELL_ATTR16_UNK16;
case 17: return SPELL_ATTR16_UNK17;
case 18: return SPELL_ATTR16_UNK18;
case 19: return SPELL_ATTR16_UNK19;
case 20: return SPELL_ATTR16_UNK20;
case 21: return SPELL_ATTR16_UNK21;
case 22: return SPELL_ATTR16_UNK22;
case 23: return SPELL_ATTR16_UNK23;
case 24: return SPELL_ATTR16_UNK24;
case 25: return SPELL_ATTR16_UNK25;
case 26: return SPELL_ATTR16_UNK26;
case 27: return SPELL_ATTR16_UNK27;
case 28: return SPELL_ATTR16_UNK28;
case 29: return SPELL_ATTR16_UNK29;
case 30: return SPELL_ATTR16_UNK30;
case 31: return SPELL_ATTR16_UNK31;
default: throw std::out_of_range("index");
}
}
template <>
TC_API_EXPORT size_t EnumUtils<SpellAttr16>::ToIndex(SpellAttr16 value)
{
switch (value)
{
case SPELL_ATTR16_UNK0: return 0;
case SPELL_ATTR16_UNK1: return 1;
case SPELL_ATTR16_UNK2: return 2;
case SPELL_ATTR16_UNK3: return 3;
case SPELL_ATTR16_UNK4: return 4;
case SPELL_ATTR16_UNK5: return 5;
case SPELL_ATTR16_UNK6: return 6;
case SPELL_ATTR16_UNK7: return 7;
case SPELL_ATTR16_UNK8: return 8;
case SPELL_ATTR16_UNK9: return 9;
case SPELL_ATTR16_UNK10: return 10;
case SPELL_ATTR16_UNK11: return 11;
case SPELL_ATTR16_UNK12: return 12;
case SPELL_ATTR16_UNK13: return 13;
case SPELL_ATTR16_UNK14: return 14;
case SPELL_ATTR16_UNK15: return 15;
case SPELL_ATTR16_UNK16: return 16;
case SPELL_ATTR16_UNK17: return 17;
case SPELL_ATTR16_UNK18: return 18;
case SPELL_ATTR16_UNK19: return 19;
case SPELL_ATTR16_UNK20: return 20;
case SPELL_ATTR16_UNK21: return 21;
case SPELL_ATTR16_UNK22: return 22;
case SPELL_ATTR16_UNK23: return 23;
case SPELL_ATTR16_UNK24: return 24;
case SPELL_ATTR16_UNK25: return 25;
case SPELL_ATTR16_UNK26: return 26;
case SPELL_ATTR16_UNK27: return 27;
case SPELL_ATTR16_UNK28: return 28;
case SPELL_ATTR16_UNK29: return 29;
case SPELL_ATTR16_UNK30: return 30;
case SPELL_ATTR16_UNK31: return 31;
default: throw std::out_of_range("value");
}
}
/***********************************************************************\
|* data for enum 'SpellCastResult' in 'SharedDefines.h' auto-generated *|
\***********************************************************************/
@@ -2664,13 +2793,14 @@ TC_API_EXPORT EnumText EnumUtils<SpellCastResult>::ToString(SpellCastResult valu
case SPELL_FAILED_ITEM_MOD_APPEARANCE_GROUP_ALREADY_KNOWN: return { "SPELL_FAILED_ITEM_MOD_APPEARANCE_GROUP_ALREADY_KNOWN", "SPELL_FAILED_ITEM_MOD_APPEARANCE_GROUP_ALREADY_KNOWN", "" };
case SPELL_FAILED_ITEM_CREATION_DISABLED_FOR_EVENT: return { "SPELL_FAILED_ITEM_CREATION_DISABLED_FOR_EVENT", "SPELL_FAILED_ITEM_CREATION_DISABLED_FOR_EVENT", "" };
case SPELL_FAILED_WARBAND_SCENE_ALREADY_KNOWN: return { "SPELL_FAILED_WARBAND_SCENE_ALREADY_KNOWN", "SPELL_FAILED_WARBAND_SCENE_ALREADY_KNOWN", "" };
case SPELL_FAILED_TRANSMOG_OUTFIT_ALREADY_KNOWN: return { "SPELL_FAILED_TRANSMOG_OUTFIT_ALREADY_KNOWN", "SPELL_FAILED_TRANSMOG_OUTFIT_ALREADY_KNOWN", "" };
case SPELL_FAILED_UNKNOWN: return { "SPELL_FAILED_UNKNOWN", "SPELL_FAILED_UNKNOWN", "" };
default: throw std::out_of_range("value");
}
}
template <>
TC_API_EXPORT size_t EnumUtils<SpellCastResult>::Count() { return 324; }
TC_API_EXPORT size_t EnumUtils<SpellCastResult>::Count() { return 325; }
template <>
TC_API_EXPORT SpellCastResult EnumUtils<SpellCastResult>::FromIndex(size_t index)
@@ -3000,7 +3130,8 @@ TC_API_EXPORT SpellCastResult EnumUtils<SpellCastResult>::FromIndex(size_t index
case 320: return SPELL_FAILED_ITEM_MOD_APPEARANCE_GROUP_ALREADY_KNOWN;
case 321: return SPELL_FAILED_ITEM_CREATION_DISABLED_FOR_EVENT;
case 322: return SPELL_FAILED_WARBAND_SCENE_ALREADY_KNOWN;
case 323: return SPELL_FAILED_UNKNOWN;
case 323: return SPELL_FAILED_TRANSMOG_OUTFIT_ALREADY_KNOWN;
case 324: return SPELL_FAILED_UNKNOWN;
default: throw std::out_of_range("index");
}
}
@@ -3333,7 +3464,8 @@ TC_API_EXPORT size_t EnumUtils<SpellCastResult>::ToIndex(SpellCastResult value)
case SPELL_FAILED_ITEM_MOD_APPEARANCE_GROUP_ALREADY_KNOWN: return 320;
case SPELL_FAILED_ITEM_CREATION_DISABLED_FOR_EVENT: return 321;
case SPELL_FAILED_WARBAND_SCENE_ALREADY_KNOWN: return 322;
case SPELL_FAILED_UNKNOWN: return 323;
case SPELL_FAILED_TRANSMOG_OUTFIT_ALREADY_KNOWN: return 323;
case SPELL_FAILED_UNKNOWN: return 324;
default: throw std::out_of_range("value");
}
}
@@ -505,8 +505,8 @@ enum AuraType : uint32
SPELL_AURA_MOD_MAX_POWER = 418,
SPELL_AURA_MOD_BASE_MANA_PCT = 419,
SPELL_AURA_MOD_BATTLE_PET_XP_PCT = 420,
SPELL_AURA_MOD_ABSORB_EFFECTS_DONE_PCT = 421, // NYI
SPELL_AURA_MOD_ABSORB_EFFECTS_TAKEN_PCT = 422, // NYI
SPELL_AURA_MOD_ABSORB_DONE_PCT = 421,
SPELL_AURA_MOD_ABSORB_TAKEN_PCT = 422,
SPELL_AURA_MOD_MANA_COST_PCT = 423,
SPELL_AURA_CASTER_IGNORE_LOS = 424, // NYI
SPELL_AURA_425 = 425,
@@ -490,8 +490,8 @@ NonDefaultConstructible<pAuraEffectHandler> AuraEffectHandler[TOTAL_AURAS]=
&AuraEffect::HandleAuraModMaxPower, //418 SPELL_AURA_MOD_MAX_POWER
&AuraEffect::HandleAuraModIncreaseBaseManaPercent, //419 SPELL_AURA_MOD_BASE_MANA_PCT
&AuraEffect::HandleNoImmediateEffect, //420 SPELL_AURA_MOD_BATTLE_PET_XP_PCT - Implemented in BattlePetMgr::GrantBattlePetExperience
&AuraEffect::HandleNULL, //421 SPELL_AURA_MOD_ABSORB_EFFECTS_DONE_PCT
&AuraEffect::HandleNULL, //422 SPELL_AURA_MOD_ABSORB_EFFECTS_TAKEN_PCT
&AuraEffect::HandleNoImmediateEffect, //421 SPELL_AURA_MOD_ABSORB_DONE_PCT implemented in Unit::SpellAbsorbPctDone
&AuraEffect::HandleNoImmediateEffect, //422 SPELL_AURA_MOD_ABSORB_TAKEN_PCT implemented in Unit::SpellAbsorbBonusTaken
&AuraEffect::HandleModManaCostPct, //423 SPELL_AURA_MOD_MANA_COST_PCT
&AuraEffect::HandleNULL, //424 SPELL_AURA_CASTER_IGNORE_LOS
&AuraEffect::HandleNULL, //425