From c6cd272505cdca5d21935ba346df82b8c767fb13 Mon Sep 17 00:00:00 2001 From: Mikhail Redko Date: Sat, 25 Feb 2023 15:18:23 +0200 Subject: Core/Misc: Sending player's own auras before all visible objects. (#28450) * Core/Misc: Sending player's own auras before all visible objects. This should finally solve the problem of naked characters. Closes #15159 Many thanks to xvwyh for explaining cause of this bug * Core/Misc: Force send update auras packet to player when he added to map --- src/server/game/Entities/Player/Player.cpp | 5 ++--- src/server/game/Entities/Player/Player.h | 2 +- src/server/game/Maps/Map.cpp | 13 ++++++++++++- 3 files changed, 15 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 444f00206fd..a6d7c7334c4 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -22814,7 +22814,6 @@ void Player::SendInitialPacketsAfterAddToMap() SendDirectMessage(&setCompoundState); } - SendAurasForTarget(this); SendEnchantmentDurations(); // must be after add to map SendItemDurations(); // must be after add to map SendQuestGiverStatusMultiple(); @@ -23208,9 +23207,9 @@ void Player::LearnSkillRewardedSpells(uint32 skillId, uint32 skillValue) } } -void Player::SendAurasForTarget(Unit* target) const +void Player::SendAurasForTarget(Unit* target, bool force /*= false*/) const { - if (!target || target->GetVisibleAuras().empty()) // speedup things + if (!target || (!force && target->GetVisibleAuras().empty())) // speedup things return; WorldPacket data(SMSG_AURA_UPDATE_ALL); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 673374441ca..a7d6a5551fc 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1895,7 +1895,7 @@ class TC_GAME_API Player : public Unit, public GridObject void SendBGWeekendWorldStates() const; void SendBattlefieldWorldStates() const; - void SendAurasForTarget(Unit* target) const; + void SendAurasForTarget(Unit* target, bool force = false) const; PlayerMenu* PlayerTalkClass; std::vector ItemSetEff; diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 58dcc7e6607..1fc947a43c2 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -2939,6 +2939,7 @@ void Map::SendInitSelf(Player* player) { TC_LOG_DEBUG("maps", "Creating player data for himself %s", player->GetGUID().ToString().c_str()); + WorldPacket packet; UpdateData data; // attach to player data current transport data @@ -2950,13 +2951,23 @@ void Map::SendInitSelf(Player* player) // build data for self presence in world at own client (one time for map) player->BuildCreateUpdateBlockForPlayer(&data, player); + // build and send self update packet before sending to player his own auras + data.BuildPacket(&packet); + player->SendDirectMessage(&packet); + + // send to player his own auras (this is needed here for timely initialization of some fields on client) + player->SendAurasForTarget(player, true); + + // clean buffers for further work + packet.clear(); + data.Clear(); + // build other passengers at transport also (they always visible and marked as visible and will not send at visibility update at add to map if (Transport* transport = player->GetTransport()) for (Transport::PassengerSet::const_iterator itr = transport->GetPassengers().begin(); itr != transport->GetPassengers().end(); ++itr) if (player != (*itr) && player->HaveAtClient(*itr)) (*itr)->BuildCreateUpdateBlockForPlayer(&data, player); - WorldPacket packet; data.BuildPacket(&packet); player->SendDirectMessage(&packet); } -- cgit v1.2.3