fix(Scripts/RuinsOfAhnQiraj): Improve Moam (#12142)
This commit is contained in:
@@ -0,0 +1,8 @@
|
|||||||
|
--
|
||||||
|
|
||||||
|
UPDATE `creature_template` SET `mingold`=0, `maxgold`=0, `AIName`='SmartAI' WHERE `entry`=15527;
|
||||||
|
DELETE FROM `smart_scripts` WHERE `entryorguid`=15527 AND `source_type`=0;
|
||||||
|
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `target_type`, `comment`) VALUES
|
||||||
|
(15527, 0, 0, 0, 0, 0, 100, 0, 6000, 6000, 6000, 6000, 11, 25679, 2, 2, 'Mana Fiend - In Combat - Cast Arcane Explosion'),
|
||||||
|
(15527, 0, 1, 0, 13, 0, 100, 0, 10000, 20000, 0, 0, 11, 15122, 0, 2, 'Mana Fiend - In Combat - Cast Counterspell');
|
||||||
|
|
||||||
@@ -21,8 +21,8 @@
|
|||||||
|
|
||||||
enum Texts
|
enum Texts
|
||||||
{
|
{
|
||||||
EMOTE_AGGRO = 0,
|
EMOTE_AGGRO = 0,
|
||||||
EMOTE_MANA_FULL = 1
|
EMOTE_MANA_FULL = 1
|
||||||
};
|
};
|
||||||
|
|
||||||
enum Spells
|
enum Spells
|
||||||
@@ -40,17 +40,16 @@ enum Spells
|
|||||||
|
|
||||||
enum Events
|
enum Events
|
||||||
{
|
{
|
||||||
EVENT_TRAMPLE = 1,
|
EVENT_SPELL_TRAMPLE = 1,
|
||||||
EVENT_DRAIN_MANA = 2,
|
EVENT_SPELL_DRAIN_MANA = 2,
|
||||||
EVENT_STONE_PHASE = 3,
|
EVENT_STONE_PHASE = 3,
|
||||||
EVENT_STONE_PHASE_END = 4,
|
EVENT_STONE_PHASE_END = 4
|
||||||
EVENT_WIDE_SLASH = 5,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
enum Actions
|
enum Actions
|
||||||
{
|
{
|
||||||
ACTION_STONE_PHASE_START = 1,
|
ACTION_STONE_PHASE_START = 1,
|
||||||
ACTION_STONE_PHASE_END = 2,
|
ACTION_STONE_PHASE_END = 2
|
||||||
};
|
};
|
||||||
|
|
||||||
class boss_moam : public CreatureScript
|
class boss_moam : public CreatureScript
|
||||||
@@ -60,9 +59,7 @@ public:
|
|||||||
|
|
||||||
struct boss_moamAI : public BossAI
|
struct boss_moamAI : public BossAI
|
||||||
{
|
{
|
||||||
boss_moamAI(Creature* creature) : BossAI(creature, DATA_MOAM)
|
boss_moamAI(Creature* creature) : BossAI(creature, DATA_MOAM) {}
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void Reset() override
|
void Reset() override
|
||||||
{
|
{
|
||||||
@@ -70,17 +67,6 @@ public:
|
|||||||
me->SetPower(POWER_MANA, 0);
|
me->SetPower(POWER_MANA, 0);
|
||||||
me->SetRegeneratingPower(false);
|
me->SetRegeneratingPower(false);
|
||||||
_isStonePhase = false;
|
_isStonePhase = false;
|
||||||
events.ScheduleEvent(EVENT_STONE_PHASE, 90000);
|
|
||||||
//events.ScheduleEvent(EVENT_WIDE_SLASH, 11000);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask) override
|
|
||||||
{
|
|
||||||
if (!_isStonePhase && HealthBelowPct(45))
|
|
||||||
{
|
|
||||||
_isStonePhase = true;
|
|
||||||
DoAction(ACTION_STONE_PHASE_START);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DoAction(int32 action) override
|
void DoAction(int32 action) override
|
||||||
@@ -96,10 +82,10 @@ public:
|
|||||||
}
|
}
|
||||||
case ACTION_STONE_PHASE_START:
|
case ACTION_STONE_PHASE_START:
|
||||||
{
|
{
|
||||||
DoCast(me, SPELL_SUMMON_MANA_FIEND_1);
|
DoCastSelf(SPELL_SUMMON_MANA_FIEND_1);
|
||||||
DoCast(me, SPELL_SUMMON_MANA_FIEND_2);
|
DoCastSelf(SPELL_SUMMON_MANA_FIEND_2);
|
||||||
DoCast(me, SPELL_SUMMON_MANA_FIEND_3);
|
DoCastSelf(SPELL_SUMMON_MANA_FIEND_3);
|
||||||
DoCast(me, SPELL_ENERGIZE);
|
DoCastSelf(SPELL_ENERGIZE);
|
||||||
events.ScheduleEvent(EVENT_STONE_PHASE_END, 90000);
|
events.ScheduleEvent(EVENT_STONE_PHASE_END, 90000);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -108,6 +94,15 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EnterCombat(Unit* who) override
|
||||||
|
{
|
||||||
|
BossAI::EnterCombat(who);
|
||||||
|
Talk(EMOTE_AGGRO);
|
||||||
|
events.ScheduleEvent(EVENT_STONE_PHASE, 90000);
|
||||||
|
events.ScheduleEvent(EVENT_SPELL_TRAMPLE, 9000);
|
||||||
|
events.ScheduleEvent(EVENT_SPELL_DRAIN_MANA, 3000);
|
||||||
|
}
|
||||||
|
|
||||||
void JustDied(Unit* /*killer*/) override
|
void JustDied(Unit* /*killer*/) override
|
||||||
{
|
{
|
||||||
_JustDied();
|
_JustDied();
|
||||||
@@ -120,26 +115,13 @@ public:
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
events.Update(diff);
|
events.Update(diff);
|
||||||
|
|
||||||
if (me->GetPower(POWER_MANA) == me->GetMaxPower(POWER_MANA))
|
if (me->GetPower(POWER_MANA) == me->GetMaxPower(POWER_MANA))
|
||||||
{
|
{
|
||||||
if (_isStonePhase)
|
Talk(EMOTE_MANA_FULL);
|
||||||
DoAction(ACTION_STONE_PHASE_END);
|
DoCastAOE(SPELL_ARCANE_ERUPTION, true);
|
||||||
DoCastAOE(SPELL_ARCANE_ERUPTION);
|
|
||||||
me->SetPower(POWER_MANA, 0);
|
me->SetPower(POWER_MANA, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_isStonePhase)
|
|
||||||
{
|
|
||||||
if (events.ExecuteEvent() == EVENT_STONE_PHASE_END)
|
|
||||||
DoAction(ACTION_STONE_PHASE_END);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Messing up mana-drain channel
|
|
||||||
//if (me->HasUnitState(UNIT_STATE_CASTING))
|
|
||||||
// return;
|
|
||||||
|
|
||||||
while (uint32 eventId = events.ExecuteEvent())
|
while (uint32 eventId = events.ExecuteEvent())
|
||||||
{
|
{
|
||||||
switch (eventId)
|
switch (eventId)
|
||||||
@@ -147,37 +129,38 @@ public:
|
|||||||
case EVENT_STONE_PHASE:
|
case EVENT_STONE_PHASE:
|
||||||
DoAction(ACTION_STONE_PHASE_START);
|
DoAction(ACTION_STONE_PHASE_START);
|
||||||
break;
|
break;
|
||||||
case EVENT_DRAIN_MANA:
|
case EVENT_STONE_PHASE_END:
|
||||||
|
DoAction(ACTION_STONE_PHASE_END);
|
||||||
|
break;
|
||||||
|
case EVENT_SPELL_DRAIN_MANA:
|
||||||
{
|
{
|
||||||
std::list<Unit*> targetList;
|
std::list<Unit*> targetList;
|
||||||
{
|
{
|
||||||
const std::list<HostileReference*>& threatlist = me->GetThreatMgr().getThreatList();
|
const std::list<HostileReference*>& threatlist = me->GetThreatMgr().getThreatList();
|
||||||
for (std::list<HostileReference*>::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr)
|
for (std::list<HostileReference*>::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr)
|
||||||
|
{
|
||||||
if ((*itr)->getTarget()->GetTypeId() == TYPEID_PLAYER && (*itr)->getTarget()->getPowerType() == POWER_MANA)
|
if ((*itr)->getTarget()->GetTypeId() == TYPEID_PLAYER && (*itr)->getTarget()->getPowerType() == POWER_MANA)
|
||||||
|
{
|
||||||
targetList.push_back((*itr)->getTarget());
|
targetList.push_back((*itr)->getTarget());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Acore::Containers::RandomResize(targetList, 6);
|
||||||
Acore::Containers::RandomResize(targetList, 5);
|
|
||||||
|
|
||||||
for (std::list<Unit*>::iterator itr = targetList.begin(); itr != targetList.end(); ++itr)
|
for (std::list<Unit*>::iterator itr = targetList.begin(); itr != targetList.end(); ++itr)
|
||||||
|
{
|
||||||
DoCast(*itr, SPELL_DRAIN_MANA);
|
DoCast(*itr, SPELL_DRAIN_MANA);
|
||||||
|
}
|
||||||
events.ScheduleEvent(EVENT_DRAIN_MANA, urand(5000, 15000));
|
events.ScheduleEvent(EVENT_SPELL_DRAIN_MANA, urand(2000, 6000));
|
||||||
break;
|
break;
|
||||||
}/*
|
}
|
||||||
case EVENT_WIDE_SLASH:
|
case EVENT_SPELL_TRAMPLE:
|
||||||
DoCast(me, SPELL_WIDE_SLASH);
|
DoCastVictim(SPELL_TRAMPLE);
|
||||||
events.ScheduleEvent(EVENT_WIDE_SLASH, 11000);
|
events.ScheduleEvent(EVENT_SPELL_TRAMPLE, 15000);
|
||||||
break;
|
break;
|
||||||
case EVENT_TRASH:
|
|
||||||
DoCast(me, SPELL_TRASH);
|
|
||||||
events.ScheduleEvent(EVENT_WIDE_SLASH, 16000);
|
|
||||||
break;*/
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DoMeleeAttackIfReady();
|
DoMeleeAttackIfReady();
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
|
|||||||
Reference in New Issue
Block a user