diff options
author | QAston <none@none> | 2010-08-18 15:04:00 +0200 |
---|---|---|
committer | QAston <none@none> | 2010-08-18 15:04:00 +0200 |
commit | 5e78e222c1d6277d438df64eb8d3840f89d88d22 (patch) | |
tree | 8b5ec158f13415a21b0e737371220c48c8e765c7 | |
parent | 9d45f295930b2ddcc481ff56926903317cd59a89 (diff) |
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
-rw-r--r-- | src/server/game/Miscellaneous/SharedDefines.h | 11 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 20 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.h | 1 | ||||
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 11 | ||||
-rw-r--r-- | src/server/game/Spells/SpellMgr.cpp | 10 |
5 files changed, 29 insertions, 24 deletions
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 8969225503b..7b0798d4b14 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -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, diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index f65f7e5bb78..6c5726092cb 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -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; diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 948a6d7987f..bca77c647a7 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -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; } diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 4b3031922d7..09ef6e4b7b2 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -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; diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index b69cc32139d..fd936a130d6 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -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; |