From a582ab9d9d5890b54e5fd2a10e07be75a33b184d Mon Sep 17 00:00:00 2001 From: linencloth Date: Wed, 15 Sep 2010 06:33:38 +0200 Subject: Core/Spells: Allow AoE spells to target dead units. Also removes some unneeded checks from ally targeting. --HG-- branch : trunk --- src/server/game/Entities/Unit/Unit.cpp | 4 ++-- src/server/game/Entities/Unit/Unit.h | 2 +- src/server/game/Spells/Spell.cpp | 3 ++- src/server/game/Spells/Spell.h | 15 +++++++++++---- 4 files changed, 16 insertions(+), 8 deletions(-) (limited to 'src') 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 &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 &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: -- cgit v1.2.3