diff options
Diffstat (limited to 'src')
-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 08f8181c303..19642b498b6 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -2786,17 +2786,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 836a041abc3..824f42ad671 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -221,7 +221,10 @@ void Object::SendUpdateToPlayer(Player* player) UpdateData upd; 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 13661f80cb2..a3602166edf 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -21942,7 +21942,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 ced588d295f..91a4a403fab 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2097,7 +2097,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; |