@@ -74,19 +74,20 @@ Battlefield::~Battlefield()
7474 CapturePoints.clear ();
7575}
7676
77- void Battlefield::HandlePlayerEnterZone (Player* player, uint32 /* zone */ )
77+ void Battlefield::RemovePlayerFromTracking (ObjectGuid playerGuid )
7878{
79- // Clear any stale entries from a prior visit that did not unwind cleanly.
80- // Runs before the script hook so scripts see a clean state if they read any
81- // of these containers.
8279 for (uint8 i = 0 ; i < PVP_TEAMS_COUNT; ++i)
8380 {
84- PlayersInWar[i].erase (player->GetGUID ());
85- InvitedPlayers[i].erase (player->GetGUID ());
86- PlayersInQueue[i].erase (player->GetGUID ());
87- PlayersWillBeKick[i].erase (player->GetGUID ());
88- Players[i].erase (player->GetGUID ());
81+ InvitedPlayers[i].erase (playerGuid);
82+ PlayersInQueue[i].erase (playerGuid);
83+ PlayersWillBeKick[i].erase (playerGuid);
84+ Players[i].erase (playerGuid);
8985 }
86+ }
87+
88+ void Battlefield::HandlePlayerEnterZone (Player* player, uint32 /* zone*/ )
89+ {
90+ RemovePlayerFromTracking (player->GetGUID ());
9091
9192 // Allow scripts to adjust the player's effective team or appearance before
9293 // any team-based battlefield containers (such as player lists or queues) are updated.
@@ -141,13 +142,7 @@ void Battlefield::HandlePlayerLeaveZone(Player* player, uint32 /*zone*/)
141142 for (BfCapturePoint* cp : CapturePoints)
142143 cp->HandlePlayerLeave (player);
143144
144- for (uint8 i = 0 ; i < PVP_TEAMS_COUNT; ++i)
145- {
146- InvitedPlayers[i].erase (player->GetGUID ());
147- PlayersInQueue[i].erase (player->GetGUID ());
148- PlayersWillBeKick[i].erase (player->GetGUID ());
149- Players[i].erase (player->GetGUID ());
150- }
145+ RemovePlayerFromTracking (player->GetGUID ());
151146 SendRemoveWorldStates (player);
152147 RemovePlayerFromResurrectQueue (player->GetGUID ());
153148 OnPlayerLeaveZone (player);
@@ -634,34 +629,22 @@ GraveyardStruct const* Battlefield::GetClosestGraveyard(Player* player)
634629 return nullptr ;
635630}
636631
637- void Battlefield::AddPlayerToResurrectQueue (ObjectGuid npcGuid, ObjectGuid playerGuid)
632+ void Battlefield::AddPlayerToResurrectQueue (ObjectGuid /* npcGuid*/ , ObjectGuid playerGuid)
638633{
639- for (BfGraveyard* gy : GraveyardList)
640- {
641- if (!gy)
642- continue ;
634+ Player* player = ObjectAccessor::FindPlayer (playerGuid);
635+ if (!player)
636+ return ;
643637
644- if (gy->HasNpc (npcGuid))
645- {
646- gy->AddPlayer (playerGuid);
647- break ;
648- }
649- }
638+ player->CastSpell (player, SPELL_WAITING_FOR_RESURRECT, true );
650639}
651640
652641void Battlefield::RemovePlayerFromResurrectQueue (ObjectGuid playerGuid)
653642{
654- for (BfGraveyard* gy : GraveyardList)
655- {
656- if (!gy)
657- continue ;
643+ Player* player = ObjectAccessor::FindPlayer (playerGuid);
644+ if (!player)
645+ return ;
658646
659- if (gy->HasPlayer (playerGuid))
660- {
661- gy->RemovePlayer (playerGuid);
662- break ;
663- }
664- }
647+ player->RemoveAurasDueToSpell (SPELL_WAITING_FOR_RESURRECT);
665648}
666649
667650void Battlefield::SendAreaSpiritHealerQueryOpcode (Player* player, ObjectGuid const & guid)
@@ -707,80 +690,9 @@ float BfGraveyard::GetDistance(Player* player)
707690 return player->GetDistance2d (safeLoc->x , safeLoc->y );
708691}
709692
710- void BfGraveyard::AddPlayer (ObjectGuid playerGuid)
711- {
712- if (!ResurrectQueue.count (playerGuid))
713- {
714- ResurrectQueue.insert (playerGuid);
715-
716- if (Player* player = ObjectAccessor::FindPlayer (playerGuid))
717- player->CastSpell (player, SPELL_WAITING_FOR_RESURRECT, true );
718- }
719- }
720-
721- void BfGraveyard::RemovePlayer (ObjectGuid playerGuid)
722- {
723- ResurrectQueue.erase (ResurrectQueue.find (playerGuid));
724-
725- if (Player* player = ObjectAccessor::FindPlayer (playerGuid))
726- player->RemoveAurasDueToSpell (SPELL_WAITING_FOR_RESURRECT);
727- }
728-
729- void BfGraveyard::Resurrect ()
730- {
731- if (ResurrectQueue.empty ())
732- return ;
733-
734- for (ObjectGuid const & guid : ResurrectQueue)
735- {
736- // Get player object from his guid
737- Player* player = ObjectAccessor::FindPlayer (guid);
738- if (!player)
739- continue ;
740-
741- // Check if the player is in world and on the good graveyard
742- if (player->IsInWorld ())
743- if (Unit* spirit = ObjectAccessor::GetCreature (*player, SpiritGuide[ControlTeam]))
744- spirit->CastSpell (spirit, SPELL_SPIRIT_HEAL, true );
745-
746- // Resurrect player
747- player->CastSpell (player, SPELL_RESURRECTION_VISUAL, true );
748- player->ResurrectPlayer (1 .0f );
749- player->CastSpell (player, 6962 , true );
750- player->CastSpell (player, SPELL_SPIRIT_HEAL_MANA, true );
751-
752- player->SpawnCorpseBones (false );
753- }
754-
755- ResurrectQueue.clear ();
756- }
757-
758- // For changing graveyard control
759693void BfGraveyard::GiveControlTo (TeamId team)
760694{
761695 ControlTeam = team;
762- // Teleport to other graveyard, players which were on this graveyard
763- RelocateDeadPlayers ();
764- }
765-
766- void BfGraveyard::RelocateDeadPlayers ()
767- {
768- GraveyardStruct const * closestGrave = nullptr ;
769- for (ObjectGuid const & guid : ResurrectQueue)
770- {
771- Player* player = ObjectAccessor::FindPlayer (guid);
772- if (!player)
773- continue ;
774-
775- if (closestGrave)
776- player->TeleportTo (player->GetMapId (), closestGrave->x , closestGrave->y , closestGrave->z , player->GetOrientation ());
777- else
778- {
779- closestGrave = Bf->GetClosestGraveyard (player);
780- if (closestGrave)
781- player->TeleportTo (player->GetMapId (), closestGrave->x , closestGrave->y , closestGrave->z , player->GetOrientation ());
782- }
783- }
784696}
785697
786698Creature* Battlefield::SpawnCreature (uint32 entry, Position pos, TeamId teamId)
0 commit comments