aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Conditions/ConditionMgr.cpp9
-rw-r--r--src/server/game/Grids/Notifiers/GridNotifiers.h8
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h4
-rw-r--r--src/server/game/Spells/Spell.cpp308
-rw-r--r--src/server/game/Spells/Spell.h2
-rw-r--r--src/server/game/Spells/SpellMgr.cpp4
6 files changed, 198 insertions, 137 deletions
diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp
index 9164f55c6ce..814ba08f2fb 100644
--- a/src/server/game/Conditions/ConditionMgr.cpp
+++ b/src/server/game/Conditions/ConditionMgr.cpp
@@ -770,6 +770,10 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
spellProto->EffectImplicitTargetB[i] == TARGET_UNIT_NEARBY_ENTRY ||
spellProto->EffectImplicitTargetA[i] == TARGET_GAMEOBJECT_NEARBY_ENTRY ||
spellProto->EffectImplicitTargetB[i] == TARGET_GAMEOBJECT_NEARBY_ENTRY ||
+ spellProto->EffectImplicitTargetA[i] == TARGET_GAMEOBJECT_AREA_SRC ||
+ spellProto->EffectImplicitTargetB[i] == TARGET_GAMEOBJECT_AREA_SRC ||
+ spellProto->EffectImplicitTargetA[i] == TARGET_GAMEOBJECT_AREA_DST ||
+ spellProto->EffectImplicitTargetB[i] == TARGET_GAMEOBJECT_AREA_DST ||
spellProto->EffectImplicitTargetA[i] == TARGET_DST_NEARBY_ENTRY ||
spellProto->EffectImplicitTargetB[i] == TARGET_DST_NEARBY_ENTRY ||
spellProto->EffectImplicitTargetA[i] == TARGET_UNIT_CONE_ENTRY ||
@@ -781,8 +785,9 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
}
if (!targetfound)
{
- sLog.outErrorDb("SourceEntry %u in `condition` table does not have any implicit target TARGET_UNIT_NEARBY_ENTRY(38) or TARGET_DST_NEARBY_ENTRY (46)\
- ,TARGET_UNIT_AREA_ENTRY_SRC(7), TARGET_UNIT_AREA_ENTRY_DST(8), TARGET_UNIT_CONE_ENTRY(60), TARGET_GAMEOBJECT_NEARBY_ENTRY(40)",cond->mSourceEntry);
+ sLog.outErrorDb("SourceEntry %u in `condition` table does not have any implicit target TARGET_UNIT_NEARBY_ENTRY(38) or TARGET_DST_NEARBY_ENTRY (46)"
+ ",TARGET_UNIT_AREA_ENTRY_SRC(7), TARGET_UNIT_AREA_ENTRY_DST(8), TARGET_UNIT_CONE_ENTRY(60), TARGET_GAMEOBJECT_NEARBY_ENTRY(40)"
+ "TARGET_GAMEOBJECT_AREA_SRC(51), TARGET_GAMEOBJECT_AREA_DST(52)", cond->mSourceEntry);
return false;
}
break;
diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h
index b0abf0aae79..21092648869 100644
--- a/src/server/game/Grids/Notifiers/GridNotifiers.h
+++ b/src/server/game/Grids/Notifiers/GridNotifiers.h
@@ -1177,13 +1177,17 @@ namespace Trinity
class GameObjectInRangeCheck
{
public:
- GameObjectInRangeCheck(float _x, float _y, float _z, float _range) : x(_x), y(_y), z(_z), range(_range) {}
+ GameObjectInRangeCheck(float _x, float _y, float _z, float _range, uint32 _entry = 0) :
+ x(_x), y(_y), z(_z), range(_range), entry(_entry) {}
bool operator() (GameObject* go)
{
- return go->IsInRange(x, y, z, range);
+ if (!entry || go->GetGOInfo() && go->GetGOInfo()->id == entry)
+ return go->IsInRange(x, y, z, range);
+ else return false;
}
private:
float x, y, z, range;
+ uint32 entry;
};
// Player checks and do
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h
index 971a26719e1..07694a57577 100644
--- a/src/server/game/Miscellaneous/SharedDefines.h
+++ b/src/server/game/Miscellaneous/SharedDefines.h
@@ -1148,8 +1148,8 @@ enum Targets
TARGET_DEST_CASTER_BACK = 48,
TARGET_DEST_CASTER_RIGHT = 49,
TARGET_DEST_CASTER_LEFT = 50,
- TARGET_OBJECT_AREA_SRC = 51,
- TARGET_OBJECT_AREA_DST = 52,
+ TARGET_GAMEOBJECT_AREA_SRC = 51, // If used with SPELL_EFFECT_ACTIVATE_OBJECT, appliccable GO entries should be specified in conditions table
+ TARGET_GAMEOBJECT_AREA_DST = 52, // If used with SPELL_EFFECT_ACTIVATE_OBJECT, appliccable GO entries should be specified in conditions table
TARGET_DST_TARGET_ENEMY = 53, // set unit coordinates as dest, only 16 target B imlemented
TARGET_UNIT_CONE_ENEMY_UNKNOWN = 54, // 180 degree, or different angle
TARGET_DEST_CASTER_FRONT_LEAP = 55, // for a leap spell
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 068252316a0..e538d93a29e 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -1729,6 +1729,9 @@ void Spell::SearchChainTarget(std::list<Unit*> &TagUnitMap, float max_range, uin
void Spell::SearchAreaTarget(std::list<Unit*> &TagUnitMap, float radius, SpellNotifyPushType type, SpellTargets TargetType, uint32 entry)
{
+ if (TargetType == SPELL_TARGETS_GO)
+ return;
+
Position *pos;
switch(type)
{
@@ -1767,6 +1770,32 @@ void Spell::SearchAreaTarget(std::list<Unit*> &TagUnitMap, float radius, SpellNo
TagUnitMap.remove(m_caster);
}
+void Spell::SearchGOAreaTarget(std::list<GameObject*> &TagGOMap, float radius, SpellNotifyPushType type, SpellTargets TargetType, uint32 entry)
+{
+ if (TargetType != SPELL_TARGETS_GO)
+ return;
+
+ Position *pos;
+ switch (type)
+ {
+ case PUSH_DST_CENTER:
+ CheckDst();
+ pos = &m_targets.m_dstPos;
+ break;
+ case PUSH_SRC_CENTER:
+ CheckSrc();
+ pos = &m_targets.m_srcPos;
+ break;
+ default:
+ pos = m_caster;
+ break;
+ }
+
+ Trinity::GameObjectInRangeCheck check(pos->m_positionX, pos->m_positionY, pos->m_positionZ, radius + 50, entry);
+ Trinity::GameObjectListSearcher<Trinity::GameObjectInRangeCheck> searcher(m_caster, TagGOMap, check);
+ m_caster->GetMap()->VisitGrid(pos->m_positionX, pos->m_positionY, radius, searcher);
+}
+
WorldObject* Spell::SearchNearbyTarget(float range, SpellTargets TargetType)
{
switch(TargetType)
@@ -2328,6 +2357,11 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur)
radius = GetSpellRadius(m_spellInfo, i, IsPositiveSpell(m_spellInfo->Id));
targetType = SPELL_TARGETS_ENTRY;
break;
+ case TARGET_GAMEOBJECT_AREA_SRC:
+ case TARGET_GAMEOBJECT_AREA_DST:
+ radius = GetSpellRadius(m_spellInfo, i, true);
+ targetType = SPELL_TARGETS_GO;
+ break;
default:
radius = GetSpellRadius(m_spellInfo, i, true);
targetType = SPELL_TARGETS_NONE;
@@ -2339,169 +2373,170 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur)
radius *= m_spellValue->RadiusMod;
std::list<Unit*> unitList;
- if (targetType == SPELL_TARGETS_ENTRY)
+ std::list<GameObject*> gobjectList;
+ switch (targetType)
{
- ConditionList conditions = sConditionMgr.GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_SPELL_SCRIPT_TARGET, m_spellInfo->Id);
- if (conditions.empty())
+ case SPELL_TARGETS_ENTRY:
{
- // Custom entries
- // TODO: move these to sql
- switch (m_spellInfo->Id)
+ ConditionList conditions = sConditionMgr.GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_SPELL_SCRIPT_TARGET, m_spellInfo->Id);
+ if (!conditions.empty())
{
- case 46584: // Raise Dead
+ for (ConditionList::const_iterator i_spellST = conditions.begin(); i_spellST != conditions.end(); ++i_spellST)
{
- if (WorldObject* result = FindCorpseUsing<Trinity::RaiseDeadObjectCheck> ())
+ if ((*i_spellST)->mConditionType != CONDITION_SPELL_SCRIPT_TARGET)
+ continue;
+ if ((*i_spellST)->mConditionValue1 == SPELL_TARGET_TYPE_CREATURE)
+ SearchAreaTarget(unitList, radius, pushType, SPELL_TARGETS_ENTRY, (*i_spellST)->mConditionValue2);
+ else if ((*i_spellST)->mConditionValue1 == SPELL_TARGET_TYPE_CONTROLLED)
{
- switch(result->GetTypeId())
- {
- case TYPEID_UNIT:
- m_targets.setDst(result);
- }
+ for (Unit::ControlList::iterator itr = m_caster->m_Controlled.begin(); itr != m_caster->m_Controlled.end(); ++itr)
+ if ((*itr)->GetEntry() == (*i_spellST)->mConditionValue2 &&
+ /*(*itr)->IsWithinDistInMap(m_caster, radius)*/ (*itr)->IsInMap(m_caster)) // For 60243 and 52173 need skip radius check or use range (no radius entry for effect)
+ unitList.push_back(*itr);
}
- break;
}
- // Corpse Explosion
- case 49158:
- case 51325:
- case 51326:
- case 51327:
- case 51328:
- // Search for ghoul if our ghoul or dead body not valid unit target
- if (!(m_targets.getUnitTarget() && (m_targets.getUnitTarget()->GetEntry() == 26125 && m_targets.getUnitTarget()->GetOwnerGUID() == m_caster->GetGUID()
- || (m_targets.getUnitTarget()->getDeathState() == CORPSE
- && m_targets.getUnitTarget()->GetDisplayId() == m_targets.getUnitTarget()->GetNativeDisplayId()
- && m_targets.getUnitTarget()->GetTypeId() == TYPEID_UNIT
- && !m_targets.getUnitTarget()->ToCreature()->isDeadByDefault()
- && !(m_targets.getUnitTarget()->GetCreatureTypeMask() & CREATURE_TYPEMASK_MECHANICAL_OR_ELEMENTAL))
- && m_targets.getUnitTarget()->GetDisplayId() == m_targets.getUnitTarget()->GetNativeDisplayId())))
+ }
+ else
+ {
+ // Custom entries
+ // TODO: move these to sql
+ switch (m_spellInfo->Id)
+ {
+ case 46584: // Raise Dead
{
- CleanupTargetList();
-
- WorldObject* result = FindCorpseUsing <Trinity::ExplodeCorpseObjectCheck> ();
-
- if (result)
+ if (WorldObject* result = FindCorpseUsing<Trinity::RaiseDeadObjectCheck> ())
{
- switch (result->GetTypeId())
+ switch(result->GetTypeId())
{
case TYPEID_UNIT:
- case TYPEID_PLAYER:
- m_targets.setUnitTarget((Unit*)result);
- break;
+ m_targets.setDst(result);
}
}
- else
+ break;
+ }
+ // Corpse Explosion
+ case 49158:
+ case 51325:
+ case 51326:
+ case 51327:
+ case 51328:
+ // Search for ghoul if our ghoul or dead body not valid unit target
+ if (!(m_targets.getUnitTarget() && (m_targets.getUnitTarget()->GetEntry() == 26125 && m_targets.getUnitTarget()->GetOwnerGUID() == m_caster->GetGUID()
+ || (m_targets.getUnitTarget()->getDeathState() == CORPSE
+ && m_targets.getUnitTarget()->GetDisplayId() == m_targets.getUnitTarget()->GetNativeDisplayId()
+ && m_targets.getUnitTarget()->GetTypeId() == TYPEID_UNIT
+ && !m_targets.getUnitTarget()->ToCreature()->isDeadByDefault()
+ && !(m_targets.getUnitTarget()->GetCreatureTypeMask() & CREATURE_TYPEMASK_MECHANICAL_OR_ELEMENTAL))
+ && m_targets.getUnitTarget()->GetDisplayId() == m_targets.getUnitTarget()->GetNativeDisplayId())))
{
- if (m_caster->GetTypeId() == TYPEID_PLAYER)
- m_caster->ToPlayer()->RemoveSpellCooldown(m_spellInfo->Id,true);
- SendCastResult(SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW);
- finish(false);
+ CleanupTargetList();
+
+ WorldObject* result = FindCorpseUsing <Trinity::ExplodeCorpseObjectCheck> ();
+
+ if (result)
+ {
+ switch (result->GetTypeId())
+ {
+ case TYPEID_UNIT:
+ case TYPEID_PLAYER:
+ m_targets.setUnitTarget((Unit*)result);
+ break;
+ }
+ }
+ else
+ {
+ if (m_caster->GetTypeId() == TYPEID_PLAYER)
+ m_caster->ToPlayer()->RemoveSpellCooldown(m_spellInfo->Id,true);
+ SendCastResult(SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW);
+ finish(false);
+ }
}
- }
- break;
+ break;
- default:
- sLog.outDebug("Spell (ID: %u) (caster Entry: %u) does not have record in `spell_script_target`", m_spellInfo->Id, m_caster->GetEntry());
+ default:
+ sLog.outDebug("Spell (ID: %u) (caster Entry: %u) does not have type CONDITION_SOURCE_TYPE_SPELL_SCRIPT_TARGET record in `conditions` table.", m_spellInfo->Id, m_caster->GetEntry());
- if (m_spellInfo->Effect[i] == SPELL_EFFECT_TELEPORT_UNITS)
- SearchAreaTarget(unitList, radius, pushType, SPELL_TARGETS_ENTRY, 0);
- else if (IsPositiveEffect(m_spellInfo->Id, i))
- SearchAreaTarget(unitList, radius, pushType, SPELL_TARGETS_ALLY);
- else
- SearchAreaTarget(unitList, radius, pushType, SPELL_TARGETS_ENEMY);
+ if (m_spellInfo->Effect[i] == SPELL_EFFECT_TELEPORT_UNITS)
+ SearchAreaTarget(unitList, radius, pushType, SPELL_TARGETS_ENTRY, 0);
+ else if (IsPositiveEffect(m_spellInfo->Id, i))
+ SearchAreaTarget(unitList, radius, pushType, SPELL_TARGETS_ALLY);
+ else
+ SearchAreaTarget(unitList, radius, pushType, SPELL_TARGETS_ENEMY);
+ }
}
+ break;
}
- // let it be done in one check?
- else
+ case SPELL_TARGETS_GO:
{
- for (ConditionList::const_iterator i_spellST = conditions.begin(); i_spellST != conditions.end(); ++i_spellST)
+ ConditionList conditions = sConditionMgr.GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_SPELL_SCRIPT_TARGET, m_spellInfo->Id);
+ if (!conditions.empty())
{
- if ((*i_spellST)->mConditionType != CONDITION_SPELL_SCRIPT_TARGET)
- continue;
- if ((*i_spellST)->mConditionValue1 == SPELL_TARGET_TYPE_CREATURE)
- SearchAreaTarget(unitList, radius, pushType, SPELL_TARGETS_ENTRY, (*i_spellST)->mConditionValue2);
- else if ((*i_spellST)->mConditionValue1 == SPELL_TARGET_TYPE_CONTROLLED)
+ for (ConditionList::const_iterator i_spellST = conditions.begin(); i_spellST != conditions.end(); ++i_spellST)
{
- for (Unit::ControlList::iterator itr = m_caster->m_Controlled.begin(); itr != m_caster->m_Controlled.end(); ++itr)
- if ((*itr)->GetEntry() == (*i_spellST)->mConditionValue2 &&
- /*(*itr)->IsWithinDistInMap(m_caster, radius)*/ (*itr)->IsInMap(m_caster)) // For 60243 and 52173 need skip radius check or use range (no radius entry for effect)
- unitList.push_back(*itr);
+ if ((*i_spellST)->mConditionType != CONDITION_SPELL_SCRIPT_TARGET)
+ continue;
+ if ((*i_spellST)->mConditionValue1 == SPELL_TARGET_TYPE_GAMEOBJECT)
+ SearchGOAreaTarget(gobjectList, radius, pushType, SPELL_TARGETS_GO, (*i_spellST)->mConditionValue2);
}
}
- }
- }
- else if (targetType)
- SearchAreaTarget(unitList, radius, pushType, targetType);
- else
- {
- switch (cur)
- {
- case TARGET_UNIT_AREA_PARTY_SRC:
- case TARGET_UNIT_AREA_PARTY_DST:
- m_caster->GetPartyMemberInDist(unitList, radius); //fix me
- break;
- case TARGET_OBJECT_AREA_SRC: // fix me
- case TARGET_OBJECT_AREA_DST:
+ else
{
- float x, y, z;
- if (cur == TARGET_OBJECT_AREA_SRC)
- {
- if (m_targets.HasSrc())
- m_targets.m_srcPos.GetPosition(x, y, z);
- else
- break;
- }
- else
- {
- if (m_targets.HasDst())
- m_targets.m_dstPos.GetPosition(x, y, z);
- else
- break;
- }
-
- Trinity::GameObjectInRangeCheck check(x, y, z, radius + 50);
- std::list<GameObject*> goList;
- Trinity::GameObjectListSearcher<Trinity::GameObjectInRangeCheck> searcher(m_caster, goList, check);
- m_caster->GetMap()->VisitGrid(x, y, radius, searcher);
- for (std::list<GameObject*>::iterator itr = goList.begin(); itr != goList.end(); ++itr)
- AddGOTarget(*itr, i);
- break;
+ if (m_spellInfo->Effect[i] == SPELL_EFFECT_ACTIVATE_OBJECT)
+ sLog.outDebug("Spell (ID: %u) (caster Entry: %u) with SPELL_EFFECT_ACTIVATE_OBJECT does not have type CONDITION_SOURCE_TYPE_SPELL_SCRIPT_TARGET record in `conditions` table.", m_spellInfo->Id, m_caster->GetEntry());
+ SearchGOAreaTarget(gobjectList, radius, pushType, SPELL_TARGETS_GO);
}
- case TARGET_UNIT_PARTY_TARGET:
- m_targets.getUnitTarget()->GetPartyMemberInDist(unitList, radius);
- break;
- case TARGET_UNIT_PARTY_CASTER:
- m_caster->GetPartyMemberInDist(unitList, radius);
- break;
- case TARGET_UNIT_RAID_CASTER:
- m_caster->GetRaidMember(unitList, radius);
- break;
- case TARGET_UNIT_CLASS_TARGET:
+ break;
+ }
+ case SPELL_TARGETS_ALLY:
+ case SPELL_TARGETS_ENEMY:
+ case SPELL_TARGETS_CHAINHEAL:
+ case SPELL_TARGETS_ANY:
+ SearchAreaTarget(unitList, radius, pushType, targetType);
+ break;
+ default:
+ switch (cur)
{
- Player* targetPlayer = m_targets.getUnitTarget() && m_targets.getUnitTarget()->GetTypeId() == TYPEID_PLAYER
- ? (Player*)m_targets.getUnitTarget() : NULL;
-
- Group* pGroup = targetPlayer ? targetPlayer->GetGroup() : NULL;
- if (pGroup)
+ case TARGET_UNIT_AREA_PARTY_SRC:
+ case TARGET_UNIT_AREA_PARTY_DST:
+ m_caster->GetPartyMemberInDist(unitList, radius); //fix me
+ break;
+ case TARGET_UNIT_PARTY_TARGET:
+ m_targets.getUnitTarget()->GetPartyMemberInDist(unitList, radius);
+ break;
+ case TARGET_UNIT_PARTY_CASTER:
+ m_caster->GetPartyMemberInDist(unitList, radius);
+ break;
+ case TARGET_UNIT_RAID_CASTER:
+ m_caster->GetRaidMember(unitList, radius);
+ break;
+ case TARGET_UNIT_CLASS_TARGET:
{
- for (GroupReference *itr = pGroup->GetFirstMember(); itr != NULL; itr = itr->next())
- {
- Player* Target = itr->getSource();
+ Player* targetPlayer = m_targets.getUnitTarget() && m_targets.getUnitTarget()->GetTypeId() == TYPEID_PLAYER
+ ? (Player*)m_targets.getUnitTarget() : NULL;
- // IsHostileTo check duel and controlled by enemy
- if (Target && targetPlayer->IsWithinDistInMap(Target, radius) &&
- targetPlayer->getClass() == Target->getClass() &&
- !m_caster->IsHostileTo(Target))
+ Group* pGroup = targetPlayer ? targetPlayer->GetGroup() : NULL;
+ if (pGroup)
+ {
+ for (GroupReference *itr = pGroup->GetFirstMember(); itr != NULL; itr = itr->next())
{
- AddUnitTarget(Target, i);
+ Player* Target = itr->getSource();
+
+ // IsHostileTo check duel and controlled by enemy
+ if (Target && targetPlayer->IsWithinDistInMap(Target, radius) &&
+ targetPlayer->getClass() == Target->getClass() &&
+ !m_caster->IsHostileTo(Target))
+ {
+ AddUnitTarget(Target, i);
+ }
}
}
+ else if (m_targets.getUnitTarget())
+ AddUnitTarget(m_targets.getUnitTarget(), i);
+ break;
}
- else if (m_targets.getUnitTarget())
- AddUnitTarget(m_targets.getUnitTarget(), i);
- break;
}
+ break;
}
- }
if (!unitList.empty())
{
@@ -2625,7 +2660,7 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur)
if (m_spellInfo->Id == 5246) //Intimidating Shout
unitList.remove(m_targets.getUnitTarget());
- Trinity::RandomResizeList(unitList, m_spellValue->MaxAffectedTargets);
+ Trinity::RandomResizeList(unitList, maxTargets);
}
else
{
@@ -2671,6 +2706,21 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur)
for (std::list<Unit*>::iterator itr = unitList.begin(); itr != unitList.end(); ++itr)
AddUnitTarget(*itr, i);
}
+
+ if (!gobjectList.empty())
+ {
+ if (uint32 maxTargets = m_spellValue->MaxAffectedTargets)
+ {
+ Unit::AuraEffectList const& Auras = m_caster->GetAuraEffectsByType(SPELL_AURA_MOD_MAX_AFFECTED_TARGETS);
+ for (Unit::AuraEffectList::const_iterator j = Auras.begin(); j != Auras.end(); ++j)
+ if ((*j)->IsAffectedOnSpell(m_spellInfo))
+ maxTargets += (*j)->GetAmount();
+
+ Trinity::RandomResizeList(gobjectList, maxTargets);
+ }
+ for (std::list<GameObject*>::iterator itr = gobjectList.begin(); itr != gobjectList.end(); ++itr)
+ AddGOTarget(*itr, i);
+ }
}
}
diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h
index 26959d31833..777f338a962 100644
--- a/src/server/game/Spells/Spell.h
+++ b/src/server/game/Spells/Spell.h
@@ -265,6 +265,7 @@ enum SpellTargets
SPELL_TARGETS_ENTRY,
SPELL_TARGETS_CHAINHEAL,
SPELL_TARGETS_ANY,
+ SPELL_TARGETS_GO
};
class Spell
@@ -645,6 +646,7 @@ class Spell
void DoAllEffectOnTarget(ItemTargetInfo *target);
bool UpdateChanneledTargetList();
void SearchAreaTarget(std::list<Unit*> &unitList, float radius, SpellNotifyPushType type, SpellTargets TargetType, uint32 entry = 0);
+ void SearchGOAreaTarget(std::list<GameObject*> &gobjectList, float radius, SpellNotifyPushType type, SpellTargets TargetType, uint32 entry = 0);
void SearchChainTarget(std::list<Unit*> &unitList, float radius, uint32 unMaxTargets, SpellTargets TargetType);
WorldObject* SearchNearbyTarget(float range, SpellTargets TargetType);
bool IsValidSingleTargetEffect(Unit const* target, Targets type) const;
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index 6e59277c550..929eb6b94e3 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -145,14 +145,14 @@ SpellMgr::SpellMgr()
case TARGET_UNIT_AREA_ALLY_SRC:
case TARGET_UNIT_AREA_ENTRY_SRC:
case TARGET_UNIT_AREA_PARTY_SRC:
- case TARGET_OBJECT_AREA_SRC:
+ case TARGET_GAMEOBJECT_AREA_SRC:
SpellTargetType[i] = TARGET_TYPE_AREA_SRC;
break;
case TARGET_UNIT_AREA_ENEMY_DST:
case TARGET_UNIT_AREA_ALLY_DST:
case TARGET_UNIT_AREA_ENTRY_DST:
case TARGET_UNIT_AREA_PARTY_DST:
- case TARGET_OBJECT_AREA_DST:
+ case TARGET_GAMEOBJECT_AREA_DST:
SpellTargetType[i] = TARGET_TYPE_AREA_DST;
break;
case TARGET_UNIT_CONE_ENEMY: