Core/Spells: Fixed target radius calculation for TARGET_DEST_*_RANDOM (#29479)

(cherry picked from commit 87f3ab11d3)
This commit is contained in:
Meji
2023-12-08 01:54:48 +01:00
committed by funjoker
parent 9e317a047a
commit c8e87e59e0
2 changed files with 12 additions and 7 deletions

View File

@@ -1603,7 +1603,7 @@ void Spell::SelectImplicitCasterDestTargets(SpellEffectInfo const& spellEffectIn
break;
case TARGET_DEST_CASTER_RANDOM:
if (dist > objSize)
dist = objSize + (dist - objSize) * rand_norm();
dist = objSize + (dist - objSize);
break;
case TARGET_DEST_CASTER_FRONT_LEFT:
case TARGET_DEST_CASTER_BACK_LEFT:
@@ -1654,8 +1654,6 @@ void Spell::SelectImplicitTargetDestTargets(SpellEffectInfo const& spellEffectIn
{
float angle = targetType.CalcDirectionAngle();
float dist = spellEffectInfo.CalcRadius(nullptr, targetIndex);
if (targetType.GetTarget() == TARGET_DEST_TARGET_RANDOM)
dist *= rand_norm();
Position pos = dest._position;
target->MovePositionToFirstCollision(pos, dist, angle);
@@ -1708,8 +1706,6 @@ void Spell::SelectImplicitDestDestTargets(SpellEffectInfo const& spellEffectInfo
{
float angle = targetType.CalcDirectionAngle();
float dist = spellEffectInfo.CalcRadius(m_caster, targetIndex);
if (targetType.GetTarget() == TARGET_DEST_DEST_RANDOM)
dist *= rand_norm();
Position pos = dest._position;
m_caster->MovePositionToFirstCollision(pos, dist, angle);

View File

@@ -645,17 +645,26 @@ float SpellEffectInfo::CalcRadius(WorldObject* caster /*= nullptr*/, SpellTarget
// TargetA -> TargetARadiusEntry
// TargetB -> TargetBRadiusEntry
// Aura effects have TargetARadiusEntry == TargetBRadiusEntry (mostly)
SpellImplicitTargetInfo target = TargetA;
SpellRadiusEntry const* entry = TargetARadiusEntry;
if (targetIndex == SpellTargetIndex::TargetB && HasRadius(targetIndex))
{
target = TargetB;
entry = TargetBRadiusEntry;
}
if (!entry)
return 0.0f;
float radius = entry->RadiusMin;
// Client uses max if min is 0
if (radius == 0.0f)
// Random targets use random value between RadiusMin and RadiusMax
// For other cases, client uses RadiusMax if RadiusMin is 0
if (target.GetTarget() == TARGET_DEST_CASTER_RANDOM ||
target.GetTarget() == TARGET_DEST_TARGET_RANDOM ||
target.GetTarget() == TARGET_DEST_DEST_RANDOM)
radius += (entry->RadiusMax - radius) * rand_norm();
else if (radius == 0.0f)
radius = entry->RadiusMax;
if (caster)