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 | 38 | ||||
-rw-r--r-- | src/server/game/Spells/SpellInfo.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Spells/SpellMgr.cpp | 8 |
4 files changed, 47 insertions, 3 deletions
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 7d19e472109..250628f3d05 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -2747,7 +2747,7 @@ enum Targets TARGET_UNK_139 = 139, TARGET_DEST_CASTER_CLUMP_CENTROID = 140, // NYI TARGET_UNK_141 = 141, - TARGET_UNK_142 = 142, + TARGET_DEST_NEARBY_ENTRY_OR_DB = 142, TARGET_UNK_143 = 143, TARGET_UNK_144 = 144, TARGET_UNK_145 = 145, diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index aa1531619c7..b45ce4a5fa8 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -1146,6 +1146,25 @@ void Spell::SelectImplicitNearbyTargets(SpellEffectInfo const& spellEffectInfo, } return; } + if (targetType.GetTarget() == TARGET_DEST_NEARBY_ENTRY_OR_DB) + { + if (SpellTargetPosition const* st = sSpellMgr->GetSpellTargetPosition(m_spellInfo->Id, spellEffectInfo.EffectIndex)) + { + SpellDestination dest(*m_caster); + if (st->target_mapId == m_caster->GetMapId() && m_caster->IsInDist(st->target_X, st->target_Y, st->target_Z, range)) + dest = SpellDestination(st->target_X, st->target_Y, st->target_Z, st->target_Orientation); + else + { + float randomRadius = spellEffectInfo.CalcRadius(m_caster); + if (randomRadius > 0.0f) + m_caster->MovePositionToFirstCollision(dest._position, randomRadius, targetType.CalcDirectionAngle()); + } + + CallScriptDestinationTargetSelectHandlers(dest, spellEffectInfo.EffectIndex, targetType); + m_targets.SetDst(dest); + return; + } + } break; default: break; @@ -1153,6 +1172,22 @@ void Spell::SelectImplicitNearbyTargets(SpellEffectInfo const& spellEffectInfo, } WorldObject* target = SearchNearbyTarget(range, targetType.GetObjectType(), targetType.GetCheckType(), condList); + float randomRadius = 0.0f; + switch (targetType.GetTarget()) + { + case TARGET_DEST_NEARBY_ENTRY_OR_DB: + // if we are here then there was no db target + if (!target) + { + target = m_caster; + // radius is only meant to be randomized when using caster fallback + randomRadius = spellEffectInfo.CalcRadius(m_caster); + } + break; + default: + break; + } + if (!target) { TC_LOG_DEBUG("spells", "Spell::SelectImplicitNearbyTargets: cannot find nearby target for spell ID {}, effect {}", m_spellInfo->Id, uint32(spellEffectInfo.EffectIndex)); @@ -1208,6 +1243,9 @@ void Spell::SelectImplicitNearbyTargets(SpellEffectInfo const& spellEffectInfo, case TARGET_OBJECT_TYPE_DEST: { SpellDestination dest(*target); + if (randomRadius > 0.0f) + target->MovePositionToFirstCollision(dest._position, randomRadius, targetType.CalcDirectionAngle()); + if (m_spellInfo->HasAttribute(SPELL_ATTR4_USE_FACING_FROM_SPELL)) dest._position.SetOrientation(spellEffectInfo.PositionFacing); diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 7c0ef4b6f46..cab8349095b 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -382,7 +382,7 @@ std::array<SpellImplicitTargetInfo::StaticData, TOTAL_SPELL_TARGETS> SpellImplic {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 139 {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 140 TARGET_DEST_CASTER_CLUMP_CENTROID {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 141 - {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 142 + {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_NEARBY, TARGET_CHECK_ENTRY, TARGET_DIR_FRONT_RIGHT}, // 142 TARGET_DEST_NEARBY_ENTRY_OR_DB {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 143 {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 144 {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 145 diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 166172dd88a..5e39db72916 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -1202,7 +1202,13 @@ void SpellMgr::LoadSpellTargetPositions() else st.target_Orientation = spellInfo->GetEffect(effIndex).PositionFacing; - if (spellInfo->GetEffect(effIndex).TargetA.GetTarget() == TARGET_DEST_DB || spellInfo->GetEffect(effIndex).TargetB.GetTarget() == TARGET_DEST_DB) + auto hasTarget = [&](Targets target) + { + SpellEffectInfo const& spellEffectInfo = spellInfo->GetEffect(effIndex); + return spellEffectInfo.TargetA.GetTarget() == target || spellEffectInfo.TargetB.GetTarget() == target; + }; + + if (hasTarget(TARGET_DEST_DB) || hasTarget(TARGET_DEST_NEARBY_ENTRY_OR_DB)) { std::pair<uint32, SpellEffIndex> key = std::make_pair(spellId, effIndex); mSpellTargetPositions[key] = st; |