Skip to content

Commit 0a9c55f

Browse files
NyeriahBalrokxfurryclaude
authored
feat(Core/Wintergrasp): aura-driven resurrect queue (azerothcore#26002)
Co-authored-by: Balrok <balrok@getmangos.com> Co-authored-by: Xfurry <xfurry.cmangos@outlook.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent e588638 commit 0a9c55f

5 files changed

Lines changed: 53 additions & 117 deletions

File tree

src/server/game/Battlefield/Battlefield.cpp

Lines changed: 9 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -629,34 +629,22 @@ GraveyardStruct const* Battlefield::GetClosestGraveyard(Player* player)
629629
return nullptr;
630630
}
631631

632-
void Battlefield::AddPlayerToResurrectQueue(ObjectGuid npcGuid, ObjectGuid playerGuid)
632+
void Battlefield::AddPlayerToResurrectQueue(ObjectGuid /*npcGuid*/, ObjectGuid playerGuid)
633633
{
634-
for (BfGraveyard* gy : GraveyardList)
635-
{
636-
if (!gy)
637-
continue;
634+
Player* player = ObjectAccessor::FindPlayer(playerGuid);
635+
if (!player)
636+
return;
638637

639-
if (gy->HasNpc(npcGuid))
640-
{
641-
gy->AddPlayer(playerGuid);
642-
break;
643-
}
644-
}
638+
player->CastSpell(player, SPELL_WAITING_FOR_RESURRECT, true);
645639
}
646640

647641
void Battlefield::RemovePlayerFromResurrectQueue(ObjectGuid playerGuid)
648642
{
649-
for (BfGraveyard* gy : GraveyardList)
650-
{
651-
if (!gy)
652-
continue;
643+
Player* player = ObjectAccessor::FindPlayer(playerGuid);
644+
if (!player)
645+
return;
653646

654-
if (gy->HasPlayer(playerGuid))
655-
{
656-
gy->RemovePlayer(playerGuid);
657-
break;
658-
}
659-
}
647+
player->RemoveAurasDueToSpell(SPELL_WAITING_FOR_RESURRECT);
660648
}
661649

662650
void Battlefield::SendAreaSpiritHealerQueryOpcode(Player* player, ObjectGuid const& guid)
@@ -702,80 +690,9 @@ float BfGraveyard::GetDistance(Player* player)
702690
return player->GetDistance2d(safeLoc->x, safeLoc->y);
703691
}
704692

705-
void BfGraveyard::AddPlayer(ObjectGuid playerGuid)
706-
{
707-
if (!ResurrectQueue.count(playerGuid))
708-
{
709-
ResurrectQueue.insert(playerGuid);
710-
711-
if (Player* player = ObjectAccessor::FindPlayer(playerGuid))
712-
player->CastSpell(player, SPELL_WAITING_FOR_RESURRECT, true);
713-
}
714-
}
715-
716-
void BfGraveyard::RemovePlayer(ObjectGuid playerGuid)
717-
{
718-
ResurrectQueue.erase(ResurrectQueue.find(playerGuid));
719-
720-
if (Player* player = ObjectAccessor::FindPlayer(playerGuid))
721-
player->RemoveAurasDueToSpell(SPELL_WAITING_FOR_RESURRECT);
722-
}
723-
724-
void BfGraveyard::Resurrect()
725-
{
726-
if (ResurrectQueue.empty())
727-
return;
728-
729-
for (ObjectGuid const& guid : ResurrectQueue)
730-
{
731-
// Get player object from his guid
732-
Player* player = ObjectAccessor::FindPlayer(guid);
733-
if (!player)
734-
continue;
735-
736-
// Check if the player is in world and on the good graveyard
737-
if (player->IsInWorld())
738-
if (Unit* spirit = ObjectAccessor::GetCreature(*player, SpiritGuide[ControlTeam]))
739-
spirit->CastSpell(spirit, SPELL_SPIRIT_HEAL, true);
740-
741-
// Resurrect player
742-
player->CastSpell(player, SPELL_RESURRECTION_VISUAL, true);
743-
player->ResurrectPlayer(1.0f);
744-
player->CastSpell(player, 6962, true);
745-
player->CastSpell(player, SPELL_SPIRIT_HEAL_MANA, true);
746-
747-
player->SpawnCorpseBones(false);
748-
}
749-
750-
ResurrectQueue.clear();
751-
}
752-
753-
// For changing graveyard control
754693
void BfGraveyard::GiveControlTo(TeamId team)
755694
{
756695
ControlTeam = team;
757-
// Teleport to other graveyard, players which were on this graveyard
758-
RelocateDeadPlayers();
759-
}
760-
761-
void BfGraveyard::RelocateDeadPlayers()
762-
{
763-
GraveyardStruct const* closestGrave = nullptr;
764-
for (ObjectGuid const& guid : ResurrectQueue)
765-
{
766-
Player* player = ObjectAccessor::FindPlayer(guid);
767-
if (!player)
768-
continue;
769-
770-
if (closestGrave)
771-
player->TeleportTo(player->GetMapId(), closestGrave->x, closestGrave->y, closestGrave->z, player->GetOrientation());
772-
else
773-
{
774-
closestGrave = Bf->GetClosestGraveyard(player);
775-
if (closestGrave)
776-
player->TeleportTo(player->GetMapId(), closestGrave->x, closestGrave->y, closestGrave->z, player->GetOrientation());
777-
}
778-
}
779696
}
780697

