*Some clean up of spell target selection.
--HG-- branch : trunk
This commit is contained in:
@@ -480,6 +480,8 @@ class TRINITY_DLL_SPEC WorldObject : public Object
|
|||||||
bool isActive() const { return m_isActive; }
|
bool isActive() const { return m_isActive; }
|
||||||
void setActive(bool isActive);
|
void setActive(bool isActive);
|
||||||
template<class NOTIFIER> void VisitNearbyObject(const float &radius, NOTIFIER ¬ifier) const { GetMap()->VisitAll(GetPositionX(), GetPositionY(), radius, notifier); }
|
template<class NOTIFIER> void VisitNearbyObject(const float &radius, NOTIFIER ¬ifier) const { GetMap()->VisitAll(GetPositionX(), GetPositionY(), radius, notifier); }
|
||||||
|
template<class NOTIFIER> void VisitNearbyGridObject(const float &radius, NOTIFIER ¬ifier) const { GetMap()->VisitGrid(GetPositionX(), GetPositionY(), radius, notifier); }
|
||||||
|
template<class NOTIFIER> void VisitNearbyWorldObject(const float &radius, NOTIFIER ¬ifier) const { GetMap()->VisitWorld(GetPositionX(), GetPositionY(), radius, notifier); }
|
||||||
protected:
|
protected:
|
||||||
explicit WorldObject();
|
explicit WorldObject();
|
||||||
std::string m_name;
|
std::string m_name;
|
||||||
|
|||||||
+31
-149
@@ -421,66 +421,19 @@ void Spell::FillTargetMap()
|
|||||||
SetTargetMap(i,m_spellInfo->EffectImplicitTargetA[i],tmpUnitMap);
|
SetTargetMap(i,m_spellInfo->EffectImplicitTargetA[i],tmpUnitMap);
|
||||||
SetTargetMap(i,m_spellInfo->EffectImplicitTargetB[i],tmpUnitMap);
|
SetTargetMap(i,m_spellInfo->EffectImplicitTargetB[i],tmpUnitMap);
|
||||||
|
|
||||||
if(m_targets.HasDest())
|
if(m_targets.HasDest()
|
||||||
|
&& spellmgr.EffectTargetType[m_spellInfo->Effect[i]] == SPELL_REQUIRE_DEST)
|
||||||
{
|
{
|
||||||
switch(m_spellInfo->Effect[i])
|
tmpUnitMap.clear();
|
||||||
{
|
tmpUnitMap.push_back(m_caster);
|
||||||
case SPELL_EFFECT_SUMMON:
|
|
||||||
case SPELL_EFFECT_SUMMON_WILD:
|
|
||||||
case SPELL_EFFECT_SUMMON_GUARDIAN:
|
|
||||||
case SPELL_EFFECT_TRANS_DOOR: //summon object
|
|
||||||
case SPELL_EFFECT_SUMMON_PET:
|
|
||||||
case SPELL_EFFECT_SUMMON_POSSESSED:
|
|
||||||
case SPELL_EFFECT_SUMMON_TOTEM:
|
|
||||||
case SPELL_EFFECT_SUMMON_OBJECT_WILD:
|
|
||||||
case SPELL_EFFECT_SUMMON_TOTEM_SLOT1:
|
|
||||||
case SPELL_EFFECT_SUMMON_TOTEM_SLOT2:
|
|
||||||
case SPELL_EFFECT_SUMMON_TOTEM_SLOT3:
|
|
||||||
case SPELL_EFFECT_SUMMON_TOTEM_SLOT4:
|
|
||||||
case SPELL_EFFECT_SUMMON_CRITTER:
|
|
||||||
case SPELL_EFFECT_SUMMON_OBJECT_SLOT1:
|
|
||||||
case SPELL_EFFECT_SUMMON_OBJECT_SLOT2:
|
|
||||||
case SPELL_EFFECT_SUMMON_OBJECT_SLOT3:
|
|
||||||
case SPELL_EFFECT_SUMMON_OBJECT_SLOT4:
|
|
||||||
case SPELL_EFFECT_SUMMON_DEAD_PET:
|
|
||||||
case SPELL_EFFECT_SUMMON_DEMON:
|
|
||||||
case SPELL_EFFECT_ADD_FARSIGHT:
|
|
||||||
case SPELL_EFFECT_TRIGGER_SPELL_2: //ritual of summon
|
|
||||||
case SPELL_EFFECT_TRIGGER_MISSILE:
|
|
||||||
{
|
|
||||||
tmpUnitMap.clear();
|
|
||||||
tmpUnitMap.push_back(m_caster);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!m_spellInfo->EffectImplicitTargetA[i])
|
if(!m_spellInfo->EffectImplicitTargetA[i]
|
||||||
{
|
&& spellmgr.EffectTargetType[m_spellInfo->Effect[i]] == SPELL_REQUIRE_NONE)
|
||||||
switch(m_spellInfo->Effect[i])
|
tmpUnitMap.push_back(m_caster);
|
||||||
{
|
|
||||||
case SPELL_EFFECT_PARRY: // 0
|
|
||||||
case SPELL_EFFECT_BLOCK: // 0
|
|
||||||
case SPELL_EFFECT_SKILL: // always with dummy 3 as A
|
|
||||||
case SPELL_EFFECT_LEARN_SPELL: // 0
|
|
||||||
case SPELL_EFFECT_TRADE_SKILL: // 0 or 1
|
|
||||||
case SPELL_EFFECT_PROFICIENCY: // 0
|
|
||||||
tmpUnitMap.push_back(m_caster);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(tmpUnitMap.empty())
|
if(tmpUnitMap.empty())
|
||||||
{
|
{
|
||||||
/*if( m_spellInfo->EffectImplicitTargetA[i]==TARGET_SCRIPT ||
|
|
||||||
m_spellInfo->EffectImplicitTargetB[i]==TARGET_SCRIPT ||
|
|
||||||
m_spellInfo->EffectImplicitTargetA[i]==TARGET_SCRIPT_COORDINATES ||
|
|
||||||
m_spellInfo->EffectImplicitTargetB[i]==TARGET_SCRIPT_COORDINATES )
|
|
||||||
{
|
|
||||||
if(!(m_targets.m_targetMask & TARGET_FLAG_DEST_LOCATION))
|
|
||||||
continue;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
// add here custom effects that need default target.
|
// add here custom effects that need default target.
|
||||||
// FOR EVERY TARGET TYPE THERE IS A DIFFERENT FILL!!
|
// FOR EVERY TARGET TYPE THERE IS A DIFFERENT FILL!!
|
||||||
switch(m_spellInfo->Effect[i])
|
switch(m_spellInfo->Effect[i])
|
||||||
@@ -494,26 +447,14 @@ void Spell::FillTargetMap()
|
|||||||
// non-standard target selection
|
// non-standard target selection
|
||||||
SpellRangeEntry const* srange = sSpellRangeStore.LookupEntry(m_spellInfo->rangeIndex);
|
SpellRangeEntry const* srange = sSpellRangeStore.LookupEntry(m_spellInfo->rangeIndex);
|
||||||
float max_range = GetSpellMaxRange(srange);
|
float max_range = GetSpellMaxRange(srange);
|
||||||
|
|
||||||
CellPair p(Trinity::ComputeCellPair(m_caster->GetPositionX(), m_caster->GetPositionY()));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
cell.SetNoCreate();
|
|
||||||
|
|
||||||
WorldObject* result = NULL;
|
WorldObject* result = NULL;
|
||||||
|
|
||||||
Trinity::CannibalizeObjectCheck u_check(m_caster, max_range);
|
Trinity::CannibalizeObjectCheck u_check(m_caster, max_range);
|
||||||
Trinity::WorldObjectSearcher<Trinity::CannibalizeObjectCheck > searcher(result, u_check);
|
Trinity::WorldObjectSearcher<Trinity::CannibalizeObjectCheck > searcher(result, u_check);
|
||||||
|
m_caster->VisitNearbyGridObject(max_range, searcher);
|
||||||
TypeContainerVisitor<Trinity::WorldObjectSearcher<Trinity::CannibalizeObjectCheck >, GridTypeMapContainer > grid_searcher(searcher);
|
|
||||||
CellLock<GridReadGuard> cell_lock(cell, p);
|
|
||||||
cell_lock->Visit(cell_lock, grid_searcher, *MapManager::Instance().GetMap(m_caster->GetMapId(), m_caster));
|
|
||||||
|
|
||||||
if(!result)
|
if(!result)
|
||||||
{
|
m_caster->VisitNearbyWorldObject(max_range, searcher);
|
||||||
TypeContainerVisitor<Trinity::WorldObjectSearcher<Trinity::CannibalizeObjectCheck >, WorldTypeMapContainer > world_searcher(searcher);
|
|
||||||
cell_lock->Visit(cell_lock, world_searcher, *MapManager::Instance().GetMap(m_caster->GetMapId(), m_caster));
|
|
||||||
}
|
|
||||||
|
|
||||||
if(result)
|
if(result)
|
||||||
{
|
{
|
||||||
@@ -1400,24 +1341,10 @@ void Spell::SearchChainTarget(std::list<Unit*> &TagUnitMap, Unit* pUnitTarget, f
|
|||||||
if(m_spellInfo->DmgClass != SPELL_DAMAGE_CLASS_MELEE)
|
if(m_spellInfo->DmgClass != SPELL_DAMAGE_CLASS_MELEE)
|
||||||
max_range += unMaxTargets * CHAIN_SPELL_JUMP_RADIUS;
|
max_range += unMaxTargets * CHAIN_SPELL_JUMP_RADIUS;
|
||||||
|
|
||||||
CellPair p(Trinity::ComputeCellPair(m_caster->GetPositionX(), m_caster->GetPositionY()));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
cell.SetNoCreate();
|
|
||||||
|
|
||||||
std::list<Unit *> tempUnitMap;
|
std::list<Unit *> tempUnitMap;
|
||||||
|
Trinity::AnyAoETargetUnitInObjectRangeCheck u_check(pUnitTarget, m_caster, max_range);
|
||||||
{
|
Trinity::UnitListSearcher<Trinity::AnyAoETargetUnitInObjectRangeCheck> searcher(tempUnitMap, u_check);
|
||||||
Trinity::AnyAoETargetUnitInObjectRangeCheck u_check(pUnitTarget, m_caster, max_range);
|
m_caster->VisitNearbyObject(max_range, searcher);
|
||||||
Trinity::UnitListSearcher<Trinity::AnyAoETargetUnitInObjectRangeCheck> searcher(tempUnitMap, u_check);
|
|
||||||
|
|
||||||
TypeContainerVisitor<Trinity::UnitListSearcher<Trinity::AnyAoETargetUnitInObjectRangeCheck>, WorldTypeMapContainer > world_unit_searcher(searcher);
|
|
||||||
TypeContainerVisitor<Trinity::UnitListSearcher<Trinity::AnyAoETargetUnitInObjectRangeCheck>, GridTypeMapContainer > grid_unit_searcher(searcher);
|
|
||||||
|
|
||||||
CellLock<GridReadGuard> cell_lock(cell, p);
|
|
||||||
cell_lock->Visit(cell_lock, world_unit_searcher, *MapManager::Instance().GetMap(m_caster->GetMapId(), m_caster));
|
|
||||||
cell_lock->Visit(cell_lock, grid_unit_searcher, *MapManager::Instance().GetMap(m_caster->GetMapId(), m_caster));
|
|
||||||
}
|
|
||||||
|
|
||||||
tempUnitMap.sort(TargetDistanceOrder(pUnitTarget));
|
tempUnitMap.sort(TargetDistanceOrder(pUnitTarget));
|
||||||
|
|
||||||
@@ -1482,68 +1409,41 @@ void Spell::SearchAreaTarget(std::list<Unit*> &TagUnitMap, float radius, const u
|
|||||||
m_caster->GetMap()->VisitWorld(x, y, radius, notifier);
|
m_caster->GetMap()->VisitWorld(x, y, radius, notifier);
|
||||||
else
|
else
|
||||||
m_caster->GetMap()->VisitAll(x, y, radius, notifier);
|
m_caster->GetMap()->VisitAll(x, y, radius, notifier);
|
||||||
|
|
||||||
/*float x_off, y_off;
|
|
||||||
CellPair p(Trinity::ComputeCellPair(x, y, x_off, y_off));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
cell.SetNoCreate();
|
|
||||||
CellLock<GridReadGuard> cell_lock(cell, p);
|
|
||||||
|
|
||||||
Trinity::SpellNotifierCreatureAndPlayer notifier(*this, TagUnitMap, radius, type, TargetType, entry);
|
|
||||||
|
|
||||||
//if(TargetType != SPELL_TARGETS_ENTRY)
|
|
||||||
{
|
|
||||||
TypeContainerVisitor<Trinity::SpellNotifierCreatureAndPlayer, WorldTypeMapContainer > world_object_notifier(notifier);
|
|
||||||
cell_lock->Visit(cell_lock, world_object_notifier, *m_caster->GetMap(), radius, x_off, y_off);
|
|
||||||
}
|
|
||||||
if(!(m_spellInfo->AttributesEx3 & SPELL_ATTR_EX3_PLAYERS_ONLY))
|
|
||||||
{
|
|
||||||
TypeContainerVisitor<Trinity::SpellNotifierCreatureAndPlayer, GridTypeMapContainer > grid_object_notifier(notifier);
|
|
||||||
cell_lock->Visit(cell_lock, grid_object_notifier, *m_caster->GetMap(), radius, x_off, y_off);
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Unit* Spell::SearchNearbyTarget(float radius, SpellTargets TargetType, uint32 entry)
|
Unit* Spell::SearchNearbyTarget(float radius, SpellTargets TargetType, uint32 entry)
|
||||||
{
|
{
|
||||||
CellPair p(Trinity::ComputeCellPair(m_caster->GetPositionX(), m_caster->GetPositionY()));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
cell.SetNoCreate();
|
|
||||||
CellLock<GridReadGuard> cell_lock(cell, p);
|
|
||||||
|
|
||||||
Unit* target = NULL;
|
Unit* target = NULL;
|
||||||
switch(TargetType)
|
switch(TargetType)
|
||||||
{
|
{
|
||||||
case SPELL_TARGETS_ENTRY:
|
case SPELL_TARGETS_ENTRY:
|
||||||
{
|
{
|
||||||
Creature* target = NULL;
|
if(entry)
|
||||||
Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck u_check(*m_caster, entry, true, radius);
|
{
|
||||||
Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck> searcher(target, u_check);
|
Creature* target = NULL;
|
||||||
TypeContainerVisitor<Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck>, WorldTypeMapContainer > world_unit_searcher(searcher);
|
Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck u_check(*m_caster, entry, true, radius);
|
||||||
TypeContainerVisitor<Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck>, GridTypeMapContainer > grid_unit_searcher(searcher);
|
Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck> searcher(target, u_check);
|
||||||
cell_lock->Visit(cell_lock, world_unit_searcher, *MapManager::Instance().GetMap(m_caster->GetMapId(), m_caster));
|
m_caster->VisitNearbyObject(radius, searcher);
|
||||||
cell_lock->Visit(cell_lock, grid_unit_searcher, *MapManager::Instance().GetMap(m_caster->GetMapId(), m_caster));
|
return target;
|
||||||
return target;
|
}
|
||||||
}break;
|
else
|
||||||
|
{
|
||||||
|
//TODO: nearest player
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
case SPELL_TARGETS_AOE_DAMAGE:
|
case SPELL_TARGETS_AOE_DAMAGE:
|
||||||
{
|
{
|
||||||
Trinity::AnyUnfriendlyUnitInObjectRangeCheck u_check(m_caster, m_caster, radius);
|
Trinity::AnyUnfriendlyUnitInObjectRangeCheck u_check(m_caster, m_caster, radius);
|
||||||
Trinity::UnitLastSearcher<Trinity::AnyUnfriendlyUnitInObjectRangeCheck> searcher(target, u_check);
|
Trinity::UnitLastSearcher<Trinity::AnyUnfriendlyUnitInObjectRangeCheck> searcher(target, u_check);
|
||||||
TypeContainerVisitor<Trinity::UnitLastSearcher<Trinity::AnyUnfriendlyUnitInObjectRangeCheck>, WorldTypeMapContainer > world_unit_searcher(searcher);
|
m_caster->VisitNearbyObject(radius, searcher);
|
||||||
TypeContainerVisitor<Trinity::UnitLastSearcher<Trinity::AnyUnfriendlyUnitInObjectRangeCheck>, GridTypeMapContainer > grid_unit_searcher(searcher);
|
|
||||||
cell_lock->Visit(cell_lock, world_unit_searcher, *MapManager::Instance().GetMap(m_caster->GetMapId(), m_caster));
|
|
||||||
cell_lock->Visit(cell_lock, grid_unit_searcher, *MapManager::Instance().GetMap(m_caster->GetMapId(), m_caster));
|
|
||||||
}break;
|
}break;
|
||||||
case SPELL_TARGETS_FRIENDLY:
|
case SPELL_TARGETS_FRIENDLY:
|
||||||
{
|
{
|
||||||
Trinity::AnyFriendlyUnitInObjectRangeCheck u_check(m_caster, m_caster, radius);
|
Trinity::AnyFriendlyUnitInObjectRangeCheck u_check(m_caster, m_caster, radius);
|
||||||
Trinity::UnitLastSearcher<Trinity::AnyFriendlyUnitInObjectRangeCheck> searcher(target, u_check);
|
Trinity::UnitLastSearcher<Trinity::AnyFriendlyUnitInObjectRangeCheck> searcher(target, u_check);
|
||||||
TypeContainerVisitor<Trinity::UnitLastSearcher<Trinity::AnyFriendlyUnitInObjectRangeCheck>, WorldTypeMapContainer > world_unit_searcher(searcher);
|
m_caster->VisitNearbyObject(radius, searcher);
|
||||||
TypeContainerVisitor<Trinity::UnitLastSearcher<Trinity::AnyFriendlyUnitInObjectRangeCheck>, GridTypeMapContainer > grid_unit_searcher(searcher);
|
|
||||||
cell_lock->Visit(cell_lock, world_unit_searcher, *MapManager::Instance().GetMap(m_caster->GetMapId(), m_caster));
|
|
||||||
cell_lock->Visit(cell_lock, grid_unit_searcher, *MapManager::Instance().GetMap(m_caster->GetMapId(), m_caster));
|
|
||||||
}break;
|
}break;
|
||||||
}
|
}
|
||||||
return target;
|
return target;
|
||||||
@@ -1775,16 +1675,9 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,std::list<Unit*> &TagUnitMap)
|
|||||||
|
|
||||||
if(i_spellST->second.targetEntry)
|
if(i_spellST->second.targetEntry)
|
||||||
{
|
{
|
||||||
CellPair p(Trinity::ComputeCellPair(m_caster->GetPositionX(), m_caster->GetPositionY()));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
|
|
||||||
Trinity::NearestGameObjectEntryInObjectRangeCheck go_check(*m_caster,i_spellST->second.targetEntry,range);
|
Trinity::NearestGameObjectEntryInObjectRangeCheck go_check(*m_caster,i_spellST->second.targetEntry,range);
|
||||||
Trinity::GameObjectLastSearcher<Trinity::NearestGameObjectEntryInObjectRangeCheck> checker(p_GameObject,go_check);
|
Trinity::GameObjectLastSearcher<Trinity::NearestGameObjectEntryInObjectRangeCheck> checker(p_GameObject,go_check);
|
||||||
|
m_caster->VisitNearbyGridObject(range, checker);
|
||||||
TypeContainerVisitor<Trinity::GameObjectLastSearcher<Trinity::NearestGameObjectEntryInObjectRangeCheck>, GridTypeMapContainer > object_checker(checker);
|
|
||||||
CellLock<GridReadGuard> cell_lock(cell, p);
|
|
||||||
cell_lock->Visit(cell_lock, object_checker, *MapManager::Instance().GetMap(m_caster->GetMapId(), m_caster));
|
|
||||||
|
|
||||||
if(p_GameObject)
|
if(p_GameObject)
|
||||||
{
|
{
|
||||||
@@ -1812,20 +1705,9 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,std::list<Unit*> &TagUnitMap)
|
|||||||
{
|
{
|
||||||
Creature *p_Creature = NULL;
|
Creature *p_Creature = NULL;
|
||||||
|
|
||||||
CellPair p(Trinity::ComputeCellPair(m_caster->GetPositionX(), m_caster->GetPositionY()));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
cell.SetNoCreate(); // Really don't know what is that???
|
|
||||||
|
|
||||||
Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck u_check(*m_caster,i_spellST->second.targetEntry,i_spellST->second.type!=SPELL_TARGET_TYPE_DEAD,range);
|
Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck u_check(*m_caster,i_spellST->second.targetEntry,i_spellST->second.type!=SPELL_TARGET_TYPE_DEAD,range);
|
||||||
Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck> searcher(p_Creature, u_check);
|
Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck> searcher(p_Creature, u_check);
|
||||||
|
m_caster->VisitNearbyObject(range, searcher);
|
||||||
TypeContainerVisitor<Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck>, WorldTypeMapContainer > world_creature_searcher(searcher);
|
|
||||||
TypeContainerVisitor<Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck>, GridTypeMapContainer > grid_creature_searcher(searcher);
|
|
||||||
|
|
||||||
CellLock<GridReadGuard> cell_lock(cell, p);
|
|
||||||
cell_lock->Visit(cell_lock, world_creature_searcher, *MapManager::Instance().GetMap(m_caster->GetMapId(), m_caster));
|
|
||||||
cell_lock->Visit(cell_lock, grid_creature_searcher, *MapManager::Instance().GetMap(m_caster->GetMapId(), m_caster));
|
|
||||||
|
|
||||||
if(p_Creature )
|
if(p_Creature )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1925,6 +1925,48 @@ void SpellMgr::LoadSpellCustomAttr()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for(int i = 0; i < TOTAL_SPELL_EFFECTS; ++i)
|
||||||
|
{
|
||||||
|
switch(i)
|
||||||
|
{
|
||||||
|
case SPELL_EFFECT_SUMMON:
|
||||||
|
case SPELL_EFFECT_SUMMON_WILD:
|
||||||
|
case SPELL_EFFECT_SUMMON_GUARDIAN:
|
||||||
|
case SPELL_EFFECT_TRANS_DOOR: //summon object
|
||||||
|
case SPELL_EFFECT_SUMMON_PET:
|
||||||
|
case SPELL_EFFECT_SUMMON_POSSESSED:
|
||||||
|
case SPELL_EFFECT_SUMMON_TOTEM:
|
||||||
|
case SPELL_EFFECT_SUMMON_OBJECT_WILD:
|
||||||
|
case SPELL_EFFECT_SUMMON_TOTEM_SLOT1:
|
||||||
|
case SPELL_EFFECT_SUMMON_TOTEM_SLOT2:
|
||||||
|
case SPELL_EFFECT_SUMMON_TOTEM_SLOT3:
|
||||||
|
case SPELL_EFFECT_SUMMON_TOTEM_SLOT4:
|
||||||
|
case SPELL_EFFECT_SUMMON_CRITTER:
|
||||||
|
case SPELL_EFFECT_SUMMON_OBJECT_SLOT1:
|
||||||
|
case SPELL_EFFECT_SUMMON_OBJECT_SLOT2:
|
||||||
|
case SPELL_EFFECT_SUMMON_OBJECT_SLOT3:
|
||||||
|
case SPELL_EFFECT_SUMMON_OBJECT_SLOT4:
|
||||||
|
case SPELL_EFFECT_SUMMON_DEAD_PET:
|
||||||
|
case SPELL_EFFECT_SUMMON_DEMON:
|
||||||
|
case SPELL_EFFECT_ADD_FARSIGHT:
|
||||||
|
case SPELL_EFFECT_TRIGGER_SPELL_2: //ritual of summon
|
||||||
|
case SPELL_EFFECT_TRIGGER_MISSILE:
|
||||||
|
EffectTargetType[i] = SPELL_REQUIRE_DEST;
|
||||||
|
break;
|
||||||
|
case SPELL_EFFECT_PARRY: // 0
|
||||||
|
case SPELL_EFFECT_BLOCK: // 0
|
||||||
|
case SPELL_EFFECT_SKILL: // always with dummy 3 as A
|
||||||
|
case SPELL_EFFECT_LEARN_SPELL: // 0
|
||||||
|
case SPELL_EFFECT_TRADE_SKILL: // 0 or 1
|
||||||
|
case SPELL_EFFECT_PROFICIENCY: // 0
|
||||||
|
EffectTargetType[i] = SPELL_REQUIRE_NONE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
EffectTargetType[i] = SPELL_REQUIRE_UNIT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpellMgr::LoadSpellLinked()
|
void SpellMgr::LoadSpellLinked()
|
||||||
|
|||||||
@@ -233,6 +233,13 @@ enum SpellDisableTypes
|
|||||||
SPELL_DISABLE_CREATURE = 2
|
SPELL_DISABLE_CREATURE = 2
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum SpellEffectTargetTypes
|
||||||
|
{
|
||||||
|
SPELL_REQUIRE_NONE,
|
||||||
|
SPELL_REQUIRE_UNIT,
|
||||||
|
SPELL_REQUIRE_DEST,
|
||||||
|
};
|
||||||
|
|
||||||
//Some SpellFamilyFlags
|
//Some SpellFamilyFlags
|
||||||
#define SPELLFAMILYFLAG_ROGUE_VANISH 0x000000800LL
|
#define SPELLFAMILYFLAG_ROGUE_VANISH 0x000000800LL
|
||||||
#define SPELLFAMILYFLAG_ROGUE_STEALTH 0x000400000LL
|
#define SPELLFAMILYFLAG_ROGUE_STEALTH 0x000400000LL
|
||||||
@@ -918,6 +925,8 @@ class SpellMgr
|
|||||||
return itr != mSpellLinkedMap.end() ? &(itr->second) : NULL;
|
return itr != mSpellLinkedMap.end() ? &(itr->second) : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SpellEffectTargetTypes EffectTargetType[TOTAL_SPELL_EFFECTS];
|
||||||
|
|
||||||
// Modifiers
|
// Modifiers
|
||||||
public:
|
public:
|
||||||
static SpellMgr& Instance();
|
static SpellMgr& Instance();
|
||||||
|
|||||||
Reference in New Issue
Block a user