mirror of
https://github.com/mangosfour/server.git
synced 2025-12-13 04:37:00 +00:00
[7860] Implement creature event ai ACTION_T_CALL_FOR_HELP for explicit call for help in some script cases.
This commit is contained in:
parent
159258b668
commit
f332c000d1
8 changed files with 142 additions and 61 deletions
|
|
@ -30,6 +30,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)
|
||||
|
|
@ -705,7 +739,6 @@ void CreatureEventAI::ProcessAction(CreatureEventAI_Action const& action, uint32
|
|||
break;
|
||||
}
|
||||
case ACTION_T_UPDATE_TEMPLATE:
|
||||
{
|
||||
if (m_creature->GetEntry() == action.update_template.creatureId)
|
||||
{
|
||||
|
||||
|
|
@ -714,10 +747,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())
|
||||
{
|
||||
|
||||
|
|
@ -725,10 +756,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())
|
||||
{
|
||||
|
||||
|
|
@ -737,8 +766,26 @@ 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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue