/* * Copyright (C) 2005-2008 MaNGOS * * Copyright (C) 2008 Trinity * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef TRINITY_GRIDNOTIFIERS_H #define TRINITY_GRIDNOTIFIERS_H #include "ObjectGridLoader.h" #include "ByteBuffer.h" #include "UpdateData.h" #include #include "Corpse.h" #include "Object.h" #include "DynamicObject.h" #include "GameObject.h" #include "Player.h" #include "Unit.h" class Player; //class Map; namespace Trinity { struct TRINITY_DLL_DECL PlayerNotifier { explicit PlayerNotifier(Player &pl) : i_player(pl) {} void Visit(PlayerMapType &); template void Visit(GridRefManager &) {} Player &i_player; }; struct TRINITY_DLL_DECL VisibleNotifier { Player &i_player; UpdateData i_data; UpdateDataMapType i_data_updates; Player::ClientGUIDs i_clientGUIDs; std::set i_visibleNow; explicit VisibleNotifier(Player &player) : i_player(player),i_clientGUIDs(player.m_clientGUIDs) {} template void Visit(GridRefManager &m); void Visit(PlayerMapType &); void Notify(void); }; struct TRINITY_DLL_DECL VisibleChangesNotifier { WorldObject &i_object; explicit VisibleChangesNotifier(WorldObject &object) : i_object(object) {} template void Visit(GridRefManager &) {} void Visit(PlayerMapType &); }; struct TRINITY_DLL_DECL GridUpdater { GridType &i_grid; uint32 i_timeDiff; GridUpdater(GridType &grid, uint32 diff) : i_grid(grid), i_timeDiff(diff) {} template void updateObjects(GridRefManager &m) { for(typename GridRefManager::iterator iter = m.begin(); iter != m.end(); ++iter) iter->getSource()->Update(i_timeDiff); } void Visit(PlayerMapType &m) { updateObjects(m); } void Visit(CreatureMapType &m){ updateObjects(m); } void Visit(GameObjectMapType &m) { updateObjects(m); } void Visit(DynamicObjectMapType &m) { updateObjects(m); } void Visit(CorpseMapType &m) { updateObjects(m); } }; struct TRINITY_DLL_DECL Deliverer { WorldObject &i_source; WorldPacket *i_message; std::set plr_list; bool i_toPossessor; float i_dist; Deliverer(WorldObject &src, WorldPacket *msg, bool to_possessor, float dist = 0.0f) : i_source(src), i_message(msg), i_toPossessor(to_possessor), i_dist(dist) {} void Visit(PlayerMapType &m); void Visit(CreatureMapType &m); virtual void VisitObject(Player* plr) = 0; void SendPacket(Player* plr); template void Visit(GridRefManager &) {} }; struct TRINITY_DLL_DECL MessageDeliverer : public Deliverer { bool i_toSelf; MessageDeliverer(Player &pl, WorldPacket *msg, bool to_possessor, bool to_self) : Deliverer(pl, msg, to_possessor), i_toSelf(to_self) {} void VisitObject(Player* plr); }; struct TRINITY_DLL_DECL ObjectMessageDeliverer : public Deliverer { explicit ObjectMessageDeliverer(WorldObject &src, WorldPacket *msg, bool to_possessor) : Deliverer(src, msg, to_possessor) {} void VisitObject(Player* plr) { SendPacket(plr); } }; struct TRINITY_DLL_DECL MessageDistDeliverer : public Deliverer { bool i_toSelf; bool i_ownTeamOnly; MessageDistDeliverer(Player &pl, WorldPacket *msg, bool to_possessor, float dist, bool to_self, bool ownTeamOnly) : Deliverer(pl, msg, to_possessor, dist), i_toSelf(to_self), i_ownTeamOnly(ownTeamOnly) {} void VisitObject(Player* plr); }; struct TRINITY_DLL_DECL ObjectMessageDistDeliverer : public Deliverer { ObjectMessageDistDeliverer(WorldObject &obj, WorldPacket *msg, bool to_possessor, float dist) : Deliverer(obj, msg, to_possessor, dist) {} void VisitObject(Player* plr) { SendPacket(plr); } }; struct TRINITY_DLL_DECL ObjectUpdater { uint32 i_timeDiff; explicit ObjectUpdater(const uint32 &diff) : i_timeDiff(diff) {} template void Visit(GridRefManager &m); void Visit(PlayerMapType &) {} void Visit(CorpseMapType &) {} void Visit(CreatureMapType &); }; template struct TRINITY_DLL_DECL ObjectAccessorNotifier { T *& i_object; uint64 i_id; ObjectAccessorNotifier(T * &obj, uint64 id) : i_object(obj), i_id(id) { i_object = NULL; } void Visit(GridRefManager &m ) { if( i_object == NULL ) { GridRefManager *iter = m.find(i_id); if( iter != m.end() ) { assert( iter->second != NULL ); i_object = iter->second; } } } template void Visit(GridRefManager &) {} }; struct TRINITY_DLL_DECL PlayerRelocationNotifier { Player &i_player; PlayerRelocationNotifier(Player &pl) : i_player(pl) {} template void Visit(GridRefManager &) {} void Visit(PlayerMapType &); void Visit(CreatureMapType &); }; struct TRINITY_DLL_DECL CreatureRelocationNotifier { Creature &i_creature; CreatureRelocationNotifier(Creature &c) : i_creature(c) {} template void Visit(GridRefManager &) {} #ifdef WIN32 template<> void Visit(PlayerMapType &); #endif }; struct TRINITY_DLL_DECL DynamicObjectUpdater { DynamicObject &i_dynobject; Unit* i_check; DynamicObjectUpdater(DynamicObject &dynobject, Unit* caster) : i_dynobject(dynobject) { i_check = caster; Unit* owner = i_check->GetOwner(); if(owner) i_check = owner; } template inline void Visit(GridRefManager &) {} #ifdef WIN32 template<> inline void Visit(PlayerMapType &); template<> inline void Visit(CreatureMapType &); #endif void VisitHelper(Unit* target); }; // SEARCHERS & LIST SEARCHERS & WORKERS // WorldObject searchers & workers template struct TRINITY_DLL_DECL WorldObjectSearcher { WorldObject* &i_object; Check &i_check; WorldObjectSearcher(WorldObject* & result, Check& check) : i_object(result),i_check(check) {} void Visit(GameObjectMapType &m); void Visit(PlayerMapType &m); void Visit(CreatureMapType &m); void Visit(CorpseMapType &m); void Visit(DynamicObjectMapType &m); template void Visit(GridRefManager &) {} }; template struct TRINITY_DLL_DECL WorldObjectListSearcher { std::list &i_objects; Check& i_check; WorldObjectListSearcher(std::list &objects, Check & check) : i_objects(objects),i_check(check) {} void Visit(PlayerMapType &m); void Visit(CreatureMapType &m); void Visit(CorpseMapType &m); void Visit(GameObjectMapType &m); void Visit(DynamicObjectMapType &m); template void Visit(GridRefManager &) {} }; template struct TRINITY_DLL_DECL WorldObjectWorker { Do const& i_do; explicit WorldObjectWorker(Do const& _do) : i_do(_do) {} void Visit(GameObjectMapType &m) { for(GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) i_do(itr->getSource()); } void Visit(PlayerMapType &m) { for(PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) i_do(itr->getSource()); } void Visit(CreatureMapType &m) { for(CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) i_do(itr->getSource()); } void Visit(CorpseMapType &m) { for(CorpseMapType::iterator itr=m.begin(); itr != m.end(); ++itr) i_do(itr->getSource()); } void Visit(DynamicObjectMapType &m) { for(DynamicObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) i_do(itr->getSource()); } template void Visit(GridRefManager &) {} }; // Gameobject searchers template struct TRINITY_DLL_DECL GameObjectSearcher { GameObject* &i_object; Check &i_check; GameObjectSearcher(GameObject* & result, Check& check) : i_object(result),i_check(check) {} void Visit(GameObjectMapType &m); template void Visit(GridRefManager &) {} }; // Last accepted by Check GO if any (Check can change requirements at each call) template struct TRINITY_DLL_DECL GameObjectLastSearcher { GameObject* &i_object; Check& i_check; GameObjectLastSearcher(GameObject* & result, Check& check) : i_object(result),i_check(check) {} void Visit(GameObjectMapType &m); template void Visit(GridRefManager &) {} }; template struct TRINITY_DLL_DECL GameObjectListSearcher { std::list &i_objects; Check& i_check; GameObjectListSearcher(std::list &objects, Check & check) : i_objects(objects),i_check(check) {} void Visit(GameObjectMapType &m); template void Visit(GridRefManager &) {} }; // Unit searchers // First accepted by Check Unit if any template struct TRINITY_DLL_DECL UnitSearcher { Unit* &i_object; Check & i_check; UnitSearcher(Unit* & result, Check & check) : i_object(result),i_check(check) {} void Visit(CreatureMapType &m); void Visit(PlayerMapType &m); template void Visit(GridRefManager &) {} }; // Last accepted by Check Unit if any (Check can change requirements at each call) template struct TRINITY_DLL_DECL UnitLastSearcher { Unit* &i_object; Check & i_check; UnitLastSearcher(Unit* & result, Check & check) : i_object(result),i_check(check) {} void Visit(CreatureMapType &m); void Visit(PlayerMapType &m); template void Visit(GridRefManager &) {} }; // All accepted by Check units if any template struct TRINITY_DLL_DECL UnitListSearcher { std::list &i_objects; Check& i_check; UnitListSearcher(std::list &objects, Check & check) : i_objects(objects),i_check(check) {} void Visit(PlayerMapType &m); void Visit(CreatureMapType &m); template void Visit(GridRefManager &) {} }; // Creature searchers template struct TRINITY_DLL_DECL CreatureSearcher { Creature* &i_object; Check & i_check; CreatureSearcher(Creature* & result, Check & check) : i_object(result),i_check(check) {} void Visit(CreatureMapType &m); template void Visit(GridRefManager &) {} }; // Last accepted by Check Creature if any (Check can change requirements at each call) template struct TRINITY_DLL_DECL CreatureLastSearcher { Creature* &i_object; Check & i_check; CreatureLastSearcher(Creature* & result, Check & check) : i_object(result),i_check(check) {} void Visit(CreatureMapType &m); template void Visit(GridRefManager &) {} }; template struct TRINITY_DLL_DECL CreatureListSearcher { std::list &i_objects; Check& i_check; CreatureListSearcher(std::list &objects, Check & check) : i_objects(objects),i_check(check) {} void Visit(CreatureMapType &m); template void Visit(GridRefManager &) {} }; // Player searchers template struct TRINITY_DLL_DECL PlayerSearcher { Player* &i_object; Check & i_check; PlayerSearcher(Player* & result, Check & check) : i_object(result),i_check(check) {} void Visit(PlayerMapType &m); template void Visit(GridRefManager &) {} }; template struct TRINITY_DLL_DECL PlayerWorker { Do& i_do; explicit PlayerWorker(Do& _do) : i_do(_do) {} void Visit(PlayerMapType &m) { for(PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) i_do(itr->getSource()); } template void Visit(GridRefManager &) {} }; // CHECKS && DO classes // WorldObject check classes class CannibalizeObjectCheck { public: CannibalizeObjectCheck(Unit* funit, float range) : i_funit(funit), i_range(range) {} bool operator()(Player* u) { if( i_funit->IsFriendlyTo(u) || u->isAlive() || u->isInFlight() ) return false; if(i_funit->IsWithinDistInMap(u, i_range) ) return true; return false; } bool operator()(Corpse* u); bool operator()(Creature* u) { if( i_funit->IsFriendlyTo(u) || u->isAlive() || u->isInFlight() || (u->GetCreatureTypeMask() & CREATURE_TYPEMASK_HUMANOID_OR_UNDEAD)==0) return false; if(i_funit->IsWithinDistInMap(u, i_range) ) return true; return false; } template bool operator()(NOT_INTERESTED* u) { return false; } private: Unit* const i_funit; float i_range; }; // WorldObject do classes class RespawnDo { public: RespawnDo() {} void operator()(Creature* u) const { u->Respawn(); } void operator()(GameObject* u) const { u->Respawn(); } void operator()(WorldObject*) const {} void operator()(Corpse*) const {} }; // GameObject checks class GameObjectFocusCheck { public: GameObjectFocusCheck(Unit const* unit,uint32 focusId) : i_unit(unit), i_focusId(focusId) {} bool operator()(GameObject* go) const { if(go->GetGOInfo()->type != GAMEOBJECT_TYPE_SPELL_FOCUS) return false; if(go->GetGOInfo()->spellFocus.focusId != i_focusId) return false; float dist = go->GetGOInfo()->spellFocus.dist; return go->IsWithinDistInMap(i_unit, dist); } private: Unit const* i_unit; uint32 i_focusId; }; // Find the nearest Fishing hole and return true only if source object is in range of hole class NearestGameObjectFishingHole { public: NearestGameObjectFishingHole(WorldObject const& obj, float range) : i_obj(obj), i_range(range) {} bool operator()(GameObject* go) { if(go->GetGOInfo()->type == GAMEOBJECT_TYPE_FISHINGHOLE && go->isSpawned() && i_obj.IsWithinDistInMap(go, i_range) && i_obj.IsWithinDistInMap(go, go->GetGOInfo()->fishinghole.radius)) { i_range = i_obj.GetDistance(go); return true; } return false; } float GetLastRange() const { return i_range; } private: WorldObject const& i_obj; float i_range; // prevent clone NearestGameObjectFishingHole(NearestGameObjectFishingHole const&); }; // Success at unit in range, range update for next check (this can be use with GameobjectLastSearcher to find nearest GO) class NearestGameObjectEntryInObjectRangeCheck { public: NearestGameObjectEntryInObjectRangeCheck(WorldObject const& obj,uint32 entry, float range) : i_obj(obj), i_entry(entry), i_range(range) {} bool operator()(GameObject* go) { if(go->GetEntry() == i_entry && i_obj.IsWithinDistInMap(go, i_range)) { i_range = i_obj.GetDistance(go); // use found GO range as new range limit for next check return true; } return false; } float GetLastRange() const { return i_range; } private: WorldObject const& i_obj; uint32 i_entry; float i_range; // prevent clone this object NearestGameObjectEntryInObjectRangeCheck(NearestGameObjectEntryInObjectRangeCheck const&); }; class GameObjectWithDbGUIDCheck { public: GameObjectWithDbGUIDCheck(WorldObject const& obj,uint32 db_guid) : i_obj(obj), i_db_guid(db_guid) {} bool operator()(GameObject const* go) const { return go->GetDBTableGUIDLow() == i_db_guid; } private: WorldObject const& i_obj; uint32 i_db_guid; }; // Unit checks class AnyUnfriendlyUnitInObjectRangeCheck { public: AnyUnfriendlyUnitInObjectRangeCheck(WorldObject const* obj, Unit const* funit, float range) : i_obj(obj), i_funit(funit), i_range(range) {} bool operator()(Unit* u) { if(u->isAlive() && i_obj->IsWithinDistInMap(u, i_range) && !i_funit->IsFriendlyTo(u)) return true; else return false; } private: WorldObject const* i_obj; Unit const* i_funit; float i_range; }; class AnyFriendlyUnitInObjectRangeCheck { public: AnyFriendlyUnitInObjectRangeCheck(WorldObject const* obj, Unit const* funit, float range) : i_obj(obj), i_funit(funit), i_range(range) {} bool operator()(Unit* u) { if(u->isAlive() && i_obj->IsWithinDistInMap(u, i_range) && i_funit->IsFriendlyTo(u)) return true; else return false; } private: WorldObject const* i_obj; Unit const* i_funit; float i_range; }; class AnyUnitInObjectRangeCheck { public: AnyUnitInObjectRangeCheck(WorldObject const* obj, float range) : i_obj(obj), i_range(range) {} bool operator()(Unit* u) { if(u->isAlive() && i_obj->IsWithinDistInMap(u, i_range)) return true; return false; } private: WorldObject const* i_obj; float i_range; }; // Success at unit in range, range update for next check (this can be use with UnitLastSearcher to find nearest unit) class NearestAttackableUnitInObjectRangeCheck { public: NearestAttackableUnitInObjectRangeCheck(WorldObject const* obj, Unit const* funit, float range) : i_obj(obj), i_funit(funit), i_range(range) {} bool operator()(Unit* u) { if( u->isTargetableForAttack() && i_obj->IsWithinDistInMap(u, i_range) && !i_funit->IsFriendlyTo(u) && u->isVisibleForOrDetect(i_funit,false) ) { i_range = i_obj->GetDistance(u); // use found unit range as new range limit for next check return true; } return false; } private: WorldObject const* i_obj; Unit const* i_funit; float i_range; // prevent clone this object NearestAttackableUnitInObjectRangeCheck(NearestAttackableUnitInObjectRangeCheck const&); }; class AnyAoETargetUnitInObjectRangeCheck { public: AnyAoETargetUnitInObjectRangeCheck(WorldObject const* obj, Unit const* funit, float range) : i_obj(obj), i_funit(funit), i_range(range) { Unit const* check = i_funit; Unit const* owner = i_funit->GetOwner(); if(owner) check = owner; i_targetForPlayer = ( check->GetTypeId()==TYPEID_PLAYER ); } bool operator()(Unit* u) { // Check contains checks for: live, non-selectable, non-attackable flags, flight check and GM check, ignore totems if (!u->isTargetableForAttack()) return false; if(u->GetTypeId()==TYPEID_UNIT && ((Creature*)u)->isTotem()) return false; if(( i_targetForPlayer ? !i_funit->IsFriendlyTo(u) : i_funit->IsHostileTo(u) )&& i_obj->IsWithinDistInMap(u, i_range)) return true; return false; } private: bool i_targetForPlayer; WorldObject const* i_obj; Unit const* i_funit; float i_range; }; struct AnyDeadUnitCheck { bool operator()(Unit* u) { return !u->isAlive(); } }; struct AnyStealthedCheck { bool operator()(Unit* u) { return u->GetVisibility()==VISIBILITY_GROUP_STEALTH; } }; // Creature checks class InAttackDistanceFromAnyHostileCreatureCheck { public: explicit InAttackDistanceFromAnyHostileCreatureCheck(Unit* funit) : i_funit(funit) {} bool operator()(Creature* u) { if(u->isAlive() && u->IsHostileTo(i_funit) && i_funit->IsWithinDistInMap(u, u->GetAttackDistance(i_funit))) return true; return false; } private: Unit* const i_funit; }; class NearestAssistCreatureInCreatureRangeCheck { public: NearestAssistCreatureInCreatureRangeCheck(Creature* obj,Unit* enemy, float range) : i_obj(obj), i_enemy(enemy), i_range(range) {} bool operator()(Creature* u) { if(u->getFaction() == i_obj->getFaction() && !u->isInCombat() && !u->GetCharmerOrOwnerGUID() && u->IsHostileTo(i_enemy) && u->isAlive()&& i_obj->IsWithinDistInMap(u, i_range) && i_obj->IsWithinLOSInMap(u)) { i_range = i_obj->GetDistance(u); // use found unit range as new range limit for next check return true; } return false; } float GetLastRange() const { return i_range; } private: Creature* const i_obj; Unit* const i_enemy; float i_range; // prevent clone this object NearestAssistCreatureInCreatureRangeCheck(NearestAssistCreatureInCreatureRangeCheck const&); }; class AnyAssistCreatureInRangeCheck { public: AnyAssistCreatureInRangeCheck(Unit* funit, Unit* enemy, float range) : i_funit(funit), i_enemy(enemy), i_range(range) { } bool operator()(Creature* u) { if(u == i_funit) return false; // we don't need help from zombies :) if( !u->isAlive() ) return false; // skip fighting creature if( u->isInCombat() ) return false; // only from same creature faction if(u->getFaction() != i_funit->getFaction() ) return false; // only free creature if( u->GetCharmerOrOwnerGUID() ) return false; // too far if( !i_funit->IsWithinDistInMap(u, i_range) ) return false; // skip non hostile to caster enemy creatures if( !u->IsHostileTo(i_enemy) ) return false; // only if see assisted creature if(!u->IsWithinLOSInMap(i_funit) ) return false; return true; } private: Unit* const i_funit; Unit* const i_enemy; float i_range; }; // Success at unit in range, range update for next check (this can be use with CreatureLastSearcher to find nearest creature) class NearestCreatureEntryWithLiveStateInObjectRangeCheck { public: NearestCreatureEntryWithLiveStateInObjectRangeCheck(WorldObject const& obj,uint32 entry, bool alive, float range) : i_obj(obj), i_entry(entry), i_alive(alive), i_range(range) {} bool operator()(Creature* u) { if(u->GetEntry() == i_entry && u->isAlive()==i_alive && i_obj.IsWithinDistInMap(u, i_range)) { i_range = i_obj.GetDistance(u); // use found unit range as new range limit for next check return true; } return false; } float GetLastRange() const { return i_range; } private: WorldObject const& i_obj; uint32 i_entry; bool i_alive; float i_range; // prevent clone this object NearestCreatureEntryWithLiveStateInObjectRangeCheck(NearestCreatureEntryWithLiveStateInObjectRangeCheck const&); }; class AnyPlayerInObjectRangeCheck { public: AnyPlayerInObjectRangeCheck(WorldObject const* obj, float range) : i_obj(obj), i_range(range) {} bool operator()(Player* u) { if(u->isAlive() && i_obj->IsWithinDistInMap(u, i_range)) return true; return false; } private: WorldObject const* i_obj; float i_range; }; // Searchers used by ScriptedAI class MostHPMissingInRange { public: MostHPMissingInRange(Unit const* obj, float range, uint32 hp) : i_obj(obj), i_range(range), i_hp(hp) {} bool operator()(Unit* u) { if(u->isAlive() && u->isInCombat() && !i_obj->IsHostileTo(u) && i_obj->IsWithinDistInMap(u, i_range) && u->GetMaxHealth() - u->GetHealth() > i_hp) { i_hp = u->GetMaxHealth() - u->GetHealth(); return true; } return false; } private: Unit const* i_obj; float i_range; uint32 i_hp; }; class FriendlyCCedInRange { public: FriendlyCCedInRange(Unit const* obj, float range) : i_obj(obj), i_range(range) {} bool operator()(Unit* u) { if(u->isAlive() && u->isInCombat() && !i_obj->IsHostileTo(u) && i_obj->IsWithinDistInMap(u, i_range) && (u->isFeared() || u->isCharmed() || u->isFrozen() || u->hasUnitState(UNIT_STAT_STUNNED) || u->hasUnitState(UNIT_STAT_CONFUSED))) { return true; } return false; } private: Unit const* i_obj; float i_range; }; class FriendlyMissingBuffInRange { public: FriendlyMissingBuffInRange(Unit const* obj, float range, uint32 spellid) : i_obj(obj), i_range(range), i_spell(spellid) {} bool operator()(Unit* u) { if(u->isAlive() && u->isInCombat() && !i_obj->IsHostileTo(u) && i_obj->IsWithinDistInMap(u, i_range) && !(u->HasAura(i_spell, 0) || u->HasAura(i_spell, 1) || u->HasAura(i_spell, 2))) { return true; } return false; } private: Unit const* i_obj; float i_range; uint32 i_spell; }; class AllFriendlyCreaturesInGrid { public: AllFriendlyCreaturesInGrid(Unit const* obj) : pUnit(obj) {} bool operator() (Unit* u) { if(u->isAlive() && u->GetVisibility() == VISIBILITY_ON && u->IsFriendlyTo(pUnit)) return true; return false; } private: Unit const* pUnit; }; class AllGameObjectsWithEntryInGrid { public: AllGameObjectsWithEntryInGrid(uint32 ent) : entry(ent) {} bool operator() (GameObject* g) { if(g->GetEntry() == entry) return true; return false; } private: uint32 entry; }; class AllCreaturesOfEntryInRange { public: AllCreaturesOfEntryInRange(Unit const* obj, uint32 ent, float ran) : pUnit(obj), entry(ent), range(ran) {} bool operator() (Unit* u) { if(u->GetEntry() == entry && pUnit->IsWithinDistInMap(u, range)) return true; return false; } private: Unit const* pUnit; uint32 entry; float range; }; #ifndef WIN32 template<> void PlayerRelocationNotifier::Visit(CreatureMapType &); template<> void PlayerRelocationNotifier::Visit(PlayerMapType &); template<> void CreatureRelocationNotifier::Visit(PlayerMapType &); template<> void CreatureRelocationNotifier::Visit(CreatureMapType &); template<> inline void DynamicObjectUpdater::Visit(CreatureMapType &); template<> inline void DynamicObjectUpdater::Visit(PlayerMapType &); #endif } #endif