diff options
-rw-r--r-- | src/server/game/Entities/Creature/Creature.cpp | 18 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 2 |
4 files changed, 15 insertions, 12 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index de899b94ea2..4f527c7563a 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -2652,17 +2652,17 @@ bool Creature::FocusTarget(Spell const* focusSpell, WorldObject const* target) ) ) { - const MapRefManager& mapPlayers = GetMap()->GetPlayers(); - for (MapRefManager::const_iterator it = mapPlayers.begin(); it != mapPlayers.end(); ++it) - if (Player* player = (*it).GetSource()) + std::list<Player*> playersNearby; + GetPlayerListInGrid(playersNearby, GetVisibilityRange()); + for (Player* player : playersNearby) + { + // only update players that are known to the client (have already been created) + if (player->HaveAtClient(this)) { - // only update players that can both see us, and are actually in combat with us (this is a performance tradeoff) - if (player->CanSeeOrDetect(this, false, true) && IsInCombatWith(player)) - { - SendUpdateToPlayer(player); - shouldDelay = true; - } + SendUpdateToPlayer(player); + shouldDelay = true; } + } if (shouldDelay) shouldDelay = !(focusSpell->IsTriggered() || focusSpell->GetCastTime() || focusSpell->GetSpellInfo()->IsChanneled()); diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 064aafb5cf7..1b9cc69e81a 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -254,7 +254,10 @@ void Object::SendUpdateToPlayer(Player* player) UpdateData upd(player->GetMapId()); WorldPacket packet; - BuildCreateUpdateBlockForPlayer(&upd, player); + if (player->HaveAtClient(this)) + BuildValuesUpdateBlockForPlayer(&upd, player); + else + BuildCreateUpdateBlockForPlayer(&upd, player); upd.BuildPacket(&packet); player->GetSession()->SendPacket(&packet); } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index ee63999802a..5c9212252c5 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -21844,7 +21844,7 @@ WorldLocation Player::GetStartPosition() const return WorldLocation(mapId, info->positionX, info->positionY, info->positionZ, 0); } -bool Player::HaveAtClient(WorldObject const* u) const +bool Player::HaveAtClient(Object const* u) const { return u == this || m_clientGUIDs.find(u->GetGUID()) != m_clientGUIDs.end(); } diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 9b9567db0c1..145786c18a9 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2278,7 +2278,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> // currently visible objects at player client GuidUnorderedSet m_clientGUIDs; - bool HaveAtClient(WorldObject const* u) const; + bool HaveAtClient(Object const* u) const; bool IsNeverVisible() const override; |