fix(Scripts/RuinsOfAhnQiraj): Improve Moam (#12142)

This commit is contained in:
Eddy Vega
2022-07-25 19:10:50 -06:00
committed by GitHub
parent e9474a38fc
commit 6e659a1681
2 changed files with 48 additions and 57 deletions
@@ -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: