aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlinencloth <none@none>2010-09-15 06:33:38 +0200
committerlinencloth <none@none>2010-09-15 06:33:38 +0200
commita582ab9d9d5890b54e5fd2a10e07be75a33b184d (patch)
tree9458f6c08f69def93e07ca1bf0d207210502c562
parentec5edaf6bff0aadd92d30d5cd32f5f5968a70c79 (diff)
Core/Spells: Allow AoE spells to target dead units.
Also removes some unneeded checks from ally targeting. --HG-- branch : trunk
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp4
-rw-r--r--src/server/game/Entities/Unit/Unit.h2
-rw-r--r--src/server/game/Spells/Spell.cpp3
-rw-r--r--src/server/game/Spells/Spell.h15
4 files changed, 16 insertions, 8 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 7f1f62b6275..f621c7aeee3 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -12094,9 +12094,9 @@ bool Unit::canAttack(Unit const* target, bool force) const
return true;
}
-bool Unit::isAttackableByAOE() const
+bool Unit::isAttackableByAOE(bool requireDeadTarget) const
{
- if (!isAlive())
+ if (isAlive() == requireDeadTarget)
return false;
if (HasFlag(UNIT_FIELD_FLAGS,
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index a270e5416ae..71ab27eb654 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -1413,7 +1413,7 @@ class Unit : public WorldObject
bool isFrozen() const;
bool isTargetableForAttack() const;
- bool isAttackableByAOE() const;
+ bool isAttackableByAOE(bool requireDeadTarget = false) const;
bool canAttack(Unit const* target, bool force = true) const;
virtual bool IsInWater() const;
virtual bool IsUnderWater() const;
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 10d6ec9f769..82098d66470 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -1875,7 +1875,8 @@ void Spell::SearchAreaTarget(std::list<Unit*> &TagUnitMap, float radius, SpellNo
break;
}
- Trinity::SpellNotifierCreatureAndPlayer notifier(m_caster, TagUnitMap, radius, type, TargetType, pos, entry);
+ bool requireDeadTarget = bool(m_spellInfo->AttributesEx3 & SPELL_ATTR_EX3_REQUIRE_DEAD_TARGET);
+ Trinity::SpellNotifierCreatureAndPlayer notifier(m_caster, TagUnitMap, radius, type, TargetType, pos, entry, requireDeadTarget);
if ((m_spellInfo->AttributesEx3 & SPELL_ATTR_EX3_PLAYERS_ONLY)
|| (TargetType == SPELL_TARGETS_ENTRY && !entry))
m_caster->GetMap()->VisitWorld(pos->m_positionX, pos->m_positionY, radius, notifier);
diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h
index 9c4ad549ebc..df7d3b7944b 100644
--- a/src/server/game/Spells/Spell.h
+++ b/src/server/game/Spells/Spell.h
@@ -738,11 +738,12 @@ namespace Trinity
const Unit * const i_source;
uint32 i_entry;
const Position * const i_pos;
+ bool i_requireDeadTarget;
SpellNotifierCreatureAndPlayer(Unit *source, std::list<Unit*> &data, float radius, SpellNotifyPushType type,
- SpellTargets TargetType = SPELL_TARGETS_ENEMY, const Position *pos = NULL, uint32 entry = 0)
+ SpellTargets TargetType = SPELL_TARGETS_ENEMY, const Position *pos = NULL, uint32 entry = 0, bool requireDeadTarget = false)
: i_data(&data), i_push_type(type), i_radius(radius), i_TargetType(TargetType),
- i_source(source), i_entry(entry), i_pos(pos)
+ i_source(source), i_entry(entry), i_pos(pos), i_requireDeadTarget(requireDeadTarget)
{
ASSERT(i_source);
}
@@ -761,7 +762,7 @@ namespace Trinity
case SPELL_TARGETS_ENEMY:
if (target->isTotem())
continue;
- if (!target->isAttackableByAOE())
+ if (!target->isAttackableByAOE(i_requireDeadTarget))
continue;
if (i_source->IsControlledByPlayer())
{
@@ -777,7 +778,13 @@ namespace Trinity
case SPELL_TARGETS_ALLY:
if (target->isTotem())
continue;
- if (!target->isAttackableByAOE() || !i_source->IsFriendlyTo(target))
+ if (!i_source->IsFriendlyTo(target))
+ continue;
+ if (target->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
+ continue;
+ if (target->GetTypeId() == TYPEID_PLAYER && target->ToPlayer()->isGameMaster())
+ continue;
+ if (target->isAlive() == i_requireDeadTarget)
continue;
break;
case SPELL_TARGETS_ENTRY: