aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorCristian Vintila <127750549+cristianvnt@users.noreply.github.com>2025-12-30 22:59:51 +0200
committerGitHub <noreply@github.com>2025-12-30 21:59:51 +0100
commite8d4837aba183849b1cf51d22475a6be55b5e1f1 (patch)
tree2fce01845b8e8218c09a4f3314fe683422e63c39 /src/server
parent1d9213f8f2e78218666406311480a83a941bb55f (diff)
Scripts/Spells: Implement Entropic Rift (#31447)
Diffstat (limited to 'src/server')
-rw-r--r--src/server/scripts/Spells/spell_priest.cpp203
1 files changed, 202 insertions, 1 deletions
diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp
index 712705d43ad..f624db6729f 100644
--- a/src/server/scripts/Spells/spell_priest.cpp
+++ b/src/server/scripts/Spells/spell_priest.cpp
@@ -26,7 +26,6 @@
#include "Containers.h"
#include "G3DPosition.hpp"
#include "GridNotifiers.h"
-#include "ListUtils.h"
#include "Log.h"
#include "MoveSplineInitArgs.h"
#include "ObjectAccessor.h"
@@ -91,6 +90,12 @@ enum PriestSpells
SPELL_PRIEST_DIVINE_STAR_SHADOW_HEAL = 390981,
SPELL_PRIEST_DIVINE_WRATH = 40441,
SPELL_PRIEST_EMPOWERED_RENEW = 391339,
+ SPELL_PRIEST_EMPOWERED_RENEW_HEAL = 391359,
+ SPELL_PRIEST_ENTROPIC_RIFT = 447444,
+ SPELL_PRIEST_ENTROPIC_RIFT_AREATRIGGER = 447445,
+ SPELL_PRIEST_ENTROPIC_RIFT_AURA = 450193,
+ SPELL_PRIEST_ENTROPIC_RIFT_DAMAGE = 447448,
+ SPELL_PRIEST_ENTROPIC_RIFT_PERIODIC = 459314,
SPELL_PRIEST_EPIPHANY = 414553,
SPELL_PRIEST_EPIPHANY_HIGHLIGHT = 414556,
SPELL_PRIEST_ESSENCE_DEVOURER = 415479,
@@ -131,6 +136,7 @@ enum PriestSpells
SPELL_PRIEST_MASOCHISM_TALENT = 193063,
SPELL_PRIEST_MASOCHISM_PERIODIC_HEAL = 193065,
SPELL_PRIEST_MASTERY_GRACE = 271534,
+ SPELL_PRIEST_MIND_BLAST = 8092,
SPELL_PRIEST_MIND_DEVOURER = 373202,
SPELL_PRIEST_MIND_DEVOURER_AURA = 373204,
SPELL_PRIEST_MINDBENDER_DISC = 123040,
@@ -217,6 +223,7 @@ enum PriestSpells
SPELL_PRIEST_VAMPIRIC_TOUCH = 34914,
SPELL_PRIEST_VOID_SHIELD = 199144,
SPELL_PRIEST_VOID_SHIELD_EFFECT = 199145,
+ SPELL_PRIEST_VOID_TORRENT = 263165,
SPELL_PRIEST_WEAKENED_SOUL = 6788,
SPELL_PRIEST_WHISPERING_SHADOWS = 406777,
SPELL_PRIEST_WHISPERING_SHADOWS_DUMMY = 391286,
@@ -1309,6 +1316,196 @@ class spell_pri_empowered_renew_heal : public AuraScript
}
};
+// 447444 - Entropic Rift
+// Triggered by 8092 - Mind Blast (Discipline) and 263165 - Void Torrent (Shadow)
+class spell_pri_entropic_rift : public SpellScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_PRIEST_ENTROPIC_RIFT });
+ }
+
+ bool Load() override
+ {
+ Unit* caster = GetCaster();
+ return caster->HasAura(SPELL_PRIEST_ENTROPIC_RIFT)
+ && caster->IsPlayer()
+ && GetSpellInfo()->Id == uint32(caster->ToPlayer()->GetPrimarySpecialization() == ChrSpecialization::PriestShadow
+ ? SPELL_PRIEST_VOID_TORRENT
+ : SPELL_PRIEST_MIND_BLAST);
+ }
+
+ void HandleEffectHit(SpellEffIndex /*effIndex*/) const
+ {
+ Unit* target = GetHitUnit();
+
+ GetCaster()->CastSpell(target->GetPosition(), SPELL_PRIEST_ENTROPIC_RIFT_AREATRIGGER, CastSpellExtraArgsInit{
+ .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
+ .CustomArg = target->GetGUID()
+ });
+ }
+
+ void Register() override
+ {
+ if (m_scriptSpellId == SPELL_PRIEST_MIND_BLAST)
+ OnEffectHitTarget += SpellEffectFn(spell_pri_entropic_rift::HandleEffectHit, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
+ else
+ OnEffectHitTarget += SpellEffectFn(spell_pri_entropic_rift::HandleEffectHit, EFFECT_0, SPELL_EFFECT_APPLY_AURA);
+ }
+};
+
+// 450193 - Entropic Rift (Aura)
+class spell_pri_entropic_rift_aura : public AuraScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_PRIEST_ENTROPIC_RIFT_AREATRIGGER });
+ }
+
+ void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const
+ {
+ if (AreaTrigger* at = GetTarget()->GetAreaTrigger(SPELL_PRIEST_ENTROPIC_RIFT_AREATRIGGER))
+ at->Remove();
+ }
+
+ void Register() override
+ {
+ OnEffectRemove += AuraEffectApplyFn(spell_pri_entropic_rift_aura::HandleRemove, EFFECT_0, SPELL_AURA_MOD_SPEED_ALWAYS, AURA_EFFECT_HANDLE_REAL);
+ }
+};
+
+// 459314 - Entropic Rift (Periodic)
+class spell_pri_entropic_rift_periodic : public AuraScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_PRIEST_ENTROPIC_RIFT_AREATRIGGER, SPELL_PRIEST_ENTROPIC_RIFT_DAMAGE });
+ }
+
+ void HandlePeriodic(AuraEffect const* /*aurEff*/) const
+ {
+ Unit* caster = GetTarget();
+
+ AreaTrigger const* at = caster->GetAreaTrigger(SPELL_PRIEST_ENTROPIC_RIFT_AREATRIGGER);
+ if (!at)
+ return;
+
+ SpellInfo const* damageSpell = sSpellMgr->AssertSpellInfo(SPELL_PRIEST_ENTROPIC_RIFT_DAMAGE, GetCastDifficulty());
+
+ for (ObjectGuid const& unitInAreaTrigger : at->GetInsideUnits())
+ if (Unit* target = ObjectAccessor::GetUnit(*at, unitInAreaTrigger))
+ if (caster->IsValidAttackTarget(target, damageSpell))
+ caster->CastSpell(target, SPELL_PRIEST_ENTROPIC_RIFT_DAMAGE, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
+ }
+
+ void Register() override
+ {
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_pri_entropic_rift_periodic::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
+ }
+};
+
+// 447445 - Entropic Rift (AreaTrigger)
+struct areatrigger_pri_entropic_rift : public AreaTriggerAI
+{
+ using AreaTriggerAI::AreaTriggerAI;
+
+ static constexpr std::array<DBCPosition2D, 2> OverrideScaleCurve =
+ {{
+ { .X = 0.0f, .Y = 1.0f },
+ { .X = 1.0f, .Y = 1.0f },
+ }};
+
+ void OnCreate(Spell const* creatingSpell) override
+ {
+ Unit* caster = at->GetCaster();
+ if (!caster)
+ return;
+
+ CastSpellExtraArgs args;
+ args.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR;
+
+ if (creatingSpell)
+ {
+ args.OriginalCastId = creatingSpell->m_castId;
+
+ if (ObjectGuid const* targetGUID = std::any_cast<ObjectGuid>(&creatingSpell->m_customArg))
+ at->SetPathTarget(*targetGUID);
+
+ _searchRadius = creatingSpell->GetSpellInfo()->GetMaxRange();
+ }
+
+ caster->CastSpell(caster, SPELL_PRIEST_ENTROPIC_RIFT_AURA, args);
+ caster->CastSpell(caster, SPELL_PRIEST_ENTROPIC_RIFT_PERIODIC, args);
+
+ UpdateMovement();
+ _scheduler.Schedule(500ms, [this](TaskContext task)
+ {
+ UpdateMovement();
+ task.Repeat(500ms);
+ });
+ }
+
+ void OnUpdate(uint32 diff) override
+ {
+ _scheduler.Update(diff);
+ }
+
+ void OnDestinationReached() override
+ {
+ _movementSpeed = 7.0f; // Entropic Rift moves slower after reaching its target
+ }
+
+ void UpdateMovement()
+ {
+ at->SetOverrideScaleCurve(OverrideScaleCurve); // updates StartTimeOffset of the curve
+
+ Unit* target = UpdateTarget();
+ if (!target)
+ return;
+
+ at->SetPathTarget(target->GetGUID());
+
+ if (at->IsInDist2d(target, 0.5f))
+ return;
+
+ PathGenerator path(at);
+ path.CalculatePath(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), false);
+ at->InitSplines(path.GetPath(), _movementSpeed);
+ }
+
+ Unit* UpdateTarget() const
+ {
+ SpellInfo const* damageSpell = sSpellMgr->GetSpellInfo(SPELL_PRIEST_ENTROPIC_RIFT_DAMAGE, DIFFICULTY_NONE);
+ if (!damageSpell || damageSpell->GetEffects().empty())
+ return nullptr;
+
+ Unit* caster = at->GetCaster();
+ if (!caster)
+ return nullptr;
+
+ SpellEffectInfo const& damageEffect = damageSpell->GetEffect(EFFECT_0);
+ Trinity::WorldObjectSpellAreaTargetCheck check(_searchRadius, caster, caster, caster, damageSpell, TARGET_CHECK_ENEMY, damageEffect.ImplicitTargetConditions.get(), TARGET_OBJECT_TYPE_UNIT);
+
+ Unit* target = ObjectAccessor::GetUnit(*at, at->m_areaTriggerData->OrbitPathTarget);
+ if (!target || !check(target))
+ {
+ std::vector<Unit*> targets;
+ Trinity::UnitListSearcher searcher(at, targets, check);
+ Spell::SearchTargets(searcher, GRID_MAP_TYPE_MASK_CREATURE | GRID_MAP_TYPE_MASK_PLAYER, caster, caster, _searchRadius);
+ Trinity::Containers::EraseIf(targets, [caster](Unit const* target) { return !caster->IsInCombatWith(target); });
+ if (!targets.empty())
+ target = Trinity::Containers::SelectRandomContainerElement(targets);
+ }
+
+ return target;
+ }
+
+private:
+ TaskScheduler _scheduler;
+ float _movementSpeed = 12.0f;
+ float _searchRadius = 0.0f;
+};
+
// 414553 - Epiphany
class spell_pri_epiphany : public AuraScript
{
@@ -4051,6 +4248,10 @@ void AddSC_priest_spell_scripts()
RegisterSpellScript(spell_pri_divine_procession);
RegisterSpellScript(spell_pri_empowered_renew);
RegisterSpellScript(spell_pri_empowered_renew_heal);
+ RegisterSpellScript(spell_pri_entropic_rift);
+ RegisterSpellScript(spell_pri_entropic_rift_aura);
+ RegisterSpellScript(spell_pri_entropic_rift_periodic);
+ RegisterAreaTriggerAI(areatrigger_pri_entropic_rift);
RegisterSpellScript(spell_pri_epiphany);
RegisterSpellScript(spell_pri_essence_devourer_heal);
RegisterSpellScript(spell_pri_evangelism);