AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
Acore::VisibleNotifier Struct Reference

#include "GridNotifiers.h"

Inheritance diagram for Acore::VisibleNotifier:
Acore::PlayerRelocationNotifier

Public Member Functions

 VisibleNotifier (Player &player, bool gobjOnly, bool largeOnly)
 
void Visit (GameObjectMapType &)
 
template<class T >
void Visit (GridRefMgr< T > &m)
 
void SendToSelf (void)
 

Public Attributes

Playeri_player
 
GuidUnorderedSet vis_guids
 
std::vector< Unit * > & i_visibleNow
 
bool i_gobjOnly
 
bool i_largeOnly
 
UpdateData i_data
 

Detailed Description

Constructor & Destructor Documentation

◆ VisibleNotifier()

Acore::VisibleNotifier::VisibleNotifier ( Player player,
bool  gobjOnly,
bool  largeOnly 
)
inline
50 :
51 i_player(player), vis_guids(player.m_clientGUIDs), i_visibleNow(player.m_newVisible), i_gobjOnly(gobjOnly), i_largeOnly(largeOnly)
52 {
53 i_visibleNow.clear();
54 }
GuidUnorderedSet m_clientGUIDs
Definition: Player.h:2341
std::vector< Unit * > m_newVisible
Definition: Player.h:2342
bool i_gobjOnly
Definition: GridNotifiers.h:46
std::vector< Unit * > & i_visibleNow
Definition: GridNotifiers.h:45
bool i_largeOnly
Definition: GridNotifiers.h:47
Player & i_player
Definition: GridNotifiers.h:43
GuidUnorderedSet vis_guids
Definition: GridNotifiers.h:44

References i_visibleNow.

Member Function Documentation

◆ SendToSelf()