781698
Creature* Battlefield::SpawnCreature(uint32 entry, Position pos, TeamId teamId)

src/server/game/Battlefield/Battlefield.h

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -169,18 +169,6 @@ class BfGraveyard
169169
// Set spirit service for the graveyard
170170
void SetSpirit(Creature* spirit, TeamId team);
171171

172-
// Add a player to the graveyard
173-
void AddPlayer(ObjectGuid playerGuid);
174-
175-
// Remove a player from the graveyard
176-
void RemovePlayer(ObjectGuid playerGuid);
177-
178-
// Resurrect players
179-
void Resurrect();
180-
181-
// Move players waiting to that graveyard on the nearest one
182-
void RelocateDeadPlayers();
183-
184172
// Check if this graveyard has a spirit guide
185173
bool HasNpc(ObjectGuid guid)
186174
{
@@ -190,8 +178,7 @@ class BfGraveyard
190178
return (SpiritGuide[0] == guid || SpiritGuide[1] == guid);
191179
}
192180

193-
// Check if a player is in this graveyard's resurrect queue
194-
bool HasPlayer(ObjectGuid guid) const { return ResurrectQueue.find(guid) != ResurrectQueue.end(); }
181+
ObjectGuid GetSpiritGuide(TeamId team) const { return SpiritGuide[team]; }
195182

196183
// Get the graveyard's ID.
197184
uint32 GetGraveyardId() const { return GraveyardId; }
@@ -200,7 +187,6 @@ class BfGraveyard
200187
TeamId ControlTeam;
201188
uint32 GraveyardId;
202189
ObjectGuid SpiritGuide[2];
203-
GuidUnorderedSet ResurrectQueue;
204190
Battlefield* Bf;
205191
};
206192

src/server/game/Battlefield/Zones/BattlefieldWG.cpp

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -193,9 +193,39 @@ bool BattlefieldWG::SetupBattlefield()
193193
_scheduler.Schedule(Milliseconds(RESURRECTION_INTERVAL),
194194
BATTLEFIELD_TIMER_GROUP_RESURRECT, [this](TaskContext context)
195195
{
196-
for (BfGraveyard* gy : GraveyardList)
197-
if (gy)
198-
gy->Resurrect();
196+
ForEachPlayerInZone([this](Player* player)
197+
{
198+
if (!player->HasAura(SPELL_WAITING_FOR_RESURRECT))
199+
return;
200+
201+
TeamId team = player->GetTeamId();
202+
Unit* closestSpirit = nullptr;
203+
float closestDist = -1.0f;
204+
for (BfGraveyard* gy : GraveyardList)
205+
{
206+
if (!gy)
207+
continue;
208+
Unit* spirit = ObjectAccessor::GetCreature(*player, gy->GetSpiritGuide(team));
209+
if (!spirit)
210+
continue;
211+
float dist = player->GetDistance(spirit);
212+
if (closestDist < 0.0f || dist < closestDist)
213+
{
214+
closestDist = dist;
215+
closestSpirit = spirit;
216+
}
217+
}
218+
219+
if (closestSpirit)
220+
closestSpirit->CastSpell(closestSpirit, SPELL_SPIRIT_HEAL, true);
221+
222+
player->CastSpell(player, SPELL_RESURRECTION_VISUAL, true);
223+
player->ResurrectPlayer(1.0f);
224+
player->CastSpell(player, 6962, true);
225+
player->CastSpell(player, SPELL_SPIRIT_HEAL_MANA, true);
226+
player->SpawnCorpseBones(false);
227+
player->RemoveAurasDueToSpell(SPELL_WAITING_FOR_RESURRECT);
228+
});
199229
context.Repeat();
200230
});
201231

src/server/game/Spells/Auras/SpellAuraEffects.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5344,13 +5344,10 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool
53445344
{
53455345
case 2584: // Waiting to Resurrect
53465346
// Waiting to resurrect spell cancel, we must remove player from resurrect queue
5347+
// bf branch omitted: it would cascade back into this handler.
53475348
if (target->IsPlayer())
5348-
{
53495349
if (Battleground* bg = target->ToPlayer()->GetBattleground())
53505350
bg->RemovePlayerFromResurrectQueue(target->ToPlayer());
5351-
if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(target->GetZoneId()))
5352-
bf->RemovePlayerFromResurrectQueue(target->GetGUID());
5353-
}
53545351
break;
53555352
case 43681: // Inactive
53565353
{

src/server/scripts/Northrend/zone_wintergrasp.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -215,13 +215,19 @@ class npc_wg_spirit_guide : public CreatureScript
215215

216216
bool OnGossipHello(Player* player, Creature* creature) override
217217
{
218-
if (creature->IsQuestGiver())
219-
player->PrepareQuestMenu(creature->GetGUID());
220-
221218
Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
222219
if (!wintergrasp)
223220
return true;
224221

222+
if (!player->IsAlive())
223+
{
224+
wintergrasp->SendAreaSpiritHealerQueryOpcode(player, creature->GetGUID());
225+
player->CastSpell(player, SPELL_WAITING_FOR_RESURRECT, true);
226+
}
227+
228+
if (creature->IsQuestGiver())
229+
player->PrepareQuestMenu(creature->GetGUID());
230+
225231
GraveyardVect graveyard = wintergrasp->GetGraveyardVector();
226232
for (uint8 i = 0; i < graveyard.size(); i++)
227233
if (graveyard[i]->GetControlTeamId() == player->GetTeamId())

0 commit comments

Comments
 (0)