From 06d16564024bd974ba14ab153f0ee9a94835214d Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Tue, 24 Feb 2026 19:34:15 -0300 Subject: [PATCH] =?UTF-8?q?fix(Scripts/Ulduar):=20Remove=20GUID-based=20ha?= =?UTF-8?q?rpoon=20identification=20in=20Razors=E2=80=A6=20(#24846)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Keader Co-authored-by: Claude Opus 4.6 --- .../Ulduar/Ulduar/boss_razorscale.cpp | 119 +++++++----------- .../Ulduar/Ulduar/instance_ulduar.cpp | 21 ---- .../scripts/Northrend/Ulduar/Ulduar/ulduar.h | 6 - 3 files changed, 44 insertions(+), 102 deletions(-) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp index 2a2efb95c..9a0315e9f 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp @@ -44,7 +44,6 @@ enum Spells SPELL_CHAIN_2 = 49682, SPELL_CHAIN_3 = 49683, SPELL_CHAIN_4 = 49684, - SPELL_LAUNCH_CHAIN = 62505, // Dark Rune Sentinel SPELL_WHIRLWIND = 63808, @@ -207,31 +206,11 @@ struct boss_razorscale : public BossAI void SpellHit(Unit* caster, SpellInfo const* spell) override { - if (!caster || !instance) + if (!caster) return; switch (spell->Id) { - case SPELL_LAUNCH_CHAIN: - { - uint32 spellId = SPELL_CHAIN_4; - - if (caster->GetGUID() == instance->GetGuidData(DATA_HARPOON_FIRE_STATE_1)) - { - spellId = SPELL_CHAIN_1; - } - else if (caster->GetGUID() == instance->GetGuidData(DATA_HARPOON_FIRE_STATE_2)) - { - spellId = SPELL_CHAIN_2; - } - else if (caster->GetGUID() == instance->GetGuidData(DATA_HARPOON_FIRE_STATE_3)) - { - spellId = SPELL_CHAIN_3; - } - - caster->CastSpell(me, spellId, true); - } - break; case SPELL_CHAIN_1: case SPELL_CHAIN_2: case SPELL_CHAIN_3: @@ -447,16 +426,16 @@ struct boss_razorscale : public BossAI events.ScheduleEvent(EVENT_FLY_UP, 2s); break; case EVENT_FLY_UP: + { me->SetInCombatWithZone(); // just in case - if (instance) - for( int i = 0; i < 4; ++i ) - if (Creature* hfs = instance->GetCreature(DATA_HARPOON_FIRE_STATE_1 + i)) - { - me->SummonCreature(34188, hfs->GetPositionX(), hfs->GetPositionY(), hfs->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 22000); - hfs->AI()->SetData(1, 0); - } + std::list hfsList; + me->GetCreaturesWithEntryInRange(hfsList, 300.0f, NPC_HARPOON_FIRE_STATE); + for (Creature* hfs : hfsList) + { + me->SummonCreature(34188, hfs->GetPositionX(), hfs->GetPositionY(), hfs->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 22000); + hfs->AI()->SetData(1, 0); + } - me->RemoveAura(SPELL_LAUNCH_CHAIN); me->RemoveAura(SPELL_CHAIN_1); me->RemoveAura(SPELL_CHAIN_3); if (RAID_MODE(0, 1)) @@ -506,6 +485,7 @@ struct boss_razorscale : public BossAI } break; + } case EVENT_RESUME_FIXING: for (uint8 i = 0; i < 3; ++i) if (Creature* c = ObjectAccessor::GetCreature(*me, ExpeditionEngineerGUIDs[i])) @@ -621,9 +601,10 @@ public: creature->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP); // reset npcs NPC_HARPOON_FIRE_STATE - for (uint8 i = 0; i < 4; ++i) - if (Creature* hfs = instance->GetCreature(DATA_HARPOON_FIRE_STATE_1 + i)) - hfs->AI()->SetData(1, 0); + std::list hfsList; + razorscale->GetCreaturesWithEntryInRange(hfsList, 300.0f, NPC_HARPOON_FIRE_STATE); + for (Creature* hfs : hfsList) + hfs->AI()->SetData(1, 0); if (razorscale->AI()) { @@ -687,18 +668,19 @@ struct npc_ulduar_harpoonfirestate : public NullCreatureAI uint32 GetHarpoonGunIdForThisHFS() { - if (pInstance) - { - if (me->GetGUID() == pInstance->GetGuidData(DATA_HARPOON_FIRE_STATE_1)) - return GO_HARPOON_GUN_1; - else if (me->GetGUID() == pInstance->GetGuidData(DATA_HARPOON_FIRE_STATE_2)) - return GO_HARPOON_GUN_2; - else if (me->GetGUID() == pInstance->GetGuidData(DATA_HARPOON_FIRE_STATE_3)) - return GO_HARPOON_GUN_3; - else - return GO_HARPOON_GUN_4; - } - return 0; + static uint32 const harpoonEntries[] = { GO_HARPOON_GUN_1, GO_HARPOON_GUN_2, GO_HARPOON_GUN_3, GO_HARPOON_GUN_4 }; + for (uint32 entry : harpoonEntries) + if (me->FindNearestGameObject(entry, 5.0f)) + return entry; + + // Fallback: determine by X position + if (me->GetPositionX() > 595) + return GO_HARPOON_GUN_4; + else if (me->GetPositionX() > 585) + return GO_HARPOON_GUN_3; + else if (me->GetPositionX() > 575) + return GO_HARPOON_GUN_2; + return GO_HARPOON_GUN_1; } void SetData(uint32 id, uint32 value) override @@ -706,7 +688,6 @@ struct npc_ulduar_harpoonfirestate : public NullCreatureAI switch (id) { case 1: // cleanup at the start of the fight - if (pInstance) { uint32 h_entry = GetHarpoonGunIdForThisHFS(); if (GameObject* wh = me->FindNearestGameObject(h_entry, 5.0f)) @@ -743,7 +724,7 @@ struct npc_ulduar_harpoonfirestate : public NullCreatureAI if (!razorscale) return; if (!razorscale->HasAura(value)) - me->CastSpell(razorscale, SPELL_LAUNCH_CHAIN, true); + me->CastSpell(razorscale, value, true); } break; } @@ -832,15 +813,16 @@ struct npc_ulduar_expedition_engineer : public NullCreatureAI return; } - for( int i = 0; i < 4; ++i ) - if (Creature* fs = pInstance->GetCreature(DATA_HARPOON_FIRE_STATE_1 + i)) - if (!fs->AI()->GetData(2)) - { - float a = rand_norm() * M_PI; - me->GetMotionMaster()->MovePoint(0, fs->GetPositionX() + 3.0f * cos(a), fs->GetPositionY() + 3.0f * std::sin(a), fs->GetPositionZ()); - fixingGUID = fs->GetGUID(); - return; - } + std::list hfsList; + me->GetCreaturesWithEntryInRange(hfsList, 300.0f, NPC_HARPOON_FIRE_STATE); + for (Creature* fs : hfsList) + if (!fs->AI()->GetData(2)) + { + float a = rand_norm() * M_PI; + me->GetMotionMaster()->MovePoint(0, fs->GetPositionX() + 3.0f * cos(a), fs->GetPositionY() + 3.0f * std::sin(a), fs->GetPositionZ()); + fixingGUID = fs->GetGUID(); + return; + } Reset(); // all harpoons repaired me->GetMotionMaster()->MoveTargetedHome(); @@ -877,30 +859,17 @@ public: return true; } - uint32 npc = 0; uint32 spell = 0; switch (go->GetEntry()) { - case GO_HARPOON_GUN_1: - npc = DATA_HARPOON_FIRE_STATE_1; - spell = SPELL_CHAIN_1; - break; - case GO_HARPOON_GUN_2: - npc = DATA_HARPOON_FIRE_STATE_2; - spell = SPELL_CHAIN_2; - break; - case GO_HARPOON_GUN_3: - npc = DATA_HARPOON_FIRE_STATE_3; - spell = SPELL_CHAIN_3; - break; - case GO_HARPOON_GUN_4: - npc = DATA_HARPOON_FIRE_STATE_4; - spell = SPELL_CHAIN_4; - break; + case GO_HARPOON_GUN_1: spell = SPELL_CHAIN_1; break; + case GO_HARPOON_GUN_2: spell = SPELL_CHAIN_2; break; + case GO_HARPOON_GUN_3: spell = SPELL_CHAIN_3; break; + case GO_HARPOON_GUN_4: spell = SPELL_CHAIN_4; break; } - if (Creature* hfs = pInstance->GetCreature(npc)) - hfs->AI()->SetData(3, spell); + if (Creature* hfs = go->FindNearestCreature(NPC_HARPOON_FIRE_STATE, 5.0f)) + hfs->AI()->SetData(3, spell); go->SetLootState(GO_JUST_DEACTIVATED); return true; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp index 3d179883c..7d4b0d1d3 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp @@ -154,9 +154,6 @@ public: uint32 m_unbrokenAchievement; uint32 m_mageBarrier; - // Razorscale - ObjectGuid m_RazorscaleHarpoonFireStateGUID[4]; - // Hodir bool hmHodir; Position normalChestPosition = { 1967.152588f, -204.188461f, 432.686951f, 5.50957f }; @@ -472,18 +469,6 @@ public: if (!m_algalonTimer) creature->DespawnOrUnsummon(); break; - case NPC_HARPOON_FIRE_STATE: - { - if (creature->GetPositionX() > 595 ) - m_RazorscaleHarpoonFireStateGUID[3] = creature->GetGUID(); - else if (creature->GetPositionX() > 585 ) - m_RazorscaleHarpoonFireStateGUID[2] = creature->GetGUID(); - else if (creature->GetPositionX() > 575 ) - m_RazorscaleHarpoonFireStateGUID[1] = creature->GetGUID(); - else - m_RazorscaleHarpoonFireStateGUID[0] = creature->GetGUID(); - } - break; //! These creatures are summoned by something else than Algalon //! but need to be controlled/despawned by him - so they need to be //! registered in his summon list @@ -803,12 +788,6 @@ public: case DATA_REPAIR_STATION2: return m_RepairSGUID[1]; - // Razorscales Harpoon Fire State GUIDs - case DATA_HARPOON_FIRE_STATE_1: - case DATA_HARPOON_FIRE_STATE_2: - case DATA_HARPOON_FIRE_STATE_3: - case DATA_HARPOON_FIRE_STATE_4: - return m_RazorscaleHarpoonFireStateGUID[data - 200]; } return GetObjectGuid(data); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h index f443536ea..5307e6758 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h @@ -66,12 +66,6 @@ enum UlduarData DATA_UNBROKEN_ACHIEVEMENT = 105, DATA_LEVIATHAN_DOORS = 106, - // Razorscales Harpoon Fire State GUIDs - DATA_HARPOON_FIRE_STATE_1 = 200, - DATA_HARPOON_FIRE_STATE_2 = 201, - DATA_HARPOON_FIRE_STATE_3 = 202, - DATA_HARPOON_FIRE_STATE_4 = 203, - // Mimiron creatures DATA_MIMIRON_LEVIATHAN_MKII = 301, DATA_MIMIRON_VX001 = 302,