diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Miscellaneous/SharedDefines.h | 2 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 36 | ||||
-rw-r--r-- | src/server/game/Spells/SpellInfo.cpp | 2 |
3 files changed, 38 insertions, 2 deletions
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 21bf938811d..469a2b847a1 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -2635,7 +2635,7 @@ enum Targets TARGET_UNIT_LINE_CASTER_TO_DEST_ENEMY = 134, TARGET_UNIT_LINE_CASTER_TO_DEST = 135, TARGET_UNK_136 = 136, - TARGET_UNK_137 = 137, + TARGET_DEST_CASTER_MOVEMENT_DIRECTION = 137, TARGET_DEST_DEST_GROUND = 138, TARGET_UNK_139 = 139, TARGET_UNK_140 = 140, diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 10b03a50ffe..461d4d81129 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -1351,6 +1351,7 @@ void Spell::SelectImplicitCasterDestTargets(SpellEffectInfo const& spellEffectIn break; } case TARGET_DEST_CASTER_FRONT_LEAP: + case TARGET_DEST_CASTER_MOVEMENT_DIRECTION: { Unit* unitCaster = m_caster->ToUnit(); if (!unitCaster) @@ -1358,6 +1359,41 @@ void Spell::SelectImplicitCasterDestTargets(SpellEffectInfo const& spellEffectIn float dist = spellEffectInfo.CalcRadius(unitCaster); float angle = targetType.CalcDirectionAngle(); + if (targetType.GetTarget() == TARGET_DEST_CASTER_MOVEMENT_DIRECTION) + { + angle = [&]() + { + switch (m_caster->m_movementInfo.GetMovementFlags() & (MOVEMENTFLAG_FORWARD | MOVEMENTFLAG_BACKWARD | MOVEMENTFLAG_STRAFE_LEFT | MOVEMENTFLAG_STRAFE_RIGHT)) + { + case MOVEMENTFLAG_NONE: + case MOVEMENTFLAG_FORWARD: + case MOVEMENTFLAG_FORWARD | MOVEMENTFLAG_BACKWARD: + case MOVEMENTFLAG_STRAFE_LEFT | MOVEMENTFLAG_STRAFE_RIGHT: + case MOVEMENTFLAG_FORWARD | MOVEMENTFLAG_STRAFE_LEFT | MOVEMENTFLAG_STRAFE_RIGHT: + case MOVEMENTFLAG_FORWARD | MOVEMENTFLAG_BACKWARD | MOVEMENTFLAG_STRAFE_LEFT | MOVEMENTFLAG_STRAFE_RIGHT: + return 0.0f; + case MOVEMENTFLAG_BACKWARD: + case MOVEMENTFLAG_BACKWARD | MOVEMENTFLAG_STRAFE_LEFT | MOVEMENTFLAG_STRAFE_RIGHT: + return static_cast<float>(M_PI); + case MOVEMENTFLAG_STRAFE_LEFT: + case MOVEMENTFLAG_FORWARD | MOVEMENTFLAG_BACKWARD | MOVEMENTFLAG_STRAFE_LEFT: + return static_cast<float>(M_PI / 2); + case MOVEMENTFLAG_FORWARD | MOVEMENTFLAG_STRAFE_LEFT: + return static_cast<float>(M_PI / 4); + case MOVEMENTFLAG_BACKWARD | MOVEMENTFLAG_STRAFE_LEFT: + return static_cast<float>(3 * M_PI / 4); + case MOVEMENTFLAG_STRAFE_RIGHT: + case MOVEMENTFLAG_FORWARD | MOVEMENTFLAG_BACKWARD | MOVEMENTFLAG_STRAFE_RIGHT: + return static_cast<float>(-M_PI / 2); + case MOVEMENTFLAG_FORWARD | MOVEMENTFLAG_STRAFE_RIGHT: + return static_cast<float>(-M_PI / 4); + case MOVEMENTFLAG_BACKWARD | MOVEMENTFLAG_STRAFE_RIGHT: + return static_cast<float>(-3 * M_PI / 4); + default: + return 0.0f; + } + }(); + } Position pos = dest._position; diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 7f16a53498b..054d9bf0ab4 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -355,7 +355,7 @@ SpellImplicitTargetInfo::StaticData SpellImplicitTargetInfo::_data[TOTAL_SPELL_T {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_DEST, TARGET_SELECT_CATEGORY_LINE, TARGET_CHECK_ENEMY, TARGET_DIR_NONE}, // 134 TARGET_UNIT_LINE_CASTER_TO_DEST_ENEMY {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_DEST, TARGET_SELECT_CATEGORY_LINE, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 135 TARGET_UNIT_LINE_CASTER_TO_DEST {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 136 - {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 137 + {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 137 TARGET_DEST_CASTER_MOVEMENT_DIRECTION {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_DEST, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 138 TARGET_DEST_DEST_GROUND {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 139 {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 140 |