aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2011-08-01 11:17:34 +0200
committerShauren <shauren.trinity@gmail.com>2011-08-01 11:17:34 +0200
commita80b36c2f374adf16a60bfedf05589aaf326aa03 (patch)
tree6420207455b88b0093c9c998e2a7ee1d60ede6f1 /src
parentacc2e88c31b6aa027da4bd90ac8889b45b1b27f7 (diff)
Core/Spells: Limited SPELL_ATTR3_PLAYERS_ONLY attribute to only allow players, not pets and totems. This fixes many boss area spells incorrectly selecting pets and totems as their targets.
Diffstat (limited to 'src')
-rwxr-xr-xsrc/server/game/Grids/Notifiers/GridNotifiers.h14
-rwxr-xr-xsrc/server/game/Spells/Spell.cpp5
2 files changed, 18 insertions, 1 deletions
diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h
index f24fa018925..2ad81b8b3a7 100755
--- a/src/server/game/Grids/Notifiers/GridNotifiers.h
+++ b/src/server/game/Grids/Notifiers/GridNotifiers.h
@@ -1285,6 +1285,20 @@ namespace Trinity
float m_fRange;
};
+ class ObjectTypeIdCheck
+ {
+ public:
+ ObjectTypeIdCheck(TypeID typeId, bool equals) : _typeId(typeId), _equals(equals) {}
+ bool operator()(WorldObject* object)
+ {
+ return (object->GetTypeId() == _typeId) == _equals;
+ }
+
+ private:
+ TypeID _typeId;
+ bool _equals;
+ };
+
// Player checks and do
// Prepare using Builder localized packets with caching and send to player
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 40ab5748f92..104f786c99b 100755
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -1832,7 +1832,10 @@ void Spell::SearchAreaTarget(std::list<Unit*> &TagUnitMap, float radius, SpellNo
Trinity::SpellNotifierCreatureAndPlayer notifier(m_caster, TagUnitMap, radius, type, TargetType, pos, entry, m_spellInfo);
if ((m_spellInfo->AttributesEx3 & SPELL_ATTR3_PLAYERS_ONLY) || (TargetType == SPELL_TARGETS_ENTRY && !entry))
+ {
m_caster->GetMap()->VisitWorld(pos->m_positionX, pos->m_positionY, radius, notifier);
+ TagUnitMap.remove_if(Trinity::ObjectTypeIdCheck(TYPEID_PLAYER, false)); // above line will select also pets and totems, remove them
+ }
else
m_caster->GetMap()->VisitAll(pos->m_positionX, pos->m_positionY, radius, notifier);
@@ -4945,7 +4948,7 @@ SpellCastResult Spell::CheckCast(bool strict)
if (castResult != SPELL_CAST_OK)
return castResult;
}
-
+
if (!(_triggeredCastFlags & TRIGGERED_IGNORE_CASTER_AURAS))
{
castResult = CheckCasterAuras();