diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index aa2faebf97d..e845a49feaa 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -1075,10 +1075,6 @@ namespace Trinity if (owner) check = owner; i_targetForPlayer = (check->GetTypeId() == TYPEID_PLAYER); - - if (!_spellInfo) - if (DynamicObject const* dynObj = i_obj->ToDynObject()) - _spellInfo = dynObj->GetSpellInfo(); } bool operator()(Unit* u) { diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index 1f04dc7e158..c9fc15d07c6 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -2472,20 +2472,17 @@ void DynObjAura::FillTargetMap(std::unordered_map& targets, Unit* if (!HasEffect(effIndex)) continue; + // we can't use effect type like area auras to determine check type, check targets + SpellTargetCheckTypes selectionType = m_spellInfo->Effects[effIndex].TargetA.GetCheckType(); + if (m_spellInfo->Effects[effIndex].TargetB.GetReferenceType() == TARGET_REFERENCE_TYPE_DEST) + selectionType = m_spellInfo->Effects[effIndex].TargetB.GetCheckType(); + std::deque units; - if (GetSpellInfo()->Effects[effIndex].TargetB.GetTarget() == TARGET_DEST_DYNOBJ_ALLY - || GetSpellInfo()->Effects[effIndex].TargetB.GetTarget() == TARGET_UNIT_DEST_AREA_ALLY) - { - Trinity::AnyFriendlyUnitInObjectRangeCheck u_check(GetDynobjOwner(), dynObjOwnerCaster, radius, m_spellInfo->HasAttribute(SPELL_ATTR3_ONLY_TARGET_PLAYERS), m_spellInfo->HasAttribute(SPELL_ATTR5_DONT_TARGET_PLAYERS)); - Trinity::UnitListSearcher searcher(GetDynobjOwner(), units, u_check); - Cell::VisitAllObjects(GetDynobjOwner(), searcher, radius); - } - else - { - Trinity::AnyAoETargetUnitInObjectRangeCheck u_check(GetDynobjOwner(), dynObjOwnerCaster, radius); - Trinity::UnitListSearcher searcher(GetDynobjOwner(), units, u_check); - Cell::VisitAllObjects(GetDynobjOwner(), searcher, radius); - } + ConditionContainer* condList = m_spellInfo->Effects[effIndex].ImplicitTargetConditions; + + Trinity::WorldObjectSpellAreaTargetCheck check(radius, GetDynobjOwner(), dynObjOwnerCaster, dynObjOwnerCaster, m_spellInfo, selectionType, condList); + Trinity::UnitListSearcher searcher(GetDynobjOwner(), units, check); + Cell::VisitAllObjects(GetDynobjOwner(), searcher, radius); for (Unit* unit : units) {