aboutsummaryrefslogtreecommitdiff
path: root/src/game/CreatureEventAI.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/CreatureEventAI.cpp')
-rw-r--r--src/game/CreatureEventAI.cpp66
1 files changed, 55 insertions, 11 deletions
diff --git a/src/game/CreatureEventAI.cpp b/src/game/CreatureEventAI.cpp
index 0026658f319..7625ce0b74f 100644
--- a/src/game/CreatureEventAI.cpp
+++ b/src/game/CreatureEventAI.cpp
@@ -32,6 +32,40 @@
#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)
@@ -697,7 +731,6 @@ void CreatureEventAI::ProcessAction(CreatureEventAI_Action const& action, uint32
break;
}
case ACTION_T_UPDATE_TEMPLATE:
- {
if (m_creature->GetEntry() == action.update_template.creatureId)
{
@@ -706,10 +739,8 @@ void CreatureEventAI::ProcessAction(CreatureEventAI_Action const& action, uint32
}
m_creature->UpdateEntry(action.update_template.creatureId, action.update_template.team ? HORDE : ALLIANCE);
- }
- break;
+ break;
case ACTION_T_DIE:
- {
if (m_creature->isDead())
{
@@ -717,10 +748,8 @@ void CreatureEventAI::ProcessAction(CreatureEventAI_Action const& action, uint32
return;
}
m_creature->DealDamage(m_creature, m_creature->GetMaxHealth(),NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
- }
- break;
+ break;
case ACTION_T_ZONE_COMBAT_PULSE:
- {
if (!m_creature->isInCombat() || !m_creature->GetMap()->IsDungeon())
{
@@ -729,6 +758,25 @@ void CreatureEventAI::ProcessAction(CreatureEventAI_Action const& action, uint32
}
DoZoneInCombat(m_creature);
+ 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());
+ break;
}
break;
@@ -755,10 +803,6 @@ void CreatureEventAI::ProcessAction(CreatureEventAI_Action const& action, uint32
}
break;
}
- case ACTION_T_CALL_ASSISTANCE:
- m_creature->SetNoCallAssistance(false);
- m_creature->CallAssistance(action.raw.param1);
- break;
}
}