From c60a4bde661edc3ecc5e39616c970e78544eb531 Mon Sep 17 00:00:00 2001 From: sogladev Date: Thu, 16 Jul 2026 00:31:05 +0200 Subject: [PATCH] fix(Scripts/Ulduar): Update Yogg portal spawning, p1 Sara Shadow Nova (#26632) --- .../rev_1784123420947336369.sql | 5 ++ .../rev_1784123661594956864.sql | 7 ++ .../game/Spells/SpellInfoCorrections.cpp | 6 -- .../Ulduar/Ulduar/boss_yoggsaron.cpp | 75 +++++++++---------- 4 files changed, 49 insertions(+), 44 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1784123420947336369.sql create mode 100644 data/sql/updates/pending_db_world/rev_1784123661594956864.sql diff --git a/data/sql/updates/pending_db_world/rev_1784123420947336369.sql b/data/sql/updates/pending_db_world/rev_1784123420947336369.sql new file mode 100644 index 000000000..cf0e67ff7 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1784123420947336369.sql @@ -0,0 +1,5 @@ +-- Yogg Portal 'Descend Into Madness' +-- Movement flags: DisableGravity + Root +DELETE FROM `creature_template_movement` WHERE (`CreatureId` = 34072); +INSERT INTO `creature_template_movement` (`CreatureId`, `Ground`, `Swim`, `Flight`, `Rooted`, `Chase`, `Random`, `InteractionPauseTimer`) VALUES +(34072, 0, 0, 1, 1, 0, 0, 0); diff --git a/data/sql/updates/pending_db_world/rev_1784123661594956864.sql b/data/sql/updates/pending_db_world/rev_1784123661594956864.sql new file mode 100644 index 000000000..29a0a0f09 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1784123661594956864.sql @@ -0,0 +1,7 @@ +-- Sara should start friendly, becoming hostile when Yogg-Saron reveals himself (phase 2) +UPDATE `creature_template` SET `faction` = 35 WHERE `entry` IN (33134, 34332); + +-- Sara (1) +DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 13) AND (`SourceGroup` = 1) AND (`SourceEntry` = 65719) AND (`SourceId` = 0) AND (`ElseGroup` = 1) AND (`ConditionTypeOrReference` = 31) AND (`ConditionTarget` = 0) AND (`ConditionValue1` = 3) AND (`ConditionValue2` = 34332) AND (`ConditionValue3` = 0); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 1, 65719, 0, 1, 31, 0, 3, 34332, 0, 0, 0, 0, '', 'Shadow Nova'); diff --git a/src/server/game/Spells/SpellInfoCorrections.cpp b/src/server/game/Spells/SpellInfoCorrections.cpp index 7b91f5115..e155138f6 100644 --- a/src/server/game/Spells/SpellInfoCorrections.cpp +++ b/src/server/game/Spells/SpellInfoCorrections.cpp @@ -2057,12 +2057,6 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->AttributesEx6 |= SPELL_ATTR6_IGNORE_PHASE_SHIFT; }); - // Shadow Nova - ApplySpellFix({ 62714, 65209 }, [](SpellInfo* spellInfo) - { - spellInfo->AttributesEx3 |= SPELL_ATTR3_ALWAYS_HIT; - }); - // Cosmic Smash (Algalon the Observer) ApplySpellFix({ 62293 }, [](SpellInfo* spellInfo) { diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yoggsaron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yoggsaron.cpp index 08835f46c..812c72143 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yoggsaron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yoggsaron.cpp @@ -49,6 +49,8 @@ enum YoggSpells SPELL_TITANIC_STORM_PASSIVE = 64171, SPELL_WEAKENED = 64162, + SPELL_TELEPORT_PORTAL_VISUAL = 64416, + // GLOBAL SPELL_SANITY_BASE = 63786, SPELL_SANITY = 63050, @@ -70,6 +72,7 @@ enum YoggSpells // GUARDIANS OF YOGG-SARON SPELL_SHADOW_NOVA = 62714, + SPELL_SHADOW_NOVA_SARA = 65719, SPELL_DARK_VOLLEY = 63038, // SARA P2 @@ -290,16 +293,16 @@ const uint32 TABLE_GOSSIP_ENTRY[4] = {NPC_FREYA_GOSSIP, NPC_HODIR_GOSSIP, NPC_MI static LocationsXY yoggPortalLoc[] = { - {1970.48f, -9.75f, 325.5f}, - {1992.76f, -10.21f, 325.5f}, - {1995.53f, -39.78f, 325.5f}, - {1969.25f, -42.00f, 325.5f}, - {1960.62f, -32.00f, 325.5f}, - {1981.98f, -5.69f, 325.5f}, - {1982.78f, -45.73f, 325.5f}, - {2000.66f, -29.68f, 325.5f}, - {1999.88f, -19.61f, 325.5f}, - {1961.37f, -19.54f, 325.5f} + {1964.60f, -42.71f, 325.08f}, + {1986.94f, -46.21f, 324.98f}, + {1989.50f, -6.70f, 325.08f}, + {1965.52f, -8.09f, 324.95f}, + {2000.84f, -25.40f, 325.19f}, + {1960.22f, -26.14f, 325.01f}, + {1976.30f, -47.83f, 325.11f}, + {1997.69f, -37.46f, 325.04f}, + {1998.07f, -13.36f, 325.17f}, + {1976.99f, -3.96f, 325.17f} }; enum Texts @@ -452,6 +455,8 @@ struct boss_yoggsaron_sara : public ScriptedAI me->SetVisible(true); me->SetDisplayId(me->GetNativeDisplayId()); me->SetDisableGravity(true); + me->SetFaction(FACTION_FRIENDLY); + me->ClearUnitState(UNIT_STATE_EVADE); EnableSara(false); SpawnClouds(); @@ -492,8 +497,6 @@ struct boss_yoggsaron_sara : public ScriptedAI // Engage Keepers summons.DoZoneInCombat(); - me->CastSpell(me, SPELL_SANITY_BASE, true); - events.ScheduleEvent(EVENT_SARA_P1_DOORS_CLOSE, 15s, 0, EVENT_PHASE_ONE); events.ScheduleEvent(EVENT_SARA_P1_BERSERK, 15min, 0, 0); events.ScheduleEvent(EVENT_SARA_P1_SUMMON, 0ms, 0, EVENT_PHASE_ONE); @@ -579,15 +582,15 @@ struct boss_yoggsaron_sara : public ScriptedAI void AddPortals() { _summonSpeed -= 0.1f; - Creature* cr = nullptr; + Creature* creature = nullptr; // Spawn Portals for (uint8 i = 0; i < RAID_MODE(4, 10); ++i) { - if ((cr = me->SummonCreature(NPC_DESCEND_INTO_MADNESS, yoggPortalLoc[i].x, yoggPortalLoc[i].y, yoggPortalLoc[i].z, 0, TEMPSUMMON_TIMED_DESPAWN, 25000))) + if ((creature = me->SummonCreature(NPC_DESCEND_INTO_MADNESS, yoggPortalLoc[i].x, yoggPortalLoc[i].y, yoggPortalLoc[i].z, 0, TEMPSUMMON_TIMED_DESPAWN, 25000))) { - cr->SetUnitFlag(UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NON_ATTACKABLE); - cr->SetArmor(_currentIllusion); + creature->SetArmor(_currentIllusion); + creature->CastSpell(creature, SPELL_TELEPORT_PORTAL_VISUAL, true); } } @@ -699,39 +702,33 @@ struct boss_yoggsaron_sara : public ScriptedAI me->CastSpell(me, SPELL_SHATTERED_ILLUSION, true); } - void DamageTaken(Unit* who, uint32& damage, DamageEffectType, SpellSchoolMask) override + void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType /*damagetype*/, SpellSchoolMask /*damageSchoolMask*/) override { // Guardians can be spawned by walking into Ominous Clouds even when InitFight // never ran (e.g. Vezax not defeated); their novas must not start phase 2 then. - if (!_instance || _instance->GetBossState(BOSS_YOGGSARON) != IN_PROGRESS) + if (!_instance || _instance->GetBossState(BOSS_YOGGSARON) != IN_PROGRESS || !attacker || attacker->GetEntry() != NPC_GUARDIAN_OF_YS || _secondPhase) { damage = 0; return; } - if (who && who->GetEntry() == NPC_GUARDIAN_OF_YS && !_secondPhase) + // START PHASE 2 + if (me->GetHealth() <= damage) { - damage = 25000; + _secondPhase = true; + damage = 0; - // START PHASE 2 - if (me->GetHealth() <= damage) - { - _secondPhase = true; - damage = 0; + events.SetPhase(EVENT_PHASE_TWO); + me->SetHealth(me->GetMaxHealth()); + me->SetInCombatWithZone(); + me->SetFaction(FACTION_MONSTER_2); - events.SetPhase(EVENT_PHASE_TWO); - me->SetHealth(me->GetMaxHealth()); + if (Creature* creature = me->SummonCreature(NPC_YOGG_SARON, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), M_PI)) + creature->SetVisible(false); - if (Creature* cr = me->SummonCreature(NPC_YOGG_SARON, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), M_PI)) - cr->SetVisible(false); - - _p2TalkTimer++; - Talk(SAY_SARA_TRANSFORM_1); - } - return; + _p2TalkTimer++; + Talk(SAY_SARA_TRANSFORM_1); } - - damage = 0; } // Players who descend into a portal are teleported ~100 yd below to the illusion @@ -1040,7 +1037,8 @@ struct boss_yoggsaron_guardian_of_ys : public ScriptedAI void JustDied(Unit*) override { - me->CastSpell((Unit*)nullptr, SPELL_SHADOW_NOVA, true); + DoCastAOE(SPELL_SHADOW_NOVA, true); + DoCastAOE(SPELL_SHADOW_NOVA_SARA, true); } void UpdateAI(uint32 diff) override @@ -2101,7 +2099,8 @@ struct boss_yoggsaron_voice : public NullCreatureAI void Reset() override { - me->CastSpell(me, SPELL_INSANE_PERIODIC, true); + DoCastSelf(SPELL_INSANE_PERIODIC, true); + DoCastSelf(SPELL_SANITY_BASE, true); } void SpellHitTarget(Unit* target, SpellInfo const* spellInfo) override