TrinityCore
Loading...
Searching...
No Matches
GridNotifiers.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "GridNotifiers.h"
19#include "CellImpl.h"
20#include "CreatureAI.h"
21#include "GridNotifiersImpl.h"
22#include "ObjectAccessor.h"
23#include "Transport.h"
24#include "UpdateData.h"
25#include "WorldPacket.h"
26
27using namespace Trinity;
28
29VisibleNotifier::VisibleNotifier(Player& player): i_player(player), i_data(player.GetMapId()), vis_guids(player.m_clientGUIDs)
30{
31}
32
34
36{
37 // at this moment i_clientGUIDs have guids that not iterate at grid level checks
38 // but exist one case when this possible and object not out of range: transports
39 if (Transport* transport = dynamic_cast<Transport*>(i_player.GetTransport()))
40 {
41 for (WorldObject* passenger : transport->GetPassengers())
42 {
43 if (vis_guids.erase(passenger->GetGUID()) > 0)
44 {
45 switch (passenger->GetTypeId())
46 {
48 i_player.UpdateVisibilityOf(passenger->ToGameObject(), i_data, i_visibleNow);
49 break;
50 case TYPEID_PLAYER:
51 i_player.UpdateVisibilityOf(passenger->ToPlayer(), i_data, i_visibleNow);
52 if (!passenger->isNeedNotify(NOTIFY_VISIBILITY_CHANGED))
53 passenger->ToPlayer()->UpdateVisibilityOf(&i_player);
54 break;
55 case TYPEID_UNIT:
56 i_player.UpdateVisibilityOf(passenger->ToCreature(), i_data, i_visibleNow);
57 break;
59 i_player.UpdateVisibilityOf(passenger->ToDynObject(), i_data, i_visibleNow);
60 break;
62 i_player.UpdateVisibilityOf(passenger->ToAreaTrigger(), i_data, i_visibleNow);
63 break;
64 default:
65 break;
66 }
67 }
68 }
69 }
70
71 for (ObjectGuid const& outOfRangeGuid : vis_guids)
72 {
73 i_player.m_clientGUIDs.erase(outOfRangeGuid);
74 i_data.AddOutOfRangeGUID(outOfRangeGuid);
75
76 if (outOfRangeGuid.IsPlayer())
77 {
78 Player* player = ObjectAccessor::GetPlayer(i_player, outOfRangeGuid);
79 if (player && !player->isNeedNotify(NOTIFY_VISIBILITY_CHANGED))
81 }
82 }
83
84 if (!i_data.HasData())
85 return;
86
87 WorldPacket packet;
88 i_data.BuildPacket(&packet);
90
91 for (WorldObject* visibleObject : i_visibleNow)
93}
94
96{
97 for (PlayerMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
98 {
99 iter->GetSource()->UpdateVisibilityOf(i_objects);
100
101 for (SharedVisionList::const_iterator i = iter->GetSource()->GetSharedVisionList().begin();
102 i != iter->GetSource()->GetSharedVisionList().end(); ++i)
103 if ((*i)->m_seer == iter->GetSource())
104 (*i)->UpdateVisibilityOf(i_objects);
105 }
106}
107
109{
110 for (CreatureMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
111 for (SharedVisionList::const_iterator i = iter->GetSource()->GetSharedVisionList().begin();
112 i != iter->GetSource()->GetSharedVisionList().end(); ++i)
113 if ((*i)->m_seer == iter->GetSource())
114 (*i)->UpdateVisibilityOf(i_objects);
115}
116
118{
119 for (DynamicObjectMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
120 if (Unit* caster = iter->GetSource()->GetCaster())
121 if (Player* player = caster->ToPlayer())
122 if (player->m_seer == iter->GetSource())
123 player->UpdateVisibilityOf(i_objects);
124}
125
127{
128 if (!u->IsAlive() || !c->IsAlive() || c == u || u->IsInFlight())
129 return;
130
132 {
133 if (c->IsAIEnabled() && c->CanSeeOrDetect(u, { .DistanceCheck = true }))
134 c->AI()->MoveInLineOfSight_Safe(u);
135 else
136 if (u->GetTypeId() == TYPEID_PLAYER && u->HasStealthAura() && c->IsAIEnabled()
137 && c->CanSeeOrDetect(u, { .DistanceCheck = true, .AlertCheck = true }))
138 c->AI()->TriggerAlert(u);
139 }
140}
141
143{
144 for (PlayerMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
145 {
146 Player* player = iter->GetSource();
147
148 vis_guids.erase(player->GetGUID());
149
151
153 continue;
154
156 }
157}
158
160{
161 bool relocated_for_ai = (&i_player == i_player.m_seer);
162
163 for (CreatureMapType::iterator iter=m.begin(); iter != m.end(); ++iter)
164 {
165 Creature* c = iter->GetSource();
166
167 vis_guids.erase(c->GetGUID());
168
170
171 if (relocated_for_ai && !c->isNeedNotify(NOTIFY_VISIBILITY_CHANGED))
173 }
174}
175
177{
178 for (PlayerMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
179 {
180 Player* player = iter->GetSource();
181
184
186 }
187}
188
190{
191 if (!i_creature.IsAlive())
192 return;
193
194 for (CreatureMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
195 {
196 Creature* c = iter->GetSource();
198
201 }
202}
203
205{
206 for (CreatureMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
207 {
208 Creature* unit = iter->GetSource();
210 continue;
211
212 CreatureRelocationNotifier relocate(*unit);
213
216
217 cell.Visit(p, c2world_relocation, i_map, *unit, i_radius);
218 cell.Visit(p, c2grid_relocation, i_map, *unit, i_radius);
219 }
220}
221
223{
224 for (PlayerMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
225 {
226 Player* player = iter->GetSource();
227 WorldObject const* viewPoint = player->m_seer;
228
230 continue;
231
232 if (player != viewPoint && !viewPoint->IsPositionValid())
233 continue;
234
235 PlayerRelocationNotifier relocate(*player);
236 Cell::VisitAllObjects(viewPoint, relocate, i_radius, false);
237 relocate.SendToSelf();
238 }
239}
240
242{
243 for (CreatureMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
244 {
245 Creature* c = iter->GetSource();
247 if (isCreature)
249 }
250}
251
253{
254 for (CreatureMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
255 {
256 Creature* c = iter->GetSource();
259 }
260}
261
263{
264 for (PlayerMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
265 {
266 Player* player = iter->GetSource();
268 }
269}
270
271/*
272void
273MessageDistDeliverer::VisitObject(Player* player)
274{
275 if (!i_ownTeamOnly || (i_source.GetTypeId() == TYPEID_PLAYER && player->GetTeam() == ((Player&)i_source).GetTeam()))
276 {
277 SendPacket(player);
278 }
279}
280*/
281
282template<class T>
284{
285 for (typename GridRefManager<T>::iterator iter = m.begin(); iter != m.end(); ++iter)
286 if (iter->GetSource()->IsInWorld())
287 iter->GetSource()->Update(i_timeDiff);
288}
289
294
299
304
309
314
319
320template void ObjectUpdater::Visit<Creature>(CreatureMapType&);
321template void ObjectUpdater::Visit<GameObject>(GameObjectMapType&);
322template void ObjectUpdater::Visit<DynamicObject>(DynamicObjectMapType&);
323template void ObjectUpdater::Visit<AreaTrigger>(AreaTriggerMapType &);
324template void ObjectUpdater::Visit<SceneObject>(SceneObjectMapType &);
325template void ObjectUpdater::Visit<Conversation>(ConversationMapType &);
@ CORPSE_BONES
Definition Corpse.h:31
void CreatureUnitRelocationWorker(Creature *c, Unit *u)
@ NOTIFY_VISIBILITY_CHANGED
@ TYPEID_AREATRIGGER
Definition ObjectGuid.h:49
@ TYPEID_DYNAMICOBJECT
Definition ObjectGuid.h:47
@ TYPEID_GAMEOBJECT
Definition ObjectGuid.h:46
@ TYPEID_UNIT
Definition ObjectGuid.h:43
@ TYPEID_PLAYER
Definition ObjectGuid.h:44
@ SPELL_AURA_GHOST
@ UNIT_STATE_SIGHTLESS
Definition Unit.h:304
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
TypeID GetTypeId() const
Definition BaseEntity.h:166
CorpseType GetType() const
Definition Corpse.h:127
void TriggerAlert(Unit const *who) const
void MoveInLineOfSight_Safe(Unit *who)
== Reactions At =================================
CreatureAI * AI() const
Definition Creature.h:228
Player * ToPlayer()
Definition Object.h:126
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:6283
GuidUnorderedSet m_clientGUIDs
Definition Player.h:2699
void UpdateVisibilityOf(WorldObject *target)
Definition Player.cpp:24652
WorldObject * m_seer
Definition Player.h:2666
void SendInitialVisiblePackets(WorldObject *target) const
Definition Player.cpp:24746
iterator end()
Definition RefManager.h:36
iterator begin()
Definition RefManager.h:35
WorldObject const *const i_searchObj
Definition Unit.h:635
bool IsAlive() const
Definition Unit.h:1185
bool HasStealthAura() const
Definition Unit.h:1088
bool IsInFlight() const
Definition Unit.h:1027
bool IsAIEnabled() const
Definition Unit.h:666
bool HasAuraType(AuraType auraType) const
Definition Unit.cpp:4814
bool HasUnitState(const uint32 f) const
Definition Unit.h:743
bool HasData() const
Definition UpdateData.h:49
void AddOutOfRangeGUID(ObjectGuid guid)
bool BuildPacket(WorldPacket *packet)
bool isNeedNotify(uint16 f) const
Definition Object.h:520
TransportBase * GetTransport() const
Definition Object.h:537
bool CanSeeOrDetect(WorldObject const *obj, CanSeeOrDetectExtraArgs const &args={ }) const
Definition Object.cpp:857
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition Object.cpp:501
TC_GAME_API Player * GetPlayer(Map const *, ObjectGuid const &guid)
static void VisitAllObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
Definition CellImpl.h:203
void Visit(CellCoord const &, TypeContainerVisitor< T, CONTAINER > &visitor, Map &, WorldObject const &obj, float radius) const
Definition CellImpl.h:61
bool IsPositionValid() const
Definition Position.cpp:42
void Visit(GridRefManager< T > &)
void Visit(GridRefManager< T > &)
void Visit(GridRefManager< T > &)
void Visit(GridRefManager< T > &m)
void Visit(GridRefManager< T > &m)
IteratorPair< WorldObject ** > i_objects
void Visit(GridRefManager< T > &)
GuidUnorderedSet vis_guids
VisibleNotifier(Player &player)
std::set< WorldObject * > i_visibleNow
bool operator()(WorldObject *target) const
Definition Spell.cpp:9370