diff options
| author | Mikhail Redko <ovitnez@gmail.com> | 2023-02-25 15:18:23 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-02-25 14:18:23 +0100 |
| commit | c6cd272505cdca5d21935ba346df82b8c767fb13 (patch) | |
| tree | 114fb0a53b6bf3b9f874ec8193fa278c9216ab3a | |
| parent | e11613eeb5dcad16f5908c9c7dd8109baabe9272 (diff) | |
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
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 5 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.h | 2 | ||||
| -rw-r--r-- | src/server/game/Maps/Map.cpp | 13 |
3 files changed, 15 insertions, 5 deletions
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<Player> void SendBGWeekendWorldStates() const; void SendBattlefieldWorldStates() const; - void SendAurasForTarget(Unit* target) const; + void SendAurasForTarget(Unit* target, bool force = false) const; PlayerMenu* PlayerTalkClass; std::vector<ItemSetEffect*> 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); } |
