From 41fec59cf94319f0f05a55bd4ef4e4623d6f0a88 Mon Sep 17 00:00:00 2001 From: qsa Date: Mon, 28 Sep 2009 15:36:51 +0300 Subject: [PATCH] Implement implicit target types 64, 66, 67 Signed-off-by: Ambal --- src/game/SharedDefines.h | 3 +++ src/game/Spell.cpp | 16 +++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.h index 323939397..b71801467 100644 --- a/src/game/SharedDefines.h +++ b/src/game/SharedDefines.h @@ -1054,7 +1054,10 @@ enum Targets TARGET_NARROW_FRONTAL_CONE = 60, TARGET_AREAEFFECT_PARTY_AND_CLASS = 61, TARGET_DUELVSPLAYER_COORDINATES = 63, + TARGET_INFRONT_OF_VICTIM = 64, TARGET_BEHIND_VICTIM = 65, // used in teleport behind spells, caster/target dependent from spell effect + TARGET_RIGHT_FROM_VICTIM = 66, + TARGET_LEFT_FROM_VICTIM = 67, TARGET_RANDOM_NEARBY_LOC = 72, // used in teleport onto nearby locations TARGET_RANDOM_CIRCUMFERENCE_POINT = 73, TARGET_DYNAMIC_OBJECT_COORDINATES = 76, diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index a0c587e77..d5f20904d 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -2022,7 +2022,10 @@ void Spell::SetTargetMap(uint32 effIndex,uint32 targetMode,UnitList& TagUnitMap) sLog.outError( "SPELL: unknown target coordinates for spell ID %u", m_spellInfo->Id ); break; } + case TARGET_INFRONT_OF_VICTIM: case TARGET_BEHIND_VICTIM: + case TARGET_RIGHT_FROM_VICTIM: + case TARGET_LEFT_FROM_VICTIM: { Unit *pTarget = NULL; @@ -2037,8 +2040,19 @@ void Spell::SetTargetMap(uint32 effIndex,uint32 targetMode,UnitList& TagUnitMap) if(pTarget) { + float angle = 0.0f; + float dist = (radius && targetMode != TARGET_BEHIND_VICTIM) ? radius : CONTACT_DISTANCE; + + switch(targetMode) + { + case TARGET_INFRONT_OF_VICTIM: break; + case TARGET_BEHIND_VICTIM: angle = M_PI; break; + case TARGET_RIGHT_FROM_VICTIM: angle = -M_PI/2; break; + case TARGET_LEFT_FROM_VICTIM: angle = M_PI/2; break; + } + float _target_x, _target_y, _target_z; - pTarget->GetClosePoint(_target_x, _target_y, _target_z, m_caster->GetObjectSize(), CONTACT_DISTANCE, M_PI); + pTarget->GetClosePoint(_target_x, _target_y, _target_z, pTarget->GetObjectSize(), dist, angle); if(pTarget->IsWithinLOS(_target_x, _target_y, _target_z)) { TagUnitMap.push_back(m_caster);