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:
QAston
2010-08-18 15:04:00 +02:00
parent 9d45f29593
commit 5e78e222c1
5 changed files with 29 additions and 24 deletions
@@ -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,
+16 -4
View File
@@ -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;
+1
View File
@@ -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; }
+1 -10
View File
@@ -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;
+6 -4
View File
@@ -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;