From ce7566defb23eca26b6a383495a54c44be9f317e Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Fri, 30 Jan 2026 00:12:35 -0300 Subject: [PATCH] fix(Scripts/ShatteredHalls): Don't let Flame Arrows stack in Blood Guard Porung Gauntlet Event (#24434) Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: sudlud --- .../ShatteredHalls/boss_porung.cpp | 21 ++++++++++++++++++- .../instance_shattered_halls.cpp | 15 +++++++++++++ .../ShatteredHalls/shattered_halls.h | 7 +++++-- 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_porung.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_porung.cpp index aa5856be6..8ce8f9e21 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_porung.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_porung.cpp @@ -291,10 +291,29 @@ class spell_tsh_shoot_flame_arrow : public SpellScript unitList.remove_if([&](WorldObject* target) -> bool { - return !target->SelectNearestPlayer(15.0f); + if (!target) + return true; + + if (!target->SelectNearestPlayer(15.0f)) + return true; + + if (target->FindNearestGameObject(GO_BLAZE, 6.0f)) + return true; + + // Don't stack arrows on the same target + if (InstanceScript* instance = caster->GetInstanceScript()) + if (target->GetGUID() == instance->GetGuidData(DATA_LAST_FLAME_ARROW)) + return true; + + return false; }); Acore::Containers::RandomResize(unitList, 1); + + // Replace last arrow GUID + if (!unitList.empty()) + if (InstanceScript* instance = caster->GetInstanceScript()) + instance->SetGuidData(DATA_LAST_FLAME_ARROW, unitList.front()->GetGUID()); } void HandleScriptEffect(SpellEffIndex effIndex) diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp index a25b4dacd..8198d5f3b 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp @@ -117,11 +117,25 @@ public: return PrisonerGUID[data - DATA_PRISONER_1]; case DATA_EXECUTIONER: return ExecutionerGUID; + case DATA_LAST_FLAME_ARROW: + return LastArrowGUID; } return ObjectGuid::Empty; } + void SetGuidData(uint32 data, ObjectGuid value) override + { + switch (data) + { + case DATA_LAST_FLAME_ARROW: + LastArrowGUID = value; + break; + default: + break; + } + } + void Update(uint32 diff) override { if (RescueTimer && RescueTimer < 100 * MINUTE * IN_MILLISECONDS) @@ -164,6 +178,7 @@ public: } protected: + ObjectGuid LastArrowGUID; ObjectGuid ExecutionerGUID; ObjectGuid PrisonerGUID[3]; uint32 RescueTimer; diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h index 31b10add2..713e399ed 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h @@ -37,7 +37,8 @@ enum DataTypes DATA_EXECUTIONER = 14, DATA_OMROGG_LEFT_HEAD = 15, DATA_OMROGG_RIGHT_HEAD = 16, - DATA_WARCHIEF_PORTAL = 17 + DATA_WARCHIEF_PORTAL = 17, + DATA_LAST_FLAME_ARROW = 18 }; enum CreatureIds @@ -49,6 +50,7 @@ enum CreatureIds NPC_SH_ZEALOT = 17462, NPC_SH_ARCHER = 17427, NPC_SH_SCOUT = 17693, + NPC_SH_FLAME_ARROW = 17687, // Warchief Kargath NPC_WARCHIEF_KARGATH = 16808, @@ -76,7 +78,8 @@ enum CreatureIds enum GameobjectIds { GO_GRAND_WARLOCK_CHAMBER_DOOR_1 = 182539, - GO_GRAND_WARLOCK_CHAMBER_DOOR_2 = 182540 + GO_GRAND_WARLOCK_CHAMBER_DOOR_2 = 182540, + GO_BLAZE = 181915 }; enum SpellIds