void VisibleNotifier::SendToSelf ( void  )
44{
45 // at this moment i_clientGUIDs have guids that not iterate at grid level checks
46 // but exist one case when this possible and object not out of range: transports
47 if (Transport* transport = i_player.GetTransport())
48 for (Transport::PassengerSet::const_iterator itr = transport->GetPassengers().begin(); itr != transport->GetPassengers().end(); ++itr)
49 {
50 if (i_largeOnly != (*itr)->IsVisibilityOverridden())
51 continue;
52
53 if (vis_guids.find((*itr)->GetGUID()) != vis_guids.end())
54 {
55 vis_guids.erase((*itr)->GetGUID());
56
57 switch ((*itr)->GetTypeId())
58 {
60 i_player.UpdateVisibilityOf((*itr)->ToGameObject(), i_data, i_visibleNow);
61 break;
62 case TYPEID_PLAYER:
63 i_player.UpdateVisibilityOf((*itr)->ToPlayer(), i_data, i_visibleNow);
64 (*itr)->ToPlayer()->UpdateVisibilityOf(&i_player);
65 break;
66 case TYPEID_UNIT:
67 i_player.UpdateVisibilityOf((*itr)->ToCreature(), i_data, i_visibleNow);
68 break;
69 default:
70 break;
71 }
72 }
73 }
74
75 for (GuidUnorderedSet::const_iterator it = vis_guids.begin(); it != vis_guids.end(); ++it)
76 {
78 {
79 if (i_largeOnly != obj->IsVisibilityOverridden())
80 continue;
81 }
82
83 // pussywizard: static transports are removed only in RemovePlayerFromMap and here if can no longer detect (eg. phase changed)
84 if ((*it).IsTransport())
85 if (GameObject* staticTrans = i_player.GetMap()->GetGameObject(*it))
86 if (i_player.CanSeeOrDetect(staticTrans, false, true))
87 continue;
88
89 i_player.m_clientGUIDs.erase(*it);
91
92 if ((*it).IsPlayer())
93 {
95 if (player && player->IsInMap(&i_player))
97 }
98 }
99
100 if (!i_data.HasData())
101 return;
102
103 WorldPacket packet;
104 i_data.BuildPacket(&packet);
105 i_player.GetSession()->SendPacket(&packet);
106
107 for (std::vector<Unit*>::const_iterator it = i_visibleNow.begin(); it != i_visibleNow.end(); ++it)
108 {
109 if (i_largeOnly != (*it)->IsVisibilityOverridden())
110 continue;
111
113 }
114}
@ TYPEID_GAMEOBJECT
Definition: ObjectGuid.h:39
@ TYPEID_UNIT
Definition: ObjectGuid.h:37
@ TYPEID_PLAYER
Definition: ObjectGuid.h:38
Player * FindPlayer(ObjectGuid const guid)
Definition: ObjectAccessor.cpp:250
WorldObject * GetWorldObject(WorldObject const &, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:120
Definition: GameObject.h:122
Definition: Object.h:393
Map * GetMap() const
Definition: Object.h:517
Transport * GetTransport() const
Definition: Object.h:585
bool CanSeeOrDetect(WorldObject const *obj, bool ignoreStealth=false, bool distanceCheck=false, bool checkAlert=false) const
Definition: Object.cpp:1726
bool IsInMap(WorldObject const *obj) const
Definition: Object.cpp:1285
bool HasData() const
Definition: UpdateData.h:60
void AddOutOfRangeGUID(ObjectGuid guid)
Definition: UpdateData.cpp:32
bool BuildPacket(WorldPacket *packet)
Definition: UpdateData.cpp:105
Definition: Player.h:1056
void UpdateVisibilityOf(WorldObject *target)
Definition: PlayerUpdates.cpp:1669
WorldSession * GetSession() const
Definition: Player.h:1958
void GetInitialVisiblePackets(Unit *target)
Definition: PlayerUpdates.cpp:1658
Definition: Transport.h:29
UpdateData i_data
Definition: GridNotifiers.h:48
GameObject * GetGameObject(ObjectGuid const guid)
Definition: Map.cpp:3309
Definition: WorldPacket.h:27
void SendPacket(WorldPacket const *packet)
Send a packet to the client.
Definition: WorldSession.cpp:207

References UpdateData::AddOutOfRangeGUID(), UpdateData::BuildPacket(), WorldObject::CanSeeOrDetect(), ObjectAccessor::FindPlayer(), Map::GetGameObject(), Player::GetInitialVisiblePackets(), WorldObject::GetMap(), Player::GetSession(), WorldObject::GetTransport(), ObjectAccessor::GetWorldObject(), UpdateData::HasData(), i_data, i_largeOnly, i_player, i_visibleNow, WorldObject::IsInMap(), Player::m_clientGUIDs, WorldSession::SendPacket(), TYPEID_GAMEOBJECT, TYPEID_PLAYER, TYPEID_UNIT, Player::UpdateVisibilityOf(), and vis_guids.

Referenced by Unit::ExecuteDelayedUnitRelocationEvent(), and Player::UpdateVisibilityForPlayer().

◆ Visit() [1/2]

void VisibleNotifier::Visit ( GameObjectMapType m)
31{
32 for (GameObjectMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
33 {
34 GameObject* go = iter->GetSource();
36 continue;
37
38 vis_guids.erase(go->GetGUID());
40 }
41}
Definition: LinkedList.h:139
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:106
bool IsVisibilityOverridden() const
Definition: Object.h:563
iterator begin()
Definition: GridRefMgr.h:35
iterator end()
Definition: GridRefMgr.h:36

References GridRefMgr< OBJECT >::begin(), GridRefMgr< OBJECT >::end(), Object::GetGUID(), i_data, i_largeOnly, i_player, i_visibleNow, WorldObject::IsVisibilityOverridden(), Player::UpdateVisibilityOf(), and vis_guids.

Referenced by Acore::PlayerRelocationNotifier::Visit().

◆ Visit() [2/2]

template<class T >
void Acore::VisibleNotifier::Visit ( GridRefMgr< T > &  m)
inline
34{
35 // Xinef: Update gameobjects only
36 if (i_gobjOnly)
37 return;
38
39 for (typename GridRefMgr<T>::iterator iter = m.begin(); iter != m.end(); ++iter)
40 {
41 if (i_largeOnly != iter->GetSource()->IsVisibilityOverridden())
42 continue;
43
44 vis_guids.erase(iter->GetSource()->GetGUID());
46 }
47}

References GridRefMgr< OBJECT >::begin(), GridRefMgr< OBJECT >::end(), i_data, i_gobjOnly, i_largeOnly, i_player, i_visibleNow, Player::UpdateVisibilityOf(), and vis_guids.

Member Data Documentation

◆ i_data

UpdateData Acore::VisibleNotifier::i_data

◆ i_gobjOnly

bool Acore::VisibleNotifier::i_gobjOnly

Referenced by Visit().

◆ i_largeOnly

bool Acore::VisibleNotifier::i_largeOnly

Referenced by SendToSelf(), and Visit().

◆ i_player

Player& Acore::VisibleNotifier::i_player

◆ i_visibleNow

std::vector<Unit*>& Acore::VisibleNotifier::i_visibleNow

◆ vis_guids

GuidUnorderedSet Acore::VisibleNotifier::vis_guids