diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index f78de43b39..72f27237f2 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -1573,7 +1573,7 @@ void Spell::SelectImplicitCasterDestTargets(SpellEffIndex effIndex, SpellImplici { 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: @@ -1620,8 +1620,6 @@ void Spell::SelectImplicitTargetDestTargets(SpellEffIndex effIndex, SpellImplici { float angle = targetType.CalcDirectionAngle(m_spellInfo->Effects[effIndex]); float dist = m_spellInfo->Effects[effIndex].CalcRadius(nullptr, targetIndex); - if (targetType.GetTarget() == TARGET_DEST_TARGET_RANDOM) - dist *= rand_norm(); Position pos = dest._position; target->MovePositionToFirstCollision(pos, dist, angle); @@ -1656,8 +1654,6 @@ void Spell::SelectImplicitDestDestTargets(SpellEffIndex effIndex, SpellImplicitT { float angle = targetType.CalcDirectionAngle(m_spellInfo->Effects[effIndex]); float dist = m_spellInfo->Effects[effIndex].CalcRadius(m_caster, targetIndex); - if (targetType.GetTarget() == TARGET_DEST_DEST_RANDOM) - dist *= rand_norm(); Position pos = dest._position; m_caster->MovePositionToFirstCollision(pos, dist, angle); diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 652b901a0d..54461c018d 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -639,14 +639,28 @@ 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; + + // 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) { if (Unit* casterUnit = caster->ToUnit())