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

View File

@@ -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');

View File

@@ -21,8 +21,8 @@
enum Texts
{
EMOTE_AGGRO = 0,
EMOTE_MANA_FULL = 1
EMOTE_AGGRO = 0,
EMOTE_MANA_FULL = 1
};
enum Spells
@@ -40,17 +40,16 @@ enum Spells
enum Events
{
EVENT_TRAMPLE = 1,
EVENT_DRAIN_MANA = 2,
EVENT_STONE_PHASE = 3,
EVENT_STONE_PHASE_END = 4,
EVENT_WIDE_SLASH = 5,
EVENT_SPELL_TRAMPLE = 1,
EVENT_SPELL_DRAIN_MANA = 2,
EVENT_STONE_PHASE = 3,
EVENT_STONE_PHASE_END = 4
};
enum Actions
{
ACTION_STONE_PHASE_START = 1,
ACTION_STONE_PHASE_END = 2,
ACTION_STONE_PHASE_START = 1,
ACTION_STONE_PHASE_END = 2
};
class boss_moam : public CreatureScript
@@ -60,9 +59,7 @@ public:
struct boss_moamAI : public BossAI
{
boss_moamAI(Creature* creature) : BossAI(creature, DATA_MOAM)
{
}
boss_moamAI(Creature* creature) : BossAI(creature, DATA_MOAM) {}
void Reset() override
{
@@ -70,17 +67,6 @@ public:
me->SetPower(POWER_MANA, 0);
me->SetRegeneratingPower(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
@@ -96,10 +82,10 @@ public:
}
case ACTION_STONE_PHASE_START:
{
DoCast(me, SPELL_SUMMON_MANA_FIEND_1);
DoCast(me, SPELL_SUMMON_MANA_FIEND_2);
DoCast(me, SPELL_SUMMON_MANA_FIEND_3);
DoCast(me, SPELL_ENERGIZE);
DoCastSelf(SPELL_SUMMON_MANA_FIEND_1);
DoCastSelf(SPELL_SUMMON_MANA_FIEND_2);
DoCastSelf(SPELL_SUMMON_MANA_FIEND_3);
DoCastSelf(SPELL_ENERGIZE);
events.ScheduleEvent(EVENT_STONE_PHASE_END, 90000);
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
{
_JustDied();
@@ -120,26 +115,13 @@ public:
return;
events.Update(diff);
if (me->GetPower(POWER_MANA) == me->GetMaxPower(POWER_MANA))
{
if (_isStonePhase)
DoAction(ACTION_STONE_PHASE_END);
DoCastAOE(SPELL_ARCANE_ERUPTION);
Talk(EMOTE_MANA_FULL);
DoCastAOE(SPELL_ARCANE_ERUPTION, true);
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())
{
switch (eventId)
@@ -147,37 +129,38 @@ public:
case EVENT_STONE_PHASE:
DoAction(ACTION_STONE_PHASE_START);
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;
{
const std::list<HostileReference*>& threatlist = me->GetThreatMgr().getThreatList();
for (std::list<HostileReference*>::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr)
{
if ((*itr)->getTarget()->GetTypeId() == TYPEID_PLAYER && (*itr)->getTarget()->getPowerType() == POWER_MANA)
{
targetList.push_back((*itr)->getTarget());
}
}
}
Acore::Containers::RandomResize(targetList, 5);
Acore::Containers::RandomResize(targetList, 6);
for (std::list<Unit*>::iterator itr = targetList.begin(); itr != targetList.end(); ++itr)
{
DoCast(*itr, SPELL_DRAIN_MANA);
events.ScheduleEvent(EVENT_DRAIN_MANA, urand(5000, 15000));
}
events.ScheduleEvent(EVENT_SPELL_DRAIN_MANA, urand(2000, 6000));
break;
}/*
case EVENT_WIDE_SLASH:
DoCast(me, SPELL_WIDE_SLASH);
events.ScheduleEvent(EVENT_WIDE_SLASH, 11000);
}
case EVENT_SPELL_TRAMPLE:
DoCastVictim(SPELL_TRAMPLE);
events.ScheduleEvent(EVENT_SPELL_TRAMPLE, 15000);
break;
case EVENT_TRASH:
DoCast(me, SPELL_TRASH);
events.ScheduleEvent(EVENT_WIDE_SLASH, 16000);
break;*/
default:
break;
}
}
DoMeleeAttackIfReady();
}
private: