TrinityCore
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
29void VisibleNotifier::SendToSelf()
30{
31 // at this moment i_clientGUIDs have guids that not iterate at grid level checks
32 // but exist one case when this possible and object not out of range: transports
33 if (Transport* transport = dynamic_cast<Transport*>(i_player.GetTransport()))
34 {
35 for (WorldObject* passenger : transport->GetPassengers())
36 {
37 if (vis_guids.erase(passenger->GetGUID()) > 0)
38 {
39 switch (passenger->GetTypeId())
40 {
42 i_player.UpdateVisibilityOf(passenger->ToGameObject(), i_data, i_visibleNow);
43 break;
44 case TYPEID_PLAYER:
45 i_player.UpdateVisibilityOf(passenger->ToPlayer(), i_data, i_visibleNow);
46 if (!passenger->isNeedNotify(NOTIFY_VISIBILITY_CHANGED))
47 passenger->ToPlayer()->UpdateVisibilityOf(&i_player);
48 break;
49 case TYPEID_UNIT:
50 i_player.UpdateVisibilityOf(passenger->ToCreature(), i_data, i_visibleNow);
51 break;
53 i_player.UpdateVisibilityOf(passenger->ToDynObject(), i_data, i_visibleNow);
54 break;
56 i_player.UpdateVisibilityOf(passenger->ToAreaTrigger(), i_data, i_visibleNow);
57 break;
58 default:
59 break;
60 }
61 }
62 }
63 }
64
65 for (ObjectGuid const& outOfRangeGuid : vis_guids)
66 {
67 i_player.m_clientGUIDs.erase(outOfRangeGuid);
68 i_data.AddOutOfRangeGUID(outOfRangeGuid);
69
70 if (outOfRangeGuid.IsPlayer())
71 {
72 Player* player = ObjectAccessor::GetPlayer(i_player, outOfRangeGuid);
73 if (player && !player->isNeedNotify(NOTIFY_VISIBILITY_CHANGED))
75 }
76 }
77
78 if (!i_data.HasData())
79 return;
80
81 WorldPacket packet;
82 i_data.BuildPacket(&packet);
84
85 for (WorldObject* visibleObject : i_visibleNow)
87}
88
90{
91 for (PlayerMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
92 {
93 iter->GetSource()->UpdateVisibilityOf(i_objects);
94
95 for (SharedVisionList::const_iterator i = iter->GetSource()->GetSharedVisionList().begin();
96 i != iter->GetSource()->GetSharedVisionList().end(); ++i)
97 if ((*i)->m_seer == iter->GetSource())
98 (*i)->UpdateVisibilityOf(i_objects);
99 }
100}
101
103{
104 for (CreatureMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
105 for (SharedVisionList::const_iterator i = iter->GetSource()->GetSharedVisionList().begin();
106 i != iter->GetSource()->GetSharedVisionList().end(); ++i)
107 if ((*i)->m_seer == iter->GetSource())
108 (*i)->UpdateVisibilityOf(i_objects);
109}
110
112{
113 for (DynamicObjectMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
114 if (Unit* caster = iter->GetSource()->GetCaster())
115 if (Player* player = caster->ToPlayer())
116 if (player->m_seer == iter->GetSource())
117 player->UpdateVisibilityOf(i_objects);
118}
119
121{
122 if (!u->IsAlive() || !c->IsAlive() || c == u || u->IsInFlight())
123 return;
124
126 {
127 if (c->IsAIEnabled() && c->CanSeeOrDetect(u, false, true))
128 c->AI()->MoveInLineOfSight_Safe(u);
129 else
130 if (u->GetTypeId() == TYPEID_PLAYER && u->HasStealthAura() && c->IsAIEnabled() && c->CanSeeOrDetect(u, false, true, true))
131 c->AI()->TriggerAlert(u);
132 }
133}
134
136{
137 for (PlayerMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
138 {
139 Player* player = iter->GetSource();
140
141 vis_guids.erase(player->GetGUID());
142
144
146 continue;
147
149 }
150}
151
153{
154 bool relocated_for_ai = (&i_player == i_player.m_seer);
155
156 for (CreatureMapType::iterator iter=m.begin(); iter != m.end(); ++iter)
157 {
158 Creature* c = iter->GetSource();
159
160 vis_guids.erase(c->GetGUID());
161
163
164 if (relocated_for_ai && !c->isNeedNotify(NOTIFY_VISIBILITY_CHANGED))
166 }
167}
168
170{
171 for (PlayerMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
172 {
173 Player* player = iter->GetSource();
174
177
179 }
180}
181
183{
184 if (!i_creature.IsAlive())
185 return;
186
187 for (CreatureMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
188 {
189 Creature* c = iter->GetSource();
191
194 }
195}
196
198{
199 for (CreatureMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
200 {
201 Creature* unit = iter->GetSource();
203 continue;
204
205 CreatureRelocationNotifier relocate(*unit);
206
209
210 cell.Visit(p, c2world_relocation, i_map, *unit, i_radius);
211 cell.Visit(p, c2grid_relocation, i_map, *unit, i_radius);
212 }
213}
214
216{
217 for (PlayerMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
218 {
219 Player* player = iter->GetSource();
220 WorldObject const* viewPoint = player->m_seer;
221
223 continue;
224
225 if (player != viewPoint && !viewPoint->IsPositionValid())
226 continue;
227
228 PlayerRelocationNotifier relocate(*player);
229 Cell::VisitAllObjects(viewPoint, relocate, i_radius, false);
230 relocate.SendToSelf();
231 }
232}
233
235{
236 for (CreatureMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
237 {
238 Creature* c = iter->GetSource();
240 if (isCreature)
242 }
243}
244
245/*
246void
247MessageDistDeliverer::VisitObject(Player* player)
248{
249 if (!i_ownTeamOnly || (i_source.GetTypeId() == TYPEID_PLAYER && player->GetTeam() == ((Player&)i_source).GetTeam()))
250 {
251 SendPacket(player);
252 }
253}
254*/
255
256template<class T>
258{
259 for (typename GridRefManager<T>::iterator iter = m.begin(); iter != m.end(); ++iter)
260 if (iter->GetSource()->IsInWorld())
261 iter->GetSource()->Update(i_timeDiff);
262}
263
265{
267}
268
270{
272}
273
275{
276 return !u->IsAlive() && i_searchObj->IsWithinDistInMap(u, i_range);
277}
278
280{
282}
283
285{
287}
288
290{
292}
293
294template void ObjectUpdater::Visit<Creature>(CreatureMapType&);
295template void ObjectUpdater::Visit<GameObject>(GameObjectMapType&);
296template void ObjectUpdater::Visit<DynamicObject>(DynamicObjectMapType&);
297template void ObjectUpdater::Visit<AreaTrigger>(AreaTriggerMapType &);
298template void ObjectUpdater::Visit<SceneObject>(SceneObjectMapType &);
299template void ObjectUpdater::Visit<Conversation>(ConversationMapType &);
@ CORPSE_BONES
Definition: Corpse.h:31
void CreatureUnitRelocationWorker(Creature *c, Unit *u)
@ NOTIFY_VISIBILITY_CHANGED
Definition: ObjectDefines.h:77
@ TYPEID_AREATRIGGER
Definition: ObjectGuid.h:46
@ TYPEID_DYNAMICOBJECT
Definition: ObjectGuid.h:44
@ TYPEID_GAMEOBJECT
Definition: ObjectGuid.h:43
@ TYPEID_UNIT
Definition: ObjectGuid.h:40
@ TYPEID_PLAYER
Definition: ObjectGuid.h:41
@ SPELL_AURA_GHOST
@ UNIT_STATE_SIGHTLESS
Definition: Unit.h:298
Definition: Corpse.h:53
CorpseType GetType() const
Definition: Corpse.h:126
void TriggerAlert(Unit const *who) const
Definition: CreatureAI.cpp:141
void MoveInLineOfSight_Safe(Unit *who)
== Reactions At =================================
Definition: CreatureAI.cpp:113
CreatureAI * AI() const
Definition: Creature.h:214
iterator end()
iterator begin()
TypeID GetTypeId() const
Definition: Object.h:173
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
static Player * ToPlayer(Object *o)
Definition: Object.h:213
void SendDirectMessage(WorldPacket const *data) const
Definition: Player.cpp:6324
GuidUnorderedSet m_clientGUIDs
Definition: Player.h:2509
void UpdateVisibilityOf(WorldObject *target)
Definition: Player.cpp:23902
WorldObject * m_seer
Definition: Player.h:2476
void SendInitialVisiblePackets(WorldObject *target) const
Definition: Player.cpp:23994
WorldObject const *const i_searchObj
Definition: Unit.h:627
bool IsAlive() const
Definition: Unit.h:1164
bool HasStealthAura() const
Definition: Unit.h:1073
bool IsInFlight() const
Definition: Unit.h:1012
bool IsAIEnabled() const
Definition: Unit.h:658
bool HasAuraType(AuraType auraType) const
Definition: Unit.cpp:4674
bool HasUnitState(const uint32 f) const
Definition: Unit.h:732
bool HasData() const
Definition: UpdateData.h:52
void AddOutOfRangeGUID(GuidSet &guids)
Definition: UpdateData.cpp:30
bool BuildPacket(WorldPacket *packet)
Definition: UpdateData.cpp:40
bool isNeedNotify(uint16 f) const
Definition: Object.h:733
TransportBase * GetTransport() const
Definition: Object.h:750
bool CanSeeOrDetect(WorldObject const *obj, bool implicitDetect=false, bool distanceCheck=false, bool checkAlert=false) const
Definition: Object.cpp:1514
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition: Object.cpp:1147
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 > &)
Definition: GridNotifiers.h:84
void Visit(GridRefManager< T > &)
Definition: GridNotifiers.h:97
void Visit(GridRefManager< T > &m)
void Visit(GridRefManager< T > &m)
Definition: GridNotifiers.h:75
IteratorPair< WorldObject ** > i_objects
Definition: GridNotifiers.h:62
void Visit(GridRefManager< T > &)
Definition: GridNotifiers.h:65
GuidUnorderedSet vis_guids
Definition: GridNotifiers.h:53
std::set< WorldObject * > i_visibleNow
Definition: GridNotifiers.h:52
bool operator()(WorldObject *target) const
Definition: Spell.cpp:9090