aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2025-08-24 14:46:20 +0200
committerShauren <shauren.trinity@gmail.com>2025-08-24 14:46:20 +0200
commitb0de792bb8b904bf59bebc45aa3cf6ba6672b032 (patch)
tree06936c25459be242548a4ff5850d17e99bbde653 /src/server/scripts
parentac15007872796937de182c0d90da1687aad61691 (diff)
Scripts/Spells: Rewrite druid talent Shooting Stars to have reduced proc chance on multiple targets
Diffstat (limited to 'src/server/scripts')
-rw-r--r--src/server/scripts/Spells/spell_druid.cpp52
1 files changed, 43 insertions, 9 deletions
diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp
index 46fc1d6c0a4..57ec310c9ed 100644
--- a/src/server/scripts/Spells/spell_druid.cpp
+++ b/src/server/scripts/Spells/spell_druid.cpp
@@ -1700,26 +1700,60 @@ class spell_dru_savage_roar_aura : public AuraScript
}
};
-// 164815 - Sunfire
-// 164812 - Moonfire
+// 202342 - Shooting Stars
class spell_dru_shooting_stars : public AuraScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
- return ValidateSpellInfo({ SPELL_DRUID_SHOOTING_STARS, SPELL_DRUID_SHOOTING_STARS_DAMAGE });
+ return ValidateSpellInfo({ SPELL_DRUID_SHOOTING_STARS_DAMAGE })
+ && ValidateSpellEffect({ { SPELL_DRUID_MOONFIRE_DAMAGE, EFFECT_1 }, { SPELL_DRUID_SUNFIRE_DAMAGE, EFFECT_1 } })
+ && sSpellMgr->AssertSpellInfo(SPELL_DRUID_MOONFIRE_DAMAGE, DIFFICULTY_NONE)->GetEffect(EFFECT_1).IsAura(SPELL_AURA_PERIODIC_DAMAGE)
+ && sSpellMgr->AssertSpellInfo(SPELL_DRUID_SUNFIRE_DAMAGE, DIFFICULTY_NONE)->GetEffect(EFFECT_1).IsAura(SPELL_AURA_PERIODIC_DAMAGE);
}
- void OnTick(AuraEffect const* /*aurEff*/)
+ void OnTick(AuraEffect const* aurEff) const
{
- if (Unit* caster = GetCaster())
- if (AuraEffect const* shootingStars = caster->GetAuraEffect(SPELL_DRUID_SHOOTING_STARS, EFFECT_0))
- if (roll_chance_i(shootingStars->GetAmount()))
- caster->CastSpell(GetTarget(), SPELL_DRUID_SHOOTING_STARS_DAMAGE, true);
+ Unit* caster = GetTarget();
+ std::vector<Unit*> moonfires;
+ std::vector<Unit*> sunfires;
+ auto work = [&, druid = caster->GetGUID()](Unit* target)
+ {
+ if (target->HasAuraEffect(SPELL_DRUID_MOONFIRE_DAMAGE, EFFECT_1, druid))
+ moonfires.push_back(target);
+
+ if (target->HasAuraEffect(SPELL_DRUID_SUNFIRE_DAMAGE, EFFECT_1, druid))
+ sunfires.push_back(target);
+ };
+ Trinity::UnitWorker worker(caster, work);
+ Cell::VisitAllObjects(caster, worker, 100.0f);
+
+ ProcessDoT(aurEff, caster, moonfires);
+ ProcessDoT(aurEff, caster, sunfires);
+ }
+
+ static void ProcessDoT(AuraEffect const* aurEff, Unit* caster, std::vector<Unit*>& targets)
+ {
+ if (targets.empty())
+ return;
+
+ float chance = float(aurEff->GetAmount()) * std::sqrt(float(targets.size()));
+ float procs;
+ if (roll_chance_f(std::modf(chance / 100.0f, &procs) * 100.0f))
+ procs += 1.0f;
+
+ if (procs <= 0.0f)
+ return;
+
+ Trinity::Containers::RandomResize(targets, procs);
+ for (Unit* target : targets)
+ caster->CastSpell(target, SPELL_DRUID_SHOOTING_STARS_DAMAGE, CastSpellExtraArgsInit{
+ .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR
+ });
}
void Register() override
{
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_dru_shooting_stars::OnTick, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE);
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_dru_shooting_stars::OnTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
}
};