Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
GridNotifiers.cpp
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
6#include "CellImpl.h"
7#include "GridNotifiers.h"
8#include "GridNotifiersImpl.h"
9#include "Item.h"
11#include "Map.h"
12#include "ObjectAccessor.h"
13#include "SpellInfo.h"
14#include "Transport.h"
15#include "UpdateData.h"
16#include "WorldPacket.h"
17#include "WorldSession.h"
18
19using namespace Skyfire;
20
22{
23 // at this moment i_clientGUIDs have guids that not iterate at grid level checks
24 // but exist one case when this possible and object not out of range: transports
25 i_player.GetMap()->PreserveTransportVisibility(vis_guids);
26
27 if (Transport* transport = i_player.GetTransport())
28 {
30 for (Player::ClientGUIDs::iterator itr = vis_guids.begin(); itr != vis_guids.end();)
31 {
32 if (IS_GAMEOBJECT_GUID(*itr))
33 vis_guids.erase(itr++);
34 else
35 ++itr;
36 }
37
38 for (std::set<WorldObject*>::const_iterator itr = transport->GetPassengers().begin(); itr != transport->GetPassengers().end(); ++itr)
39 {
40 if (vis_guids.find((*itr)->GetGUID()) != vis_guids.end())
41 {
42 vis_guids.erase((*itr)->GetGUID());
43
44 switch ((*itr)->GetTypeId())
45 {
47 i_player.UpdateVisibilityOf((*itr)->ToGameObject(), i_data, i_visibleNow);
48 break;
50 i_player.UpdateVisibilityOf((*itr)->ToPlayer(), i_data, i_visibleNow);
51 if (!(*itr)->isNeedNotify(NOTIFY_VISIBILITY_CHANGED))
52 (*itr)->ToPlayer()->UpdateVisibilityOf(&i_player);
53 break;
55 i_player.UpdateVisibilityOf((*itr)->ToCreature(), i_data, i_visibleNow);
56 break;
57 default:
58 break;
59 }
60 }
61 }
62 }
63
64 for (Player::ClientGUIDs::const_iterator it = vis_guids.begin(); it != vis_guids.end(); ++it)
65 {
66 i_player.m_clientGUIDs.erase(*it);
67 i_data.AddOutOfRangeGUID(*it);
68
69 if (IS_PLAYER_GUID(*it))
70 {
72 if (player && player->IsInWorld() && !player->isNeedNotify(NOTIFY_VISIBILITY_CHANGED))
74 }
75 }
76
77 if (!i_data.HasData())
78 return;
79
80 WorldPacket packet;
81 i_data.BuildPacket(&packet);
82 i_player.GetSession()->SendPacket(&packet);
83
84 for (std::set<Unit*>::const_iterator it = i_visibleNow.begin(); it != i_visibleNow.end(); ++it)
85 i_player.SendInitialVisiblePackets(*it);
86}
87
89{
90 for (PlayerMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
91 {
92 if (iter->GetSource() == &i_object)
93 continue;
94
95 iter->GetSource()->UpdateVisibilityOf(&i_object);
96
97 if (iter->GetSource()->HasSharedVision())
98 {
99 for (SharedVisionList::const_iterator i = iter->GetSource()->GetSharedVisionList().begin();
100 i != iter->GetSource()->GetSharedVisionList().end(); ++i)
101 {
102 if ((*i)->m_seer == iter->GetSource())
103 (*i)->UpdateVisibilityOf(&i_object);
104 }
105 }
106 }
107}
108
110{
111 for (CreatureMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
112 if (iter->GetSource()->HasSharedVision())
113 for (SharedVisionList::const_iterator i = iter->GetSource()->GetSharedVisionList().begin();
114 i != iter->GetSource()->GetSharedVisionList().end(); ++i)
115 if ((*i)->m_seer == iter->GetSource())
116 (*i)->UpdateVisibilityOf(&i_object);
117}
118
120{
121 for (DynamicObjectMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
122 if (Unit* caster = iter->GetSource()->GetCaster())
123 if (Player* player = caster->ToPlayer())
124 if (player->m_seer == iter->GetSource())
125 player->UpdateVisibilityOf(&i_object);
126}
127
129{
130 if (!u->IsAlive() || !c->IsAlive() || c == u || u->IsInFlight())
131 return;
132
134 if (c->IsAIEnabled && c->CanSeeOrDetect(u, false, true) && c->IsWithinLOSInMap(u))
135 c->AI()->MoveInLineOfSight_Safe(u);
136}
137
139{
140 for (PlayerMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
141 {
142 Player* player = iter->GetSource();
143
144 vis_guids.erase(player->GetGUID());
145
146 i_player.UpdateVisibilityOf(player, i_data, i_visibleNow);
147
149 continue;
150
152 }
153}
154
156{
157 bool relocated_for_ai = (&i_player == i_player.m_seer);
158
159 for (CreatureMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
160 {
161 Creature* c = iter->GetSource();
162
163 vis_guids.erase(c->GetGUID());
164
165 i_player.UpdateVisibilityOf(c, i_data, i_visibleNow);
166
167 if (relocated_for_ai && !c->isNeedNotify(NOTIFY_VISIBILITY_CHANGED))
169 }
170}
171
173{
174 for (PlayerMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
175 {
176 Player* player = iter->GetSource();
177
180
182 }
183}
184
186{
187 if (!i_creature.IsAlive())
188 return;
189
190 for (CreatureMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
191 {
192 Creature* c = iter->GetSource();
194
197 }
198}
199
201{
202 for (CreatureMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
203 {
204 Creature* unit = iter->GetSource();
206 continue;
207
208 CreatureRelocationNotifier relocate(*unit);
209
212
213 cell.Visit(p, c2world_relocation, i_map, *unit, i_radius);
214 cell.Visit(p, c2grid_relocation, i_map, *unit, i_radius);
215 }
216}
217
219{
220 for (PlayerMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
221 {
222 Player* player = iter->GetSource();
223 WorldObject const* viewPoint = player->m_seer;
224
226 continue;
227
228 if (player != viewPoint && !viewPoint->IsPositionValid())
229 continue;
230
231 CellCoord pair2(Skyfire::ComputeCellCoord(viewPoint->GetPositionX(), viewPoint->GetPositionY()));
232 Cell cell2(pair2);
233 //cell.SetNoCreate(); need load cells around viewPoint or player, that's why its commented
234
235 PlayerRelocationNotifier relocate(*player);
238
239 cell2.Visit(pair2, c2world_relocation, i_map, *viewPoint, i_radius);
240 cell2.Visit(pair2, c2grid_relocation, i_map, *viewPoint, i_radius);
241
242 relocate.SendToSelf();
243 }
244}
245
247{
248 for (CreatureMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
249 {
250 Creature* c = iter->GetSource();
252 if (isCreature)
254 }
255}
256
258{
259 for (PlayerMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
260 {
261 Player* target = iter->GetSource();
262 if (!target->InSamePhase(i_phaseMask))
263 continue;
264
265 if (target->GetExactDist2dSq(i_source) > i_distSq)
266 continue;
267
268 // Send packet to all who are sharing the player's vision
269 if (target->HasSharedVision())
270 {
271 SharedVisionList::const_iterator i = target->GetSharedVisionList().begin();
272 for (; i != target->GetSharedVisionList().end(); ++i)
273 if ((*i)->m_seer == target)
274 SendPacket(*i);
275 }
276
277 if (target->m_seer == target || target->GetVehicle())
278 SendPacket(target);
279 }
280}
281
283{
284 for (CreatureMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
285 {
286 Creature* target = iter->GetSource();
287 if (!target->InSamePhase(i_phaseMask))
288 continue;
289
290 if (target->GetExactDist2dSq(i_source) > i_distSq)
291 continue;
292
293 // Send packet to all who are sharing the creature's vision
294 if (target->HasSharedVision())
295 {
296 SharedVisionList::const_iterator i = target->GetSharedVisionList().begin();
297 for (; i != target->GetSharedVisionList().end(); ++i)
298 if ((*i)->m_seer == target)
299 SendPacket(*i);
300 }
301 }
302}
303
305{
306 for (DynamicObjectMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
307 {
308 DynamicObject* target = iter->GetSource();
309 if (!target->InSamePhase(i_phaseMask))
310 continue;
311
312 if (target->GetExactDist2dSq(i_source) > i_distSq)
313 continue;
314
315 if (Unit* caster = target->GetCaster())
316 {
317 // Send packet back to the caster if the caster has vision of dynamic object
318 Player* player = caster->ToPlayer();
319 if (player && player->m_seer == target)
320 SendPacket(player);
321 }
322 }
323}
324
325/*
326void
327MessageDistDeliverer::VisitObject(Player* player)
328{
329 if (!i_ownTeamOnly || (i_source.GetTypeId() == TYPEID_PLAYER && player->GetTeam() == ((Player&)i_source).GetTeam()))
330 {
331 SendPacket(player);
332 }
333}
334*/
335
336template<class T>
338{
339 for (typename GridRefManager<T>::iterator iter = m.begin(); iter != m.end(); ++iter)
340 if (iter->GetSource()->IsInWorld())
341 iter->GetSource()->Update(i_timeDiff);
342}
343
345{
346 return !u->IsAlive() && !u->HasAuraType(SPELL_AURA_GHOST) && i_searchObj->IsWithinDistInMap(u, i_range);
347}
348
350{
351 return u->GetType() != CorpseType::CORPSE_BONES && i_searchObj->IsWithinDistInMap(u, i_range);
352}
353
355{
356 return !u->IsAlive() && i_searchObj->IsWithinDistInMap(u, i_range);
357}
358
363
368
373
@ CORPSE_BONES
Definition Corpse.h:16
GridRefManager< DynamicObject > DynamicObjectMapType
Definition GridDefines.h:52
GridRefManager< Creature > CreatureMapType
Definition GridDefines.h:51
GridRefManager< Player > PlayerMapType
Definition GridDefines.h:54
GridRefManager< AreaTrigger > AreaTriggerMapType
Definition GridDefines.h:55
CoordPair< TOTAL_NUMBER_OF_CELLS_PER_MAP > CellCoord
GridRefManager< GameObject > GameObjectMapType
Definition GridDefines.h:53
void CreatureUnitRelocationWorker(Creature *c, Unit *u)
@ TYPEID_PLAYER
Definition Object.h:55
@ TYPEID_GAMEOBJECT
Definition Object.h:56
@ TYPEID_UNIT
Definition Object.h:54
@ NOTIFY_VISIBILITY_CHANGED
Definition Object.h:88
bool IS_GAMEOBJECT_GUID(uint64 guid)
bool IS_PLAYER_GUID(uint64 guid)
@ SPELL_AURA_GHOST
@ UNIT_STATE_SIGHTLESS
Definition Unit.h:545
@ REACT_AGGRESSIVE
Definition Unit.h:1158
CorpseType GetType() const
Definition Corpse.h:58
void MoveInLineOfSight_Safe(Unit *who)
== Reactions At =================================
bool HasReactState(ReactStates state) const
Definition Creature.h:462
CreatureAI * AI() const
Definition Creature.h:483
Unit * GetCaster() const
LinkedListHead::Iterator< GridReference< Player > > iterator
iterator begin()
static Player * FindPlayer(uint64)
uint64 GetGUID() const
Definition Object.h:119
Player * ToPlayer()
Definition Object.h:204
bool IsInWorld() const
Definition Object.h:114
void UpdateVisibilityOf(WorldObject *target)
Definition Player.cpp:18170
WorldObject * m_seer
Definition Player.h:2808
Definition Unit.h:1367
Vehicle * GetVehicle() const
Definition Unit.h:2743
bool IsAlive() const
Definition Unit.h:2032
bool IsInFlight() const
Definition Unit.h:1891
SharedVisionList const & GetSharedVisionList()
Definition Unit.h:2157
bool HasAuraType(AuraType auraType) const
bool IsAIEnabled
Definition Unit.h:2735
bool HasUnitState(const uint32 f) const
Definition Unit.h:1485
bool HasSharedVision() const
Definition Unit.h:2163
bool isNeedNotify(uint16 f) const
Definition Object.h:770
bool IsWithinLOSInMap(WorldObject const *obj) const
Definition Object.cpp:1656
bool InSamePhase(WorldObject const *obj) const
Definition Object.cpp:3412
bool CanSeeOrDetect(WorldObject const *obj, bool ignoreStealth=false, bool distanceCheck=false) const
Definition Object.cpp:2105
bool ShouldPreservePassengerGameObjectVisibility(uint32 clientEntry)
CellCoord ComputeCellCoord(float x, float y)
Definition Cell.h:37
void Visit(CellCoord const &, TypeContainerVisitor< T, CONTAINER > &visitor, Map &, WorldObject const &, float) const
Definition CellImpl.h:109
float GetExactDist2dSq(float x, float y) const
Definition Object.h:362
bool IsPositionValid() const
Definition Object.cpp:2049
float GetPositionX() const
Definition Object.h:328
float GetPositionY() const
Definition Object.h:329
void Visit(GridRefManager< T > &)
void Visit(GridRefManager< T > &)
void Visit(GridRefManager< T > &)
void Visit(PlayerMapType &m)
void SendPacket(Player *player) const
void Visit(GridRefManager< T > &m)
void Visit(GridRefManager< T > &m)
void Visit(GridRefManager< T > &)
std::set< Unit * > i_visibleNow
Player::ClientGUIDs vis_guids