mirror of
https://github.com/mangosfour/server.git
synced 2025-12-12 19:37:03 +00:00
[9736] Added more usable interface for grid visits
(based on SilverIce's repo commit f20f01e) Signed-off-by: VladimirMangos <vladimir@getmangos.com>
This commit is contained in:
parent
9a0de445b8
commit
e3f3f3410a
19 changed files with 88 additions and 406 deletions
|
|
@ -641,17 +641,11 @@ void AchievementMgr::SendAchievementEarned(AchievementEntry const* achievement)
|
||||||
// if player is in world he can tell his friends about new achievement
|
// if player is in world he can tell his friends about new achievement
|
||||||
else if (GetPlayer()->IsInWorld())
|
else if (GetPlayer()->IsInWorld())
|
||||||
{
|
{
|
||||||
CellPair p = MaNGOS::ComputeCellPair(GetPlayer()->GetPositionX(), GetPlayer()->GetPositionY());
|
|
||||||
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
cell.SetNoCreate();
|
|
||||||
|
|
||||||
MaNGOS::AchievementChatBuilder say_builder(*GetPlayer(), CHAT_MSG_ACHIEVEMENT, LANG_ACHIEVEMENT_EARNED,achievement->ID);
|
MaNGOS::AchievementChatBuilder say_builder(*GetPlayer(), CHAT_MSG_ACHIEVEMENT, LANG_ACHIEVEMENT_EARNED,achievement->ID);
|
||||||
MaNGOS::LocalizedPacketDo<MaNGOS::AchievementChatBuilder> say_do(say_builder);
|
MaNGOS::LocalizedPacketDo<MaNGOS::AchievementChatBuilder> say_do(say_builder);
|
||||||
MaNGOS::PlayerDistWorker<MaNGOS::LocalizedPacketDo<MaNGOS::AchievementChatBuilder> > say_worker(GetPlayer(),sWorld.getConfig(CONFIG_FLOAT_LISTEN_RANGE_SAY),say_do);
|
MaNGOS::PlayerDistWorker<MaNGOS::LocalizedPacketDo<MaNGOS::AchievementChatBuilder> > say_worker(GetPlayer(),sWorld.getConfig(CONFIG_FLOAT_LISTEN_RANGE_SAY),say_do);
|
||||||
TypeContainerVisitor<MaNGOS::PlayerDistWorker<MaNGOS::LocalizedPacketDo<MaNGOS::AchievementChatBuilder> >, WorldTypeMapContainer > message(say_worker);
|
|
||||||
cell.Visit(p, message, *GetPlayer()->GetMap(), *GetPlayer(), sWorld.getConfig(CONFIG_FLOAT_LISTEN_RANGE_SAY));
|
Cell::VisitWorldObjects(GetPlayer(), say_worker, sWorld.getConfig(CONFIG_FLOAT_LISTEN_RANGE_SAY));
|
||||||
}
|
}
|
||||||
|
|
||||||
WorldPacket data(SMSG_ACHIEVEMENT_EARNED, 8+4+8);
|
WorldPacket data(SMSG_ACHIEVEMENT_EARNED, 8+4+8);
|
||||||
|
|
|
||||||
|
|
@ -163,6 +163,10 @@ struct MANGOS_DLL_DECL Cell
|
||||||
|
|
||||||
static CellArea CalculateCellArea(const WorldObject &obj, float radius);
|
static CellArea CalculateCellArea(const WorldObject &obj, float radius);
|
||||||
|
|
||||||
|
template<class T> static void VisitGridObjects(const WorldObject *obj, T &visitor, float radius, bool dont_load = true);
|
||||||
|
template<class T> static void VisitWorldObjects(const WorldObject *obj, T &visitor, float radius, bool dont_load = true);
|
||||||
|
template<class T> static void VisitAllObjects(const WorldObject *obj, T &visitor, float radius, bool dont_load = true);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
template<class T, class CONTAINER> void VisitCircle(TypeContainerVisitor<T, CONTAINER> &, Map &, const CellPair& , const CellPair& ) const;
|
template<class T, class CONTAINER> void VisitCircle(TypeContainerVisitor<T, CONTAINER> &, Map &, const CellPair& , const CellPair& ) const;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -279,4 +279,39 @@ Cell::VisitCircle(TypeContainerVisitor<T, CONTAINER> &visitor, Map &m, const Cel
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
inline void Cell::VisitGridObjects(const WorldObject *center_obj, T &visitor, float radius, bool dont_load)
|
||||||
|
{
|
||||||
|
CellPair p(MaNGOS::ComputeCellPair(center_obj->GetPositionX(), center_obj->GetPositionY()));
|
||||||
|
Cell cell(p);
|
||||||
|
if (dont_load)
|
||||||
|
cell.SetNoCreate();
|
||||||
|
typename TypeContainerVisitor<T, GridTypeMapContainer > gnotifier(visitor);
|
||||||
|
cell.Visit(p, gnotifier, *center_obj->GetMap(), *center_obj, radius);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
inline void Cell::VisitWorldObjects(const WorldObject *center_obj, T &visitor, float radius, bool dont_load)
|
||||||
|
{
|
||||||
|
CellPair p(MaNGOS::ComputeCellPair(center_obj->GetPositionX(), center_obj->GetPositionY()));
|
||||||
|
Cell cell(p);
|
||||||
|
if (dont_load)
|
||||||
|
cell.SetNoCreate();
|
||||||
|
typename TypeContainerVisitor<T, WorldTypeMapContainer > gnotifier(visitor);
|
||||||
|
cell.Visit(p, gnotifier, *center_obj->GetMap(), *center_obj, radius);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
inline void Cell::VisitAllObjects(const WorldObject *center_obj, T &visitor, float radius, bool dont_load)
|
||||||
|
{
|
||||||
|
CellPair p(MaNGOS::ComputeCellPair(center_obj->GetPositionX(), center_obj->GetPositionY()));
|
||||||
|
Cell cell(p);
|
||||||
|
if (dont_load)
|
||||||
|
cell.SetNoCreate();
|
||||||
|
typename TypeContainerVisitor<T, GridTypeMapContainer > gnotifier(visitor);
|
||||||
|
typename TypeContainerVisitor<T, WorldTypeMapContainer > wnotifier(visitor);
|
||||||
|
cell.Visit(p, gnotifier, *center_obj->GetMap(), *center_obj, radius);
|
||||||
|
cell.Visit(p, wnotifier, *center_obj->GetMap(), *center_obj, radius);
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -1975,16 +1975,9 @@ GameObject* ChatHandler::GetObjectGlobalyWithGuidOrNearWithDbGuid(uint32 lowguid
|
||||||
|
|
||||||
if(!obj && sObjectMgr.GetGOData(lowguid)) // guid is DB guid of object
|
if(!obj && sObjectMgr.GetGOData(lowguid)) // guid is DB guid of object
|
||||||
{
|
{
|
||||||
// search near player then
|
|
||||||
CellPair p(MaNGOS::ComputeCellPair(pl->GetPositionX(), pl->GetPositionY()));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
|
|
||||||
MaNGOS::GameObjectWithDbGUIDCheck go_check(*pl,lowguid);
|
MaNGOS::GameObjectWithDbGUIDCheck go_check(*pl,lowguid);
|
||||||
MaNGOS::GameObjectSearcher<MaNGOS::GameObjectWithDbGUIDCheck> checker(pl,obj,go_check);
|
MaNGOS::GameObjectSearcher<MaNGOS::GameObjectWithDbGUIDCheck> checker(pl,obj,go_check);
|
||||||
|
Cell::VisitGridObjects(pl,checker, pl->GetMap()->GetVisibilityDistance());
|
||||||
TypeContainerVisitor<MaNGOS::GameObjectSearcher<MaNGOS::GameObjectWithDbGUIDCheck>, GridTypeMapContainer > object_checker(checker);
|
|
||||||
cell.Visit(p, object_checker, *pl->GetMap());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return obj;
|
return obj;
|
||||||
|
|
|
||||||
|
|
@ -572,17 +572,10 @@ void WorldSession::HandleTextEmoteOpcode( WorldPacket & recv_data )
|
||||||
|
|
||||||
Unit* unit = ObjectAccessor::GetUnit(*_player, guid);
|
Unit* unit = ObjectAccessor::GetUnit(*_player, guid);
|
||||||
|
|
||||||
CellPair p = MaNGOS::ComputeCellPair(GetPlayer()->GetPositionX(), GetPlayer()->GetPositionY());
|
|
||||||
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
cell.SetNoCreate();
|
|
||||||
|
|
||||||
MaNGOS::EmoteChatBuilder emote_builder(*GetPlayer(), text_emote, emoteNum, unit);
|
MaNGOS::EmoteChatBuilder emote_builder(*GetPlayer(), text_emote, emoteNum, unit);
|
||||||
MaNGOS::LocalizedPacketDo<MaNGOS::EmoteChatBuilder > emote_do(emote_builder);
|
MaNGOS::LocalizedPacketDo<MaNGOS::EmoteChatBuilder > emote_do(emote_builder);
|
||||||
MaNGOS::PlayerDistWorker<MaNGOS::LocalizedPacketDo<MaNGOS::EmoteChatBuilder > > emote_worker(GetPlayer(), sWorld.getConfig(CONFIG_FLOAT_LISTEN_RANGE_TEXTEMOTE), emote_do);
|
MaNGOS::PlayerDistWorker<MaNGOS::LocalizedPacketDo<MaNGOS::EmoteChatBuilder > > emote_worker(GetPlayer(), sWorld.getConfig(CONFIG_FLOAT_LISTEN_RANGE_TEXTEMOTE), emote_do);
|
||||||
TypeContainerVisitor<MaNGOS::PlayerDistWorker<MaNGOS::LocalizedPacketDo<MaNGOS::EmoteChatBuilder > >, WorldTypeMapContainer> message(emote_worker);
|
Cell::VisitWorldObjects(GetPlayer(), emote_worker, sWorld.getConfig(CONFIG_FLOAT_LISTEN_RANGE_TEXTEMOTE));
|
||||||
cell.Visit(p, message, *GetPlayer()->GetMap(), *GetPlayer(), sWorld.getConfig(CONFIG_FLOAT_LISTEN_RANGE_TEXTEMOTE));
|
|
||||||
|
|
||||||
GetPlayer()->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE, text_emote, 0, unit);
|
GetPlayer()->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE, text_emote, 0, unit);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -569,16 +569,9 @@ void Creature::DoFleeToGetAssistance()
|
||||||
{
|
{
|
||||||
Creature* pCreature = NULL;
|
Creature* pCreature = NULL;
|
||||||
|
|
||||||
CellPair p(MaNGOS::ComputeCellPair(GetPositionX(), GetPositionY()));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
cell.SetNoCreate();
|
|
||||||
MaNGOS::NearestAssistCreatureInCreatureRangeCheck u_check(this, getVictim(), radius);
|
MaNGOS::NearestAssistCreatureInCreatureRangeCheck u_check(this, getVictim(), radius);
|
||||||
MaNGOS::CreatureLastSearcher<MaNGOS::NearestAssistCreatureInCreatureRangeCheck> searcher(this, pCreature, u_check);
|
MaNGOS::CreatureLastSearcher<MaNGOS::NearestAssistCreatureInCreatureRangeCheck> searcher(this, pCreature, u_check);
|
||||||
|
Cell::VisitGridObjects(this, searcher, radius);
|
||||||
TypeContainerVisitor<MaNGOS::CreatureLastSearcher<MaNGOS::NearestAssistCreatureInCreatureRangeCheck>, GridTypeMapContainer > grid_creature_searcher(searcher);
|
|
||||||
|
|
||||||
cell.Visit(p, grid_creature_searcher, *GetMap(), *this, radius);
|
|
||||||
|
|
||||||
SetNoSearchAssistance(true);
|
SetNoSearchAssistance(true);
|
||||||
UpdateSpeed(MOVE_RUN, false);
|
UpdateSpeed(MOVE_RUN, false);
|
||||||
|
|
@ -1546,17 +1539,9 @@ void Creature::CallAssistance()
|
||||||
std::list<Creature*> assistList;
|
std::list<Creature*> assistList;
|
||||||
|
|
||||||
{
|
{
|
||||||
CellPair p(MaNGOS::ComputeCellPair(GetPositionX(), GetPositionY()));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
cell.SetNoCreate();
|
|
||||||
|
|
||||||
MaNGOS::AnyAssistCreatureInRangeCheck u_check(this, getVictim(), radius);
|
MaNGOS::AnyAssistCreatureInRangeCheck u_check(this, getVictim(), radius);
|
||||||
MaNGOS::CreatureListSearcher<MaNGOS::AnyAssistCreatureInRangeCheck> searcher(this, assistList, u_check);
|
MaNGOS::CreatureListSearcher<MaNGOS::AnyAssistCreatureInRangeCheck> searcher(this, assistList, u_check);
|
||||||
|
Cell::VisitGridObjects(this,searcher, radius);
|
||||||
TypeContainerVisitor<MaNGOS::CreatureListSearcher<MaNGOS::AnyAssistCreatureInRangeCheck>, GridTypeMapContainer > grid_creature_searcher(searcher);
|
|
||||||
|
|
||||||
cell.Visit(p, grid_creature_searcher, *GetMap(), *this, radius);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!assistList.empty())
|
if (!assistList.empty())
|
||||||
|
|
@ -1579,17 +1564,9 @@ void Creature::CallForHelp(float fRadius)
|
||||||
if (fRadius <= 0.0f || !getVictim() || isPet() || isCharmed())
|
if (fRadius <= 0.0f || !getVictim() || isPet() || isCharmed())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
CellPair p(MaNGOS::ComputeCellPair(GetPositionX(), GetPositionY()));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
cell.SetNoCreate();
|
|
||||||
|
|
||||||
MaNGOS::CallOfHelpCreatureInRangeDo u_do(this, getVictim(), fRadius);
|
MaNGOS::CallOfHelpCreatureInRangeDo u_do(this, getVictim(), fRadius);
|
||||||
MaNGOS::CreatureWorker<MaNGOS::CallOfHelpCreatureInRangeDo> worker(this, u_do);
|
MaNGOS::CreatureWorker<MaNGOS::CallOfHelpCreatureInRangeDo> worker(this, u_do);
|
||||||
|
Cell::VisitGridObjects(this,worker, fRadius);
|
||||||
TypeContainerVisitor<MaNGOS::CreatureWorker<MaNGOS::CallOfHelpCreatureInRangeDo>, GridTypeMapContainer > grid_creature_searcher(worker);
|
|
||||||
|
|
||||||
cell.Visit(p, grid_creature_searcher, *GetMap(), *this, fRadius);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Creature::CanAssistTo(const Unit* u, const Unit* enemy, bool checkfaction /*= true*/) const
|
bool Creature::CanAssistTo(const Unit* u, const Unit* enemy, bool checkfaction /*= true*/) const
|
||||||
|
|
@ -2099,19 +2076,7 @@ void Creature::SendAreaSpiritHealerQueryOpcode(Player *pl)
|
||||||
|
|
||||||
void Creature::RelocationNotify()
|
void Creature::RelocationNotify()
|
||||||
{
|
{
|
||||||
CellPair new_val = MaNGOS::ComputeCellPair(GetPositionX(), GetPositionY());
|
|
||||||
Cell cell(new_val);
|
|
||||||
CellPair cellpair = cell.cellPair();
|
|
||||||
|
|
||||||
MaNGOS::CreatureRelocationNotifier relocationNotifier(*this);
|
MaNGOS::CreatureRelocationNotifier relocationNotifier(*this);
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
cell.SetNoCreate(); // not trigger load unloaded grids at notifier call
|
|
||||||
|
|
||||||
TypeContainerVisitor<MaNGOS::CreatureRelocationNotifier, WorldTypeMapContainer > c2world_relocation(relocationNotifier);
|
|
||||||
TypeContainerVisitor<MaNGOS::CreatureRelocationNotifier, GridTypeMapContainer > c2grid_relocation(relocationNotifier);
|
|
||||||
|
|
||||||
float radius = MAX_CREATURE_ATTACK_RADIUS * sWorld.getConfig(CONFIG_FLOAT_RATE_CREATURE_AGGRO);
|
float radius = MAX_CREATURE_ATTACK_RADIUS * sWorld.getConfig(CONFIG_FLOAT_RATE_CREATURE_AGGRO);
|
||||||
|
Cell::VisitAllObjects(this, relocationNotifier, radius);
|
||||||
cell.Visit(cellpair, c2world_relocation, *GetMap(), *this, radius);
|
|
||||||
cell.Visit(cellpair, c2grid_relocation, *GetMap(), *this, radius);
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1225,11 +1225,6 @@ inline Unit* CreatureEventAI::GetTargetByType(uint32 Target, Unit* pActionInvoke
|
||||||
|
|
||||||
Unit* CreatureEventAI::DoSelectLowestHpFriendly(float range, uint32 MinHPDiff)
|
Unit* CreatureEventAI::DoSelectLowestHpFriendly(float range, uint32 MinHPDiff)
|
||||||
{
|
{
|
||||||
CellPair p(MaNGOS::ComputeCellPair(m_creature->GetPositionX(), m_creature->GetPositionY()));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
cell.SetNoCreate();
|
|
||||||
|
|
||||||
Unit* pUnit = NULL;
|
Unit* pUnit = NULL;
|
||||||
|
|
||||||
MaNGOS::MostHPMissingInRange u_check(m_creature, range, MinHPDiff);
|
MaNGOS::MostHPMissingInRange u_check(m_creature, range, MinHPDiff);
|
||||||
|
|
@ -1239,40 +1234,22 @@ Unit* CreatureEventAI::DoSelectLowestHpFriendly(float range, uint32 MinHPDiff)
|
||||||
typedef TYPELIST_4(GameObject, Creature*except pets*, DynamicObject, Corpse*Bones*) AllGridObjectTypes;
|
typedef TYPELIST_4(GameObject, Creature*except pets*, DynamicObject, Corpse*Bones*) AllGridObjectTypes;
|
||||||
This means that if we only search grid then we cannot possibly return pets or players so this is safe
|
This means that if we only search grid then we cannot possibly return pets or players so this is safe
|
||||||
*/
|
*/
|
||||||
TypeContainerVisitor<MaNGOS::UnitLastSearcher<MaNGOS::MostHPMissingInRange>, GridTypeMapContainer > grid_unit_searcher(searcher);
|
Cell::VisitGridObjects(m_creature, searcher, range);
|
||||||
|
|
||||||
cell.Visit(p, grid_unit_searcher, *m_creature->GetMap(), *m_creature, range);
|
|
||||||
return pUnit;
|
return pUnit;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CreatureEventAI::DoFindFriendlyCC(std::list<Creature*>& _list, float range)
|
void CreatureEventAI::DoFindFriendlyCC(std::list<Creature*>& _list, float range)
|
||||||
{
|
{
|
||||||
CellPair p(MaNGOS::ComputeCellPair(m_creature->GetPositionX(), m_creature->GetPositionY()));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
cell.SetNoCreate();
|
|
||||||
|
|
||||||
MaNGOS::FriendlyCCedInRange u_check(m_creature, range);
|
MaNGOS::FriendlyCCedInRange u_check(m_creature, range);
|
||||||
MaNGOS::CreatureListSearcher<MaNGOS::FriendlyCCedInRange> searcher(m_creature, _list, u_check);
|
MaNGOS::CreatureListSearcher<MaNGOS::FriendlyCCedInRange> searcher(m_creature, _list, u_check);
|
||||||
|
Cell::VisitGridObjects(m_creature, searcher, range);
|
||||||
TypeContainerVisitor<MaNGOS::CreatureListSearcher<MaNGOS::FriendlyCCedInRange>, GridTypeMapContainer > grid_creature_searcher(searcher);
|
|
||||||
|
|
||||||
cell.Visit(p, grid_creature_searcher, *m_creature->GetMap(), *m_creature, range);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CreatureEventAI::DoFindFriendlyMissingBuff(std::list<Creature*>& _list, float range, uint32 spellid)
|
void CreatureEventAI::DoFindFriendlyMissingBuff(std::list<Creature*>& _list, float range, uint32 spellid)
|
||||||
{
|
{
|
||||||
CellPair p(MaNGOS::ComputeCellPair(m_creature->GetPositionX(), m_creature->GetPositionY()));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
cell.SetNoCreate();
|
|
||||||
|
|
||||||
MaNGOS::FriendlyMissingBuffInRange u_check(m_creature, range, spellid);
|
MaNGOS::FriendlyMissingBuffInRange u_check(m_creature, range, spellid);
|
||||||
MaNGOS::CreatureListSearcher<MaNGOS::FriendlyMissingBuffInRange> searcher(m_creature, _list, u_check);
|
MaNGOS::CreatureListSearcher<MaNGOS::FriendlyMissingBuffInRange> searcher(m_creature, _list, u_check);
|
||||||
|
Cell::VisitGridObjects(m_creature,searcher, range);
|
||||||
TypeContainerVisitor<MaNGOS::CreatureListSearcher<MaNGOS::FriendlyMissingBuffInRange>, GridTypeMapContainer > grid_creature_searcher(searcher);
|
|
||||||
|
|
||||||
cell.Visit(p, grid_creature_searcher, *m_creature->GetMap(), *m_creature, range);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//*********************************
|
//*********************************
|
||||||
|
|
|
||||||
|
|
@ -114,18 +114,8 @@ void DynamicObject::Update(uint32 p_time)
|
||||||
if(m_radius)
|
if(m_radius)
|
||||||
{
|
{
|
||||||
// TODO: make a timer and update this in larger intervals
|
// TODO: make a timer and update this in larger intervals
|
||||||
CellPair p(MaNGOS::ComputeCellPair(GetPositionX(), GetPositionY()));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
cell.SetNoCreate();
|
|
||||||
|
|
||||||
MaNGOS::DynamicObjectUpdater notifier(*this, caster);
|
MaNGOS::DynamicObjectUpdater notifier(*this, caster);
|
||||||
|
Cell::VisitAllObjects(this, notifier, m_radius);
|
||||||
TypeContainerVisitor<MaNGOS::DynamicObjectUpdater, WorldTypeMapContainer > world_object_notifier(notifier);
|
|
||||||
TypeContainerVisitor<MaNGOS::DynamicObjectUpdater, GridTypeMapContainer > grid_object_notifier(notifier);
|
|
||||||
|
|
||||||
cell.Visit(p, world_object_notifier, *GetMap(), *this, m_radius);
|
|
||||||
cell.Visit(p, grid_object_notifier, *GetMap(), *this, m_radius);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(deleteThis)
|
if(deleteThis)
|
||||||
|
|
|
||||||
|
|
@ -289,26 +289,15 @@ void GameObject::Update(uint32 /*p_time*/)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CellPair p(MaNGOS::ComputeCellPair(GetPositionX(),GetPositionY()));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
|
|
||||||
// Note: this hack with search required until GO casting not implemented
|
// Note: this hack with search required until GO casting not implemented
|
||||||
// search unfriendly creature
|
// search unfriendly creature
|
||||||
if(owner && goInfo->trap.charges > 0) // hunter trap
|
if(owner && goInfo->trap.charges > 0) // hunter trap
|
||||||
{
|
{
|
||||||
MaNGOS::AnyUnfriendlyUnitInObjectRangeCheck u_check(this, owner, radius);
|
MaNGOS::AnyUnfriendlyUnitInObjectRangeCheck u_check(this, owner, radius);
|
||||||
MaNGOS::UnitSearcher<MaNGOS::AnyUnfriendlyUnitInObjectRangeCheck> checker(this,ok, u_check);
|
MaNGOS::UnitSearcher<MaNGOS::AnyUnfriendlyUnitInObjectRangeCheck> checker(this,ok, u_check);
|
||||||
|
Cell::VisitGridObjects(this,checker, radius);
|
||||||
TypeContainerVisitor<MaNGOS::UnitSearcher<MaNGOS::AnyUnfriendlyUnitInObjectRangeCheck>, GridTypeMapContainer > grid_object_checker(checker);
|
|
||||||
cell.Visit(p, grid_object_checker, *GetMap(), *this, radius);
|
|
||||||
|
|
||||||
// or unfriendly player/pet
|
|
||||||
if(!ok)
|
if(!ok)
|
||||||
{
|
Cell::VisitWorldObjects(this,checker, radius);
|
||||||
TypeContainerVisitor<MaNGOS::UnitSearcher<MaNGOS::AnyUnfriendlyUnitInObjectRangeCheck>, WorldTypeMapContainer > world_object_checker(checker);
|
|
||||||
cell.Visit(p, world_object_checker, *GetMap(), *this, radius);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else // environmental trap
|
else // environmental trap
|
||||||
{
|
{
|
||||||
|
|
@ -318,9 +307,7 @@ void GameObject::Update(uint32 /*p_time*/)
|
||||||
Player* p_ok = NULL;
|
Player* p_ok = NULL;
|
||||||
MaNGOS::AnyPlayerInObjectRangeCheck p_check(this, radius);
|
MaNGOS::AnyPlayerInObjectRangeCheck p_check(this, radius);
|
||||||
MaNGOS::PlayerSearcher<MaNGOS::AnyPlayerInObjectRangeCheck> checker(this,p_ok, p_check);
|
MaNGOS::PlayerSearcher<MaNGOS::AnyPlayerInObjectRangeCheck> checker(this,p_ok, p_check);
|
||||||
|
Cell::VisitWorldObjects(this,checker, radius);
|
||||||
TypeContainerVisitor<MaNGOS::PlayerSearcher<MaNGOS::AnyPlayerInObjectRangeCheck>, WorldTypeMapContainer > world_object_checker(checker);
|
|
||||||
cell.Visit(p, world_object_checker, *GetMap(), *this, radius);
|
|
||||||
ok = p_ok;
|
ok = p_ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -813,15 +800,10 @@ void GameObject::TriggeringLinkedGameObject( uint32 trapEntry, Unit* target)
|
||||||
GameObject* trapGO = NULL;
|
GameObject* trapGO = NULL;
|
||||||
{
|
{
|
||||||
// using original GO distance
|
// using original GO distance
|
||||||
CellPair p(MaNGOS::ComputeCellPair(GetPositionX(), GetPositionY()));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
|
|
||||||
MaNGOS::NearestGameObjectEntryInObjectRangeCheck go_check(*target,trapEntry,range);
|
MaNGOS::NearestGameObjectEntryInObjectRangeCheck go_check(*target,trapEntry,range);
|
||||||
MaNGOS::GameObjectLastSearcher<MaNGOS::NearestGameObjectEntryInObjectRangeCheck> checker(this, trapGO,go_check);
|
MaNGOS::GameObjectLastSearcher<MaNGOS::NearestGameObjectEntryInObjectRangeCheck> checker(this, trapGO,go_check);
|
||||||
|
|
||||||
TypeContainerVisitor<MaNGOS::GameObjectLastSearcher<MaNGOS::NearestGameObjectEntryInObjectRangeCheck>, GridTypeMapContainer > object_checker(checker);
|
Cell::VisitGridObjects(this, checker, range);
|
||||||
cell.Visit(p, object_checker, *GetMap(), *target, range);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// found correct GO
|
// found correct GO
|
||||||
|
|
@ -834,14 +816,9 @@ GameObject* GameObject::LookupFishingHoleAround(float range)
|
||||||
{
|
{
|
||||||
GameObject* ok = NULL;
|
GameObject* ok = NULL;
|
||||||
|
|
||||||
CellPair p(MaNGOS::ComputeCellPair(GetPositionX(),GetPositionY()));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
MaNGOS::NearestGameObjectFishingHole u_check(*this, range);
|
MaNGOS::NearestGameObjectFishingHole u_check(*this, range);
|
||||||
MaNGOS::GameObjectSearcher<MaNGOS::NearestGameObjectFishingHole> checker(this, ok, u_check);
|
MaNGOS::GameObjectSearcher<MaNGOS::NearestGameObjectFishingHole> checker(this, ok, u_check);
|
||||||
|
Cell::VisitGridObjects(this,checker, range);
|
||||||
TypeContainerVisitor<MaNGOS::GameObjectSearcher<MaNGOS::NearestGameObjectFishingHole>, GridTypeMapContainer > grid_object_checker(checker);
|
|
||||||
cell.Visit(p, grid_object_checker, *GetMap(), *this, range);
|
|
||||||
|
|
||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5471,17 +5471,9 @@ bool ChatHandler::HandleRespawnCommand(const char* /*args*/)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
CellPair p(MaNGOS::ComputeCellPair(pl->GetPositionX(), pl->GetPositionY()));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
cell.SetNoCreate();
|
|
||||||
|
|
||||||
MaNGOS::RespawnDo u_do;
|
MaNGOS::RespawnDo u_do;
|
||||||
MaNGOS::WorldObjectWorker<MaNGOS::RespawnDo> worker(pl,u_do);
|
MaNGOS::WorldObjectWorker<MaNGOS::RespawnDo> worker(pl,u_do);
|
||||||
|
Cell::VisitGridObjects(pl, worker, pl->GetMap()->GetVisibilityDistance());
|
||||||
TypeContainerVisitor<MaNGOS::WorldObjectWorker<MaNGOS::RespawnDo>, GridTypeMapContainer > obj_worker(worker);
|
|
||||||
cell.Visit(p, obj_worker, *pl->GetMap());
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -490,92 +490,28 @@ Map::Add(T *obj)
|
||||||
|
|
||||||
void Map::MessageBroadcast(Player *player, WorldPacket *msg, bool to_self)
|
void Map::MessageBroadcast(Player *player, WorldPacket *msg, bool to_self)
|
||||||
{
|
{
|
||||||
CellPair p = MaNGOS::ComputeCellPair(player->GetPositionX(), player->GetPositionY());
|
|
||||||
|
|
||||||
if(p.x_coord >= TOTAL_NUMBER_OF_CELLS_PER_MAP || p.y_coord >= TOTAL_NUMBER_OF_CELLS_PER_MAP )
|
|
||||||
{
|
|
||||||
sLog.outError("Map::MessageBroadcast: Player (GUID: %u) have invalid coordinates X:%f Y:%f grid cell [%u:%u]", player->GetGUIDLow(), player->GetPositionX(), player->GetPositionY(), p.x_coord, p.y_coord);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
cell.SetNoCreate();
|
|
||||||
|
|
||||||
if( !loaded(GridPair(cell.data.Part.grid_x, cell.data.Part.grid_y)) )
|
|
||||||
return;
|
|
||||||
|
|
||||||
MaNGOS::MessageDeliverer post_man(*player, msg, to_self);
|
MaNGOS::MessageDeliverer post_man(*player, msg, to_self);
|
||||||
TypeContainerVisitor<MaNGOS::MessageDeliverer, WorldTypeMapContainer > message(post_man);
|
Cell::VisitWorldObjects(player, post_man, GetVisibilityDistance());
|
||||||
cell.Visit(p, message, *this, *player, GetVisibilityDistance());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Map::MessageBroadcast(WorldObject *obj, WorldPacket *msg)
|
void Map::MessageBroadcast(WorldObject *obj, WorldPacket *msg)
|
||||||
{
|
{
|
||||||
CellPair p = MaNGOS::ComputeCellPair(obj->GetPositionX(), obj->GetPositionY());
|
|
||||||
|
|
||||||
if(p.x_coord >= TOTAL_NUMBER_OF_CELLS_PER_MAP || p.y_coord >= TOTAL_NUMBER_OF_CELLS_PER_MAP )
|
|
||||||
{
|
|
||||||
sLog.outError("Map::MessageBroadcast: Object (GUID: %u TypeId: %u) have invalid coordinates X:%f Y:%f grid cell [%u:%u]", obj->GetGUIDLow(), obj->GetTypeId(), obj->GetPositionX(), obj->GetPositionY(), p.x_coord, p.y_coord);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
cell.SetNoCreate();
|
|
||||||
|
|
||||||
if( !loaded(GridPair(cell.data.Part.grid_x, cell.data.Part.grid_y)) )
|
|
||||||
return;
|
|
||||||
|
|
||||||
//TODO: currently on continents when Visibility.Distance.InFlight > Visibility.Distance.Continents
|
//TODO: currently on continents when Visibility.Distance.InFlight > Visibility.Distance.Continents
|
||||||
//we have alot of blinking mobs because monster move packet send is broken...
|
//we have alot of blinking mobs because monster move packet send is broken...
|
||||||
MaNGOS::ObjectMessageDeliverer post_man(*obj,msg);
|
MaNGOS::ObjectMessageDeliverer post_man(*obj,msg);
|
||||||
TypeContainerVisitor<MaNGOS::ObjectMessageDeliverer, WorldTypeMapContainer > message(post_man);
|
Cell::VisitWorldObjects(obj, post_man, GetVisibilityDistance());
|
||||||
cell.Visit(p, message, *this, *obj, GetVisibilityDistance());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Map::MessageDistBroadcast(Player *player, WorldPacket *msg, float dist, bool to_self, bool own_team_only)
|
void Map::MessageDistBroadcast(Player *player, WorldPacket *msg, float dist, bool to_self, bool own_team_only)
|
||||||
{
|
{
|
||||||
CellPair p = MaNGOS::ComputeCellPair(player->GetPositionX(), player->GetPositionY());
|
|
||||||
|
|
||||||
if(p.x_coord >= TOTAL_NUMBER_OF_CELLS_PER_MAP || p.y_coord >= TOTAL_NUMBER_OF_CELLS_PER_MAP )
|
|
||||||
{
|
|
||||||
sLog.outError("Map::MessageBroadcast: Player (GUID: %u) have invalid coordinates X:%f Y:%f grid cell [%u:%u]", player->GetGUIDLow(), player->GetPositionX(), player->GetPositionY(), p.x_coord, p.y_coord);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
cell.SetNoCreate();
|
|
||||||
|
|
||||||
if( !loaded(GridPair(cell.data.Part.grid_x, cell.data.Part.grid_y)) )
|
|
||||||
return;
|
|
||||||
|
|
||||||
MaNGOS::MessageDistDeliverer post_man(*player, msg, dist, to_self, own_team_only);
|
MaNGOS::MessageDistDeliverer post_man(*player, msg, dist, to_self, own_team_only);
|
||||||
TypeContainerVisitor<MaNGOS::MessageDistDeliverer , WorldTypeMapContainer > message(post_man);
|
Cell::VisitWorldObjects(player, post_man, GetVisibilityDistance());
|
||||||
cell.Visit(p, message, *this, *player, dist);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Map::MessageDistBroadcast(WorldObject *obj, WorldPacket *msg, float dist)
|
void Map::MessageDistBroadcast(WorldObject *obj, WorldPacket *msg, float dist)
|
||||||
{
|
{
|
||||||
CellPair p = MaNGOS::ComputeCellPair(obj->GetPositionX(), obj->GetPositionY());
|
|
||||||
|
|
||||||
if(p.x_coord >= TOTAL_NUMBER_OF_CELLS_PER_MAP || p.y_coord >= TOTAL_NUMBER_OF_CELLS_PER_MAP )
|
|
||||||
{
|
|
||||||
sLog.outError("Map::MessageBroadcast: Object (GUID: %u TypeId: %u) have invalid coordinates X:%f Y:%f grid cell [%u:%u]", obj->GetGUIDLow(), obj->GetTypeId(), obj->GetPositionX(), obj->GetPositionY(), p.x_coord, p.y_coord);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
cell.SetNoCreate();
|
|
||||||
|
|
||||||
if( !loaded(GridPair(cell.data.Part.grid_x, cell.data.Part.grid_y)) )
|
|
||||||
return;
|
|
||||||
|
|
||||||
MaNGOS::ObjectMessageDistDeliverer post_man(*obj, msg, dist);
|
MaNGOS::ObjectMessageDistDeliverer post_man(*obj, msg, dist);
|
||||||
TypeContainerVisitor<MaNGOS::ObjectMessageDistDeliverer, WorldTypeMapContainer > message(post_man);
|
Cell::VisitWorldObjects(obj, post_man, GetVisibilityDistance());
|
||||||
cell.Visit(p, message, *this, *obj, dist);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Map::loaded(const GridPair &p) const
|
bool Map::loaded(const GridPair &p) const
|
||||||
|
|
@ -2030,7 +1966,7 @@ void Map::UpdateObjectsVisibilityFor( Player* player, Cell cell, CellPair cellpa
|
||||||
MaNGOS::VisibleNotifier notifier(*player);
|
MaNGOS::VisibleNotifier notifier(*player);
|
||||||
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
cell.data.Part.reserved = ALL_DISTRICT;
|
||||||
cell.SetNoCreate();
|
//cell.SetNoCreate(); need trigger cell loading around the player
|
||||||
TypeContainerVisitor<MaNGOS::VisibleNotifier, WorldTypeMapContainer > world_notifier(notifier);
|
TypeContainerVisitor<MaNGOS::VisibleNotifier, WorldTypeMapContainer > world_notifier(notifier);
|
||||||
TypeContainerVisitor<MaNGOS::VisibleNotifier, GridTypeMapContainer > grid_notifier(notifier);
|
TypeContainerVisitor<MaNGOS::VisibleNotifier, GridTypeMapContainer > grid_notifier(notifier);
|
||||||
cell.Visit(cellpair, world_notifier, *this, *player, GetVisibilityDistance());
|
cell.Visit(cellpair, world_notifier, *this, *player, GetVisibilityDistance());
|
||||||
|
|
@ -3105,15 +3041,9 @@ void Map::ScriptsProcess()
|
||||||
GameObject *go = NULL;
|
GameObject *go = NULL;
|
||||||
int32 time_to_despawn = step.script->datalong2<5 ? 5 : (int32)step.script->datalong2;
|
int32 time_to_despawn = step.script->datalong2<5 ? 5 : (int32)step.script->datalong2;
|
||||||
|
|
||||||
CellPair p(MaNGOS::ComputeCellPair(summoner->GetPositionX(), summoner->GetPositionY()));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
|
|
||||||
MaNGOS::GameObjectWithDbGUIDCheck go_check(*summoner,step.script->datalong);
|
MaNGOS::GameObjectWithDbGUIDCheck go_check(*summoner,step.script->datalong);
|
||||||
MaNGOS::GameObjectSearcher<MaNGOS::GameObjectWithDbGUIDCheck> checker(summoner, go,go_check);
|
MaNGOS::GameObjectSearcher<MaNGOS::GameObjectWithDbGUIDCheck> checker(summoner, go,go_check);
|
||||||
|
Cell::VisitGridObjects(summoner, checker, GetVisibilityDistance());
|
||||||
TypeContainerVisitor<MaNGOS::GameObjectSearcher<MaNGOS::GameObjectWithDbGUIDCheck>, GridTypeMapContainer > object_checker(checker);
|
|
||||||
cell.Visit(p, object_checker, *summoner->GetMap());
|
|
||||||
|
|
||||||
if ( !go )
|
if ( !go )
|
||||||
{
|
{
|
||||||
|
|
@ -3164,15 +3094,9 @@ void Map::ScriptsProcess()
|
||||||
GameObject *door = NULL;
|
GameObject *door = NULL;
|
||||||
int32 time_to_close = step.script->datalong2 < 15 ? 15 : (int32)step.script->datalong2;
|
int32 time_to_close = step.script->datalong2 < 15 ? 15 : (int32)step.script->datalong2;
|
||||||
|
|
||||||
CellPair p(MaNGOS::ComputeCellPair(caster->GetPositionX(), caster->GetPositionY()));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
|
|
||||||
MaNGOS::GameObjectWithDbGUIDCheck go_check(*caster,step.script->datalong);
|
MaNGOS::GameObjectWithDbGUIDCheck go_check(*caster,step.script->datalong);
|
||||||
MaNGOS::GameObjectSearcher<MaNGOS::GameObjectWithDbGUIDCheck> checker(caster,door,go_check);
|
MaNGOS::GameObjectSearcher<MaNGOS::GameObjectWithDbGUIDCheck> checker(caster,door,go_check);
|
||||||
|
Cell::VisitGridObjects(caster, checker, GetVisibilityDistance());
|
||||||
TypeContainerVisitor<MaNGOS::GameObjectSearcher<MaNGOS::GameObjectWithDbGUIDCheck>, GridTypeMapContainer > object_checker(checker);
|
|
||||||
cell.Visit(p, object_checker, *caster->GetMap());
|
|
||||||
|
|
||||||
if (!door)
|
if (!door)
|
||||||
{
|
{
|
||||||
|
|
@ -3219,15 +3143,9 @@ void Map::ScriptsProcess()
|
||||||
GameObject *door = NULL;
|
GameObject *door = NULL;
|
||||||
int32 time_to_open = step.script->datalong2 < 15 ? 15 : (int32)step.script->datalong2;
|
int32 time_to_open = step.script->datalong2 < 15 ? 15 : (int32)step.script->datalong2;
|
||||||
|
|
||||||
CellPair p(MaNGOS::ComputeCellPair(caster->GetPositionX(), caster->GetPositionY()));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
|
|
||||||
MaNGOS::GameObjectWithDbGUIDCheck go_check(*caster,step.script->datalong);
|
MaNGOS::GameObjectWithDbGUIDCheck go_check(*caster,step.script->datalong);
|
||||||
MaNGOS::GameObjectSearcher<MaNGOS::GameObjectWithDbGUIDCheck> checker(caster,door,go_check);
|
MaNGOS::GameObjectSearcher<MaNGOS::GameObjectWithDbGUIDCheck> checker(caster,door,go_check);
|
||||||
|
Cell::VisitGridObjects(caster, checker, GetVisibilityDistance());
|
||||||
TypeContainerVisitor<MaNGOS::GameObjectSearcher<MaNGOS::GameObjectWithDbGUIDCheck>, GridTypeMapContainer > object_checker(checker);
|
|
||||||
cell.Visit(p, object_checker, *caster->GetMap());
|
|
||||||
|
|
||||||
if ( !door )
|
if ( !door )
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1494,34 +1494,21 @@ namespace MaNGOS
|
||||||
|
|
||||||
void WorldObject::MonsterSay(int32 textId, uint32 language, uint64 TargetGuid)
|
void WorldObject::MonsterSay(int32 textId, uint32 language, uint64 TargetGuid)
|
||||||
{
|
{
|
||||||
CellPair p = MaNGOS::ComputeCellPair(GetPositionX(), GetPositionY());
|
|
||||||
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
cell.SetNoCreate();
|
|
||||||
|
|
||||||
MaNGOS::MonsterChatBuilder say_build(*this, CHAT_MSG_MONSTER_SAY, textId,language,TargetGuid);
|
MaNGOS::MonsterChatBuilder say_build(*this, CHAT_MSG_MONSTER_SAY, textId,language,TargetGuid);
|
||||||
MaNGOS::LocalizedPacketDo<MaNGOS::MonsterChatBuilder> say_do(say_build);
|
MaNGOS::LocalizedPacketDo<MaNGOS::MonsterChatBuilder> say_do(say_build);
|
||||||
MaNGOS::PlayerDistWorker<MaNGOS::LocalizedPacketDo<MaNGOS::MonsterChatBuilder> > say_worker(this,sWorld.getConfig(CONFIG_FLOAT_LISTEN_RANGE_SAY),say_do);
|
MaNGOS::PlayerDistWorker<MaNGOS::LocalizedPacketDo<MaNGOS::MonsterChatBuilder> > say_worker(this,sWorld.getConfig(CONFIG_FLOAT_LISTEN_RANGE_SAY),say_do);
|
||||||
TypeContainerVisitor<MaNGOS::PlayerDistWorker<MaNGOS::LocalizedPacketDo<MaNGOS::MonsterChatBuilder> >, WorldTypeMapContainer > message(say_worker);
|
Cell::VisitWorldObjects(this, say_worker, sWorld.getConfig(CONFIG_FLOAT_LISTEN_RANGE_SAY));
|
||||||
cell.Visit(p, message, *GetMap(), *this, sWorld.getConfig(CONFIG_FLOAT_LISTEN_RANGE_SAY));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorldObject::MonsterYell(int32 textId, uint32 language, uint64 TargetGuid)
|
void WorldObject::MonsterYell(int32 textId, uint32 language, uint64 TargetGuid)
|
||||||
{
|
{
|
||||||
CellPair p = MaNGOS::ComputeCellPair(GetPositionX(), GetPositionY());
|
|
||||||
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
cell.SetNoCreate();
|
|
||||||
|
|
||||||
float range = sWorld.getConfig(CONFIG_FLOAT_LISTEN_RANGE_YELL);
|
float range = sWorld.getConfig(CONFIG_FLOAT_LISTEN_RANGE_YELL);
|
||||||
|
|
||||||
MaNGOS::MonsterChatBuilder say_build(*this, CHAT_MSG_MONSTER_YELL, textId,language,TargetGuid);
|
MaNGOS::MonsterChatBuilder say_build(*this, CHAT_MSG_MONSTER_YELL, textId,language,TargetGuid);
|
||||||
MaNGOS::LocalizedPacketDo<MaNGOS::MonsterChatBuilder> say_do(say_build);
|
MaNGOS::LocalizedPacketDo<MaNGOS::MonsterChatBuilder> say_do(say_build);
|
||||||
MaNGOS::PlayerDistWorker<MaNGOS::LocalizedPacketDo<MaNGOS::MonsterChatBuilder> > say_worker(this,range,say_do);
|
MaNGOS::PlayerDistWorker<MaNGOS::LocalizedPacketDo<MaNGOS::MonsterChatBuilder> > say_worker(this,range,say_do);
|
||||||
TypeContainerVisitor<MaNGOS::PlayerDistWorker<MaNGOS::LocalizedPacketDo<MaNGOS::MonsterChatBuilder> >, WorldTypeMapContainer > message(say_worker);
|
Cell::VisitWorldObjects(this, say_worker, sWorld.getConfig(CONFIG_FLOAT_LISTEN_RANGE_YELL));
|
||||||
cell.Visit(p, message, *GetMap(), *this, range);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorldObject::MonsterYellToZone(int32 textId, uint32 language, uint64 TargetGuid)
|
void WorldObject::MonsterYellToZone(int32 textId, uint32 language, uint64 TargetGuid)
|
||||||
|
|
@ -1539,19 +1526,12 @@ void WorldObject::MonsterYellToZone(int32 textId, uint32 language, uint64 Target
|
||||||
|
|
||||||
void WorldObject::MonsterTextEmote(int32 textId, uint64 TargetGuid, bool IsBossEmote)
|
void WorldObject::MonsterTextEmote(int32 textId, uint64 TargetGuid, bool IsBossEmote)
|
||||||
{
|
{
|
||||||
CellPair p = MaNGOS::ComputeCellPair(GetPositionX(), GetPositionY());
|
|
||||||
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
cell.SetNoCreate();
|
|
||||||
|
|
||||||
float range = sWorld.getConfig(IsBossEmote ? CONFIG_FLOAT_LISTEN_RANGE_YELL : CONFIG_FLOAT_LISTEN_RANGE_TEXTEMOTE);
|
float range = sWorld.getConfig(IsBossEmote ? CONFIG_FLOAT_LISTEN_RANGE_YELL : CONFIG_FLOAT_LISTEN_RANGE_TEXTEMOTE);
|
||||||
|
|
||||||
MaNGOS::MonsterChatBuilder say_build(*this, IsBossEmote ? CHAT_MSG_RAID_BOSS_EMOTE : CHAT_MSG_MONSTER_EMOTE, textId,LANG_UNIVERSAL,TargetGuid);
|
MaNGOS::MonsterChatBuilder say_build(*this, IsBossEmote ? CHAT_MSG_RAID_BOSS_EMOTE : CHAT_MSG_MONSTER_EMOTE, textId,LANG_UNIVERSAL,TargetGuid);
|
||||||
MaNGOS::LocalizedPacketDo<MaNGOS::MonsterChatBuilder> say_do(say_build);
|
MaNGOS::LocalizedPacketDo<MaNGOS::MonsterChatBuilder> say_do(say_build);
|
||||||
MaNGOS::PlayerDistWorker<MaNGOS::LocalizedPacketDo<MaNGOS::MonsterChatBuilder> > say_worker(this,range,say_do);
|
MaNGOS::PlayerDistWorker<MaNGOS::LocalizedPacketDo<MaNGOS::MonsterChatBuilder> > say_worker(this,range,say_do);
|
||||||
TypeContainerVisitor<MaNGOS::PlayerDistWorker<MaNGOS::LocalizedPacketDo<MaNGOS::MonsterChatBuilder> >, WorldTypeMapContainer > message(say_worker);
|
Cell::VisitWorldObjects(this, say_worker, sWorld.getConfig(IsBossEmote ? CONFIG_FLOAT_LISTEN_RANGE_YELL : CONFIG_FLOAT_LISTEN_RANGE_TEXTEMOTE));
|
||||||
cell.Visit(p, message, *GetMap(), *this, range);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorldObject::MonsterWhisper(int32 textId, uint64 receiver, bool IsBossWhisper)
|
void WorldObject::MonsterWhisper(int32 textId, uint64 receiver, bool IsBossWhisper)
|
||||||
|
|
@ -1779,19 +1759,10 @@ void WorldObject::GetNearPoint(WorldObject const* searcher, float &x, float &y,
|
||||||
|
|
||||||
// adding used positions around object
|
// adding used positions around object
|
||||||
{
|
{
|
||||||
CellPair p(MaNGOS::ComputeCellPair(GetPositionX(), GetPositionY()));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
cell.SetNoCreate();
|
|
||||||
|
|
||||||
MaNGOS::NearUsedPosDo u_do(*this,searcher,absAngle,selector);
|
MaNGOS::NearUsedPosDo u_do(*this,searcher,absAngle,selector);
|
||||||
MaNGOS::WorldObjectWorker<MaNGOS::NearUsedPosDo> worker(this,u_do);
|
MaNGOS::WorldObjectWorker<MaNGOS::NearUsedPosDo> worker(this,u_do);
|
||||||
|
|
||||||
TypeContainerVisitor<MaNGOS::WorldObjectWorker<MaNGOS::NearUsedPosDo>, GridTypeMapContainer > grid_obj_worker(worker);
|
Cell::VisitAllObjects(this, worker, distance2d);
|
||||||
TypeContainerVisitor<MaNGOS::WorldObjectWorker<MaNGOS::NearUsedPosDo>, WorldTypeMapContainer > world_obj_worker(worker);
|
|
||||||
|
|
||||||
cell.Visit(p, grid_obj_worker, *GetMap(), *this, distance2d);
|
|
||||||
cell.Visit(p, world_obj_worker, *GetMap(), *this, distance2d);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// maybe can just place in primary position
|
// maybe can just place in primary position
|
||||||
|
|
@ -1943,15 +1914,8 @@ struct WorldObjectChangeAccumulator
|
||||||
|
|
||||||
void WorldObject::BuildUpdateData( UpdateDataMapType & update_players)
|
void WorldObject::BuildUpdateData( UpdateDataMapType & update_players)
|
||||||
{
|
{
|
||||||
CellPair p = MaNGOS::ComputeCellPair(GetPositionX(), GetPositionY());
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
cell.SetNoCreate();
|
|
||||||
WorldObjectChangeAccumulator notifier(*this, update_players);
|
WorldObjectChangeAccumulator notifier(*this, update_players);
|
||||||
TypeContainerVisitor<WorldObjectChangeAccumulator, WorldTypeMapContainer > player_notifier(notifier);
|
Cell::VisitWorldObjects(this, notifier, GetMap()->GetVisibilityDistance());
|
||||||
Map* aMap = GetMap();
|
|
||||||
//we must build packets for all visible players
|
|
||||||
cell.Visit(p, player_notifier, *aMap, *this, aMap->GetVisibilityDistance());
|
|
||||||
|
|
||||||
ClearUpdateMask(false);
|
ClearUpdateMask(false);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -498,4 +498,5 @@ class MANGOS_DLL_SPEC WorldObject : public Object
|
||||||
float m_positionZ;
|
float m_positionZ;
|
||||||
float m_orientation;
|
float m_orientation;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -17866,19 +17866,9 @@ void Player::HandleStealthedUnitsDetection()
|
||||||
{
|
{
|
||||||
std::list<Unit*> stealthedUnits;
|
std::list<Unit*> stealthedUnits;
|
||||||
|
|
||||||
CellPair p(MaNGOS::ComputeCellPair(GetPositionX(),GetPositionY()));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
cell.SetNoCreate();
|
|
||||||
|
|
||||||
MaNGOS::AnyStealthedCheck u_check;
|
MaNGOS::AnyStealthedCheck u_check;
|
||||||
MaNGOS::UnitListSearcher<MaNGOS::AnyStealthedCheck > searcher(this,stealthedUnits, u_check);
|
MaNGOS::UnitListSearcher<MaNGOS::AnyStealthedCheck > searcher(this,stealthedUnits, u_check);
|
||||||
|
Cell::VisitAllObjects(this, searcher, MAX_PLAYER_STEALTH_DETECT_RANGE);
|
||||||
TypeContainerVisitor<MaNGOS::UnitListSearcher<MaNGOS::AnyStealthedCheck >, WorldTypeMapContainer > world_unit_searcher(searcher);
|
|
||||||
TypeContainerVisitor<MaNGOS::UnitListSearcher<MaNGOS::AnyStealthedCheck >, GridTypeMapContainer > grid_unit_searcher(searcher);
|
|
||||||
|
|
||||||
cell.Visit(p, world_unit_searcher, *GetMap(), *this, MAX_PLAYER_STEALTH_DETECT_RANGE);
|
|
||||||
cell.Visit(p, grid_unit_searcher, *GetMap(), *this, MAX_PLAYER_STEALTH_DETECT_RANGE);
|
|
||||||
|
|
||||||
WorldObject const* viewPoint = GetViewPoint();
|
WorldObject const* viewPoint = GetViewPoint();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -418,24 +418,15 @@ WorldObject* Spell::FindCorpseUsing()
|
||||||
SpellRangeEntry const* srange = sSpellRangeStore.LookupEntry(m_spellInfo->rangeIndex);
|
SpellRangeEntry const* srange = sSpellRangeStore.LookupEntry(m_spellInfo->rangeIndex);
|
||||||
float max_range = GetSpellMaxRange(srange);
|
float max_range = GetSpellMaxRange(srange);
|
||||||
|
|
||||||
CellPair p(MaNGOS::ComputeCellPair(m_caster->GetPositionX(), m_caster->GetPositionY()));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
cell.SetNoCreate();
|
|
||||||
|
|
||||||
WorldObject* result = NULL;
|
WorldObject* result = NULL;
|
||||||
|
|
||||||
T u_check(m_caster, max_range);
|
T u_check(m_caster, max_range);
|
||||||
MaNGOS::WorldObjectSearcher<T> searcher(m_caster, result, u_check);
|
MaNGOS::WorldObjectSearcher<T> searcher(m_caster, result, u_check);
|
||||||
|
|
||||||
TypeContainerVisitor<MaNGOS::WorldObjectSearcher<T>, GridTypeMapContainer > grid_searcher(searcher);
|
Cell::VisitGridObjects(m_caster, searcher, max_range);
|
||||||
cell.Visit(p, grid_searcher, *m_caster->GetMap(), *m_caster, max_range);
|
|
||||||
|
|
||||||
if (!result)
|
if (!result)
|
||||||
{
|
Cell::VisitWorldObjects(m_caster, searcher, max_range);
|
||||||
TypeContainerVisitor<MaNGOS::WorldObjectSearcher<T>, WorldTypeMapContainer > world_searcher(searcher);
|
|
||||||
cell.Visit(p, world_searcher, *m_caster->GetMap(), *m_caster, max_range);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
@ -1414,22 +1405,12 @@ void Spell::SetTargetMap(SpellEffectIndex effIndex, uint32 targetMode, UnitList&
|
||||||
unMaxTargets = EffectChainTarget;
|
unMaxTargets = EffectChainTarget;
|
||||||
float max_range = radius + unMaxTargets * CHAIN_SPELL_JUMP_RADIUS;
|
float max_range = radius + unMaxTargets * CHAIN_SPELL_JUMP_RADIUS;
|
||||||
|
|
||||||
CellPair p(MaNGOS::ComputeCellPair(m_caster->GetPositionX(), m_caster->GetPositionY()));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
cell.SetNoCreate();
|
|
||||||
|
|
||||||
std::list<Unit *> tempTargetUnitMap;
|
std::list<Unit *> tempTargetUnitMap;
|
||||||
|
|
||||||
{
|
{
|
||||||
MaNGOS::AnyAoETargetUnitInObjectRangeCheck u_check(m_caster, max_range);
|
MaNGOS::AnyAoETargetUnitInObjectRangeCheck u_check(m_caster, max_range);
|
||||||
MaNGOS::UnitListSearcher<MaNGOS::AnyAoETargetUnitInObjectRangeCheck> searcher(m_caster, tempTargetUnitMap, u_check);
|
MaNGOS::UnitListSearcher<MaNGOS::AnyAoETargetUnitInObjectRangeCheck> searcher(m_caster, tempTargetUnitMap, u_check);
|
||||||
|
Cell::VisitAllObjects(m_caster, searcher, max_range);
|
||||||
TypeContainerVisitor<MaNGOS::UnitListSearcher<MaNGOS::AnyAoETargetUnitInObjectRangeCheck>, WorldTypeMapContainer > world_unit_searcher(searcher);
|
|
||||||
TypeContainerVisitor<MaNGOS::UnitListSearcher<MaNGOS::AnyAoETargetUnitInObjectRangeCheck>, GridTypeMapContainer > grid_unit_searcher(searcher);
|
|
||||||
|
|
||||||
cell.Visit(p, world_unit_searcher, *m_caster->GetMap(), *m_caster, max_range);
|
|
||||||
cell.Visit(p, grid_unit_searcher, *m_caster->GetMap(), *m_caster, max_range);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(tempTargetUnitMap.empty())
|
if(tempTargetUnitMap.empty())
|
||||||
|
|
@ -1485,20 +1466,11 @@ void Spell::SetTargetMap(SpellEffectIndex effIndex, uint32 targetMode, UnitList&
|
||||||
m_targets.m_targetMask = 0;
|
m_targets.m_targetMask = 0;
|
||||||
unMaxTargets = EffectChainTarget;
|
unMaxTargets = EffectChainTarget;
|
||||||
float max_range = radius + unMaxTargets * CHAIN_SPELL_JUMP_RADIUS;
|
float max_range = radius + unMaxTargets * CHAIN_SPELL_JUMP_RADIUS;
|
||||||
CellPair p(MaNGOS::ComputeCellPair(m_caster->GetPositionX(), m_caster->GetPositionY()));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
cell.SetNoCreate();
|
|
||||||
std::list<Unit*> tempTargetUnitMap;
|
std::list<Unit*> tempTargetUnitMap;
|
||||||
{
|
{
|
||||||
MaNGOS::AnyFriendlyUnitInObjectRangeCheck u_check(m_caster, max_range);
|
MaNGOS::AnyFriendlyUnitInObjectRangeCheck u_check(m_caster, max_range);
|
||||||
MaNGOS::UnitListSearcher<MaNGOS::AnyFriendlyUnitInObjectRangeCheck> searcher(m_caster, tempTargetUnitMap, u_check);
|
MaNGOS::UnitListSearcher<MaNGOS::AnyFriendlyUnitInObjectRangeCheck> searcher(m_caster, tempTargetUnitMap, u_check);
|
||||||
|
Cell::VisitAllObjects(m_caster, searcher, max_range);
|
||||||
TypeContainerVisitor<MaNGOS::UnitListSearcher<MaNGOS::AnyFriendlyUnitInObjectRangeCheck>, WorldTypeMapContainer > world_unit_searcher(searcher);
|
|
||||||
TypeContainerVisitor<MaNGOS::UnitListSearcher<MaNGOS::AnyFriendlyUnitInObjectRangeCheck>, GridTypeMapContainer > grid_unit_searcher(searcher);
|
|
||||||
|
|
||||||
cell.Visit(p, world_unit_searcher, *m_caster->GetMap(), *m_caster, max_range);
|
|
||||||
cell.Visit(p, grid_unit_searcher, *m_caster->GetMap(), *m_caster, max_range);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(tempTargetUnitMap.empty())
|
if(tempTargetUnitMap.empty())
|
||||||
|
|
@ -1580,20 +1552,11 @@ void Spell::SetTargetMap(SpellEffectIndex effIndex, uint32 targetMode, UnitList&
|
||||||
//FIXME: This very like horrible hack and wrong for most spells
|
//FIXME: This very like horrible hack and wrong for most spells
|
||||||
max_range = radius + unMaxTargets * CHAIN_SPELL_JUMP_RADIUS;
|
max_range = radius + unMaxTargets * CHAIN_SPELL_JUMP_RADIUS;
|
||||||
|
|
||||||
CellPair p(MaNGOS::ComputeCellPair(m_caster->GetPositionX(), m_caster->GetPositionY()));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
cell.SetNoCreate();
|
|
||||||
|
|
||||||
std::list<Unit *> tempTargetUnitMap;
|
std::list<Unit *> tempTargetUnitMap;
|
||||||
{
|
{
|
||||||
MaNGOS::AnyAoEVisibleTargetUnitInObjectRangeCheck u_check(pUnitTarget, originalCaster, max_range);
|
MaNGOS::AnyAoEVisibleTargetUnitInObjectRangeCheck u_check(pUnitTarget, originalCaster, max_range);
|
||||||
MaNGOS::UnitListSearcher<MaNGOS::AnyAoEVisibleTargetUnitInObjectRangeCheck> searcher(m_caster, tempTargetUnitMap, u_check);
|
MaNGOS::UnitListSearcher<MaNGOS::AnyAoEVisibleTargetUnitInObjectRangeCheck> searcher(m_caster, tempTargetUnitMap, u_check);
|
||||||
TypeContainerVisitor<MaNGOS::UnitListSearcher<MaNGOS::AnyAoEVisibleTargetUnitInObjectRangeCheck>, WorldTypeMapContainer> world_unit_searcher(searcher);
|
Cell::VisitAllObjects(m_caster, searcher, max_range);
|
||||||
TypeContainerVisitor<MaNGOS::UnitListSearcher<MaNGOS::AnyAoEVisibleTargetUnitInObjectRangeCheck>, GridTypeMapContainer> grid_unit_searcher(searcher);
|
|
||||||
|
|
||||||
cell.Visit(p, world_unit_searcher, *m_caster->GetMap(), *pUnitTarget, max_range);
|
|
||||||
cell.Visit(p, grid_unit_searcher, *m_caster->GetMap(), *pUnitTarget, max_range);
|
|
||||||
}
|
}
|
||||||
if (tempTargetUnitMap.empty())
|
if (tempTargetUnitMap.empty())
|
||||||
break;
|
break;
|
||||||
|
|
@ -4300,15 +4263,9 @@ SpellCastResult Spell::CheckCast(bool strict)
|
||||||
|
|
||||||
if (i_spellST->second.targetEntry)
|
if (i_spellST->second.targetEntry)
|
||||||
{
|
{
|
||||||
CellPair p(MaNGOS::ComputeCellPair(m_caster->GetPositionX(), m_caster->GetPositionY()));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
|
|
||||||
MaNGOS::NearestGameObjectEntryInObjectRangeCheck go_check(*m_caster, i_spellST->second.targetEntry, range);
|
MaNGOS::NearestGameObjectEntryInObjectRangeCheck go_check(*m_caster, i_spellST->second.targetEntry, range);
|
||||||
MaNGOS::GameObjectLastSearcher<MaNGOS::NearestGameObjectEntryInObjectRangeCheck> checker(m_caster, p_GameObject, go_check);
|
MaNGOS::GameObjectLastSearcher<MaNGOS::NearestGameObjectEntryInObjectRangeCheck> checker(m_caster, p_GameObject, go_check);
|
||||||
|
Cell::VisitGridObjects(m_caster, checker, range);
|
||||||
TypeContainerVisitor<MaNGOS::GameObjectLastSearcher<MaNGOS::NearestGameObjectEntryInObjectRangeCheck>, GridTypeMapContainer > object_checker(checker);
|
|
||||||
cell.Visit(p, object_checker, *m_caster->GetMap(), *m_caster, range);
|
|
||||||
|
|
||||||
if (p_GameObject)
|
if (p_GameObject)
|
||||||
{
|
{
|
||||||
|
|
@ -4357,17 +4314,10 @@ SpellCastResult Spell::CheckCast(bool strict)
|
||||||
// no target provided or it was not valid, so use closest in range
|
// no target provided or it was not valid, so use closest in range
|
||||||
if (!p_Creature)
|
if (!p_Creature)
|
||||||
{
|
{
|
||||||
CellPair p(MaNGOS::ComputeCellPair(m_caster->GetPositionX(), m_caster->GetPositionY()));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
cell.SetNoCreate();
|
|
||||||
|
|
||||||
MaNGOS::NearestCreatureEntryWithLiveStateInObjectRangeCheck u_check(*m_caster, i_spellST->second.targetEntry, i_spellST->second.type != SPELL_TARGET_TYPE_DEAD, range);
|
MaNGOS::NearestCreatureEntryWithLiveStateInObjectRangeCheck u_check(*m_caster, i_spellST->second.targetEntry, i_spellST->second.type != SPELL_TARGET_TYPE_DEAD, range);
|
||||||
MaNGOS::CreatureLastSearcher<MaNGOS::NearestCreatureEntryWithLiveStateInObjectRangeCheck> searcher(m_caster, p_Creature, u_check);
|
MaNGOS::CreatureLastSearcher<MaNGOS::NearestCreatureEntryWithLiveStateInObjectRangeCheck> searcher(m_caster, p_Creature, u_check);
|
||||||
|
|
||||||
TypeContainerVisitor<MaNGOS::CreatureLastSearcher<MaNGOS::NearestCreatureEntryWithLiveStateInObjectRangeCheck>, GridTypeMapContainer > grid_creature_searcher(searcher);
|
Cell::VisitGridObjects(m_caster, searcher, range);
|
||||||
|
|
||||||
cell.Visit(p, grid_creature_searcher, *m_caster->GetMap(), *m_caster, range);
|
|
||||||
|
|
||||||
range = u_check.GetLastRange();
|
range = u_check.GetLastRange();
|
||||||
}
|
}
|
||||||
|
|
@ -5510,17 +5460,10 @@ SpellCastResult Spell::CheckItems()
|
||||||
// check spell focus object
|
// check spell focus object
|
||||||
if(m_spellInfo->RequiresSpellFocus)
|
if(m_spellInfo->RequiresSpellFocus)
|
||||||
{
|
{
|
||||||
CellPair p(MaNGOS::ComputeCellPair(m_caster->GetPositionX(), m_caster->GetPositionY()));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
|
|
||||||
GameObject* ok = NULL;
|
GameObject* ok = NULL;
|
||||||
MaNGOS::GameObjectFocusCheck go_check(m_caster,m_spellInfo->RequiresSpellFocus);
|
MaNGOS::GameObjectFocusCheck go_check(m_caster,m_spellInfo->RequiresSpellFocus);
|
||||||
MaNGOS::GameObjectSearcher<MaNGOS::GameObjectFocusCheck> checker(m_caster, ok, go_check);
|
MaNGOS::GameObjectSearcher<MaNGOS::GameObjectFocusCheck> checker(m_caster, ok, go_check);
|
||||||
|
Cell::VisitGridObjects(m_caster, checker, m_caster->GetMap()->GetVisibilityDistance());
|
||||||
TypeContainerVisitor<MaNGOS::GameObjectSearcher<MaNGOS::GameObjectFocusCheck>, GridTypeMapContainer > object_checker(checker);
|
|
||||||
Map& map = *m_caster->GetMap();
|
|
||||||
cell.Visit(p, object_checker, map, *m_caster, map.GetVisibilityDistance());
|
|
||||||
|
|
||||||
if(!ok)
|
if(!ok)
|
||||||
return SPELL_FAILED_REQUIRES_SPELL_FOCUS;
|
return SPELL_FAILED_REQUIRES_SPELL_FOCUS;
|
||||||
|
|
|
||||||
|
|
@ -754,32 +754,16 @@ void AreaAura::Update(uint32 diff)
|
||||||
}
|
}
|
||||||
case AREA_AURA_FRIEND:
|
case AREA_AURA_FRIEND:
|
||||||
{
|
{
|
||||||
CellPair p(MaNGOS::ComputeCellPair(caster->GetPositionX(), caster->GetPositionY()));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
cell.SetNoCreate();
|
|
||||||
|
|
||||||
MaNGOS::AnyFriendlyUnitInObjectRangeCheck u_check(caster, m_radius);
|
MaNGOS::AnyFriendlyUnitInObjectRangeCheck u_check(caster, m_radius);
|
||||||
MaNGOS::UnitListSearcher<MaNGOS::AnyFriendlyUnitInObjectRangeCheck> searcher(caster,targets, u_check);
|
MaNGOS::UnitListSearcher<MaNGOS::AnyFriendlyUnitInObjectRangeCheck> searcher(caster,targets, u_check);
|
||||||
TypeContainerVisitor<MaNGOS::UnitListSearcher<MaNGOS::AnyFriendlyUnitInObjectRangeCheck>, WorldTypeMapContainer > world_unit_searcher(searcher);
|
Cell::VisitAllObjects(caster, searcher, m_radius);
|
||||||
TypeContainerVisitor<MaNGOS::UnitListSearcher<MaNGOS::AnyFriendlyUnitInObjectRangeCheck>, GridTypeMapContainer > grid_unit_searcher(searcher);
|
|
||||||
cell.Visit(p, world_unit_searcher, *caster->GetMap(), *caster, m_radius);
|
|
||||||
cell.Visit(p, grid_unit_searcher, *caster->GetMap(), *caster, m_radius);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case AREA_AURA_ENEMY:
|
case AREA_AURA_ENEMY:
|
||||||
{
|
{
|
||||||
CellPair p(MaNGOS::ComputeCellPair(caster->GetPositionX(), caster->GetPositionY()));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
cell.SetNoCreate();
|
|
||||||
|
|
||||||
MaNGOS::AnyAoETargetUnitInObjectRangeCheck u_check(caster, m_radius); // No GetCharmer in searcher
|
MaNGOS::AnyAoETargetUnitInObjectRangeCheck u_check(caster, m_radius); // No GetCharmer in searcher
|
||||||
MaNGOS::UnitListSearcher<MaNGOS::AnyAoETargetUnitInObjectRangeCheck> searcher(caster, targets, u_check);
|
MaNGOS::UnitListSearcher<MaNGOS::AnyAoETargetUnitInObjectRangeCheck> searcher(caster, targets, u_check);
|
||||||
TypeContainerVisitor<MaNGOS::UnitListSearcher<MaNGOS::AnyAoETargetUnitInObjectRangeCheck>, WorldTypeMapContainer > world_unit_searcher(searcher);
|
Cell::VisitAllObjects(caster, searcher, m_radius);
|
||||||
TypeContainerVisitor<MaNGOS::UnitListSearcher<MaNGOS::AnyAoETargetUnitInObjectRangeCheck>, GridTypeMapContainer > grid_unit_searcher(searcher);
|
|
||||||
cell.Visit(p, world_unit_searcher, *caster->GetMap(), *caster, m_radius);
|
|
||||||
cell.Visit(p, grid_unit_searcher, *caster->GetMap(), *caster, m_radius);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case AREA_AURA_OWNER:
|
case AREA_AURA_OWNER:
|
||||||
|
|
@ -7870,18 +7854,9 @@ void Aura::PeriodicDummyTick()
|
||||||
// eff_radius ==0
|
// eff_radius ==0
|
||||||
float radius = GetSpellMaxRange(sSpellRangeStore.LookupEntry(spell->rangeIndex));
|
float radius = GetSpellMaxRange(sSpellRangeStore.LookupEntry(spell->rangeIndex));
|
||||||
|
|
||||||
CellPair p(MaNGOS::ComputeCellPair(m_target->GetPositionX(),m_target->GetPositionY()));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
|
|
||||||
MaNGOS::AnyUnfriendlyVisibleUnitInObjectRangeCheck u_check(m_target, m_target, radius);
|
MaNGOS::AnyUnfriendlyVisibleUnitInObjectRangeCheck u_check(m_target, m_target, radius);
|
||||||
MaNGOS::UnitListSearcher<MaNGOS::AnyUnfriendlyVisibleUnitInObjectRangeCheck> checker(m_target, targets, u_check);
|
MaNGOS::UnitListSearcher<MaNGOS::AnyUnfriendlyVisibleUnitInObjectRangeCheck> checker(m_target, targets, u_check);
|
||||||
|
Cell::VisitAllObjects(m_target, checker, radius);
|
||||||
TypeContainerVisitor<MaNGOS::UnitListSearcher<MaNGOS::AnyUnfriendlyVisibleUnitInObjectRangeCheck>, GridTypeMapContainer > grid_object_checker(checker);
|
|
||||||
TypeContainerVisitor<MaNGOS::UnitListSearcher<MaNGOS::AnyUnfriendlyVisibleUnitInObjectRangeCheck>, WorldTypeMapContainer > world_object_checker(checker);
|
|
||||||
|
|
||||||
cell.Visit(p, grid_object_checker, *m_target->GetMap(), *m_target, radius);
|
|
||||||
cell.Visit(p, world_object_checker, *m_target->GetMap(), *m_target, radius);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(targets.empty())
|
if(targets.empty())
|
||||||
|
|
|
||||||
|
|
@ -78,20 +78,11 @@ TotemAI::UpdateAI(const uint32 /*diff*/)
|
||||||
!victim->isTargetableForAttack() || !m_creature->IsWithinDistInMap(victim, max_range) ||
|
!victim->isTargetableForAttack() || !m_creature->IsWithinDistInMap(victim, max_range) ||
|
||||||
m_creature->IsFriendlyTo(victim) || !victim->isVisibleForOrDetect(m_creature,m_creature,false) )
|
m_creature->IsFriendlyTo(victim) || !victim->isVisibleForOrDetect(m_creature,m_creature,false) )
|
||||||
{
|
{
|
||||||
CellPair p(MaNGOS::ComputeCellPair(m_creature->GetPositionX(),m_creature->GetPositionY()));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
|
|
||||||
victim = NULL;
|
victim = NULL;
|
||||||
|
|
||||||
MaNGOS::NearestAttackableUnitInObjectRangeCheck u_check(m_creature, m_creature, max_range);
|
MaNGOS::NearestAttackableUnitInObjectRangeCheck u_check(m_creature, m_creature, max_range);
|
||||||
MaNGOS::UnitLastSearcher<MaNGOS::NearestAttackableUnitInObjectRangeCheck> checker(m_creature,victim, u_check);
|
MaNGOS::UnitLastSearcher<MaNGOS::NearestAttackableUnitInObjectRangeCheck> checker(m_creature,victim, u_check);
|
||||||
|
Cell::VisitAllObjects(m_creature, checker, max_range);
|
||||||
TypeContainerVisitor<MaNGOS::UnitLastSearcher<MaNGOS::NearestAttackableUnitInObjectRangeCheck>, GridTypeMapContainer > grid_object_checker(checker);
|
|
||||||
TypeContainerVisitor<MaNGOS::UnitLastSearcher<MaNGOS::NearestAttackableUnitInObjectRangeCheck>, WorldTypeMapContainer > world_object_checker(checker);
|
|
||||||
|
|
||||||
cell.Visit(p, grid_object_checker, *m_creature->GetMap(), *m_creature, max_range);
|
|
||||||
cell.Visit(p, world_object_checker, *m_creature->GetMap(), *m_creature, max_range);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// If have target
|
// If have target
|
||||||
|
|
|
||||||
|
|
@ -12931,21 +12931,11 @@ void Unit::UpdateReactives( uint32 p_time )
|
||||||
|
|
||||||
Unit* Unit::SelectRandomUnfriendlyTarget(Unit* except /*= NULL*/, float radius /*= ATTACK_DISTANCE*/) const
|
Unit* Unit::SelectRandomUnfriendlyTarget(Unit* except /*= NULL*/, float radius /*= ATTACK_DISTANCE*/) const
|
||||||
{
|
{
|
||||||
CellPair p(MaNGOS::ComputeCellPair(GetPositionX(), GetPositionY()));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
cell.SetNoCreate();
|
|
||||||
|
|
||||||
std::list<Unit *> targets;
|
std::list<Unit *> targets;
|
||||||
|
|
||||||
MaNGOS::AnyUnfriendlyUnitInObjectRangeCheck u_check(this, this, radius);
|
MaNGOS::AnyUnfriendlyUnitInObjectRangeCheck u_check(this, this, radius);
|
||||||
MaNGOS::UnitListSearcher<MaNGOS::AnyUnfriendlyUnitInObjectRangeCheck> searcher(this, targets, u_check);
|
MaNGOS::UnitListSearcher<MaNGOS::AnyUnfriendlyUnitInObjectRangeCheck> searcher(this, targets, u_check);
|
||||||
|
Cell::VisitAllObjects(this, searcher, ATTACK_DISTANCE);
|
||||||
TypeContainerVisitor<MaNGOS::UnitListSearcher<MaNGOS::AnyUnfriendlyUnitInObjectRangeCheck>, WorldTypeMapContainer > world_unit_searcher(searcher);
|
|
||||||
TypeContainerVisitor<MaNGOS::UnitListSearcher<MaNGOS::AnyUnfriendlyUnitInObjectRangeCheck>, GridTypeMapContainer > grid_unit_searcher(searcher);
|
|
||||||
|
|
||||||
cell.Visit(p, world_unit_searcher, *GetMap(), *this, radius);
|
|
||||||
cell.Visit(p, grid_unit_searcher, *GetMap(), *this, radius);
|
|
||||||
|
|
||||||
// remove current target
|
// remove current target
|
||||||
if(except)
|
if(except)
|
||||||
|
|
@ -12979,22 +12969,12 @@ Unit* Unit::SelectRandomUnfriendlyTarget(Unit* except /*= NULL*/, float radius /
|
||||||
|
|
||||||
Unit* Unit::SelectRandomFriendlyTarget(Unit* except /*= NULL*/, float radius /*= ATTACK_DISTANCE*/) const
|
Unit* Unit::SelectRandomFriendlyTarget(Unit* except /*= NULL*/, float radius /*= ATTACK_DISTANCE*/) const
|
||||||
{
|
{
|
||||||
CellPair p(MaNGOS::ComputeCellPair(GetPositionX(), GetPositionY()));
|
|
||||||
Cell cell(p);
|
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
|
||||||
cell.SetNoCreate();
|
|
||||||
|
|
||||||
std::list<Unit *> targets;
|
std::list<Unit *> targets;
|
||||||
|
|
||||||
MaNGOS::AnyFriendlyUnitInObjectRangeCheck u_check(this, radius);
|
MaNGOS::AnyFriendlyUnitInObjectRangeCheck u_check(this, radius);
|
||||||
MaNGOS::UnitListSearcher<MaNGOS::AnyFriendlyUnitInObjectRangeCheck> searcher(this, targets, u_check);
|
MaNGOS::UnitListSearcher<MaNGOS::AnyFriendlyUnitInObjectRangeCheck> searcher(this, targets, u_check);
|
||||||
|
|
||||||
TypeContainerVisitor<MaNGOS::UnitListSearcher<MaNGOS::AnyFriendlyUnitInObjectRangeCheck>, WorldTypeMapContainer > world_unit_searcher(searcher);
|
Cell::VisitAllObjects(this, searcher, radius);
|
||||||
TypeContainerVisitor<MaNGOS::UnitListSearcher<MaNGOS::AnyFriendlyUnitInObjectRangeCheck>, GridTypeMapContainer > grid_unit_searcher(searcher);
|
|
||||||
|
|
||||||
cell.Visit(p, world_unit_searcher, *GetMap(), *this, radius);
|
|
||||||
cell.Visit(p, grid_unit_searcher, *GetMap(), *this, radius);
|
|
||||||
|
|
||||||
// remove current target
|
// remove current target
|
||||||
if(except)
|
if(except)
|
||||||
targets.remove(except);
|
targets.remove(except);
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "9735"
|
#define REVISION_NR "9736"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue