Core/Spells: Implemented spell target type 142

This commit is contained in:
Shauren
2023-05-28 01:14:19 +02:00
parent 7881f0ef5f
commit 3790c1e3da
4 changed files with 47 additions and 3 deletions
@@ -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,
+38
View File
@@ -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);
+1 -1
View File
@@ -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
+7 -1
View File
@@ -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;