aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Player/Player.cpp74
-rw-r--r--src/server/game/Entities/Player/Player.h4
-rw-r--r--src/server/game/Grids/Notifiers/GridNotifiers.cpp36
-rw-r--r--src/server/game/Grids/Notifiers/GridNotifiers.h2
4 files changed, 49 insertions, 67 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index cbe9326ce91..337055bf4ab 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -23780,26 +23780,6 @@ bool Player::IsVisibleGloballyFor(Player const* u) const
}
template<class T>
-inline void UpdateVisibilityOf_helper(GuidUnorderedSet& s64, T* target, std::set<Unit*>& /*v*/)
-{
- s64.insert(target->GetGUID());
-}
-
-template<>
-inline void UpdateVisibilityOf_helper(GuidUnorderedSet& s64, Creature* target, std::set<Unit*>& v)
-{
- s64.insert(target->GetGUID());
- v.insert(target);
-}
-
-template<>
-inline void UpdateVisibilityOf_helper(GuidUnorderedSet& s64, Player* target, std::set<Unit*>& v)
-{
- s64.insert(target->GetGUID());
- v.insert(target);
-}
-
-template<class T>
inline void BeforeVisibilityDestroy(T* /*t*/, Player* /*p*/) { }
template<>
@@ -23815,7 +23795,7 @@ void Player::UpdateVisibilityOf(Trinity::IteratorPair<WorldObject**> targets)
return;
UpdateData udata(GetMapId());
- std::set<Unit*> newVisibleUnits;
+ std::set<WorldObject*> newVisibleObjects;
for (WorldObject* target : targets)
{
@@ -23825,28 +23805,28 @@ void Player::UpdateVisibilityOf(Trinity::IteratorPair<WorldObject**> targets)
switch (target->GetTypeId())
{
case TYPEID_UNIT:
- UpdateVisibilityOf(target->ToCreature(), udata, newVisibleUnits);
+ UpdateVisibilityOf(target->ToCreature(), udata, newVisibleObjects);
break;
case TYPEID_PLAYER:
- UpdateVisibilityOf(target->ToPlayer(), udata, newVisibleUnits);
+ UpdateVisibilityOf(target->ToPlayer(), udata, newVisibleObjects);
break;
case TYPEID_GAMEOBJECT:
- UpdateVisibilityOf(target->ToGameObject(), udata, newVisibleUnits);
+ UpdateVisibilityOf(target->ToGameObject(), udata, newVisibleObjects);
break;
case TYPEID_DYNAMICOBJECT:
- UpdateVisibilityOf(target->ToDynObject(), udata, newVisibleUnits);
+ UpdateVisibilityOf(target->ToDynObject(), udata, newVisibleObjects);
break;
case TYPEID_CORPSE:
- UpdateVisibilityOf(target->ToCorpse(), udata, newVisibleUnits);
+ UpdateVisibilityOf(target->ToCorpse(), udata, newVisibleObjects);
break;
case TYPEID_AREATRIGGER:
- UpdateVisibilityOf(target->ToAreaTrigger(), udata, newVisibleUnits);
+ UpdateVisibilityOf(target->ToAreaTrigger(), udata, newVisibleObjects);
break;
case TYPEID_SCENEOBJECT:
- UpdateVisibilityOf(target->ToSceneObject(), udata, newVisibleUnits);
+ UpdateVisibilityOf(target->ToSceneObject(), udata, newVisibleObjects);
break;
case TYPEID_CONVERSATION:
- UpdateVisibilityOf(target->ToConversation(), udata, newVisibleUnits);
+ UpdateVisibilityOf(target->ToConversation(), udata, newVisibleObjects);
break;
default:
break;
@@ -23860,7 +23840,7 @@ void Player::UpdateVisibilityOf(Trinity::IteratorPair<WorldObject**> targets)
udata.BuildPacket(&packet);
SendDirectMessage(&packet);
- for (Unit* visibleUnit : newVisibleUnits)
+ for (WorldObject* visibleUnit : newVisibleObjects)
SendInitialVisiblePackets(visibleUnit);
}
@@ -23945,18 +23925,21 @@ void Player::UpdateTriggerVisibility()
SendDirectMessage(&packet);
}
-void Player::SendInitialVisiblePackets(Unit* target) const
+void Player::SendInitialVisiblePackets(WorldObject* target) const
{
- SendAurasForTarget(target);
- if (target->IsAlive())
+ if (Unit* targetUnit = target->ToUnit())
{
- if (target->HasUnitState(UNIT_STATE_MELEE_ATTACKING) && target->GetVictim())
- target->SendMeleeAttackStart(target->GetVictim());
+ SendAurasForTarget(targetUnit);
+ if (targetUnit->IsAlive())
+ {
+ if (targetUnit->HasUnitState(UNIT_STATE_MELEE_ATTACKING) && targetUnit->GetVictim())
+ targetUnit->SendMeleeAttackStart(targetUnit->GetVictim());
+ }
}
}
template<class T>
-void Player::UpdateVisibilityOf(T* target, UpdateData& data, std::set<Unit*>& visibleNow)
+void Player::UpdateVisibilityOf(T* target, UpdateData& data, std::set<WorldObject*>& visibleNow)
{
if (HaveAtClient(target))
{
@@ -23981,7 +23964,8 @@ void Player::UpdateVisibilityOf(T* target, UpdateData& data, std::set<Unit*>& vi
if (CanSeeOrDetect(target, false, true))
{
target->BuildCreateUpdateBlockForPlayer(&data, this);
- UpdateVisibilityOf_helper(m_clientGUIDs, target, visibleNow);
+ m_clientGUIDs.insert(target->GetGUID());
+ visibleNow.insert(target);
#ifdef TRINITY_DEBUG
TC_LOG_DEBUG("maps", "Object {} is visible now for player {}. Distance = {}", target->GetGUID().ToString(), GetGUID().ToString(), GetDistance(target));
@@ -23990,14 +23974,14 @@ void Player::UpdateVisibilityOf(T* target, UpdateData& data, std::set<Unit*>& vi
}
}
-template void Player::UpdateVisibilityOf(Player* target, UpdateData& data, std::set<Unit*>& visibleNow);
-template void Player::UpdateVisibilityOf(Creature* target, UpdateData& data, std::set<Unit*>& visibleNow);
-template void Player::UpdateVisibilityOf(Corpse* target, UpdateData& data, std::set<Unit*>& visibleNow);
-template void Player::UpdateVisibilityOf(GameObject* target, UpdateData& data, std::set<Unit*>& visibleNow);
-template void Player::UpdateVisibilityOf(DynamicObject* target, UpdateData& data, std::set<Unit*>& visibleNow);
-template void Player::UpdateVisibilityOf(AreaTrigger* target, UpdateData& data, std::set<Unit*>& visibleNow);
-template void Player::UpdateVisibilityOf(SceneObject* target, UpdateData& data, std::set<Unit*>& visibleNow);
-template void Player::UpdateVisibilityOf(Conversation* target, UpdateData& data, std::set<Unit*>& visibleNow);
+template void Player::UpdateVisibilityOf(Player* target, UpdateData& data, std::set<WorldObject*>& visibleNow);
+template void Player::UpdateVisibilityOf(Creature* target, UpdateData& data, std::set<WorldObject*>& visibleNow);
+template void Player::UpdateVisibilityOf(Corpse* target, UpdateData& data, std::set<WorldObject*>& visibleNow);
+template void Player::UpdateVisibilityOf(GameObject* target, UpdateData& data, std::set<WorldObject*>& visibleNow);
+template void Player::UpdateVisibilityOf(DynamicObject* target, UpdateData& data, std::set<WorldObject*>& visibleNow);
+template void Player::UpdateVisibilityOf(AreaTrigger* target, UpdateData& data, std::set<WorldObject*>& visibleNow);
+template void Player::UpdateVisibilityOf(SceneObject* target, UpdateData& data, std::set<WorldObject*>& visibleNow);
+template void Player::UpdateVisibilityOf(Conversation* target, UpdateData& data, std::set<WorldObject*>& visibleNow);
void Player::UpdateObjectVisibility(bool forced)
{
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index e5a39a319fc..4c33e4dae77 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -2515,7 +2515,7 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player>
bool IsVisibleGloballyFor(Player const* player) const;
- void SendInitialVisiblePackets(Unit* target) const;
+ void SendInitialVisiblePackets(WorldObject* target) const;
void OnPhaseChange() override;
void UpdateObjectVisibility(bool forced = true) override;
void UpdateVisibilityForPlayer();
@@ -2524,7 +2524,7 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player>
void UpdateTriggerVisibility();
template<class T>
- void UpdateVisibilityOf(T* target, UpdateData& data, std::set<Unit*>& visibleNow);
+ void UpdateVisibilityOf(T* target, UpdateData& data, std::set<WorldObject*>& visibleNow);
std::array<uint8, MAX_MOVE_TYPE> m_forced_speed_changes;
uint8 m_movementForceModMagnitudeChanges;
diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.cpp b/src/server/game/Grids/Notifiers/GridNotifiers.cpp
index 1077aad9e72..067898f671b 100644
--- a/src/server/game/Grids/Notifiers/GridNotifiers.cpp
+++ b/src/server/game/Grids/Notifiers/GridNotifiers.cpp
@@ -32,30 +32,28 @@ void VisibleNotifier::SendToSelf()
// but exist one case when this possible and object not out of range: transports
if (Transport* transport = dynamic_cast<Transport*>(i_player.GetTransport()))
{
- for (Transport::PassengerSet::const_iterator itr = transport->GetPassengers().begin(); itr != transport->GetPassengers().end(); ++itr)
+ for (WorldObject* passenger : transport->GetPassengers())
{
- if (vis_guids.find((*itr)->GetGUID()) != vis_guids.end())
+ if (vis_guids.erase(passenger->GetGUID()) > 0)
{
- vis_guids.erase((*itr)->GetGUID());
-
- switch ((*itr)->GetTypeId())
+ switch (passenger->GetTypeId())
{
case TYPEID_GAMEOBJECT:
- i_player.UpdateVisibilityOf((*itr)->ToGameObject(), i_data, i_visibleNow);
+ i_player.UpdateVisibilityOf(passenger->ToGameObject(), i_data, i_visibleNow);
break;
case TYPEID_PLAYER:
- i_player.UpdateVisibilityOf((*itr)->ToPlayer(), i_data, i_visibleNow);
- if (!(*itr)->isNeedNotify(NOTIFY_VISIBILITY_CHANGED))
- (*itr)->ToPlayer()->UpdateVisibilityOf(&i_player);
+ i_player.UpdateVisibilityOf(passenger->ToPlayer(), i_data, i_visibleNow);
+ if (!passenger->isNeedNotify(NOTIFY_VISIBILITY_CHANGED))
+ passenger->ToPlayer()->UpdateVisibilityOf(&i_player);
break;
case TYPEID_UNIT:
- i_player.UpdateVisibilityOf((*itr)->ToCreature(), i_data, i_visibleNow);
+ i_player.UpdateVisibilityOf(passenger->ToCreature(), i_data, i_visibleNow);
break;
case TYPEID_DYNAMICOBJECT:
- i_player.UpdateVisibilityOf((*itr)->ToDynObject(), i_data, i_visibleNow);
+ i_player.UpdateVisibilityOf(passenger->ToDynObject(), i_data, i_visibleNow);
break;
case TYPEID_AREATRIGGER:
- i_player.UpdateVisibilityOf((*itr)->ToAreaTrigger(), i_data, i_visibleNow);
+ i_player.UpdateVisibilityOf(passenger->ToAreaTrigger(), i_data, i_visibleNow);
break;
default:
break;
@@ -64,14 +62,14 @@ void VisibleNotifier::SendToSelf()
}
}
- for (auto it = vis_guids.begin(); it != vis_guids.end(); ++it)
+ for (ObjectGuid const& outOfRangeGuid : vis_guids)
{
- i_player.m_clientGUIDs.erase(*it);
- i_data.AddOutOfRangeGUID(*it);
+ i_player.m_clientGUIDs.erase(outOfRangeGuid);
+ i_data.AddOutOfRangeGUID(outOfRangeGuid);
- if (it->IsPlayer())
+ if (outOfRangeGuid.IsPlayer())
{
- Player* player = ObjectAccessor::FindPlayer(*it);
+ Player* player = ObjectAccessor::GetPlayer(i_player, outOfRangeGuid);
if (player && !player->isNeedNotify(NOTIFY_VISIBILITY_CHANGED))
player->UpdateVisibilityOf(&i_player);
}
@@ -84,8 +82,8 @@ void VisibleNotifier::SendToSelf()
i_data.BuildPacket(&packet);
i_player.SendDirectMessage(&packet);
- for (std::set<Unit*>::const_iterator it = i_visibleNow.begin(); it != i_visibleNow.end(); ++it)
- i_player.SendInitialVisiblePackets(*it);
+ for (WorldObject* visibleObject : i_visibleNow)
+ i_player.SendInitialVisiblePackets(visibleObject);
}
void VisibleChangesNotifier::Visit(PlayerMapType &m)
diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h
index 8c4b19eca1c..bbb795be802 100644
--- a/src/server/game/Grids/Notifiers/GridNotifiers.h
+++ b/src/server/game/Grids/Notifiers/GridNotifiers.h
@@ -49,7 +49,7 @@ namespace Trinity
{
Player &i_player;
UpdateData i_data;
- std::set<Unit*> i_visibleNow;
+ std::set<WorldObject*> i_visibleNow;
GuidUnorderedSet vis_guids;
VisibleNotifier(Player &player) : i_player(player), i_data(player.GetMapId()), vis_guids(player.m_clientGUIDs) { }