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