aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/game/Creature.cpp19
-rw-r--r--src/game/Creature.h1
-rw-r--r--src/game/CreatureEventAI.cpp51
-rw-r--r--src/game/GridNotifiers.h33
4 files changed, 54 insertions, 50 deletions
diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp
index f817e8a57c9..7f249b36fbd 100644
--- a/src/game/Creature.cpp
+++ b/src/game/Creature.cpp
@@ -2039,6 +2039,25 @@ void Creature::CallAssistance()
}
}
+void Creature::CallForHelp(float fRadius)
+{
+ if (fRadius <= 0.0f || !getVictim() || isPet() || isCharmed())
+ 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::CreatureWorker<MaNGOS::CallOfHelpCreatureInRangeDo> worker(this, u_do);
+
+ TypeContainerVisitor<MaNGOS::CreatureWorker<MaNGOS::CallOfHelpCreatureInRangeDo>, GridTypeMapContainer > grid_creature_searcher(worker);
+
+ CellLock<GridReadGuard> cell_lock(cell, p);
+ cell_lock->Visit(cell_lock, grid_creature_searcher, *GetMap());
+}
+
bool Creature::CanAssistTo(const Unit* u, const Unit* enemy, bool checkfaction /*= true*/) const
{
// is it true?
diff --git a/src/game/Creature.h b/src/game/Creature.h
index 0ee6d4618c7..68c353205f7 100644
--- a/src/game/Creature.h
+++ b/src/game/Creature.h
@@ -644,6 +644,7 @@ class TRINITY_DLL_SPEC Creature : public Unit
Unit* SelectNearestTarget(float dist = 0) const;
void DoFleeToGetAssistance();
+ void CallForHelp(float fRadius);
void CallAssistance();
void SetNoCallAssistance(bool val) { m_AlreadyCallAssistance = val; }
void SetNoSearchAssistance(bool val) { m_AlreadySearchedAssistance = val; }
diff --git a/src/game/CreatureEventAI.cpp b/src/game/CreatureEventAI.cpp
index e2c51f40804..834741fd2ae 100644
--- a/src/game/CreatureEventAI.cpp
+++ b/src/game/CreatureEventAI.cpp
@@ -29,43 +29,8 @@
#include "GameEventMgr.h"
#include "GridNotifiers.h"
#include "GridNotifiersImpl.h"
-#include "WorldPacket.h"
#include "InstanceData.h"
-namespace MaNGOS
-{
- class CallOfHelpCreatureInRangeDo // do attack at call of help to friendly crearture
- {
- public:
- CallOfHelpCreatureInRangeDo(Unit* funit, Unit* enemy, float range)
- : i_funit(funit), i_enemy(enemy), i_range(range)
- {}
- void operator()(Creature* u)
- {
- if (u == i_funit)
- return;
-
- if (!u->CanAssistTo(i_funit, i_enemy, false))
- return;
-
- // too far
- if( !i_funit->IsWithinDistInMap(u, i_range) )
- return;
-
- // only if see assisted creature
- if( !i_funit->IsWithinLOSInMap(u) )
- return;
-
- if(u->AI())
- u->AI()->AttackStart(i_enemy);
- }
- private:
- Unit* const i_funit;
- Unit* const i_enemy;
- float i_range;
- };
-}
-
bool CreatureEventAIHolder::UpdateRepeatTimer( Creature* creature, uint32 repeatMin, uint32 repeatMax )
{
if (repeatMin == repeatMax)
@@ -765,21 +730,7 @@ void CreatureEventAI::ProcessAction(CreatureEventAI_Action const& action, uint32
break;
case ACTION_T_CALL_FOR_HELP:
{
- if (!m_creature->getVictim())
- return;
-
- CellPair p(MaNGOS::ComputeCellPair(m_creature->GetPositionX(), m_creature->GetPositionY()));
- Cell cell(p);
- cell.data.Part.reserved = ALL_DISTRICT;
- cell.SetNoCreate();
-
- MaNGOS::CallOfHelpCreatureInRangeDo u_do(m_creature, m_creature->getVictim(), action.call_for_help.radius);
- MaNGOS::CreatureWorker<MaNGOS::CallOfHelpCreatureInRangeDo> worker(m_creature, u_do);
-
- TypeContainerVisitor<MaNGOS::CreatureWorker<MaNGOS::CallOfHelpCreatureInRangeDo>, GridTypeMapContainer > grid_creature_searcher(worker);
-
- CellLock<GridReadGuard> cell_lock(cell, p);
- cell_lock->Visit(cell_lock, grid_creature_searcher, *m_creature->GetMap());
+ m_creature->CallForHelp(action.call_for_help.radius);
break;
}
break;
diff --git a/src/game/GridNotifiers.h b/src/game/GridNotifiers.h
index a1bee4df650..25caa970c39 100644
--- a/src/game/GridNotifiers.h
+++ b/src/game/GridNotifiers.h
@@ -32,6 +32,7 @@
#include "GameObject.h"
#include "Player.h"
#include "Unit.h"
+#include "CreatureAI.h"
class Player;
//class Map;
@@ -905,6 +906,38 @@ namespace Trinity
float i_range;
};
+ // do attack at call of help to friendly crearture
+ class CallOfHelpCreatureInRangeDo
+ {
+ public:
+ CallOfHelpCreatureInRangeDo(Unit* funit, Unit* enemy, float range)
+ : i_funit(funit), i_enemy(enemy), i_range(range)
+ {}
+ void operator()(Creature* u)
+ {
+ if (u == i_funit)
+ return;
+
+ if (!u->CanAssistTo(i_funit, i_enemy, false))
+ return;
+
+ // too far
+ if (!i_funit->IsWithinDistInMap(u, i_range))
+ return;
+
+ // only if see assisted creature
+ if (!i_funit->IsWithinLOSInMap(u))
+ return;
+
+ if (u->AI())
+ u->AI()->AttackStart(i_enemy);
+ }
+ private:
+ Unit* const i_funit;
+ Unit* const i_enemy;
+ float i_range;
+ };
+
struct AnyDeadUnitCheck
{
bool operator()(Unit* u) { return !u->isAlive(); }