Core/Spells: Implemented SPELL_AURA_SUPPRESS_ITEM_PASSIVE_EFFECT_BY_SPELL_LABEL

This commit is contained in:
Shauren
2021-10-16 16:43:13 +02:00
parent 95e2185094
commit 6e4a90d274
4 changed files with 22 additions and 2 deletions

View File

@@ -267,7 +267,7 @@ enum AuraType : uint32
SPELL_AURA_MOD_POWER_DISPLAY = 179,
SPELL_AURA_MOD_FLAT_SPELL_DAMAGE_VERSUS = 180,
SPELL_AURA_MOD_SPELL_CURRENCY_REAGENTS_COUNT_PCT = 181, // NYI
SPELL_AURA_SUPPRESS_ITEM_PASSIVE_EFFECT_BY_SPELL_LABEL = 182, // NYI
SPELL_AURA_SUPPRESS_ITEM_PASSIVE_EFFECT_BY_SPELL_LABEL = 182,
SPELL_AURA_MOD_CRIT_CHANCE_VERSUS_TARGET_HEALTH = 183,
SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE = 184,
SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE = 185,

View File

@@ -250,7 +250,7 @@ NonDefaultConstructible<pAuraEffectHandler> AuraEffectHandler[TOTAL_AURAS]=
&AuraEffect::HandleAuraModPowerDisplay, //179 SPELL_AURA_MOD_POWER_DISPLAY
&AuraEffect::HandleNoImmediateEffect, //180 SPELL_AURA_MOD_FLAT_SPELL_DAMAGE_VERSUS implemented in Unit::SpellDamageBonus
&AuraEffect::HandleNULL, //181 SPELL_AURA_MOD_SPELL_CURRENCY_REAGENTS_COUNT_PCT
&AuraEffect::HandleNULL, //182 SPELL_AURA_SUPPRESS_ITEM_PASSIVE_EFFECT_BY_SPELL_LABEL
&AuraEffect::HandleSuppressItemPassiveEffectBySpellLabel, //182 SPELL_AURA_SUPPRESS_ITEM_PASSIVE_EFFECT_BY_SPELL_LABEL
&AuraEffect::HandleNoImmediateEffect, //183 SPELL_AURA_MOD_CRIT_CHANCE_VERSUS_TARGET_HEALTH implemented in Unit::GetUnitCriticalChance, Unit::GetUnitSpellCriticalChance
&AuraEffect::HandleNoImmediateEffect, //184 SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE implemented in Unit::RollMeleeOutcomeAgainst
&AuraEffect::HandleNoImmediateEffect, //185 SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE implemented in Unit::RollMeleeOutcomeAgainst
@@ -6020,6 +6020,21 @@ void AuraEffect::HandleCosmeticMounted(AuraApplication const* aurApp, uint8 mode
playerTarget->SendMovementSetCollisionHeight(playerTarget->GetCollisionHeight(), WorldPackets::Movement::UpdateCollisionHeightReason::Force);
}
void AuraEffect::HandleSuppressItemPassiveEffectBySpellLabel(AuraApplication const* aurApp, uint8 mode, bool apply) const
{
if (!(mode & AURA_EFFECT_HANDLE_REAL))
return;
std::vector<Aura*> suppressedAuras;
for (Unit::AuraMap::value_type const& appliedAura : aurApp->GetTarget()->GetOwnedAuras())
if (appliedAura.second->GetSpellInfo()->HasLabel(GetMiscValue()))
suppressedAuras.push_back(appliedAura.second);
// Refresh applications
for (Aura* aura : suppressedAuras)
aura->ApplyForTargets();
}
template TC_GAME_API void AuraEffect::GetTargetList(std::list<Unit*>&) const;
template TC_GAME_API void AuraEffect::GetTargetList(std::deque<Unit*>&) const;
template TC_GAME_API void AuraEffect::GetTargetList(std::vector<Unit*>&) const;

View File

@@ -323,6 +323,7 @@ class TC_GAME_API AuraEffect
void HandleTriggerSpellOnPowerPercent(AuraApplication const* aurApp, uint8 mode, bool apply) const;
void HandleStoreTeleportReturnPoint(AuraApplication const* aurApp, uint8 mode, bool apply) const;
void HandleCosmeticMounted(AuraApplication const* aurApp, uint8 mode, bool apply) const;
void HandleSuppressItemPassiveEffectBySpellLabel(AuraApplication const* aurApp, uint8 mode, bool apply) const;
// aura effect periodic tick handlers
void HandlePeriodicTriggerSpellAuraTick(Unit* target, Unit* caster) const;

View File

@@ -1543,6 +1543,10 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b
bool Aura::CanBeAppliedOn(Unit* target)
{
for (uint32 label : GetSpellInfo()->Labels)
if (target->HasAuraTypeWithMiscvalue(SPELL_AURA_SUPPRESS_ITEM_PASSIVE_EFFECT_BY_SPELL_LABEL, label))
return false;
// unit not in world or during remove from world
if (!target->IsInWorld() || target->IsDuringRemoveFromWorld())
{