mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-13 09:17:18 +00:00
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;
|
||||
});
|
||||
|
||||
// Molten Punch
|
||||
ApplySpellFix({ 40126 }, [](SpellInfo* spellInfo)
|
||||
{
|
||||
spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo(TARGET_DEST_CASTER);
|
||||
});
|
||||
|
||||
for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i)
|
||||
{
|
||||
SpellInfo* spellInfo = mSpellInfoMap[i];
|
||||
|
||||
@@ -24,76 +24,139 @@ enum Supremus
|
||||
EMOTE_NEW_TARGET = 0,
|
||||
EMOTE_PUNCH_GROUND = 1,
|
||||
EMOTE_GROUND_CRACK = 2,
|
||||
EMOTE_BERSERK = 3,
|
||||
|
||||
SPELL_SNARE_SELF = 41922,
|
||||
SPELL_MOLTEN_PUNCH = 40126,
|
||||
SPELL_MOLTEN_FLAME = 40980,
|
||||
SPELL_HATEFUL_STRIKE = 41926,
|
||||
SPELL_VOLCANIC_ERUPTION = 40276,
|
||||
SPELL_VOLCANIC_ERUPTION_TRIGGER = 40117,
|
||||
SPELL_BERSERK = 45078,
|
||||
SPELL_VOLCANIC_GEYSER = 42055,
|
||||
SPELL_BERSERK = 26662,
|
||||
SPELL_CHARGE = 41581,
|
||||
|
||||
NPC_SUPREMUS_PUNCH_STALKER = 23095,
|
||||
SPELL_SERVERSIDE_RANDOM_TARGET = 41951, // Found in 55261. Used for Fixate target
|
||||
|
||||
EVENT_SPELL_BERSERK = 1,
|
||||
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,
|
||||
NPC_SUPREMUS_VOLCANO = 23085,
|
||||
|
||||
EVENT_GROUP_ABILITIES = 1
|
||||
GROUP_ABILITIES = 1,
|
||||
GROUP_MOLTEN_PUNCH = 2,
|
||||
GROUP_PHASE_CHANGE = 3
|
||||
};
|
||||
|
||||
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
|
||||
{
|
||||
BossAI::JustEngagedWith(who);
|
||||
|
||||
SchedulePhase(false);
|
||||
events.ScheduleEvent(EVENT_SPELL_BERSERK, 900000);
|
||||
events.ScheduleEvent(EVENT_SPELL_MOLTEN_FLAMES, 4000);
|
||||
SchedulePhase(true);
|
||||
|
||||
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);
|
||||
events.ScheduleEvent(EVENT_SWITCH_PHASE, 60000);
|
||||
scheduler.CancelGroup(GROUP_ABILITIES);
|
||||
|
||||
scheduler.Schedule(1min, [this](TaskContext context)
|
||||
{
|
||||
context.SetGroup(GROUP_PHASE_CHANGE);
|
||||
SchedulePhase(me->HasAura(SPELL_SNARE_SELF));
|
||||
});
|
||||
|
||||
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_EFFECT, SPELL_EFFECT_ATTACK_ME, false);
|
||||
me->RemoveAurasDueToSpell(SPELL_SNARE_SELF);
|
||||
}
|
||||
// Gaze Phase
|
||||
else
|
||||
{
|
||||
events.ScheduleEvent(EVENT_SPELL_VOLCANIC_ERUPTION, 5000, EVENT_GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_SWITCH_TARGET, 0, EVENT_GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_CHECK_DIST, 0, EVENT_GROUP_ABILITIES);
|
||||
DoCastSelf(SPELL_SNARE_SELF, true);
|
||||
|
||||
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_EFFECT, SPELL_EFFECT_ATTACK_ME, true);
|
||||
me->CastSpell(me, SPELL_SNARE_SELF, true);
|
||||
}
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon) override
|
||||
{
|
||||
summons.Summon(summon);
|
||||
if (summon->GetEntry() == NPC_SUPREMUS_PUNCH_STALKER)
|
||||
{
|
||||
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
|
||||
if (summon->GetEntry() == NPC_SUPREMUS_VOLCANO)
|
||||
summon->CastSpell(summon, SPELL_VOLCANIC_ERUPTION_TRIGGER, true);
|
||||
else
|
||||
summon->ToTempSummon()->InitStats(30000);
|
||||
}
|
||||
|
||||
void SummonedCreatureDespawn(Creature* summon) override
|
||||
@@ -116,71 +179,42 @@ struct boss_supremus : public BossAI
|
||||
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
|
||||
{
|
||||
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()
|
||||
{
|
||||
RegisterBlackTempleCreatureAI(npc_supremus_punch_invisible_stalker);
|
||||
RegisterBlackTempleCreatureAI(boss_supremus);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user