fix(Scripts/BlackTemple): Move Supremus to TaskScheduler and tweak a bit (#19418)
* Update boss_supremus.cpp * Update boss_supremus.cpp * Update boss_supremus.cpp * ble * egh * ye * ermps * ok done * Update SpellInfoCorrections.cpp * Update SpellInfoCorrections.cpp
This commit is contained in:
@@ -0,0 +1,12 @@
|
|||||||
|
--
|
||||||
|
DELETE FROM `creature_text` WHERE (`CreatureID` = 22898);
|
||||||
|
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
|
||||||
|
(22898, 0, 0, 'Supremus acquires a new target!', 41, 0, 100, 0, 0, 0, 21959, 0, 'Supremus'),
|
||||||
|
(22898, 1, 0, 'Supremus punches the ground in anger!', 41, 0, 100, 53, 0, 0, 21019, 0, 'Supremus'),
|
||||||
|
(22898, 2, 0, 'The ground begins to crack open!', 41, 0, 100, 0, 0, 0, 21018, 0, 'Supremus'),
|
||||||
|
(22898, 3, 0, '%s goes into a berserker rage!', 16, 0, 100, 0, 0, 0, 4428, 0, 'Supremus');
|
||||||
|
|
||||||
|
UPDATE `creature_model_info` SET `CombatReach` = 40 WHERE `DisplayID` = 21145;
|
||||||
|
|
||||||
|
UPDATE `creature_template` SET `AIName` = '', `ScriptName` = 'npc_supremus_punch_invisible_stalker', `speed_run` = 1.28571 WHERE (`entry` = 23095);
|
||||||
|
DELETE FROM `creature_template_addon` WHERE (`entry` = 23095);
|
||||||
@@ -4834,6 +4834,12 @@ void SpellMgr::LoadSpellInfoCorrections()
|
|||||||
spellInfo->AuraInterruptFlags &= ~AURA_INTERRUPT_FLAG_NOT_ABOVEWATER;
|
spellInfo->AuraInterruptFlags &= ~AURA_INTERRUPT_FLAG_NOT_ABOVEWATER;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Molten Punch
|
||||||
|
ApplySpellFix({ 40126 }, [](SpellInfo* spellInfo)
|
||||||
|
{
|
||||||
|
spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo(TARGET_DEST_CASTER);
|
||||||
|
});
|
||||||
|
|
||||||
for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i)
|
for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i)
|
||||||
{
|
{
|
||||||
SpellInfo* spellInfo = mSpellInfoMap[i];
|
SpellInfo* spellInfo = mSpellInfoMap[i];
|
||||||
|
|||||||
@@ -24,76 +24,139 @@ enum Supremus
|
|||||||
EMOTE_NEW_TARGET = 0,
|
EMOTE_NEW_TARGET = 0,
|
||||||
EMOTE_PUNCH_GROUND = 1,
|
EMOTE_PUNCH_GROUND = 1,
|
||||||
EMOTE_GROUND_CRACK = 2,
|
EMOTE_GROUND_CRACK = 2,
|
||||||
|
EMOTE_BERSERK = 3,
|
||||||
|
|
||||||
SPELL_SNARE_SELF = 41922,
|
SPELL_SNARE_SELF = 41922,
|
||||||
SPELL_MOLTEN_PUNCH = 40126,
|
SPELL_MOLTEN_PUNCH = 40126,
|
||||||
|
SPELL_MOLTEN_FLAME = 40980,
|
||||||
SPELL_HATEFUL_STRIKE = 41926,
|
SPELL_HATEFUL_STRIKE = 41926,
|
||||||
SPELL_VOLCANIC_ERUPTION = 40276,
|
SPELL_VOLCANIC_ERUPTION = 40276,
|
||||||
SPELL_VOLCANIC_ERUPTION_TRIGGER = 40117,
|
SPELL_VOLCANIC_ERUPTION_TRIGGER = 40117,
|
||||||
SPELL_BERSERK = 45078,
|
SPELL_VOLCANIC_GEYSER = 42055,
|
||||||
|
SPELL_BERSERK = 26662,
|
||||||
SPELL_CHARGE = 41581,
|
SPELL_CHARGE = 41581,
|
||||||
|
|
||||||
NPC_SUPREMUS_PUNCH_STALKER = 23095,
|
SPELL_SERVERSIDE_RANDOM_TARGET = 41951, // Found in 55261. Used for Fixate target
|
||||||
|
|
||||||
EVENT_SPELL_BERSERK = 1,
|
NPC_SUPREMUS_VOLCANO = 23085,
|
||||||
EVENT_SPELL_HATEFUL_STRIKE = 2,
|
|
||||||
EVENT_SPELL_MOLTEN_FLAMES = 3,
|
|
||||||
EVENT_SWITCH_PHASE = 4,
|
|
||||||
EVENT_SPELL_VOLCANIC_ERUPTION = 5,
|
|
||||||
EVENT_SWITCH_TARGET = 6,
|
|
||||||
EVENT_CHECK_DIST = 7,
|
|
||||||
|
|
||||||
EVENT_GROUP_ABILITIES = 1
|
GROUP_ABILITIES = 1,
|
||||||
|
GROUP_MOLTEN_PUNCH = 2,
|
||||||
|
GROUP_PHASE_CHANGE = 3
|
||||||
};
|
};
|
||||||
|
|
||||||
struct boss_supremus : public BossAI
|
struct boss_supremus : public BossAI
|
||||||
{
|
{
|
||||||
boss_supremus(Creature* creature) : BossAI(creature, DATA_SUPREMUS) { }
|
boss_supremus(Creature* creature) : BossAI(creature, DATA_SUPREMUS)
|
||||||
|
{
|
||||||
|
scheduler.SetValidator([this]
|
||||||
|
{
|
||||||
|
return !me->HasUnitState(UNIT_STATE_CASTING);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void Reset() override
|
||||||
|
{
|
||||||
|
BossAI::Reset();
|
||||||
|
me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false);
|
||||||
|
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, false);
|
||||||
|
}
|
||||||
|
|
||||||
void JustEngagedWith(Unit* who) override
|
void JustEngagedWith(Unit* who) override
|
||||||
{
|
{
|
||||||
BossAI::JustEngagedWith(who);
|
BossAI::JustEngagedWith(who);
|
||||||
|
|
||||||
SchedulePhase(false);
|
SchedulePhase(true);
|
||||||
events.ScheduleEvent(EVENT_SPELL_BERSERK, 900000);
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_MOLTEN_FLAMES, 4000);
|
ScheduleTimedEvent(15min, [&]
|
||||||
|
{
|
||||||
|
DoCastSelf(SPELL_BERSERK, true);
|
||||||
|
Talk(EMOTE_BERSERK);
|
||||||
|
scheduler.CancelGroup(GROUP_ABILITIES); // Supremus stops all other abilities after berserking
|
||||||
|
scheduler.CancelGroup(GROUP_MOLTEN_PUNCH);
|
||||||
|
scheduler.CancelGroup(GROUP_PHASE_CHANGE);
|
||||||
|
}, 5min);
|
||||||
|
|
||||||
|
scheduler.Schedule(20s, [this](TaskContext context)
|
||||||
|
{
|
||||||
|
context.SetGroup(GROUP_MOLTEN_PUNCH);
|
||||||
|
DoCastSelf(SPELL_MOLTEN_PUNCH);
|
||||||
|
context.Repeat(15s, 20s);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void SchedulePhase(bool run)
|
void SchedulePhase(bool isSnared)
|
||||||
{
|
{
|
||||||
events.CancelEventGroup(EVENT_GROUP_ABILITIES);
|
scheduler.CancelGroup(GROUP_ABILITIES);
|
||||||
events.ScheduleEvent(EVENT_SWITCH_PHASE, 60000);
|
|
||||||
|
scheduler.Schedule(1min, [this](TaskContext context)
|
||||||
|
{
|
||||||
|
context.SetGroup(GROUP_PHASE_CHANGE);
|
||||||
|
SchedulePhase(me->HasAura(SPELL_SNARE_SELF));
|
||||||
|
});
|
||||||
|
|
||||||
DoResetThreatList();
|
DoResetThreatList();
|
||||||
|
|
||||||
if (!run)
|
// Hateful Strike Phase
|
||||||
|
if (isSnared)
|
||||||
{
|
{
|
||||||
events.ScheduleEvent(EVENT_SPELL_HATEFUL_STRIKE, 5000, EVENT_GROUP_ABILITIES);
|
scheduler.Schedule(8s, 15s, [this](TaskContext context)
|
||||||
|
{
|
||||||
|
context.SetGroup(GROUP_ABILITIES);
|
||||||
|
|
||||||
|
if (Unit* target = FindHatefulStrikeTarget())
|
||||||
|
DoCast(target, SPELL_HATEFUL_STRIKE);
|
||||||
|
|
||||||
|
context.Repeat(1500ms, 15s);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (me->HasAura(SPELL_SNARE_SELF))
|
||||||
|
Talk(EMOTE_PUNCH_GROUND);
|
||||||
|
|
||||||
me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false);
|
me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false);
|
||||||
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, false);
|
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, false);
|
||||||
me->RemoveAurasDueToSpell(SPELL_SNARE_SELF);
|
me->RemoveAurasDueToSpell(SPELL_SNARE_SELF);
|
||||||
}
|
}
|
||||||
|
// Gaze Phase
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
events.ScheduleEvent(EVENT_SPELL_VOLCANIC_ERUPTION, 5000, EVENT_GROUP_ABILITIES);
|
DoCastSelf(SPELL_SNARE_SELF, true);
|
||||||
events.ScheduleEvent(EVENT_SWITCH_TARGET, 0, EVENT_GROUP_ABILITIES);
|
|
||||||
events.ScheduleEvent(EVENT_CHECK_DIST, 0, EVENT_GROUP_ABILITIES);
|
scheduler.Schedule(5s, [this](TaskContext context)
|
||||||
|
{
|
||||||
|
context.SetGroup(GROUP_ABILITIES);
|
||||||
|
|
||||||
|
if (DoCastRandomTarget(SPELL_VOLCANIC_ERUPTION, 0, 100.f, true) == SPELL_CAST_OK)
|
||||||
|
Talk(EMOTE_GROUND_CRACK);
|
||||||
|
|
||||||
|
context.Repeat(10s, 18s);
|
||||||
|
}).Schedule(0s, [this](TaskContext context)
|
||||||
|
{
|
||||||
|
context.SetGroup(GROUP_ABILITIES);
|
||||||
|
|
||||||
|
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true))
|
||||||
|
{
|
||||||
|
DoResetThreatList();
|
||||||
|
me->AddThreat(target, 5000000.0f);
|
||||||
|
Talk(EMOTE_NEW_TARGET);
|
||||||
|
DoCastVictim(SPELL_CHARGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
context.Repeat(10s);
|
||||||
|
});
|
||||||
|
|
||||||
me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true);
|
me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true);
|
||||||
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, true);
|
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, true);
|
||||||
me->CastSpell(me, SPELL_SNARE_SELF, true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void JustSummoned(Creature* summon) override
|
void JustSummoned(Creature* summon) override
|
||||||
{
|
{
|
||||||
summons.Summon(summon);
|
summons.Summon(summon);
|
||||||
if (summon->GetEntry() == NPC_SUPREMUS_PUNCH_STALKER)
|
if (summon->GetEntry() == NPC_SUPREMUS_VOLCANO)
|
||||||
{
|
|
||||||
summon->ToTempSummon()->InitStats(20000);
|
|
||||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true))
|
|
||||||
summon->GetMotionMaster()->MoveFollow(target, 0.0f, 0.0f, MOTION_SLOT_CONTROLLED);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
summon->CastSpell(summon, SPELL_VOLCANIC_ERUPTION_TRIGGER, true);
|
summon->CastSpell(summon, SPELL_VOLCANIC_ERUPTION_TRIGGER, true);
|
||||||
|
else
|
||||||
|
summon->ToTempSummon()->InitStats(30000);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SummonedCreatureDespawn(Creature* summon) override
|
void SummonedCreatureDespawn(Creature* summon) override
|
||||||
@@ -116,71 +179,42 @@ struct boss_supremus : public BossAI
|
|||||||
return target;
|
return target;
|
||||||
}
|
}
|
||||||
|
|
||||||
void UpdateAI(uint32 diff) override
|
|
||||||
{
|
|
||||||
if (!UpdateVictim())
|
|
||||||
return;
|
|
||||||
|
|
||||||
events.Update(diff);
|
|
||||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
|
||||||
return;
|
|
||||||
|
|
||||||
switch (events.ExecuteEvent())
|
|
||||||
{
|
|
||||||
case EVENT_SPELL_BERSERK:
|
|
||||||
me->CastSpell(me, SPELL_BERSERK, true);
|
|
||||||
break;
|
|
||||||
case EVENT_SPELL_HATEFUL_STRIKE:
|
|
||||||
if (Unit* target = FindHatefulStrikeTarget())
|
|
||||||
me->CastSpell(target, SPELL_HATEFUL_STRIKE, false);
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_HATEFUL_STRIKE, urand(1500, 3000), EVENT_GROUP_ABILITIES);
|
|
||||||
break;
|
|
||||||
case EVENT_SPELL_MOLTEN_FLAMES:
|
|
||||||
me->CastSpell(me, SPELL_MOLTEN_PUNCH, false);
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_MOLTEN_FLAMES, 20000, EVENT_GROUP_ABILITIES);
|
|
||||||
break;
|
|
||||||
case EVENT_SWITCH_PHASE:
|
|
||||||
SchedulePhase(!me->HasAura(SPELL_SNARE_SELF));
|
|
||||||
break;
|
|
||||||
case EVENT_SWITCH_TARGET:
|
|
||||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true))
|
|
||||||
{
|
|
||||||
DoResetThreatList();
|
|
||||||
me->AddThreat(target, 5000000.0f);
|
|
||||||
Talk(EMOTE_NEW_TARGET);
|
|
||||||
}
|
|
||||||
events.ScheduleEvent(EVENT_SWITCH_TARGET, 10000, EVENT_GROUP_ABILITIES);
|
|
||||||
break;
|
|
||||||
case EVENT_CHECK_DIST:
|
|
||||||
if (me->GetDistance(me->GetVictim()) > 40.0f)
|
|
||||||
{
|
|
||||||
Talk(EMOTE_PUNCH_GROUND);
|
|
||||||
me->CastSpell(me->GetVictim(), SPELL_CHARGE, true);
|
|
||||||
events.ScheduleEvent(EVENT_CHECK_DIST, 5000, EVENT_GROUP_ABILITIES);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
events.ScheduleEvent(EVENT_CHECK_DIST, 1, EVENT_GROUP_ABILITIES);
|
|
||||||
break;
|
|
||||||
case EVENT_SPELL_VOLCANIC_ERUPTION:
|
|
||||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true))
|
|
||||||
{
|
|
||||||
me->CastSpell(target, SPELL_VOLCANIC_ERUPTION, true);
|
|
||||||
Talk(EMOTE_GROUND_CRACK);
|
|
||||||
}
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_VOLCANIC_ERUPTION, urand(10000, 18000), EVENT_GROUP_ABILITIES);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
DoMeleeAttackIfReady();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CheckEvadeIfOutOfCombatArea() const override
|
bool CheckEvadeIfOutOfCombatArea() const override
|
||||||
{
|
{
|
||||||
return me->GetPositionX() < 565 || me->GetPositionX() > 865 || me->GetPositionY() < 545 || me->GetPositionY() > 1000;
|
return me->GetPositionX() < 565 || me->GetPositionX() > 865 || me->GetPositionY() < 545 || me->GetPositionY() > 1000;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct npc_supremus_punch_invisible_stalker : public ScriptedAI
|
||||||
|
{
|
||||||
|
npc_supremus_punch_invisible_stalker(Creature* creature) : ScriptedAI(creature) { }
|
||||||
|
|
||||||
|
void IsSummonedBy(WorldObject* /*summoner*/) override
|
||||||
|
{
|
||||||
|
me->SetInCombatWithZone();
|
||||||
|
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true))
|
||||||
|
me->AddThreat(target, 10000.f);
|
||||||
|
|
||||||
|
DoCastSelf(SPELL_MOLTEN_FLAME, true);
|
||||||
|
|
||||||
|
scheduler.Schedule(6s, 10s, [this](TaskContext /*context*/)
|
||||||
|
{
|
||||||
|
me->CombatStop();
|
||||||
|
me->SetReactState(REACT_PASSIVE);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdateAI(uint32 diff) override
|
||||||
|
{
|
||||||
|
scheduler.Update(diff);
|
||||||
|
|
||||||
|
if (!UpdateVictim())
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
void AddSC_boss_supremus()
|
void AddSC_boss_supremus()
|
||||||
{
|
{
|
||||||
|
RegisterBlackTempleCreatureAI(npc_supremus_punch_invisible_stalker);
|
||||||
RegisterBlackTempleCreatureAI(boss_supremus);
|
RegisterBlackTempleCreatureAI(boss_supremus);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user