aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/game/Spell.cpp6
-rw-r--r--src/game/Spell.h76
-rw-r--r--src/game/SpellAuras.cpp26
3 files changed, 47 insertions, 61 deletions
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp
index 91c4a536d56..bfc58631079 100644
--- a/src/game/Spell.cpp
+++ b/src/game/Spell.cpp
@@ -1380,9 +1380,6 @@ void Spell::SearchChainTarget(std::list<Unit*> &TagUnitMap, float max_range, uin
void Spell::SearchAreaTarget(std::list<Unit*> &TagUnitMap, float radius, const uint32 &type, SpellTargets TargetType, uint32 entry)
{
float x, y, z;
-
- Unit *target = m_targets.getUnitTarget();
-
if(type == PUSH_DEST_CENTER)
{
if(!m_targets.HasDest())
@@ -1396,6 +1393,7 @@ void Spell::SearchAreaTarget(std::list<Unit*> &TagUnitMap, float radius, const u
}
else if(type == PUSH_TARGET_CENTER)
{
+ Unit *target = m_targets.getUnitTarget();
if(!target)
{
sLog.outError( "SPELL: cannot find unit target for spell ID %u\n", m_spellInfo->Id );
@@ -1412,7 +1410,7 @@ void Spell::SearchAreaTarget(std::list<Unit*> &TagUnitMap, float radius, const u
z = m_caster->GetPositionZ();
}
- Trinity::SpellNotifierCreatureAndPlayer notifier(*this, TagUnitMap, radius, type, TargetType, entry, x, y, z, target);
+ Trinity::SpellNotifierCreatureAndPlayer notifier(*this, TagUnitMap, radius, type, TargetType, entry, x, y, z);
if((m_spellInfo->AttributesEx3 & SPELL_ATTR_EX3_PLAYERS_ONLY)
|| TargetType == SPELL_TARGETS_ENTRY && !entry)
m_caster->GetMap()->VisitWorld(x, y, radius, notifier);
diff --git a/src/game/Spell.h b/src/game/Spell.h
index fee6f120835..0e87a0a01e3 100644
--- a/src/game/Spell.h
+++ b/src/game/Spell.h
@@ -631,87 +631,73 @@ namespace Trinity
const uint32& i_push_type;
float i_radius, i_radiusSq;
SpellTargets i_TargetType;
- Unit* i_caster;
+ Unit* i_source;
uint32 i_entry;
float i_x, i_y, i_z;
- Unit* i_unitTarget;
- Unit* i_origCaster;
SpellNotifierCreatureAndPlayer(Spell &spell, std::list<Unit*> &data, float radius, const uint32 &type,
- SpellTargets TargetType = SPELL_TARGETS_ENEMY, uint32 entry = 0, float x = 0, float y = 0, float z = 0, Unit * unitTarget=NULL)
+ SpellTargets TargetType = SPELL_TARGETS_ENEMY, uint32 entry = 0, float x = 0, float y = 0, float z = 0)
: i_data(&data), i_spell(spell), i_push_type(type), i_radius(radius), i_radiusSq(radius*radius)
- , i_TargetType(TargetType), i_entry(entry), i_x(x), i_y(y), i_z(z), i_unitTarget(unitTarget)
+ , i_TargetType(TargetType), i_entry(entry), i_x(x), i_y(y), i_z(z)
{
- i_caster = spell.GetCaster();
- i_origCaster = spell.GetOriginalCaster();
+ i_source = spell.GetCaster();
+ assert(i_source);
}
template<class T> inline void Visit(GridRefManager<T> &m)
{
- assert(i_data);
-
- if(!i_origCaster)
- return;
-
for(typename GridRefManager<T>::iterator itr = m.begin(); itr != m.end(); ++itr)
{
- if( !itr->getSource()->isAlive() || (itr->getSource()->GetTypeId() == TYPEID_PLAYER && ((Player*)itr->getSource())->isInFlight()))
- continue;
+ Unit *target = (Unit*)itr->getSource();
switch (i_TargetType)
{
- case SPELL_TARGETS_ALLY:
- if (!itr->getSource()->isAttackableByAOE() || !i_origCaster->IsFriendlyTo( itr->getSource() ))
- continue;
- break;
case SPELL_TARGETS_ENEMY:
- {
- if (itr->getSource() == i_unitTarget)
- break;
-
- if(itr->getSource()->GetTypeId()==TYPEID_UNIT && ((Creature*)itr->getSource())->isTotem())
+ if(target->GetTypeId() == TYPEID_UNIT && ((Creature*)target)->isTotem())
continue;
- if(!itr->getSource()->isAttackableByAOE())
+ if(!target->isAttackableByAOE())
continue;
-
- Unit* check = i_origCaster->GetCharmerOrOwnerOrSelf();
-
- if( check->GetTypeId()==TYPEID_PLAYER )
+ if(i_source->GetTypeId()==TYPEID_PLAYER)
{
- if (check->IsFriendlyTo( itr->getSource() ))
+ if(i_source->IsFriendlyTo(target))
continue;
}
else
{
- if (!check->IsHostileTo( itr->getSource() ))
+ if(!i_source->IsHostileTo(target))
continue;
}
- }break;
+ break;
+ case SPELL_TARGETS_ALLY:
+ if(!target->isAttackableByAOE() || !i_source->IsFriendlyTo(target))
+ continue;
+ break;
case SPELL_TARGETS_ENTRY:
- {
- if(itr->getSource()->GetEntry()!= i_entry)
+ if(target->GetEntry()!= i_entry)
continue;
- }break;
- default: continue;
+ break;
+ default:
+ continue;
}
switch(i_push_type)
{
+ case PUSH_DEST_CENTER:
+ case PUSH_TARGET_CENTER:
+ if((target->GetDistanceSq(i_x, i_y, i_z) < i_radiusSq))
+ i_data->push_back(target);
+ break;
case PUSH_IN_FRONT:
- if(i_caster->isInFront((Unit*)(itr->getSource()), i_radius, M_PI/3 ))
- i_data->push_back(itr->getSource());
+ if(i_source->isInFront(target, i_radius, M_PI/3))
+ i_data->push_back(target);
break;
case PUSH_IN_BACK:
- if(i_caster->isInBack((Unit*)(itr->getSource()), i_radius, M_PI/3 ))
- i_data->push_back(itr->getSource());
+ if(i_source->isInBack(target, i_radius, M_PI/3))
+ i_data->push_back(target);
break;
case PUSH_IN_LINE:
- if(i_caster->isInLine((Unit*)(itr->getSource()), i_radius ))
- i_data->push_back(itr->getSource());
- break;
- default:
- if((itr->getSource()->GetDistanceSq(i_x, i_y, i_z) < i_radiusSq))
- i_data->push_back(itr->getSource());
+ if(i_source->isInLine(target, i_radius))
+ i_data->push_back(target);
break;
}
}
diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp
index e925c0ebd59..3fa0a58c307 100644
--- a/src/game/SpellAuras.cpp
+++ b/src/game/SpellAuras.cpp
@@ -2051,25 +2051,27 @@ void Aura::HandleAuraDummy(bool apply, bool Real)
m_target->SetReducedThreatPercent(0, 0);
return;
}
- // Haunt
- if(caster && m_spellProto->SpellFamilyName == SPELLFAMILY_WARLOCK && m_spellProto->SpellFamilyFlags[1] & 0x40000)
- {
- caster->CastCustomSpell(caster, 48210, &m_currentBasePoints, 0, 0, true);
- return;
- }
+
switch(m_spellProto->SpellFamilyName)
{
+ case SPELLFAMILY_WARLOCK:
+ // Haunt
+ if(m_spellProto->SpellFamilyFlags[1] & 0x40000)
+ {
+ if(caster)
+ caster->CastCustomSpell(caster, 48210, &m_currentBasePoints, 0, 0, true);
+ return;
+ }
+ break;
case SPELLFAMILY_MAGE:
// Living Bomb
- if (m_spellProto->SpellFamilyFlags[1] & 0x20000)
+ if(m_spellProto->SpellFamilyFlags[1] & 0x20000)
{
- if(!m_target || !(m_removeMode == AURA_REMOVE_BY_DISPEL || m_removeMode == AURA_REMOVE_BY_DEFAULT))
- return;
- Unit* target=NULL;
- m_target->CastSpell(target, GetModifier()->m_amount, true, NULL, NULL, GetCasterGUID());
+ if(caster && (m_removeMode == AURA_REMOVE_BY_DISPEL || m_removeMode == AURA_REMOVE_BY_DEFAULT))
+ caster->CastSpell(m_target, GetModifier()->m_amount, true);
return;
}
- break;
+ break;
}
}