Core/Spells: Implemented spell target type 142
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user