diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index e95b33a58..2a9cb6457 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -11586,7 +11586,6 @@ void Player::SendInitialPacketsAfterAddToMap() SendMessageToSet(&data2, true); } - GetAurasForTarget(this); SendEnchantmentDurations(); // must be after add to map SendItemDurations(); // must be after add to map SendQuestGiverStatusMultiple(); @@ -11967,9 +11966,9 @@ void Player::learnSkillRewardedSpells(uint32 skill_id, uint32 skill_value) } } -void Player::GetAurasForTarget(Unit* target) // pussywizard: contact before changing ANYTHING! +void Player::GetAurasForTarget(Unit* target, bool force /*= false*/) { - if (!target/* || target->GetVisibleAuras()->empty()*/) // speedup things + if (!target || (!force && target->GetVisibleAuras()->empty())) // speedup things return; /*! Blizz sends certain movement packets sometimes even before CreateObject diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 52dec4b03..98c256426 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2183,7 +2183,7 @@ public: void SendBGWeekendWorldStates(); void SendBattlefieldWorldStates(); - void GetAurasForTarget(Unit* target); + void GetAurasForTarget(Unit* target, bool force = false); PlayerMenu* PlayerTalkClass; std::vector ItemSetEff; diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 1fb51a577..0b7520676 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -2525,6 +2525,7 @@ void Map::SendInitSelf(Player* player) { LOG_DEBUG("maps", "Creating player data for himself {}", player->GetGUID().ToString()); + WorldPacket packet; UpdateData data; // attach to player data current transport data @@ -2534,15 +2535,25 @@ 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->GetAurasForTarget(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->GetSession()->SendPacket(&packet); + player->SendDirectMessage(&packet); } void Map::SendInitTransports(Player* player)