aboutsummaryrefslogtreecommitdiff
path: root/src/game/GridNotifiers.h
diff options
context:
space:
mode:
authormaximius <none@none>2009-10-17 15:51:44 -0700
committermaximius <none@none>2009-10-17 15:51:44 -0700
commite585187b248f48b3c6e9247b49fa07c6565d65e5 (patch)
tree637c5b7ddacf41040bef4ea4f75a97da64c6a9bc /src/game/GridNotifiers.h
parent26b5e033ffde3d161382fc9addbfa99738379641 (diff)
*Backed out changeset 3be01fb200a5
--HG-- branch : trunk
Diffstat (limited to 'src/game/GridNotifiers.h')
-rw-r--r--src/game/GridNotifiers.h192
1 files changed, 192 insertions, 0 deletions
diff --git a/src/game/GridNotifiers.h b/src/game/GridNotifiers.h
index 54e3e466c41..b76bbb27256 100644
--- a/src/game/GridNotifiers.h
+++ b/src/game/GridNotifiers.h
@@ -17,11 +17,14 @@
* 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 "UpdateData.h"
#include <iostream>
+
#include "Corpse.h"
#include "Object.h"
#include "DynamicObject.h"
@@ -29,8 +32,10 @@
#include "Player.h"
#include "Unit.h"
#include "CreatureAI.h"
+
class Player;
//class Map;
+
namespace Trinity
{
struct TRINITY_DLL_DECL PlayerVisibilityNotifier
@@ -39,10 +44,14 @@ namespace Trinity
UpdateData i_data;
Player::ClientGUIDs i_clientGUIDs;
std::set<WorldObject*> i_visibleNow;
+
PlayerVisibilityNotifier(Player &player) : i_player(player),i_clientGUIDs(player.m_clientGUIDs) {}
+
template<class T> inline void Visit(GridRefManager<T> &);
+
void Notify(void);
};
+
struct TRINITY_DLL_DECL PlayerRelocationNotifier : public PlayerVisibilityNotifier
{
PlayerRelocationNotifier(Player &player) : PlayerVisibilityNotifier(player) {}
@@ -52,6 +61,7 @@ namespace Trinity
template<> inline void Visit(CreatureMapType &);
#endif
};
+
struct TRINITY_DLL_DECL CreatureRelocationNotifier
{
Creature &i_creature;
@@ -62,31 +72,37 @@ namespace Trinity
template<> inline void Visit(CreatureMapType &);
#endif
};
+
struct TRINITY_DLL_DECL VisibleChangesNotifier
{
WorldObject &i_object;
+
explicit VisibleChangesNotifier(WorldObject &object) : i_object(object) {}
template<class T> void Visit(GridRefManager<T> &) {}
void Visit(PlayerMapType &);
void Visit(CreatureMapType &);
void Visit(DynamicObjectMapType &);
};
+
struct TRINITY_DLL_DECL GridUpdater
{
GridType &i_grid;
uint32 i_timeDiff;
GridUpdater(GridType &grid, uint32 diff) : i_grid(grid), i_timeDiff(diff) {}
+
template<class T> void updateObjects(GridRefManager<T> &m)
{
for(typename GridRefManager<T>::iterator iter = m.begin(); iter != m.end(); ++iter)
iter->getSource()->Update(i_timeDiff);
}
+
void Visit(PlayerMapType &m) { updateObjects<Player>(m); }
void Visit(CreatureMapType &m){ updateObjects<Creature>(m); }
void Visit(GameObjectMapType &m) { updateObjects<GameObject>(m); }
void Visit(DynamicObjectMapType &m) { updateObjects<DynamicObject>(m); }
void Visit(CorpseMapType &m) { updateObjects<Corpse>(m); }
};
+
struct TRINITY_DLL_DECL MessageDistDeliverer
{
WorldObject *i_source;
@@ -103,14 +119,17 @@ namespace Trinity
void Visit(CreatureMapType &m);
void Visit(DynamicObjectMapType &m);
template<class SKIP> void Visit(GridRefManager<SKIP> &) {}
+
void SendPacket(Player* plr)
{
// never send packet to self
if(plr == i_source || team && plr->GetTeam() != team)
return;
+
plr->GetSession()->SendPacket(i_message);
}
};
+
struct TRINITY_DLL_DECL ObjectUpdater
{
uint32 i_timeDiff;
@@ -120,15 +139,18 @@ namespace Trinity
void Visit(CorpseMapType &) {}
void Visit(CreatureMapType &);
};
+
template<class T>
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<T> &m )
{
if( i_object == NULL )
@@ -141,8 +163,10 @@ namespace Trinity
}
}
}
+
template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {}
};
+
struct TRINITY_DLL_DECL DynamicObjectUpdater
{
DynamicObject &i_dynobject;
@@ -154,58 +178,74 @@ namespace Trinity
if(owner)
i_check = owner;
}
+
template<class T> inline void Visit(GridRefManager<T> &) {}
#ifdef WIN32
template<> inline void Visit<Player>(PlayerMapType &);
template<> inline void Visit<Creature>(CreatureMapType &);
#endif
+
void VisitHelper(Unit* target);
};
+
// SEARCHERS & LIST SEARCHERS & WORKERS
+
// WorldObject searchers & workers
+
template<class Check>
struct TRINITY_DLL_DECL WorldObjectSearcher
{
uint32 i_phaseMask;
WorldObject* &i_object;
Check &i_check;
+
WorldObjectSearcher(WorldObject const* searcher, WorldObject* & result, Check& check)
: i_phaseMask(searcher->GetPhaseMask()), 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<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {}
};
+
template<class Check>
struct TRINITY_DLL_DECL WorldObjectListSearcher
{
uint32 i_phaseMask;
std::list<WorldObject*> &i_objects;
Check& i_check;
+
WorldObjectListSearcher(WorldObject const* searcher, std::list<WorldObject*> &objects, Check & check)
: i_phaseMask(searcher->GetPhaseMask()), 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<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {}
};
+
template<class Do>
struct TRINITY_DLL_DECL WorldObjectWorker
{
uint32 i_phaseMask;
Do const& i_do;
+
WorldObjectWorker(WorldObject const* searcher, Do const& _do)
: i_phaseMask(searcher->GetPhaseMask()), i_do(_do) {}
+
void Visit(GameObjectMapType &m)
{
for(GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
if(itr->getSource()->InSamePhase(i_phaseMask))
i_do(itr->getSource());
}
+
void Visit(PlayerMapType &m)
{
for(PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
@@ -218,32 +258,41 @@ namespace Trinity
if(itr->getSource()->InSamePhase(i_phaseMask))
i_do(itr->getSource());
}
+
void Visit(CorpseMapType &m)
{
for(CorpseMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
if(itr->getSource()->InSamePhase(i_phaseMask))
i_do(itr->getSource());
}
+
void Visit(DynamicObjectMapType &m)
{
for(DynamicObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
if(itr->getSource()->InSamePhase(i_phaseMask))
i_do(itr->getSource());
}
+
template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {}
};
+
// Gameobject searchers
+
template<class Check>
struct TRINITY_DLL_DECL GameObjectSearcher
{
uint32 i_phaseMask;
GameObject* &i_object;
Check &i_check;
+
GameObjectSearcher(WorldObject const* searcher, GameObject* & result, Check& check)
: i_phaseMask(searcher->GetPhaseMask()), i_object(result),i_check(check) {}
+
void Visit(GameObjectMapType &m);
+
template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {}
};
+
// Last accepted by Check GO if any (Check can change requirements at each call)
template<class Check>
struct TRINITY_DLL_DECL GameObjectLastSearcher
@@ -251,23 +300,32 @@ namespace Trinity
uint32 i_phaseMask;
GameObject* &i_object;
Check& i_check;
+
GameObjectLastSearcher(WorldObject const* searcher, GameObject* & result, Check& check)
: i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) {}
+
void Visit(GameObjectMapType &m);
+
template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {}
};
+
template<class Check>
struct TRINITY_DLL_DECL GameObjectListSearcher
{
uint32 i_phaseMask;
std::list<GameObject*> &i_objects;
Check& i_check;
+
GameObjectListSearcher(WorldObject const* searcher, std::list<GameObject*> &objects, Check & check)
: i_phaseMask(searcher->GetPhaseMask()), i_objects(objects), i_check(check) {}
+
void Visit(GameObjectMapType &m);
+
template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {}
};
+
// Unit searchers
+
// First accepted by Check Unit if any
template<class Check>
struct TRINITY_DLL_DECL UnitSearcher
@@ -275,12 +333,16 @@ namespace Trinity
uint32 i_phaseMask;
Unit* &i_object;
Check & i_check;
+
UnitSearcher(WorldObject const* searcher, Unit* & result, Check & check)
: i_phaseMask(searcher->GetPhaseMask()), i_object(result),i_check(check) {}
+
void Visit(CreatureMapType &m);
void Visit(PlayerMapType &m);
+
template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {}
};
+
// Last accepted by Check Unit if any (Check can change requirements at each call)
template<class Check>
struct TRINITY_DLL_DECL UnitLastSearcher
@@ -288,12 +350,16 @@ namespace Trinity
uint32 i_phaseMask;
Unit* &i_object;
Check & i_check;
+
UnitLastSearcher(WorldObject const* searcher, Unit* & result, Check & check)
: i_phaseMask(searcher->GetPhaseMask()), i_object(result),i_check(check) {}
+
void Visit(CreatureMapType &m);
void Visit(PlayerMapType &m);
+
template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {}
};
+
// All accepted by Check units if any
template<class Check>
struct TRINITY_DLL_DECL UnitListSearcher
@@ -301,24 +367,33 @@ namespace Trinity
uint32 i_phaseMask;
std::list<Unit*> &i_objects;
Check& i_check;
+
UnitListSearcher(WorldObject const* searcher, std::list<Unit*> &objects, Check & check)
: i_phaseMask(searcher->GetPhaseMask()), i_objects(objects),i_check(check) {}
+
void Visit(PlayerMapType &m);
void Visit(CreatureMapType &m);
+
template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {}
};
+
// Creature searchers
+
template<class Check>
struct TRINITY_DLL_DECL CreatureSearcher
{
uint32 i_phaseMask;
Creature* &i_object;
Check & i_check;
+
CreatureSearcher(WorldObject const* searcher, Creature* & result, Check & check)
: i_phaseMask(searcher->GetPhaseMask()), i_object(result),i_check(check) {}
+
void Visit(CreatureMapType &m);
+
template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {}
};
+
// Last accepted by Check Creature if any (Check can change requirements at each call)
template<class Check>
struct TRINITY_DLL_DECL CreatureLastSearcher
@@ -326,92 +401,122 @@ namespace Trinity
uint32 i_phaseMask;
Creature* &i_object;
Check & i_check;
+
CreatureLastSearcher(WorldObject const* searcher, Creature* & result, Check & check)
: i_phaseMask(searcher->GetPhaseMask()), i_object(result),i_check(check) {}
+
void Visit(CreatureMapType &m);
+
template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {}
};
+
template<class Check>
struct TRINITY_DLL_DECL CreatureListSearcher
{
uint32 i_phaseMask;
std::list<Creature*> &i_objects;
Check& i_check;
+
CreatureListSearcher(WorldObject const* searcher, std::list<Creature*> &objects, Check & check)
: i_phaseMask(searcher->GetPhaseMask()), i_objects(objects),i_check(check) {}
+
void Visit(CreatureMapType &m);
+
template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {}
};
+
template<class Do>
struct MANGOS_DLL_DECL CreatureWorker
{
uint32 i_phaseMask;
Do& i_do;
+
CreatureWorker(WorldObject const* searcher, Do& _do)
: i_phaseMask(searcher->GetPhaseMask()), i_do(_do) {}
+
void Visit(CreatureMapType &m)
{
for(CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
if(itr->getSource()->InSamePhase(i_phaseMask))
i_do(itr->getSource());
}
+
template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {}
};
+
// Player searchers
+
template<class Check>
struct TRINITY_DLL_DECL PlayerSearcher
{
uint32 i_phaseMask;
Player* &i_object;
Check & i_check;
+
PlayerSearcher(WorldObject const* searcher, Player* & result, Check & check)
: i_phaseMask(searcher->GetPhaseMask()), i_object(result),i_check(check) {}
+
void Visit(PlayerMapType &m);
+
template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {}
};
+
template<class Check>
struct TRINITY_DLL_DECL PlayerListSearcher
{
uint32 i_phaseMask;
std::list<Player*> &i_objects;
Check& i_check;
+
PlayerListSearcher(WorldObject const* searcher, std::list<Player*> &objects, Check & check)
: i_phaseMask(searcher->GetPhaseMask()), i_objects(objects),i_check(check) {}
+
void Visit(PlayerMapType &m);
+
template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {}
};
+
template<class Do>
struct TRINITY_DLL_DECL PlayerWorker
{
uint32 i_phaseMask;
Do& i_do;
+
PlayerWorker(WorldObject const* searcher, Do& _do)
: i_phaseMask(searcher->GetPhaseMask()), i_do(_do) {}
+
void Visit(PlayerMapType &m)
{
for(PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
if(itr->getSource()->InSamePhase(i_phaseMask))
i_do(itr->getSource());
}
+
template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {}
};
+
template<class Do>
struct TRINITY_DLL_DECL PlayerDistWorker
{
WorldObject const* i_searcher;
float i_dist;
Do& i_do;
+
PlayerDistWorker(WorldObject const* searcher, float _dist, Do& _do)
: i_searcher(searcher), i_dist(_dist), i_do(_do) {}
+
void Visit(PlayerMapType &m)
{
for(PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
if (itr->getSource()->InSamePhase(i_searcher) && itr->getSource()->IsWithinDist(i_searcher,i_dist))
i_do(itr->getSource());
}
+
template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {}
};
+
// CHECKS && DO classes
+
// WorldObject check classes
class RaiseDeadObjectCheck
{
@@ -424,6 +529,7 @@ namespace Trinity
( u->GetCreatureTypeMask() & (1 << (CREATURE_TYPE_HUMANOID-1)) )==0 ||
(u->GetDisplayId() != u->GetNativeDisplayId()))
return false;
+
return i_funit->IsWithinDistInMap(u, i_range);
}
template<class NOT_INTERESTED> bool operator()(NOT_INTERESTED*) { return false; }
@@ -431,6 +537,7 @@ namespace Trinity
Unit* const i_funit;
float i_range;
};
+
class ExplodeCorpseObjectCheck
{
public:
@@ -440,6 +547,7 @@ namespace Trinity
if (u->getDeathState()!=CORPSE || u->isInFlight() ||
u->HasAuraType(SPELL_AURA_GHOST) || (u->GetDisplayId() != u->GetNativeDisplayId()))
return false;
+
return i_funit->IsWithinDistInMap(u, i_range);
}
bool operator()(Creature* u)
@@ -448,6 +556,7 @@ namespace Trinity
(u->GetDisplayId() != u->GetNativeDisplayId()) ||
(u->GetCreatureTypeMask() & CREATURE_TYPEMASK_MECHANICAL_OR_ELEMENTAL)!=0)
return false;
+
return i_funit->IsWithinDistInMap(u, i_range);
}
template<class NOT_INTERESTED> bool operator()(NOT_INTERESTED*) { return false; }
@@ -455,6 +564,7 @@ namespace Trinity
Unit* const i_funit;
float i_range;
};
+
class CannibalizeObjectCheck
{
public:
@@ -463,6 +573,7 @@ namespace Trinity
{
if( i_funit->IsFriendlyTo(u) || u->isAlive() || u->isInFlight() )
return false;
+
return i_funit->IsWithinDistInMap(u, i_range);
}
bool operator()(Corpse* u);
@@ -471,6 +582,7 @@ namespace Trinity
if (i_funit->IsFriendlyTo(u) || u->isAlive() || u->isInFlight() ||
(u->GetCreatureTypeMask() & CREATURE_TYPEMASK_HUMANOID_OR_UNDEAD)==0)
return false;
+
return i_funit->IsWithinDistInMap(u, i_range);
}
template<class NOT_INTERESTED> bool operator()(NOT_INTERESTED*) { return false; }
@@ -478,7 +590,9 @@ namespace Trinity
Unit* const i_funit;
float i_range;
};
+
// WorldObject do classes
+
class RespawnDo
{
public:
@@ -488,7 +602,9 @@ namespace Trinity
void operator()(WorldObject*) const {}
void operator()(Corpse*) const {}
};
+
// GameObject checks
+
class GameObjectFocusCheck
{
public:
@@ -497,15 +613,19 @@ namespace Trinity
{
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
{
@@ -524,9 +644,11 @@ namespace Trinity
private:
WorldObject const& i_obj;
float i_range;
+
// prevent clone
NearestGameObjectFishingHole(NearestGameObjectFishingHole const&);
};
+
class NearestGameObjectCheck
{
public:
@@ -544,9 +666,11 @@ namespace Trinity
private:
WorldObject const& i_obj;
float i_range;
+
// prevent clone this object
NearestGameObjectCheck(NearestGameObjectCheck const&);
};
+
// Success at unit in range, range update for next check (this can be use with GameobjectLastSearcher to find nearest GO)
class NearestGameObjectEntryInObjectRangeCheck
{
@@ -566,9 +690,11 @@ namespace Trinity
WorldObject const& i_obj;
uint32 i_entry;
float i_range;
+
// prevent clone this object
NearestGameObjectEntryInObjectRangeCheck(NearestGameObjectEntryInObjectRangeCheck const&);
};
+
class GameObjectWithDbGUIDCheck
{
public:
@@ -581,7 +707,9 @@ namespace Trinity
WorldObject const& i_obj;
uint32 i_db_guid;
};
+
// Unit checks
+
class MostHPMissingInRange
{
public:
@@ -600,6 +728,7 @@ namespace Trinity
float i_range;
uint32 i_hp;
};
+
class FriendlyCCedInRange
{
public:
@@ -617,6 +746,7 @@ namespace Trinity
Unit const* i_obj;
float i_range;
};
+
class FriendlyMissingBuffInRange
{
public:
@@ -635,6 +765,7 @@ namespace Trinity
float i_range;
uint32 i_spell;
};
+
class AnyUnfriendlyUnitInObjectRangeCheck
{
public:
@@ -651,6 +782,7 @@ namespace Trinity
Unit const* i_funit;
float i_range;
};
+
class AnyUnfriendlyNoTotemUnitInObjectRangeCheck
{
public:
@@ -659,8 +791,10 @@ namespace Trinity
{
if(!u->isAlive())
return false;
+
if(u->GetTypeId()==TYPEID_UNIT && ((Creature*)u)->isTotem())
return false;
+
return i_obj->IsWithinDistInMap(u, i_range) && !i_funit->IsFriendlyTo(u);
}
private:
@@ -668,11 +802,13 @@ namespace Trinity
Unit const* i_funit;
float i_range;
};
+
class AnyUnfriendlyVisibleUnitInObjectRangeCheck
{
public:
AnyUnfriendlyVisibleUnitInObjectRangeCheck(WorldObject const* obj, Unit const* funit, float range)
: i_obj(obj), i_funit(funit), i_range(range) {}
+
bool operator()(Unit* u)
{
return u->isAlive()
@@ -685,6 +821,7 @@ namespace Trinity
Unit const* i_funit;
float i_range;
};
+
class CreatureWithDbGUIDCheck
{
public:
@@ -697,6 +834,7 @@ namespace Trinity
WorldObject const* i_obj;
uint32 i_lowguid;
};
+
class AnyFriendlyUnitInObjectRangeCheck
{
public:
@@ -713,6 +851,7 @@ namespace Trinity
Unit const* i_funit;
float i_range;
};
+
class AnyUnitInObjectRangeCheck
{
public:
@@ -721,12 +860,14 @@ namespace Trinity
{
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
{
@@ -740,15 +881,18 @@ namespace Trinity
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:
@@ -768,8 +912,10 @@ namespace Trinity
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:
@@ -778,6 +924,7 @@ namespace Trinity
Unit const* i_funit;
float i_range;
};
+
// do attack at call of help to friendly crearture
class CallOfHelpCreatureInRangeDo
{
@@ -789,14 +936,18 @@ namespace Trinity
{
if (u == i_funit)
return;
+
if (!u->CanAssistTo(i_funit, i_enemy, false))
return;
+
// too far
if (!u->IsWithinDistInMap(i_enemy, i_range))
return;
+
// only if see assisted creature's enemy
if (!u->IsWithinLOSInMap(i_enemy))
return;
+
if (u->AI())
u->AI()->AttackStart(i_enemy);
}
@@ -805,15 +956,19 @@ namespace Trinity
Unit* const i_enemy;
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 NearestHostileUnitInAttackDistanceCheck
{
public:
@@ -827,6 +982,7 @@ namespace Trinity
// TODO: addthreat for every enemy in range?
if(!m_creature->IsWithinDistInMap(u, m_range))
return false;
+
if(m_force)
{
if(!m_creature->canAttack(u))
@@ -837,6 +993,7 @@ namespace Trinity
if(!m_creature->canStartAttack(u, false))
return false;
}
+
m_range = m_creature->GetDistance(u);
return true;
}
@@ -847,6 +1004,7 @@ namespace Trinity
bool m_force;
NearestHostileUnitInAttackDistanceCheck(NearestHostileUnitInAttackDistanceCheck const&);
};
+
class AnyAssistCreatureInRangeCheck
{
public:
@@ -858,14 +1016,18 @@ namespace Trinity
{
if(u == i_funit)
return false;
+
if ( !u->CanAssistTo(i_funit, i_enemy) )
return false;
+
// too far
if( !i_funit->IsWithinDistInMap(u, i_range) )
return false;
+
// only if see assisted creature
if( !i_funit->IsWithinLOSInMap(u) )
return false;
+
return true;
}
private:
@@ -873,21 +1035,26 @@ namespace Trinity
Unit* const i_enemy;
float i_range;
};
+
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 == i_obj)
return false;
if(!u->CanAssistTo(i_obj,i_enemy))
return false;
+
if(!i_obj->IsWithinDistInMap(u, i_range))
return false;
+
if(!i_obj->IsWithinLOSInMap(u))
return false;
+
i_range = i_obj->GetDistance(u); // use found unit range as new range limit for next check
return true;
}
@@ -896,15 +1063,18 @@ namespace Trinity
Creature* const i_obj;
Unit* const i_enemy;
float i_range;
+
// prevent clone this object
NearestAssistCreatureInCreatureRangeCheck(NearestAssistCreatureInCreatureRangeCheck const&);
};
+
// 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))
@@ -920,9 +1090,11 @@ namespace Trinity
uint32 i_entry;
bool i_alive;
float i_range;
+
// prevent clone this object
NearestCreatureEntryWithLiveStateInObjectRangeCheck(NearestCreatureEntryWithLiveStateInObjectRangeCheck const&);
};
+
class AnyPlayerInObjectRangeCheck
{
public:
@@ -931,12 +1103,14 @@ namespace Trinity
{
if(u->isAlive() && i_obj->IsWithinDistInMap(u, i_range))
return true;
+
return false;
}
private:
WorldObject const* i_obj;
float i_range;
};
+
class AllFriendlyCreaturesInGrid
{
public:
@@ -945,11 +1119,13 @@ namespace Trinity
{
if(u->isAlive() && u->GetVisibility() == VISIBILITY_ON && u->IsFriendlyTo(pUnit))
return true;
+
return false;
}
private:
Unit const* pUnit;
};
+
class AllGameObjectsWithEntryInRange
{
public:
@@ -958,6 +1134,7 @@ namespace Trinity
{
if (pGo->GetEntry() == m_uiEntry && m_pObject->IsWithinDist(pGo,m_fRange,false))
return true;
+
return false;
}
private:
@@ -965,6 +1142,7 @@ namespace Trinity
uint32 m_uiEntry;
float m_fRange;
};
+
class AllCreaturesOfEntryInRange
{
public:
@@ -973,13 +1151,16 @@ namespace Trinity
{
if (pUnit->GetEntry() == m_uiEntry && m_pObject->IsWithinDist(pUnit,m_fRange,false))
return true;
+
return false;
}
+
private:
const WorldObject* m_pObject;
uint32 m_uiEntry;
float m_fRange;
};
+
class PlayerAtMinimumRangeAway
{
public:
@@ -989,12 +1170,15 @@ namespace Trinity
//No threat list check, must be done explicit if expected to be in combat with creature
if (!pPlayer->isGameMaster() && pPlayer->isAlive() && !pUnit->IsWithinDist(pPlayer,fRange,false))
return true;
+
return false;
}
+
private:
Unit const* pUnit;
float fRange;
};
+
class GameObjectInRangeCheck
{
public:
@@ -1006,23 +1190,28 @@ namespace Trinity
private:
float x, y, z, range;
};
+
// Player checks and do
+
// Prepare using Builder localized packets with caching and send to player
template<class Builder>
class LocalizedPacketDo
{
public:
explicit LocalizedPacketDo(Builder& builder) : i_builder(builder) {}
+
~LocalizedPacketDo()
{
for(size_t i = 0; i < i_data_cache.size(); ++i)
delete i_data_cache[i];
}
void operator()( Player* p );
+
private:
Builder& i_builder;
std::vector<WorldPacket*> i_data_cache; // 0 = default, i => i-1 locale index
};
+
// Prepare using Builder localized packets with caching and send to player
template<class Builder>
class LocalizedPacketListDo
@@ -1030,6 +1219,7 @@ namespace Trinity
public:
typedef std::vector<WorldPacket*> WorldPacketList;
explicit LocalizedPacketListDo(Builder& builder) : i_builder(builder) {}
+
~LocalizedPacketListDo()
{
for(size_t i = 0; i < i_data_cache.size(); ++i)
@@ -1037,11 +1227,13 @@ namespace Trinity
delete i_data_cache[i][j];
}
void operator()( Player* p );
+
private:
Builder& i_builder;
std::vector<WorldPacketList> i_data_cache;
// 0 = default, i => i-1 locale index
};
+
#ifndef WIN32
template<> inline void PlayerRelocationNotifier::Visit<Creature>(CreatureMapType &);
template<> inline void PlayerRelocationNotifier::Visit<Player>(PlayerMapType &);