2 * Copyright (C) 2005-2010 MaNGOS <http://getmangos.com/>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 #ifndef MANGOS_GRIDNOTIFIERS_H
20 #define MANGOS_GRIDNOTIFIERS_H
22 #include "ObjectGridLoader.h"
23 #include "UpdateData.h"
28 #include "DynamicObject.h"
29 #include "GameObject.h"
32 #include "CreatureAI.h"
40 struct MANGOS_DLL_DECL PlayerNotifier
42 explicit PlayerNotifier(Player
&pl
) : i_player(pl
) {}
43 void Visit(PlayerMapType
&);
44 template<class SKIP
> void Visit(GridRefManager
<SKIP
> &) {}
48 struct MANGOS_DLL_DECL VisibleNotifier
52 UpdateDataMapType i_data_updates
;
53 ObjectGuidSet i_clientGUIDs
;
54 std::set
<WorldObject
*> i_visibleNow
;
56 explicit VisibleNotifier(Player
&player
) : i_player(player
),i_clientGUIDs(player
.m_clientGUIDs
) {}
57 template<class T
> void Visit(GridRefManager
<T
> &m
);
58 void Visit(PlayerMapType
&);
62 struct MANGOS_DLL_DECL VisibleChangesNotifier
64 WorldObject
&i_object
;
66 explicit VisibleChangesNotifier(WorldObject
&object
) : i_object(object
) {}
67 template<class T
> void Visit(GridRefManager
<T
> &) {}
68 void Visit(PlayerMapType
&);
71 struct MANGOS_DLL_DECL GridUpdater
75 GridUpdater(GridType
&grid
, uint32 diff
) : i_grid(grid
), i_timeDiff(diff
) {}
77 template<class T
> void updateObjects(GridRefManager
<T
> &m
)
79 for(typename GridRefManager
<T
>::iterator iter
= m
.begin(); iter
!= m
.end(); ++iter
)
80 iter
->getSource()->Update(i_timeDiff
);
83 void Visit(PlayerMapType
&m
) { updateObjects
<Player
>(m
); }
84 void Visit(CreatureMapType
&m
){ updateObjects
<Creature
>(m
); }
85 void Visit(GameObjectMapType
&m
) { updateObjects
<GameObject
>(m
); }
86 void Visit(DynamicObjectMapType
&m
) { updateObjects
<DynamicObject
>(m
); }
87 void Visit(CorpseMapType
&m
) { updateObjects
<Corpse
>(m
); }
90 struct MANGOS_DLL_DECL MessageDeliverer
93 WorldPacket
*i_message
;
95 MessageDeliverer(Player
&pl
, WorldPacket
*msg
, bool to_self
) : i_player(pl
), i_message(msg
), i_toSelf(to_self
) {}
96 void Visit(PlayerMapType
&m
);
97 template<class SKIP
> void Visit(GridRefManager
<SKIP
> &) {}
100 struct MANGOS_DLL_DECL ObjectMessageDeliverer
103 WorldPacket
*i_message
;
104 explicit ObjectMessageDeliverer(WorldObject
& obj
, WorldPacket
*msg
)
105 : i_phaseMask(obj
.GetPhaseMask()), i_message(msg
) {}
106 void Visit(PlayerMapType
&m
);
107 template<class SKIP
> void Visit(GridRefManager
<SKIP
> &) {}
110 struct MANGOS_DLL_DECL MessageDistDeliverer
113 WorldPacket
*i_message
;
118 MessageDistDeliverer(Player
&pl
, WorldPacket
*msg
, float dist
, bool to_self
, bool ownTeamOnly
)
119 : i_player(pl
), i_message(msg
), i_toSelf(to_self
), i_ownTeamOnly(ownTeamOnly
), i_dist(dist
) {}
120 void Visit(PlayerMapType
&m
);
121 template<class SKIP
> void Visit(GridRefManager
<SKIP
> &) {}
124 struct MANGOS_DLL_DECL ObjectMessageDistDeliverer
126 WorldObject
&i_object
;
127 WorldPacket
*i_message
;
129 ObjectMessageDistDeliverer(WorldObject
&obj
, WorldPacket
*msg
, float dist
) : i_object(obj
), i_message(msg
), i_dist(dist
) {}
130 void Visit(PlayerMapType
&m
);
131 template<class SKIP
> void Visit(GridRefManager
<SKIP
> &) {}
134 struct MANGOS_DLL_DECL ObjectUpdater
137 explicit ObjectUpdater(const uint32
&diff
) : i_timeDiff(diff
) {}
138 template<class T
> void Visit(GridRefManager
<T
> &m
);
139 void Visit(PlayerMapType
&) {}
140 void Visit(CorpseMapType
&) {}
141 void Visit(CreatureMapType
&);
144 struct MANGOS_DLL_DECL PlayerRelocationNotifier
147 PlayerRelocationNotifier(Player
&pl
) : i_player(pl
) {}
148 template<class T
> void Visit(GridRefManager
<T
> &) {}
149 void Visit(PlayerMapType
&);
150 void Visit(CreatureMapType
&);
153 struct MANGOS_DLL_DECL CreatureRelocationNotifier
155 Creature
&i_creature
;
156 CreatureRelocationNotifier(Creature
&c
) : i_creature(c
) {}
157 template<class T
> void Visit(GridRefManager
<T
> &) {}
159 template<> void Visit(PlayerMapType
&);
163 struct MANGOS_DLL_DECL DynamicObjectUpdater
165 DynamicObject
&i_dynobject
;
167 DynamicObjectUpdater(DynamicObject
&dynobject
, Unit
* caster
) : i_dynobject(dynobject
)
170 Unit
* owner
= i_check
->GetOwner();
175 template<class T
> inline void Visit(GridRefManager
<T
> &) {}
177 template<> inline void Visit
<Player
>(PlayerMapType
&);
178 template<> inline void Visit
<Creature
>(CreatureMapType
&);
181 void VisitHelper(Unit
* target
);
184 // SEARCHERS & LIST SEARCHERS & WORKERS
186 // WorldObject searchers & workers
188 template<class Check
>
189 struct MANGOS_DLL_DECL WorldObjectSearcher
192 WorldObject
* &i_object
;
195 WorldObjectSearcher(WorldObject
const* searcher
, WorldObject
* & result
, Check
& check
)
196 : i_phaseMask(searcher
->GetPhaseMask()), i_object(result
),i_check(check
) {}
198 void Visit(GameObjectMapType
&m
);
199 void Visit(PlayerMapType
&m
);
200 void Visit(CreatureMapType
&m
);
201 void Visit(CorpseMapType
&m
);
202 void Visit(DynamicObjectMapType
&m
);
204 template<class NOT_INTERESTED
> void Visit(GridRefManager
<NOT_INTERESTED
> &) {}
207 template<class Check
>
208 struct MANGOS_DLL_DECL WorldObjectListSearcher
211 std::list
<WorldObject
*> &i_objects
;
214 WorldObjectListSearcher(WorldObject
const* searcher
, std::list
<WorldObject
*> &objects
, Check
& check
)
215 : i_phaseMask(searcher
->GetPhaseMask()), i_objects(objects
),i_check(check
) {}
217 void Visit(PlayerMapType
&m
);
218 void Visit(CreatureMapType
&m
);
219 void Visit(CorpseMapType
&m
);
220 void Visit(GameObjectMapType
&m
);
221 void Visit(DynamicObjectMapType
&m
);
223 template<class NOT_INTERESTED
> void Visit(GridRefManager
<NOT_INTERESTED
> &) {}
227 struct MANGOS_DLL_DECL WorldObjectWorker
232 WorldObjectWorker(WorldObject
const* searcher
, Do
const& _do
)
233 : i_phaseMask(searcher
->GetPhaseMask()), i_do(_do
) {}
235 void Visit(GameObjectMapType
&m
)
237 for(GameObjectMapType::iterator itr
=m
.begin(); itr
!= m
.end(); ++itr
)
238 if(itr
->getSource()->InSamePhase(i_phaseMask
))
239 i_do(itr
->getSource());
242 void Visit(PlayerMapType
&m
)
244 for(PlayerMapType::iterator itr
=m
.begin(); itr
!= m
.end(); ++itr
)
245 if(itr
->getSource()->InSamePhase(i_phaseMask
))
246 i_do(itr
->getSource());
248 void Visit(CreatureMapType
&m
)
250 for(CreatureMapType::iterator itr
=m
.begin(); itr
!= m
.end(); ++itr
)
251 if(itr
->getSource()->InSamePhase(i_phaseMask
))
252 i_do(itr
->getSource());
255 void Visit(CorpseMapType
&m
)
257 for(CorpseMapType::iterator itr
=m
.begin(); itr
!= m
.end(); ++itr
)
258 if(itr
->getSource()->InSamePhase(i_phaseMask
))
259 i_do(itr
->getSource());
262 void Visit(DynamicObjectMapType
&m
)
264 for(DynamicObjectMapType::iterator itr
=m
.begin(); itr
!= m
.end(); ++itr
)
265 if(itr
->getSource()->InSamePhase(i_phaseMask
))
266 i_do(itr
->getSource());
269 template<class NOT_INTERESTED
> void Visit(GridRefManager
<NOT_INTERESTED
> &) {}
272 // Gameobject searchers
274 template<class Check
>
275 struct MANGOS_DLL_DECL GameObjectSearcher
278 GameObject
* &i_object
;
281 GameObjectSearcher(WorldObject
const* searcher
, GameObject
* & result
, Check
& check
)
282 : i_phaseMask(searcher
->GetPhaseMask()), i_object(result
),i_check(check
) {}
284 void Visit(GameObjectMapType
&m
);
286 template<class NOT_INTERESTED
> void Visit(GridRefManager
<NOT_INTERESTED
> &) {}
289 // Last accepted by Check GO if any (Check can change requirements at each call)
290 template<class Check
>
291 struct MANGOS_DLL_DECL GameObjectLastSearcher
294 GameObject
* &i_object
;
297 GameObjectLastSearcher(WorldObject
const* searcher
, GameObject
* & result
, Check
& check
)
298 : i_phaseMask(searcher
->GetPhaseMask()), i_object(result
), i_check(check
) {}
300 void Visit(GameObjectMapType
&m
);
302 template<class NOT_INTERESTED
> void Visit(GridRefManager
<NOT_INTERESTED
> &) {}
305 template<class Check
>
306 struct MANGOS_DLL_DECL GameObjectListSearcher
309 std::list
<GameObject
*> &i_objects
;
312 GameObjectListSearcher(WorldObject
const* searcher
, std::list
<GameObject
*> &objects
, Check
& check
)
313 : i_phaseMask(searcher
->GetPhaseMask()), i_objects(objects
), i_check(check
) {}
315 void Visit(GameObjectMapType
&m
);
317 template<class NOT_INTERESTED
> void Visit(GridRefManager
<NOT_INTERESTED
> &) {}
322 // First accepted by Check Unit if any
323 template<class Check
>
324 struct MANGOS_DLL_DECL UnitSearcher
330 UnitSearcher(WorldObject
const* searcher
, Unit
* & result
, Check
& check
)
331 : i_phaseMask(searcher
->GetPhaseMask()), i_object(result
),i_check(check
) {}
333 void Visit(CreatureMapType
&m
);
334 void Visit(PlayerMapType
&m
);
336 template<class NOT_INTERESTED
> void Visit(GridRefManager
<NOT_INTERESTED
> &) {}
339 // Last accepted by Check Unit if any (Check can change requirements at each call)
340 template<class Check
>
341 struct MANGOS_DLL_DECL UnitLastSearcher
347 UnitLastSearcher(WorldObject
const* searcher
, Unit
* & result
, Check
& check
)
348 : i_phaseMask(searcher
->GetPhaseMask()), i_object(result
),i_check(check
) {}
350 void Visit(CreatureMapType
&m
);
351 void Visit(PlayerMapType
&m
);
353 template<class NOT_INTERESTED
> void Visit(GridRefManager
<NOT_INTERESTED
> &) {}
356 // All accepted by Check units if any
357 template<class Check
>
358 struct MANGOS_DLL_DECL UnitListSearcher
361 std::list
<Unit
*> &i_objects
;
364 UnitListSearcher(WorldObject
const* searcher
, std::list
<Unit
*> &objects
, Check
& check
)
365 : i_phaseMask(searcher
->GetPhaseMask()), i_objects(objects
),i_check(check
) {}
367 void Visit(PlayerMapType
&m
);
368 void Visit(CreatureMapType
&m
);
370 template<class NOT_INTERESTED
> void Visit(GridRefManager
<NOT_INTERESTED
> &) {}
373 // Creature searchers
375 template<class Check
>
376 struct MANGOS_DLL_DECL CreatureSearcher
382 CreatureSearcher(WorldObject
const* searcher
, Creature
* & result
, Check
& check
)
383 : i_phaseMask(searcher
->GetPhaseMask()), i_object(result
),i_check(check
) {}
385 void Visit(CreatureMapType
&m
);
387 template<class NOT_INTERESTED
> void Visit(GridRefManager
<NOT_INTERESTED
> &) {}
390 // Last accepted by Check Creature if any (Check can change requirements at each call)
391 template<class Check
>
392 struct MANGOS_DLL_DECL CreatureLastSearcher
398 CreatureLastSearcher(WorldObject
const* searcher
, Creature
* & result
, Check
& check
)
399 : i_phaseMask(searcher
->GetPhaseMask()), i_object(result
),i_check(check
) {}
401 void Visit(CreatureMapType
&m
);
403 template<class NOT_INTERESTED
> void Visit(GridRefManager
<NOT_INTERESTED
> &) {}
406 template<class Check
>
407 struct MANGOS_DLL_DECL CreatureListSearcher
410 std::list
<Creature
*> &i_objects
;
413 CreatureListSearcher(WorldObject
const* searcher
, std::list
<Creature
*> &objects
, Check
& check
)
414 : i_phaseMask(searcher
->GetPhaseMask()), i_objects(objects
),i_check(check
) {}
416 void Visit(CreatureMapType
&m
);
418 template<class NOT_INTERESTED
> void Visit(GridRefManager
<NOT_INTERESTED
> &) {}
422 struct MANGOS_DLL_DECL CreatureWorker
427 CreatureWorker(WorldObject
const* searcher
, Do
& _do
)
428 : i_phaseMask(searcher
->GetPhaseMask()), i_do(_do
) {}
430 void Visit(CreatureMapType
&m
)
432 for(CreatureMapType::iterator itr
=m
.begin(); itr
!= m
.end(); ++itr
)
433 if(itr
->getSource()->InSamePhase(i_phaseMask
))
434 i_do(itr
->getSource());
437 template<class NOT_INTERESTED
> void Visit(GridRefManager
<NOT_INTERESTED
> &) {}
442 template<class Check
>
443 struct MANGOS_DLL_DECL PlayerSearcher
449 PlayerSearcher(WorldObject
const* searcher
, Player
* & result
, Check
& check
)
450 : i_phaseMask(searcher
->GetPhaseMask()), i_object(result
),i_check(check
) {}
452 void Visit(PlayerMapType
&m
);
454 template<class NOT_INTERESTED
> void Visit(GridRefManager
<NOT_INTERESTED
> &) {}
458 struct MANGOS_DLL_DECL PlayerWorker
463 PlayerWorker(WorldObject
const* searcher
, Do
& _do
)
464 : i_phaseMask(searcher
->GetPhaseMask()), i_do(_do
) {}
466 void Visit(PlayerMapType
&m
)
468 for(PlayerMapType::iterator itr
=m
.begin(); itr
!= m
.end(); ++itr
)
469 if(itr
->getSource()->InSamePhase(i_phaseMask
))
470 i_do(itr
->getSource());
473 template<class NOT_INTERESTED
> void Visit(GridRefManager
<NOT_INTERESTED
> &) {}
477 struct MANGOS_DLL_DECL PlayerDistWorker
479 WorldObject
const* i_searcher
;
483 PlayerDistWorker(WorldObject
const* searcher
, float _dist
, Do
& _do
)
484 : i_searcher(searcher
), i_dist(_dist
), i_do(_do
) {}
486 void Visit(PlayerMapType
&m
)
488 for(PlayerMapType::iterator itr
=m
.begin(); itr
!= m
.end(); ++itr
)
489 if (itr
->getSource()->InSamePhase(i_searcher
) && itr
->getSource()->IsWithinDist(i_searcher
,i_dist
))
490 i_do(itr
->getSource());
493 template<class NOT_INTERESTED
> void Visit(GridRefManager
<NOT_INTERESTED
> &) {}
496 // CHECKS && DO classes
498 // WorldObject check classes
499 class RaiseDeadObjectCheck
502 RaiseDeadObjectCheck(Player
const* fobj
, float range
) : i_fobj(fobj
), i_range(range
) {}
503 bool operator()(Creature
* u
)
505 if (i_fobj
->isHonorOrXPTarget(u
) ||
506 u
->getDeathState() != CORPSE
|| u
->isDeadByDefault() || u
->isInFlight() ||
507 ( u
->GetCreatureTypeMask() & (1 << (CREATURE_TYPE_HUMANOID
-1)) )==0 ||
508 (u
->GetDisplayId() != u
->GetNativeDisplayId()))
511 return i_fobj
->IsWithinDistInMap(u
, i_range
);
513 template<class NOT_INTERESTED
> bool operator()(NOT_INTERESTED
*) { return false; }
515 Player
const* i_fobj
;
519 class ExplodeCorpseObjectCheck
522 ExplodeCorpseObjectCheck(WorldObject
const* fobj
, float range
) : i_fobj(fobj
), i_range(range
) {}
523 bool operator()(Player
* u
)
525 if (u
->getDeathState()!=CORPSE
|| u
->isInFlight() ||
526 u
->HasAuraType(SPELL_AURA_GHOST
) || (u
->GetDisplayId() != u
->GetNativeDisplayId()))
529 return i_fobj
->IsWithinDistInMap(u
, i_range
);
531 bool operator()(Creature
* u
)
533 if (u
->getDeathState()!=CORPSE
|| u
->isInFlight() || u
->isDeadByDefault() ||
534 (u
->GetDisplayId() != u
->GetNativeDisplayId()) ||
535 (u
->GetCreatureTypeMask() & CREATURE_TYPEMASK_MECHANICAL_OR_ELEMENTAL
)!=0)
538 return i_fobj
->IsWithinDistInMap(u
, i_range
);
540 template<class NOT_INTERESTED
> bool operator()(NOT_INTERESTED
*) { return false; }
542 WorldObject
const* i_fobj
;
546 class CannibalizeObjectCheck
549 CannibalizeObjectCheck(WorldObject
const* fobj
, float range
) : i_fobj(fobj
), i_range(range
) {}
550 bool operator()(Player
* u
)
552 if( i_fobj
->IsFriendlyTo(u
) || u
->isAlive() || u
->isInFlight() )
555 return i_fobj
->IsWithinDistInMap(u
, i_range
);
557 bool operator()(Corpse
* u
);
558 bool operator()(Creature
* u
)
560 if (i_fobj
->IsFriendlyTo(u
) || u
->isAlive() || u
->isInFlight() ||
561 (u
->GetCreatureTypeMask() & CREATURE_TYPEMASK_HUMANOID_OR_UNDEAD
)==0)
564 return i_fobj
->IsWithinDistInMap(u
, i_range
);
566 template<class NOT_INTERESTED
> bool operator()(NOT_INTERESTED
*) { return false; }
568 WorldObject
const* i_fobj
;
572 // WorldObject do classes
578 void operator()(Creature
* u
) const { u
->Respawn(); }
579 void operator()(GameObject
* u
) const { u
->Respawn(); }
580 void operator()(WorldObject
*) const {}
581 void operator()(Corpse
*) const {}
586 class GameObjectFocusCheck
589 GameObjectFocusCheck(Unit
const* unit
,uint32 focusId
) : i_unit(unit
), i_focusId(focusId
) {}
590 bool operator()(GameObject
* go
) const
592 if(go
->GetGOInfo()->type
!= GAMEOBJECT_TYPE_SPELL_FOCUS
)
595 if(go
->GetGOInfo()->spellFocus
.focusId
!= i_focusId
)
598 float dist
= (float)go
->GetGOInfo()->spellFocus
.dist
;
600 return go
->IsWithinDistInMap(i_unit
, dist
);
607 // Find the nearest Fishing hole and return true only if source object is in range of hole
608 class NearestGameObjectFishingHole
611 NearestGameObjectFishingHole(WorldObject
const& obj
, float range
) : i_obj(obj
), i_range(range
) {}
612 bool operator()(GameObject
* go
)
614 if(go
->GetGOInfo()->type
== GAMEOBJECT_TYPE_FISHINGHOLE
&& go
->isSpawned() && i_obj
.IsWithinDistInMap(go
, i_range
) && i_obj
.IsWithinDistInMap(go
, (float)go
->GetGOInfo()->fishinghole
.radius
))
616 i_range
= i_obj
.GetDistance(go
);
621 float GetLastRange() const { return i_range
; }
623 WorldObject
const& i_obj
;
627 NearestGameObjectFishingHole(NearestGameObjectFishingHole
const&);
630 // Success at unit in range, range update for next check (this can be use with GameobjectLastSearcher to find nearest GO)
631 class NearestGameObjectEntryInObjectRangeCheck
634 NearestGameObjectEntryInObjectRangeCheck(WorldObject
const& obj
,uint32 entry
, float range
) : i_obj(obj
), i_entry(entry
), i_range(range
) {}
635 bool operator()(GameObject
* go
)
637 if(go
->GetEntry() == i_entry
&& i_obj
.IsWithinDistInMap(go
, i_range
))
639 i_range
= i_obj
.GetDistance(go
); // use found GO range as new range limit for next check
644 float GetLastRange() const { return i_range
; }
646 WorldObject
const& i_obj
;
650 // prevent clone this object
651 NearestGameObjectEntryInObjectRangeCheck(NearestGameObjectEntryInObjectRangeCheck
const&);
654 class GameObjectWithDbGUIDCheck
657 GameObjectWithDbGUIDCheck(WorldObject
const& obj
,uint32 db_guid
) : i_obj(obj
), i_db_guid(db_guid
) {}
658 bool operator()(GameObject
const* go
) const
660 return go
->GetDBTableGUIDLow() == i_db_guid
;
663 WorldObject
const& i_obj
;
669 class MostHPMissingInRange
672 MostHPMissingInRange(Unit
const* obj
, float range
, uint32 hp
) : i_obj(obj
), i_range(range
), i_hp(hp
) {}
673 bool operator()(Unit
* u
)
675 if(u
->isAlive() && u
->isInCombat() && !i_obj
->IsHostileTo(u
) && i_obj
->IsWithinDistInMap(u
, i_range
) && u
->GetMaxHealth() - u
->GetHealth() > i_hp
)
677 i_hp
= u
->GetMaxHealth() - u
->GetHealth();
688 class FriendlyCCedInRange
691 FriendlyCCedInRange(WorldObject
const* obj
, float range
) : i_obj(obj
), i_range(range
) {}
692 bool operator()(Unit
* u
)
694 if(u
->isAlive() && u
->isInCombat() && !i_obj
->IsHostileTo(u
) && i_obj
->IsWithinDistInMap(u
, i_range
) &&
695 (u
->isCharmed() || u
->isFrozen() || u
->hasUnitState(UNIT_STAT_CAN_NOT_REACT
)))
702 WorldObject
const* i_obj
;
706 class FriendlyMissingBuffInRange
709 FriendlyMissingBuffInRange(WorldObject
const* obj
, float range
, uint32 spellid
) : i_obj(obj
), i_range(range
), i_spell(spellid
) {}
710 bool operator()(Unit
* u
)
712 if(u
->isAlive() && u
->isInCombat() && !i_obj
->IsHostileTo(u
) && i_obj
->IsWithinDistInMap(u
, i_range
) &&
713 !(u
->HasAura(i_spell
, EFFECT_INDEX_0
) || u
->HasAura(i_spell
, EFFECT_INDEX_1
) || u
->HasAura(i_spell
, EFFECT_INDEX_2
)))
720 WorldObject
const* i_obj
;
725 class AnyUnfriendlyUnitInObjectRangeCheck
728 AnyUnfriendlyUnitInObjectRangeCheck(WorldObject
const* obj
, Unit
const* funit
, float range
) : i_obj(obj
), i_funit(funit
), i_range(range
) {}
729 bool operator()(Unit
* u
)
731 if(u
->isAlive() && i_obj
->IsWithinDistInMap(u
, i_range
) && !i_funit
->IsFriendlyTo(u
))
737 WorldObject
const* i_obj
;
742 class AnyUnfriendlyVisibleUnitInObjectRangeCheck
745 AnyUnfriendlyVisibleUnitInObjectRangeCheck(WorldObject
const* obj
, Unit
const* funit
, float range
)
746 : i_obj(obj
), i_funit(funit
), i_range(range
) {}
748 bool operator()(Unit
* u
)
751 && i_obj
->IsWithinDistInMap(u
, i_range
)
752 && !i_funit
->IsFriendlyTo(u
)
753 && u
->isVisibleForOrDetect(i_funit
,i_funit
,false);
756 WorldObject
const* i_obj
;
761 class AnyFriendlyUnitInObjectRangeCheck
764 AnyFriendlyUnitInObjectRangeCheck(WorldObject
const* obj
, float range
) : i_obj(obj
), i_range(range
) {}
765 bool operator()(Unit
* u
)
767 if(u
->isAlive() && i_obj
->IsWithinDistInMap(u
, i_range
) && i_obj
->IsFriendlyTo(u
))
773 WorldObject
const* i_obj
;
777 class AnyUnitInObjectRangeCheck
780 AnyUnitInObjectRangeCheck(WorldObject
const* obj
, float range
) : i_obj(obj
), i_range(range
) {}
781 bool operator()(Unit
* u
)
783 if(u
->isAlive() && i_obj
->IsWithinDistInMap(u
, i_range
))
789 WorldObject
const* i_obj
;
793 // Success at unit in range, range update for next check (this can be use with UnitLastSearcher to find nearest unit)
794 class NearestAttackableUnitInObjectRangeCheck
797 NearestAttackableUnitInObjectRangeCheck(WorldObject
const* obj
, Unit
const* funit
, float range
) : i_obj(obj
), i_funit(funit
), i_range(range
) {}
798 bool operator()(Unit
* u
)
800 if( u
->isTargetableForAttack() && i_obj
->IsWithinDistInMap(u
, i_range
) &&
801 !i_funit
->IsFriendlyTo(u
) && u
->isVisibleForOrDetect(i_funit
,i_funit
,false) )
803 i_range
= i_obj
->GetDistance(u
); // use found unit range as new range limit for next check
810 WorldObject
const* i_obj
;
814 // prevent clone this object
815 NearestAttackableUnitInObjectRangeCheck(NearestAttackableUnitInObjectRangeCheck
const&);
818 class AnyAoEVisibleTargetUnitInObjectRangeCheck
821 AnyAoEVisibleTargetUnitInObjectRangeCheck(WorldObject
const* obj
, Unit
const* funit
, float range
)
822 : i_obj(obj
), i_funit(funit
), i_range(range
)
824 Unit
const* check
= i_funit
;
825 Unit
const* owner
= i_funit
->GetOwner();
828 i_targetForPlayer
= ( check
->GetTypeId()==TYPEID_PLAYER
);
830 bool operator()(Unit
* u
)
832 // Check contains checks for: live, non-selectable, non-attackable flags, flight check and GM check, ignore totems
833 if (!u
->isTargetableForAttack())
835 if(u
->GetTypeId()==TYPEID_UNIT
&& ((Creature
*)u
)->isTotem())
837 if (!u
->isVisibleForOrDetect(i_funit
, i_funit
, false))
840 if(( i_targetForPlayer
? !i_funit
->IsFriendlyTo(u
) : i_funit
->IsHostileTo(u
) )&& i_obj
->IsWithinDistInMap(u
, i_range
))
846 bool i_targetForPlayer
;
847 WorldObject
const* i_obj
;
852 class AnyAoETargetUnitInObjectRangeCheck
855 AnyAoETargetUnitInObjectRangeCheck(WorldObject
const* obj
, float range
)
856 : i_obj(obj
), i_range(range
)
858 i_targetForPlayer
= i_obj
->IsControlledByPlayer();
861 bool operator()(Unit
* u
)
863 // Check contains checks for: live, non-selectable, non-attackable flags, flight check and GM check, ignore totems
864 if (!u
->isTargetableForAttack())
867 if(u
->GetTypeId()==TYPEID_UNIT
&& ((Creature
*)u
)->isTotem())
870 if(( i_targetForPlayer
? !i_obj
->IsFriendlyTo(u
) : i_obj
->IsHostileTo(u
) )&& i_obj
->IsWithinDistInMap(u
, i_range
))
877 bool i_targetForPlayer
;
878 WorldObject
const* i_obj
;
882 // do attack at call of help to friendly crearture
883 class CallOfHelpCreatureInRangeDo
886 CallOfHelpCreatureInRangeDo(Unit
* funit
, Unit
* enemy
, float range
)
887 : i_funit(funit
), i_enemy(enemy
), i_range(range
)
889 void operator()(Creature
* u
)
894 if (!u
->CanAssistTo(i_funit
, i_enemy
, false))
898 if (!i_funit
->IsWithinDistInMap(u
, i_range
))
901 // only if see assisted creature
902 if (!i_funit
->IsWithinLOSInMap(u
))
906 u
->AI()->AttackStart(i_enemy
);
915 struct AnyDeadUnitCheck
917 bool operator()(Unit
* u
) { return !u
->isAlive(); }
920 struct AnyStealthedCheck
922 bool operator()(Unit
* u
) { return u
->GetVisibility()==VISIBILITY_GROUP_STEALTH
; }
927 class InAttackDistanceFromAnyHostileCreatureCheck
930 explicit InAttackDistanceFromAnyHostileCreatureCheck(Unit
* funit
) : i_funit(funit
) {}
931 bool operator()(Creature
* u
)
933 if(u
->isAlive() && u
->IsHostileTo(i_funit
) && i_funit
->IsWithinDistInMap(u
, u
->GetAttackDistance(i_funit
)))
942 class AnyAssistCreatureInRangeCheck
945 AnyAssistCreatureInRangeCheck(Unit
* funit
, Unit
* enemy
, float range
)
946 : i_funit(funit
), i_enemy(enemy
), i_range(range
)
949 bool operator()(Creature
* u
)
954 if ( !u
->CanAssistTo(i_funit
, i_enemy
) )
958 if( !i_funit
->IsWithinDistInMap(u
, i_range
) )
961 // only if see assisted creature
962 if( !i_funit
->IsWithinLOSInMap(u
) )
973 class NearestAssistCreatureInCreatureRangeCheck
976 NearestAssistCreatureInCreatureRangeCheck(Creature
* obj
, Unit
* enemy
, float range
)
977 : i_obj(obj
), i_enemy(enemy
), i_range(range
) {}
979 bool operator()(Creature
* u
)
983 if(!u
->CanAssistTo(i_obj
,i_enemy
))
986 if(!i_obj
->IsWithinDistInMap(u
, i_range
))
989 if(!i_obj
->IsWithinLOSInMap(u
))
992 i_range
= i_obj
->GetDistance(u
); // use found unit range as new range limit for next check
995 float GetLastRange() const { return i_range
; }
997 Creature
* const i_obj
;
1001 // prevent clone this object
1002 NearestAssistCreatureInCreatureRangeCheck(NearestAssistCreatureInCreatureRangeCheck
const&);
1005 // Success at unit in range, range update for next check (this can be use with CreatureLastSearcher to find nearest creature)
1006 class NearestCreatureEntryWithLiveStateInObjectRangeCheck
1009 NearestCreatureEntryWithLiveStateInObjectRangeCheck(WorldObject
const& obj
,uint32 entry
, bool alive
, float range
)
1010 : i_obj(obj
), i_entry(entry
), i_alive(alive
), i_range(range
) {}
1012 bool operator()(Creature
* u
)
1014 if(u
->GetEntry() == i_entry
&& u
->isAlive()==i_alive
&& i_obj
.IsWithinDistInMap(u
, i_range
))
1016 i_range
= i_obj
.GetDistance(u
); // use found unit range as new range limit for next check
1021 float GetLastRange() const { return i_range
; }
1023 WorldObject
const& i_obj
;
1028 // prevent clone this object
1029 NearestCreatureEntryWithLiveStateInObjectRangeCheck(NearestCreatureEntryWithLiveStateInObjectRangeCheck
const&);
1032 class AnyPlayerInObjectRangeCheck
1035 AnyPlayerInObjectRangeCheck(WorldObject
const* obj
, float range
) : i_obj(obj
), i_range(range
) {}
1036 bool operator()(Player
* u
)
1038 if(u
->isAlive() && i_obj
->IsWithinDistInMap(u
, i_range
))
1044 WorldObject
const* i_obj
;
1048 // Player checks and do
1050 // Prepare using Builder localized packets with caching and send to player
1051 template<class Builder
>
1052 class LocalizedPacketDo
1055 explicit LocalizedPacketDo(Builder
& builder
) : i_builder(builder
) {}
1057 ~LocalizedPacketDo()
1059 for(size_t i
= 0; i
< i_data_cache
.size(); ++i
)
1060 delete i_data_cache
[i
];
1062 void operator()( Player
* p
);
1066 std::vector
<WorldPacket
*> i_data_cache
; // 0 = default, i => i-1 locale index
1069 // Prepare using Builder localized packets with caching and send to player
1070 template<class Builder
>
1071 class LocalizedPacketListDo
1074 typedef std::vector
<WorldPacket
*> WorldPacketList
;
1075 explicit LocalizedPacketListDo(Builder
& builder
) : i_builder(builder
) {}
1077 ~LocalizedPacketListDo()
1079 for(size_t i
= 0; i
< i_data_cache
.size(); ++i
)
1080 for(size_t j
= 0; j
< i_data_cache
[i
].size(); ++j
)
1081 delete i_data_cache
[i
][j
];
1083 void operator()( Player
* p
);
1087 std::vector
<WorldPacketList
> i_data_cache
;
1088 // 0 = default, i => i-1 locale index
1092 template<> void PlayerRelocationNotifier::Visit
<Creature
>(CreatureMapType
&);
1093 template<> void PlayerRelocationNotifier::Visit
<Player
>(PlayerMapType
&);
1094 template<> void CreatureRelocationNotifier::Visit
<Player
>(PlayerMapType
&);
1095 template<> void CreatureRelocationNotifier::Visit
<Creature
>(CreatureMapType
&);
1096 template<> inline void DynamicObjectUpdater::Visit
<Creature
>(CreatureMapType
&);
1097 template<> inline void DynamicObjectUpdater::Visit
<Player
>(PlayerMapType
&);