[9529] Make Player::IsValidPos const
[getmangos.git] / src / game / GridNotifiers.h
blob9c4c66ce4bdc357debbed4b74772358b6a944844
1 /*
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"
24 #include <iostream>
26 #include "Corpse.h"
27 #include "Object.h"
28 #include "DynamicObject.h"
29 #include "GameObject.h"
30 #include "Player.h"
31 #include "Unit.h"
32 #include "CreatureAI.h"
34 class Player;
35 //class Map;
37 namespace MaNGOS
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> &) {}
45 Player &i_player;
48 struct MANGOS_DLL_DECL VisibleNotifier
50 Player &i_player;
51 UpdateData i_data;
52 UpdateDataMapType i_data_updates;
53 Player::ClientGUIDs 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 &);
59 void Notify(void);
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
73 GridType &i_grid;
74 uint32 i_timeDiff;
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
92 Player &i_player;
93 WorldPacket *i_message;
94 bool i_toSelf;
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
102 uint32 i_phaseMask;
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
112 Player &i_player;
113 WorldPacket *i_message;
114 bool i_toSelf;
115 bool i_ownTeamOnly;
116 float i_dist;
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;
128 float i_dist;
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
136 uint32 i_timeDiff;
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
146 Player &i_player;
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> &) {}
158 #ifdef WIN32
159 template<> void Visit(PlayerMapType &);
160 #endif
163 struct MANGOS_DLL_DECL DynamicObjectUpdater
165 DynamicObject &i_dynobject;
166 Unit* i_check;
167 DynamicObjectUpdater(DynamicObject &dynobject, Unit* caster) : i_dynobject(dynobject)
169 i_check = caster;
170 Unit* owner = i_check->GetOwner();
171 if(owner)
172 i_check = owner;
175 template<class T> inline void Visit(GridRefManager<T> &) {}
176 #ifdef WIN32
177 template<> inline void Visit<Player>(PlayerMapType &);
178 template<> inline void Visit<Creature>(CreatureMapType &);
179 #endif
181 void VisitHelper(Unit* target);
184 // SEARCHERS & LIST SEARCHERS & WORKERS
186 // WorldObject searchers & workers
188 template<class Check>
189 struct MANGOS_DLL_DECL WorldObjectSearcher
191 uint32 i_phaseMask;
192 WorldObject* &i_object;
193 Check &i_check;
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
210 uint32 i_phaseMask;
211 std::list<WorldObject*> &i_objects;
212 Check& i_check;
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> &) {}
226 template<class Do>
227 struct MANGOS_DLL_DECL WorldObjectWorker
229 uint32 i_phaseMask;
230 Do const& i_do;
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
277 uint32 i_phaseMask;
278 GameObject* &i_object;
279 Check &i_check;
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
293 uint32 i_phaseMask;
294 GameObject* &i_object;
295 Check& i_check;
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
308 uint32 i_phaseMask;
309 std::list<GameObject*> &i_objects;
310 Check& i_check;
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> &) {}
320 // Unit searchers
322 // First accepted by Check Unit if any
323 template<class Check>
324 struct MANGOS_DLL_DECL UnitSearcher
326 uint32 i_phaseMask;
327 Unit* &i_object;
328 Check & i_check;
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
343 uint32 i_phaseMask;
344 Unit* &i_object;
345 Check & i_check;
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
360 uint32 i_phaseMask;
361 std::list<Unit*> &i_objects;
362 Check& i_check;
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
378 uint32 i_phaseMask;
379 Creature* &i_object;
380 Check & i_check;
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
394 uint32 i_phaseMask;
395 Creature* &i_object;
396 Check & i_check;
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
409 uint32 i_phaseMask;
410 std::list<Creature*> &i_objects;
411 Check& i_check;
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> &) {}
421 template<class Do>
422 struct MANGOS_DLL_DECL CreatureWorker
424 uint32 i_phaseMask;
425 Do& i_do;
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> &) {}
440 // Player searchers
442 template<class Check>
443 struct MANGOS_DLL_DECL PlayerSearcher
445 uint32 i_phaseMask;
446 Player* &i_object;
447 Check & i_check;
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> &) {}
457 template<class Do>
458 struct MANGOS_DLL_DECL PlayerWorker
460 uint32 i_phaseMask;
461 Do& i_do;
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> &) {}
476 template<class Do>
477 struct MANGOS_DLL_DECL PlayerDistWorker
479 WorldObject const* i_searcher;
480 float i_dist;
481 Do& i_do;
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
501 public:
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()))
509 return false;
511 return i_fobj->IsWithinDistInMap(u, i_range);
513 template<class NOT_INTERESTED> bool operator()(NOT_INTERESTED*) { return false; }
514 private:
515 Player const* i_fobj;
516 float i_range;
519 class ExplodeCorpseObjectCheck
521 public:
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()))
527 return false;
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)
536 return false;
538 return i_fobj->IsWithinDistInMap(u, i_range);
540 template<class NOT_INTERESTED> bool operator()(NOT_INTERESTED*) { return false; }
541 private:
542 WorldObject const* i_fobj;
543 float i_range;
546 class CannibalizeObjectCheck
548 public:
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() )
553 return false;
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)
562 return false;
564 return i_fobj->IsWithinDistInMap(u, i_range);
566 template<class NOT_INTERESTED> bool operator()(NOT_INTERESTED*) { return false; }
567 private:
568 WorldObject const* i_fobj;
569 float i_range;
572 // WorldObject do classes
574 class RespawnDo
576 public:
577 RespawnDo() {}
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 {}
584 // GameObject checks
586 class GameObjectFocusCheck
588 public:
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)
593 return false;
595 if(go->GetGOInfo()->spellFocus.focusId != i_focusId)
596 return false;
598 float dist = (float)go->GetGOInfo()->spellFocus.dist;
600 return go->IsWithinDistInMap(i_unit, dist);
602 private:
603 Unit const* i_unit;
604 uint32 i_focusId;
607 // Find the nearest Fishing hole and return true only if source object is in range of hole
608 class NearestGameObjectFishingHole
610 public:
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);
617 return true;
619 return false;
621 float GetLastRange() const { return i_range; }
622 private:
623 WorldObject const& i_obj;
624 float i_range;
626 // prevent clone
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
633 public:
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
640 return true;
642 return false;
644 float GetLastRange() const { return i_range; }
645 private:
646 WorldObject const& i_obj;
647 uint32 i_entry;
648 float i_range;
650 // prevent clone this object
651 NearestGameObjectEntryInObjectRangeCheck(NearestGameObjectEntryInObjectRangeCheck const&);
654 class GameObjectWithDbGUIDCheck
656 public:
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;
662 private:
663 WorldObject const& i_obj;
664 uint32 i_db_guid;
667 // Unit checks
669 class MostHPMissingInRange
671 public:
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();
678 return true;
680 return false;
682 private:
683 Unit const* i_obj;
684 float i_range;
685 uint32 i_hp;
688 class FriendlyCCedInRange
690 public:
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)))
697 return true;
699 return false;
701 private:
702 WorldObject const* i_obj;
703 float i_range;
706 class FriendlyMissingBuffInRange
708 public:
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)))
715 return true;
717 return false;
719 private:
720 WorldObject const* i_obj;
721 float i_range;
722 uint32 i_spell;
725 class AnyUnfriendlyUnitInObjectRangeCheck
727 public:
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))
732 return true;
733 else
734 return false;
736 private:
737 WorldObject const* i_obj;
738 Unit const* i_funit;
739 float i_range;
742 class AnyUnfriendlyVisibleUnitInObjectRangeCheck
744 public:
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)
750 return u->isAlive()
751 && i_obj->IsWithinDistInMap(u, i_range)
752 && !i_funit->IsFriendlyTo(u)
753 && u->isVisibleForOrDetect(i_funit,i_funit,false);
755 private:
756 WorldObject const* i_obj;
757 Unit const* i_funit;
758 float i_range;
761 class AnyFriendlyUnitInObjectRangeCheck
763 public:
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))
768 return true;
769 else
770 return false;
772 private:
773 WorldObject const* i_obj;
774 float i_range;
777 class AnyUnitInObjectRangeCheck
779 public:
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))
784 return true;
786 return false;
788 private:
789 WorldObject const* i_obj;
790 float i_range;
793 // Success at unit in range, range update for next check (this can be use with UnitLastSearcher to find nearest unit)
794 class NearestAttackableUnitInObjectRangeCheck
796 public:
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
804 return true;
807 return false;
809 private:
810 WorldObject const* i_obj;
811 Unit const* i_funit;
812 float i_range;
814 // prevent clone this object
815 NearestAttackableUnitInObjectRangeCheck(NearestAttackableUnitInObjectRangeCheck const&);
818 class AnyAoEVisibleTargetUnitInObjectRangeCheck
820 public:
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();
826 if(owner)
827 check = owner;
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())
834 return false;
835 if(u->GetTypeId()==TYPEID_UNIT && ((Creature*)u)->isTotem())
836 return false;
837 if (!u->isVisibleForOrDetect(i_funit, i_funit, false))
838 return false;
840 if(( i_targetForPlayer ? !i_funit->IsFriendlyTo(u) : i_funit->IsHostileTo(u) )&& i_obj->IsWithinDistInMap(u, i_range))
841 return true;
843 return false;
845 private:
846 bool i_targetForPlayer;
847 WorldObject const* i_obj;
848 Unit const* i_funit;
849 float i_range;
852 class AnyAoETargetUnitInObjectRangeCheck
854 public:
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())
865 return false;
867 if(u->GetTypeId()==TYPEID_UNIT && ((Creature*)u)->isTotem())
868 return false;
870 if(( i_targetForPlayer ? !i_obj->IsFriendlyTo(u) : i_obj->IsHostileTo(u) )&& i_obj->IsWithinDistInMap(u, i_range))
871 return true;
873 return false;
876 private:
877 bool i_targetForPlayer;
878 WorldObject const* i_obj;
879 float i_range;
882 // do attack at call of help to friendly crearture
883 class CallOfHelpCreatureInRangeDo
885 public:
886 CallOfHelpCreatureInRangeDo(Unit* funit, Unit* enemy, float range)
887 : i_funit(funit), i_enemy(enemy), i_range(range)
889 void operator()(Creature* u)
891 if (u == i_funit)
892 return;
894 if (!u->CanAssistTo(i_funit, i_enemy, false))
895 return;
897 // too far
898 if (!i_funit->IsWithinDistInMap(u, i_range))
899 return;
901 // only if see assisted creature
902 if (!i_funit->IsWithinLOSInMap(u))
903 return;
905 if (u->AI())
906 u->AI()->AttackStart(i_enemy);
909 private:
910 Unit* const i_funit;
911 Unit* const i_enemy;
912 float i_range;
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; }
925 // Creature checks
927 class InAttackDistanceFromAnyHostileCreatureCheck
929 public:
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)))
934 return true;
936 return false;
938 private:
939 Unit* const i_funit;
942 class AnyAssistCreatureInRangeCheck
944 public:
945 AnyAssistCreatureInRangeCheck(Unit* funit, Unit* enemy, float range)
946 : i_funit(funit), i_enemy(enemy), i_range(range)
949 bool operator()(Creature* u)
951 if(u == i_funit)
952 return false;
954 if ( !u->CanAssistTo(i_funit, i_enemy) )
955 return false;
957 // too far
958 if( !i_funit->IsWithinDistInMap(u, i_range) )
959 return false;
961 // only if see assisted creature
962 if( !i_funit->IsWithinLOSInMap(u) )
963 return false;
965 return true;
967 private:
968 Unit* const i_funit;
969 Unit* const i_enemy;
970 float i_range;
973 class NearestAssistCreatureInCreatureRangeCheck
975 public:
976 NearestAssistCreatureInCreatureRangeCheck(Creature* obj, Unit* enemy, float range)
977 : i_obj(obj), i_enemy(enemy), i_range(range) {}
979 bool operator()(Creature* u)
981 if(u == i_obj)
982 return false;
983 if(!u->CanAssistTo(i_obj,i_enemy))
984 return false;
986 if(!i_obj->IsWithinDistInMap(u, i_range))
987 return false;
989 if(!i_obj->IsWithinLOSInMap(u))
990 return false;
992 i_range = i_obj->GetDistance(u); // use found unit range as new range limit for next check
993 return true;
995 float GetLastRange() const { return i_range; }
996 private:
997 Creature* const i_obj;
998 Unit* const i_enemy;
999 float i_range;
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
1008 public:
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
1017 return true;
1019 return false;
1021 float GetLastRange() const { return i_range; }
1022 private:
1023 WorldObject const& i_obj;
1024 uint32 i_entry;
1025 bool i_alive;
1026 float i_range;
1028 // prevent clone this object
1029 NearestCreatureEntryWithLiveStateInObjectRangeCheck(NearestCreatureEntryWithLiveStateInObjectRangeCheck const&);
1032 class AnyPlayerInObjectRangeCheck
1034 public:
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))
1039 return true;
1041 return false;
1043 private:
1044 WorldObject const* i_obj;
1045 float i_range;
1048 // Player checks and do
1050 // Prepare using Builder localized packets with caching and send to player
1051 template<class Builder>
1052 class LocalizedPacketDo
1054 public:
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 );
1064 private:
1065 Builder& i_builder;
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
1073 public:
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 );
1085 private:
1086 Builder& i_builder;
1087 std::vector<WorldPacketList> i_data_cache;
1088 // 0 = default, i => i-1 locale index
1091 #ifndef WIN32
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 &);
1098 #endif
1100 #endif