Core/Spells: Implement TARGET_DEST_CHANNEL_CASTER(106) and TARGET_GAMEOBJECT_AREA_PATH(108). Rename TARGET_UNIT_CHANNEL to TARGET_UNIT_CHANNEL_TARGET, TARGET_DEST_CHANNEL to TARGET_DEST_CHANNEL_TARGET
--HG-- branch : trunk
This commit is contained in:
@@ -1173,8 +1173,8 @@ enum Targets
|
||||
TARGET_DEST_CASTER_RADIUS = 73,
|
||||
TARGET_DEST_TARGET_RANDOM = 74,
|
||||
TARGET_DEST_TARGET_RADIUS = 75,
|
||||
TARGET_DEST_CHANNEL = 76,
|
||||
TARGET_UNIT_CHANNEL = 77,
|
||||
TARGET_DEST_CHANNEL_TARGET = 76,
|
||||
TARGET_UNIT_CHANNEL_TARGET = 77,
|
||||
TARGET_DEST_DEST_FRONT = 78,
|
||||
TARGET_DEST_DEST_BACK = 79,
|
||||
TARGET_DEST_DEST_RIGHT = 80,
|
||||
@@ -1203,14 +1203,13 @@ enum Targets
|
||||
TARGET_UNIT_PASSENGER_7 = 103,
|
||||
TARGET_UNIT_AREA_PATH = 104,
|
||||
TARGET_UNIT_UNK_105 = 105, // 1 spell
|
||||
TARGET_DEST_CHANNEL_TARGET = 106, // TODO
|
||||
TARGET_DEST_CHANNEL_CASTER = 106,
|
||||
TARGET_UNK_AREA_UNK_DST_107 = 107, // not enough info - only generic spells avalible
|
||||
TARGET_GAMEOBJECT_AREA_PATH = 108, // TODO
|
||||
TARGET_GAMEOBJECT_AREA_PATH = 108,
|
||||
TARGET_DEST_UNK_110 = 110, // some kind of traj?
|
||||
TOTAL_SPELL_TARGETS
|
||||
};
|
||||
|
||||
#define TOTAL_SPELL_TARGETS 105
|
||||
|
||||
enum SpellMissInfo
|
||||
{
|
||||
SPELL_MISS_NONE = 0,
|
||||
|
||||
@@ -164,6 +164,14 @@ void SpellCastTargets::setDst(WorldObject &wObj)
|
||||
m_targetMask |= TARGET_FLAG_DEST_LOCATION;
|
||||
}
|
||||
|
||||
void SpellCastTargets::setDst(SpellCastTargets &spellTargets)
|
||||
{
|
||||
m_dstTransGUID = spellTargets.m_dstTransGUID;
|
||||
m_dstTransOffset.Relocate(spellTargets.m_dstTransOffset);
|
||||
m_dstPos.Relocate(spellTargets.m_dstPos);
|
||||
m_targetMask |= TARGET_FLAG_DEST_LOCATION;
|
||||
}
|
||||
|
||||
void SpellCastTargets::modDst(Position &pos)
|
||||
{
|
||||
ASSERT(m_targetMask & TARGET_FLAG_DEST_LOCATION);
|
||||
@@ -2329,21 +2337,24 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur)
|
||||
|
||||
switch (cur)
|
||||
{
|
||||
case TARGET_UNIT_CHANNEL:
|
||||
// in some cases unittarget is invalid and crash. do not know why it happens.
|
||||
case TARGET_UNIT_CHANNEL_TARGET:
|
||||
// unit target may be no longer avalible - teleported out of map for example
|
||||
if (Unit* target = Unit::GetUnit(*m_caster, m_originalCaster->GetCurrentSpell(CURRENT_CHANNELED_SPELL)->m_targets.getUnitTargetGUID()))
|
||||
AddUnitTarget(target, i);
|
||||
else
|
||||
sLog.outError("SPELL: cannot find channel spell target for spell ID %u", m_spellInfo->Id);
|
||||
break;
|
||||
case TARGET_DEST_CHANNEL:
|
||||
case TARGET_DEST_CHANNEL_TARGET:
|
||||
if (m_originalCaster->GetCurrentSpell(CURRENT_CHANNELED_SPELL)->m_targets.HasDst())
|
||||
m_targets = m_originalCaster->GetCurrentSpell(CURRENT_CHANNELED_SPELL)->m_targets;
|
||||
m_targets.setDst(m_originalCaster->GetCurrentSpell(CURRENT_CHANNELED_SPELL)->m_targets);
|
||||
else if (Unit* target = Unit::GetUnit(*m_caster, m_originalCaster->GetCurrentSpell(CURRENT_CHANNELED_SPELL)->m_targets.getUnitTargetGUID()))
|
||||
m_targets.setDst(*target);
|
||||
else
|
||||
sLog.outError("SPELL: cannot find channel spell destination for spell ID %u", m_spellInfo->Id);
|
||||
break;
|
||||
case TARGET_DEST_CHANNEL_CASTER:
|
||||
m_targets.setDst(*m_originalCaster->GetCurrentSpell(CURRENT_CHANNELED_SPELL)->GetCaster());
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -2455,6 +2466,7 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur)
|
||||
break;
|
||||
case TARGET_GAMEOBJECT_AREA_SRC:
|
||||
case TARGET_GAMEOBJECT_AREA_DST:
|
||||
case TARGET_GAMEOBJECT_AREA_PATH:
|
||||
radius = GetSpellRadius(m_spellInfo, i, true);
|
||||
targetType = SPELL_TARGETS_GO;
|
||||
break;
|
||||
|
||||
@@ -179,6 +179,7 @@ class SpellCastTargets
|
||||
void setDst(float x, float y, float z, float orientation, uint32 mapId = MAPID_INVALID);
|
||||
void setDst(Position &pos);
|
||||
void setDst(WorldObject &wObj);
|
||||
void setDst(SpellCastTargets &spellTargets);
|
||||
void modDst(Position &pos);
|
||||
|
||||
uint64 getGOTargetGUID() const { return m_GOTargetGUID; }
|
||||
|
||||
@@ -4810,15 +4810,6 @@ void Spell::EffectScriptEffect(uint32 effIndex)
|
||||
cTarget->RemoveCorpse();
|
||||
break;
|
||||
}
|
||||
/*// Flame Crash
|
||||
case 41126:
|
||||
{
|
||||
if (!unitTarget)
|
||||
return;
|
||||
|
||||
unitTarget->CastSpell(unitTarget, 41131, true);
|
||||
break;
|
||||
}*/
|
||||
case 48025: // Headless Horseman's Mount
|
||||
{
|
||||
if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER)
|
||||
@@ -7310,7 +7301,7 @@ void Spell::EffectRechargeManaGem(uint32 /*i*/)
|
||||
if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER)
|
||||
return;
|
||||
|
||||
Player *player = (Player*)m_caster;
|
||||
Player *player = m_caster->ToPlayer();
|
||||
|
||||
if (!player)
|
||||
return;
|
||||
|
||||
@@ -160,6 +160,7 @@ SpellMgr::SpellMgr()
|
||||
case TARGET_UNIT_CONE_ENTRY:
|
||||
case TARGET_UNIT_CONE_ENEMY_UNKNOWN:
|
||||
case TARGET_UNIT_AREA_PATH:
|
||||
case TARGET_GAMEOBJECT_AREA_PATH:
|
||||
SpellTargetType[i] = TARGET_TYPE_AREA_CONE;
|
||||
break;
|
||||
case TARGET_DST_CASTER:
|
||||
@@ -214,8 +215,9 @@ SpellMgr::SpellMgr()
|
||||
case TARGET_DST_NEARBY_ENTRY:
|
||||
SpellTargetType[i] = TARGET_TYPE_DEST_SPECIAL;
|
||||
break;
|
||||
case TARGET_UNIT_CHANNEL:
|
||||
case TARGET_DEST_CHANNEL:
|
||||
case TARGET_UNIT_CHANNEL_TARGET:
|
||||
case TARGET_DEST_CHANNEL_TARGET:
|
||||
case TARGET_DEST_CHANNEL_CASTER:
|
||||
SpellTargetType[i] = TARGET_TYPE_CHANNEL;
|
||||
break;
|
||||
default:
|
||||
@@ -223,7 +225,7 @@ SpellMgr::SpellMgr()
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < TOTAL_SPELL_TARGETS; ++i)
|
||||
for (int32 i = 0; i < TOTAL_SPELL_TARGETS; ++i)
|
||||
{
|
||||
switch(i)
|
||||
{
|
||||
@@ -241,6 +243,7 @@ SpellMgr::SpellMgr()
|
||||
case TARGET_UNIT_CONE_ALLY:
|
||||
case TARGET_UNIT_CONE_ENEMY_UNKNOWN:
|
||||
case TARGET_UNIT_AREA_PATH:
|
||||
case TARGET_GAMEOBJECT_AREA_PATH:
|
||||
case TARGET_UNIT_RAID_CASTER:
|
||||
IsAreaEffectTarget[i] = true;
|
||||
break;
|
||||
@@ -734,7 +737,6 @@ bool IsPositiveTarget(uint32 targetA, uint32 targetB)
|
||||
case TARGET_UNIT_CONE_ENEMY:
|
||||
case TARGET_DEST_DYNOBJ_ENEMY:
|
||||
case TARGET_DST_TARGET_ENEMY:
|
||||
case TARGET_UNIT_CHANNEL:
|
||||
return false;
|
||||
default:
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user