Scripts/Molten Core: Update scripts (#31244)
* Many changes to improve several encounters Credit for a lot of things goes to CMaNGOS Garr fully based on CMaNGOS version (cherry picked from commit 2979b12f8f1c6c82a69089c2c9123a1787b36773)
This commit is contained in:
@@ -0,0 +1,31 @@
|
||||
-- Magmadar
|
||||
DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_magmadar_lava_bomb';
|
||||
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
|
||||
(19411, 'spell_magmadar_lava_bomb'),
|
||||
(20474, 'spell_magmadar_lava_bomb');
|
||||
|
||||
DELETE FROM `creature_text` WHERE `CreatureID` = 11982 AND `GroupID` = 1;
|
||||
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
|
||||
(11982,1,0,"%s becomes exhausted!",16,0,100,0,0,0,8252,0,"magmadar EMOTE_EXHAUSTED");
|
||||
|
||||
UPDATE `creature_text` SET `BroadcastTextId` = 7797 WHERE `CreatureID` = 11982 AND `GroupID` = 0;
|
||||
|
||||
-- Golemagg
|
||||
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 13 AND `SourceEntry` = 20553;
|
||||
INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
|
||||
(13,7,20553,0,0,31,0,3,11672,0,0,0,0,"","Group 0: Spell 'Golemagg's Trust' (Effect 0, 1, 2) targets creature 'Core Rager'");
|
||||
|
||||
-- Garr
|
||||
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 13 AND `SourceEntry` IN (20482,19515,23487);
|
||||
INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
|
||||
(13,3,20482,0,0,31,0,3,12099,0,0,0,0,"","Group 0: Spell 'Firesworn Eruption Trigger' (Effect 0, 1) targets creature 'Firesworn'"),
|
||||
(13,1,19515,0,0,31,0,3,12057,0,0,0,0,"","Group 0: Spell 'Frenzy' (Effect 0) targets creature 'Garr'"),
|
||||
(13,1,23487,0,0,31,0,3,12099,0,0,0,0,"","Group 0: Spell 'Separation Anxiety' (Effect 0) targets creature 'Firesworn'");
|
||||
|
||||
DELETE FROM `creature_text` WHERE `CreatureID` = 12057;
|
||||
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
|
||||
(12057,0,0,"%s forces one of his Firesworn minions to erupt!",16,0,100,0,0,0,8254,0,"Garr EMOTE_MASSIVE_ERUPTION");
|
||||
|
||||
DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_garr_separation_anxiety';
|
||||
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
|
||||
(23487, 'spell_garr_separation_anxiety');
|
||||
+52
-34
@@ -15,52 +15,69 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* ScriptData
|
||||
SDName: Boss_Baron_Geddon
|
||||
SD%Complete: 100
|
||||
SDComment:
|
||||
SDCategory: Molten Core
|
||||
EndScriptData */
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "molten_core.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "SpellAuraEffects.h"
|
||||
#include "SpellInfo.h"
|
||||
#include "SpellScript.h"
|
||||
|
||||
enum Emotes
|
||||
enum GeddonTexts
|
||||
{
|
||||
EMOTE_SERVICE = 0
|
||||
};
|
||||
|
||||
enum Spells
|
||||
enum GeddonSpells
|
||||
{
|
||||
SPELL_INFERNO = 19695,
|
||||
SPELL_INFERNO_DMG = 19698,
|
||||
SPELL_IGNITE_MANA = 19659,
|
||||
SPELL_LIVING_BOMB = 20475,
|
||||
SPELL_ARMAGEDDON = 20478,
|
||||
|
||||
SPELL_INFERNO_DMG = 19698
|
||||
};
|
||||
|
||||
enum Events
|
||||
enum GeddonEvents
|
||||
{
|
||||
EVENT_INFERNO = 1,
|
||||
EVENT_IGNITE_MANA = 2,
|
||||
EVENT_LIVING_BOMB = 3,
|
||||
EVENT_IGNITE_MANA,
|
||||
EVENT_LIVING_BOMB,
|
||||
EVENT_ARMAGEDDON
|
||||
};
|
||||
|
||||
// 12056 - Baron Geddon
|
||||
struct boss_baron_geddon : public BossAI
|
||||
{
|
||||
boss_baron_geddon(Creature* creature) : BossAI(creature, BOSS_BARON_GEDDON)
|
||||
boss_baron_geddon(Creature* creature) : BossAI(creature, BOSS_BARON_GEDDON), _performedArmageddon(false) { }
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
_Reset();
|
||||
_performedArmageddon = false;
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* victim) override
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(victim);
|
||||
events.ScheduleEvent(EVENT_INFERNO, 45s);
|
||||
events.ScheduleEvent(EVENT_IGNITE_MANA, 30s);
|
||||
events.ScheduleEvent(EVENT_LIVING_BOMB, 35s);
|
||||
BossAI::JustEngagedWith(who);
|
||||
|
||||
events.ScheduleEvent(EVENT_INFERNO, 15s, 20s);
|
||||
events.ScheduleEvent(EVENT_IGNITE_MANA, 5s, 20s);
|
||||
events.ScheduleEvent(EVENT_LIVING_BOMB, 15s, 35s);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
|
||||
{
|
||||
if (!_performedArmageddon && me->HealthBelowPctDamaged(2, damage))
|
||||
{
|
||||
_performedArmageddon = true;
|
||||
events.ScheduleEvent(EVENT_ARMAGEDDON, 0s);
|
||||
}
|
||||
}
|
||||
|
||||
void OnSpellCast(SpellInfo const* spell) override
|
||||
{
|
||||
if (spell->Id == SPELL_ARMAGEDDON)
|
||||
Talk(EMOTE_SERVICE);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -70,15 +87,6 @@ struct boss_baron_geddon : public BossAI
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
// If we are <2% hp cast Armageddon
|
||||
if (!HealthAbovePct(2))
|
||||
{
|
||||
me->InterruptNonMeleeSpells(true);
|
||||
DoCast(me, SPELL_ARMAGEDDON);
|
||||
Talk(EMOTE_SERVICE);
|
||||
return;
|
||||
}
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
@@ -87,18 +95,20 @@ struct boss_baron_geddon : public BossAI
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_INFERNO:
|
||||
DoCast(me, SPELL_INFERNO);
|
||||
events.ScheduleEvent(EVENT_INFERNO, 45s);
|
||||
DoCastSelf(SPELL_INFERNO);
|
||||
events.Repeat(20s, 35s);
|
||||
break;
|
||||
case EVENT_IGNITE_MANA:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, true, -SPELL_IGNITE_MANA))
|
||||
DoCast(target, SPELL_IGNITE_MANA);
|
||||
events.ScheduleEvent(EVENT_IGNITE_MANA, 30s);
|
||||
DoCastSelf(SPELL_IGNITE_MANA);
|
||||
events.Repeat(25s, 40s);
|
||||
break;
|
||||
case EVENT_LIVING_BOMB:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true))
|
||||
DoCast(target, SPELL_LIVING_BOMB);
|
||||
events.ScheduleEvent(EVENT_LIVING_BOMB, 35s);
|
||||
events.Repeat(10s, 20s);
|
||||
break;
|
||||
case EVENT_ARMAGEDDON:
|
||||
DoCastSelf(SPELL_ARMAGEDDON);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -108,11 +118,19 @@ struct boss_baron_geddon : public BossAI
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
bool _performedArmageddon;
|
||||
};
|
||||
|
||||
// 19695 - Inferno
|
||||
class spell_baron_geddon_inferno : public AuraScript
|
||||
{
|
||||
bool Validate(SpellInfo const* /*spellInfo*/) override
|
||||
{
|
||||
return ValidateSpellInfo({ SPELL_INFERNO_DMG });
|
||||
}
|
||||
|
||||
void OnPeriodic(AuraEffect const* aurEff)
|
||||
{
|
||||
PreventDefaultAction();
|
||||
|
||||
@@ -15,45 +15,73 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* ScriptData
|
||||
SDName: Boss_Garr
|
||||
SD%Complete: 50
|
||||
SDComment: Adds NYI
|
||||
SDCategory: Molten Core
|
||||
EndScriptData */
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "molten_core.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "SpellAuraEffects.h"
|
||||
#include "SpellInfo.h"
|
||||
#include "SpellScript.h"
|
||||
|
||||
enum Spells
|
||||
enum GarrTexts
|
||||
{
|
||||
EMOTE_MASSIVE_ERUPTION = 0
|
||||
};
|
||||
|
||||
enum GarrSpells
|
||||
{
|
||||
// Garr
|
||||
SPELL_ANTIMAGIC_PULSE = 19492,
|
||||
SPELL_MAGMA_SHACKLES = 19496,
|
||||
SPELL_ENRAGE = 19516,
|
||||
SPELL_SEPARATION_ANXIETY = 23492,
|
||||
SPELL_ANTIMAGIC_PULSE = 19492,
|
||||
SPELL_MAGMA_SHACKLES = 19496,
|
||||
SPELL_ERUPTION_TRIGGER = 20482,
|
||||
|
||||
// Adds
|
||||
SPELL_ERUPTION = 19497,
|
||||
SPELL_IMMOLATE = 15732,
|
||||
SPELL_FRENZY = 19516,
|
||||
SPELL_SEPARATION_ANXIETY = 23487,
|
||||
|
||||
// Firesworn
|
||||
SPELL_THRASH = 8876,
|
||||
SPELL_IMMOLATE = 15733,
|
||||
|
||||
SPELL_ERUPTION = 19497,
|
||||
SPELL_FRENZY_TRIGGER = 19515,
|
||||
SPELL_MASSIVE_ERUPTION = 20483,
|
||||
|
||||
// Scripts
|
||||
SPELL_SEPARATION_ANXIETY_EFFECT = 23492
|
||||
};
|
||||
|
||||
enum Events
|
||||
enum GarrEvents
|
||||
{
|
||||
EVENT_ANTIMAGIC_PULSE = 1,
|
||||
EVENT_MAGMA_SHACKLES = 2,
|
||||
EVENT_ANTIMAGIC_PULSE = 1,
|
||||
EVENT_MAGMA_SHACKLES,
|
||||
EVENT_MASSIVE_ERUPTION
|
||||
};
|
||||
|
||||
// 12057 - Garr
|
||||
struct boss_garr : public BossAI
|
||||
{
|
||||
boss_garr(Creature* creature) : BossAI(creature, BOSS_GARR) { }
|
||||
|
||||
void JustEngagedWith(Unit* victim) override
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(victim);
|
||||
events.ScheduleEvent(EVENT_ANTIMAGIC_PULSE, 25s);
|
||||
events.ScheduleEvent(EVENT_MAGMA_SHACKLES, 15s);
|
||||
BossAI::JustEngagedWith(who);
|
||||
|
||||
DoCastSelf(SPELL_SEPARATION_ANXIETY);
|
||||
|
||||
events.ScheduleEvent(EVENT_ANTIMAGIC_PULSE, 10s, 15s);
|
||||
events.ScheduleEvent(EVENT_MAGMA_SHACKLES, 5s, 10s);
|
||||
events.ScheduleEvent(EVENT_MASSIVE_ERUPTION, 6min);
|
||||
}
|
||||
|
||||
void OnSpellCast(SpellInfo const* spell) override
|
||||
{
|
||||
if (spell->Id == SPELL_ERUPTION_TRIGGER)
|
||||
Talk(EMOTE_MASSIVE_ERUPTION);
|
||||
}
|
||||
|
||||
void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
|
||||
{
|
||||
if (spellInfo->Id == SPELL_FRENZY_TRIGGER)
|
||||
DoCastSelf(SPELL_FRENZY);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -70,16 +98,20 @@ struct boss_garr : public BossAI
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_ANTIMAGIC_PULSE:
|
||||
DoCast(me, SPELL_ANTIMAGIC_PULSE);
|
||||
events.ScheduleEvent(EVENT_ANTIMAGIC_PULSE, 10s, 15s);
|
||||
break;
|
||||
case EVENT_MAGMA_SHACKLES:
|
||||
DoCast(me, SPELL_MAGMA_SHACKLES);
|
||||
events.ScheduleEvent(EVENT_MAGMA_SHACKLES, 8s, 12s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
case EVENT_ANTIMAGIC_PULSE:
|
||||
DoCastSelf(SPELL_ANTIMAGIC_PULSE);
|
||||
events.Repeat(15s, 20s);
|
||||
break;
|
||||
case EVENT_MAGMA_SHACKLES:
|
||||
DoCastSelf(SPELL_MAGMA_SHACKLES);
|
||||
events.Repeat(10s, 15s);
|
||||
break;
|
||||
case EVENT_MASSIVE_ERUPTION:
|
||||
DoCastSelf(SPELL_ERUPTION_TRIGGER);
|
||||
events.Repeat(20s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
@@ -88,70 +120,71 @@ struct boss_garr : public BossAI
|
||||
}
|
||||
};
|
||||
|
||||
// 12099 - Firesworn
|
||||
struct npc_firesworn : public ScriptedAI
|
||||
{
|
||||
npc_firesworn(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
void ScheduleTasks()
|
||||
void InitializeAI() override
|
||||
{
|
||||
// Timers for this are probably wrong
|
||||
_scheduler.Schedule(4s, [this](TaskContext& context)
|
||||
{
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
||||
DoCast(target, SPELL_IMMOLATE);
|
||||
|
||||
context.Repeat(5s, 10s);
|
||||
});
|
||||
|
||||
// Separation Anxiety - Periodically check if Garr is nearby
|
||||
// ...and enrage if he is not.
|
||||
_scheduler.Schedule(3s, [this](TaskContext& context)
|
||||
{
|
||||
if (!me->FindNearestCreature(NPC_GARR, 20.0f))
|
||||
DoCastSelf(SPELL_SEPARATION_ANXIETY);
|
||||
else if (me->HasAura(SPELL_SEPARATION_ANXIETY))
|
||||
me->RemoveAurasDueToSpell(SPELL_SEPARATION_ANXIETY);
|
||||
|
||||
context.Repeat();
|
||||
});
|
||||
me->SetCorpseDelay(5, true);
|
||||
ScriptedAI::InitializeAI();
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
_scheduler.CancelAll();
|
||||
DoCastSelf(SPELL_THRASH);
|
||||
DoCastSelf(SPELL_IMMOLATE);
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* /*who*/) override
|
||||
void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
|
||||
{
|
||||
ScheduleTasks();
|
||||
if (spellInfo->Id == SPELL_ERUPTION_TRIGGER)
|
||||
DoCastSelf(SPELL_MASSIVE_ERUPTION);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
|
||||
void JustDied(Unit* killer) override
|
||||
{
|
||||
uint32 const health10pct = me->CountPctFromMaxHealth(10);
|
||||
uint32 health = me->GetHealth();
|
||||
if (int32(health) - int32(damage) < int32(health10pct))
|
||||
{
|
||||
damage = 0;
|
||||
DoCastVictim(SPELL_ERUPTION);
|
||||
me->DespawnOrUnsummon();
|
||||
}
|
||||
}
|
||||
if (killer != me)
|
||||
DoCastSelf(SPELL_ERUPTION, true);
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
DoCastSelf(SPELL_FRENZY_TRIGGER, true);
|
||||
}
|
||||
};
|
||||
|
||||
// 23487 - Separation Anxiety
|
||||
class spell_garr_separation_anxiety : public AuraScript
|
||||
{
|
||||
bool Validate(SpellInfo const* /*spellInfo*/) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
_scheduler.Update(diff);
|
||||
return ValidateSpellInfo({ SPELL_SEPARATION_ANXIETY_EFFECT });
|
||||
}
|
||||
|
||||
private:
|
||||
TaskScheduler _scheduler;
|
||||
void CalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude)
|
||||
{
|
||||
isPeriodic = true;
|
||||
amplitude = 5 * IN_MILLISECONDS;
|
||||
}
|
||||
|
||||
void HandleDummyTick(AuraEffect const* aurEff)
|
||||
{
|
||||
Unit* target = GetTarget();
|
||||
|
||||
if (Unit* caster = GetCaster())
|
||||
if (caster->IsAlive() && !caster->IsWithinDistInMap(target, aurEff->GetSpellEffectInfo().CalcRadius(caster, SpellTargetIndex::TargetA).Max))
|
||||
target->CastSpell(target, SPELL_SEPARATION_ANXIETY_EFFECT, true);
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_garr_separation_anxiety::CalcPeriodic, EFFECT_0, SPELL_AURA_DUMMY);
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_garr_separation_anxiety::HandleDummyTick, EFFECT_0, SPELL_AURA_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_garr()
|
||||
{
|
||||
RegisterMoltenCoreCreatureAI(boss_garr);
|
||||
RegisterMoltenCoreCreatureAI(npc_firesworn);
|
||||
RegisterSpellScript(spell_garr_separation_anxiety);
|
||||
}
|
||||
|
||||
@@ -15,43 +15,39 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* ScriptData
|
||||
SDName: Boss_Gehennas
|
||||
SD%Complete: 90
|
||||
SDComment: Adds MC NYI
|
||||
SDCategory: Molten Core
|
||||
EndScriptData */
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "molten_core.h"
|
||||
#include "ScriptedCreature.h"
|
||||
|
||||
enum Spells
|
||||
enum GehennasSpells
|
||||
{
|
||||
SPELL_GEHENNAS_CURSE = 19716,
|
||||
SPELL_RAIN_OF_FIRE = 19717,
|
||||
SPELL_SHADOW_BOLT = 19728,
|
||||
SPELL_GEHENNAS_CURSE = 19716,
|
||||
SPELL_RAIN_OF_FIRE = 19717,
|
||||
SPELL_SHADOW_BOLT_VICTIM = 19728,
|
||||
SPELL_SHADOW_BOLT_RANDOM = 19729
|
||||
};
|
||||
|
||||
enum Events
|
||||
enum GehennasEvents
|
||||
{
|
||||
EVENT_GEHENNAS_CURSE = 1,
|
||||
EVENT_RAIN_OF_FIRE = 2,
|
||||
EVENT_SHADOW_BOLT = 3,
|
||||
EVENT_GEHENNAS_CURSE = 1,
|
||||
EVENT_RAIN_OF_FIRE,
|
||||
EVENT_SHADOW_BOLT_VICTIM,
|
||||
EVENT_SHADOW_BOLT_RANDOM
|
||||
};
|
||||
|
||||
// 12259 - Gehennas
|
||||
struct boss_gehennas : public BossAI
|
||||
{
|
||||
boss_gehennas(Creature* creature) : BossAI(creature, BOSS_GEHENNAS)
|
||||
{
|
||||
}
|
||||
boss_gehennas(Creature* creature) : BossAI(creature, BOSS_GEHENNAS) { }
|
||||
|
||||
void JustEngagedWith(Unit* victim) override
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(victim);
|
||||
events.ScheduleEvent(EVENT_GEHENNAS_CURSE, 12s);
|
||||
events.ScheduleEvent(EVENT_RAIN_OF_FIRE, 10s);
|
||||
events.ScheduleEvent(EVENT_SHADOW_BOLT, 6s);
|
||||
BossAI::JustEngagedWith(who);
|
||||
|
||||
events.ScheduleEvent(EVENT_GEHENNAS_CURSE, 5s, 10s);
|
||||
events.ScheduleEvent(EVENT_RAIN_OF_FIRE, 5s, 10s);
|
||||
events.ScheduleEvent(EVENT_SHADOW_BOLT_VICTIM, 3s, 6s);
|
||||
events.ScheduleEvent(EVENT_SHADOW_BOLT_RANDOM, 3s, 6s);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -69,18 +65,22 @@ struct boss_gehennas : public BossAI
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_GEHENNAS_CURSE:
|
||||
DoCastVictim(SPELL_GEHENNAS_CURSE);
|
||||
events.ScheduleEvent(EVENT_GEHENNAS_CURSE, 22s, 30s);
|
||||
DoCastSelf(SPELL_GEHENNAS_CURSE);
|
||||
events.Repeat(25s, 30s);
|
||||
break;
|
||||
case EVENT_RAIN_OF_FIRE:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
||||
DoCast(target, SPELL_RAIN_OF_FIRE);
|
||||
events.ScheduleEvent(EVENT_RAIN_OF_FIRE, 4s, 12s);
|
||||
events.Repeat(6s, 12s);
|
||||
break;
|
||||
case EVENT_SHADOW_BOLT:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1))
|
||||
DoCast(target, SPELL_SHADOW_BOLT);
|
||||
events.ScheduleEvent(EVENT_SHADOW_BOLT, 7s);
|
||||
case EVENT_SHADOW_BOLT_VICTIM:
|
||||
DoCastVictim(SPELL_SHADOW_BOLT_VICTIM);
|
||||
events.Repeat(3s, 6s);
|
||||
break;
|
||||
case EVENT_SHADOW_BOLT_RANDOM:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
||||
DoCast(target, SPELL_SHADOW_BOLT_RANDOM);
|
||||
events.Repeat(3s, 6s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
@@ -15,66 +15,83 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* ScriptData
|
||||
SDName: Boss_Golemagg
|
||||
SD%Complete: 90
|
||||
SDComment: Timers need to be confirmed, Golemagg's Trust need to be checked
|
||||
SDCategory: Molten Core
|
||||
EndScriptData */
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "InstanceScript.h"
|
||||
#include "molten_core.h"
|
||||
#include "ObjectAccessor.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "SpellInfo.h"
|
||||
|
||||
enum Texts
|
||||
enum GolemaggTexts
|
||||
{
|
||||
EMOTE_LOWHP = 0,
|
||||
EMOTE_LOW_HEALTH = 0
|
||||
};
|
||||
|
||||
enum Spells
|
||||
enum GolemaggSpells
|
||||
{
|
||||
// Golemagg
|
||||
SPELL_MAGMASPLASH = 13879,
|
||||
SPELL_DOUBLE_ATTACK = 18943,
|
||||
SPELL_GOLEMAGGS_TRUST = 20556,
|
||||
SPELL_MAGMA_SPLASH = 13879,
|
||||
|
||||
SPELL_PYROBLAST = 20228,
|
||||
SPELL_EARTHQUAKE = 19798,
|
||||
SPELL_ENRAGE = 19953,
|
||||
SPELL_GOLEMAGG_TRUST = 20553,
|
||||
|
||||
// Core Rager
|
||||
SPELL_MANGLE = 19820
|
||||
SPELL_THRASH = 12787,
|
||||
SPELL_MANGLE = 19820,
|
||||
SPELL_FULL_HEAL = 17683,
|
||||
SPELL_QUIET_SUICIDE = 3617
|
||||
};
|
||||
|
||||
enum Events
|
||||
enum GolemaggEvents
|
||||
{
|
||||
EVENT_PYROBLAST = 1,
|
||||
EVENT_EARTHQUAKE = 2,
|
||||
EVENT_PYROBLAST = 1,
|
||||
EVENT_EARTHQUAKE
|
||||
};
|
||||
|
||||
enum GolemaggMisc
|
||||
{
|
||||
NPC_CORE_RAGER = 11672,
|
||||
ACTION_QUIET_SUICIDE = 0
|
||||
};
|
||||
|
||||
// 11988 - Golemagg the Incinerator
|
||||
struct boss_golemagg : public BossAI
|
||||
{
|
||||
boss_golemagg(Creature* creature) : BossAI(creature, BOSS_GOLEMAGG_THE_INCINERATOR) { }
|
||||
boss_golemagg(Creature* creature) : BossAI(creature, BOSS_GOLEMAGG_THE_INCINERATOR), _isPerformingEarthquake(false) { }
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
BossAI::Reset();
|
||||
DoCast(me, SPELL_MAGMASPLASH, true);
|
||||
_Reset();
|
||||
_isPerformingEarthquake = false;
|
||||
DoCastSelf(SPELL_DOUBLE_ATTACK);
|
||||
DoCastSelf(SPELL_GOLEMAGGS_TRUST);
|
||||
DoCastSelf(SPELL_MAGMA_SPLASH);
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* victim) override
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(victim);
|
||||
events.ScheduleEvent(EVENT_PYROBLAST, 7s);
|
||||
BossAI::JustEngagedWith(who);
|
||||
|
||||
events.ScheduleEvent(EVENT_PYROBLAST, 5s, 10s);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
|
||||
void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
|
||||
{
|
||||
if (!HealthBelowPct(10) || me->HasAura(SPELL_ENRAGE))
|
||||
return;
|
||||
if (!_isPerformingEarthquake && me->HealthBelowPctDamaged(10, damage))
|
||||
{
|
||||
_isPerformingEarthquake = true;
|
||||
events.ScheduleEvent(EVENT_EARTHQUAKE, 3s);
|
||||
}
|
||||
}
|
||||
|
||||
DoCast(me, SPELL_ENRAGE, true);
|
||||
events.ScheduleEvent(EVENT_EARTHQUAKE, 3s);
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
_JustDied();
|
||||
|
||||
std::vector<Creature*> ragers;
|
||||
GetCreatureListWithEntryInGrid(ragers, me, NPC_CORE_RAGER, 250.0f);
|
||||
for (Creature* rager : ragers)
|
||||
rager->AI()->DoAction(ACTION_QUIET_SUICIDE);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -94,11 +111,11 @@ struct boss_golemagg : public BossAI
|
||||
case EVENT_PYROBLAST:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
||||
DoCast(target, SPELL_PYROBLAST);
|
||||
events.ScheduleEvent(EVENT_PYROBLAST, 7s);
|
||||
events.Repeat(3s, 13s);
|
||||
break;
|
||||
case EVENT_EARTHQUAKE:
|
||||
DoCastVictim(SPELL_EARTHQUAKE);
|
||||
events.ScheduleEvent(EVENT_EARTHQUAKE, 3s);
|
||||
DoCastSelf(SPELL_EARTHQUAKE);
|
||||
events.Repeat(3s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -108,42 +125,51 @@ struct boss_golemagg : public BossAI
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
bool _isPerformingEarthquake;
|
||||
};
|
||||
|
||||
// 11672 - Core Rager
|
||||
struct npc_core_rager : public ScriptedAI
|
||||
{
|
||||
npc_core_rager(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
_instance = creature->GetInstanceScript();
|
||||
}
|
||||
npc_core_rager(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
_scheduler.CancelAll();
|
||||
DoCastSelf(SPELL_THRASH);
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* /*who*/) override
|
||||
{
|
||||
_scheduler.Schedule(7s, [this](TaskContext& task) // These times are probably wrong
|
||||
_scheduler.Schedule(5s, 15s, [this](TaskContext& task)
|
||||
{
|
||||
DoCastVictim(SPELL_MANGLE);
|
||||
task.Repeat(10s);
|
||||
task.Repeat(10s, 20s);
|
||||
});
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
|
||||
void DoAction(int32 action) override
|
||||
{
|
||||
if (HealthAbovePct(50) || !_instance)
|
||||
return;
|
||||
if (action == ACTION_QUIET_SUICIDE)
|
||||
DoCastSelf(SPELL_QUIET_SUICIDE);
|
||||
}
|
||||
|
||||
if (Creature* pGolemagg = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(BOSS_GOLEMAGG_THE_INCINERATOR)))
|
||||
void OnSpellCast(SpellInfo const* spell) override
|
||||
{
|
||||
if (spell->Id == SPELL_FULL_HEAL)
|
||||
Talk(EMOTE_LOW_HEALTH);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
|
||||
{
|
||||
if (me->HealthBelowPctDamaged(50, damage))
|
||||
{
|
||||
if (pGolemagg->IsAlive())
|
||||
_scheduler.Schedule(0s, [this](TaskContext /*task*/)
|
||||
{
|
||||
me->AddAura(SPELL_GOLEMAGG_TRUST, me);
|
||||
Talk(EMOTE_LOWHP);
|
||||
me->SetFullHealth();
|
||||
}
|
||||
DoCastSelf(SPELL_FULL_HEAL);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -156,7 +182,6 @@ struct npc_core_rager : public ScriptedAI
|
||||
}
|
||||
|
||||
private:
|
||||
InstanceScript* _instance;
|
||||
TaskScheduler _scheduler;
|
||||
};
|
||||
|
||||
|
||||
@@ -15,43 +15,36 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* ScriptData
|
||||
SDName: Boss_Lucifron
|
||||
SD%Complete: 100
|
||||
SDComment:
|
||||
SDCategory: Molten Core
|
||||
EndScriptData */
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "molten_core.h"
|
||||
#include "ScriptedCreature.h"
|
||||
|
||||
enum Spells
|
||||
enum LucifronSpells
|
||||
{
|
||||
SPELL_IMPENDING_DOOM = 19702,
|
||||
SPELL_LUCIFRON_CURSE = 19703,
|
||||
SPELL_SHADOW_SHOCK = 20603,
|
||||
SPELL_SHADOW_SHOCK = 19460
|
||||
};
|
||||
|
||||
enum Events
|
||||
enum LucifronEvents
|
||||
{
|
||||
EVENT_IMPENDING_DOOM = 1,
|
||||
EVENT_LUCIFRON_CURSE = 2,
|
||||
EVENT_SHADOW_SHOCK = 3,
|
||||
EVENT_LUCIFRON_CURSE,
|
||||
EVENT_SHADOW_SHOCK
|
||||
};
|
||||
|
||||
// 12118 - Lucifron
|
||||
struct boss_lucifron : public BossAI
|
||||
{
|
||||
boss_lucifron(Creature* creature) : BossAI(creature, BOSS_LUCIFRON)
|
||||
{
|
||||
}
|
||||
boss_lucifron(Creature* creature) : BossAI(creature, BOSS_LUCIFRON) { }
|
||||
|
||||
void JustEngagedWith(Unit* victim) override
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(victim);
|
||||
events.ScheduleEvent(EVENT_IMPENDING_DOOM, 10s);
|
||||
events.ScheduleEvent(EVENT_LUCIFRON_CURSE, 20s);
|
||||
events.ScheduleEvent(EVENT_SHADOW_SHOCK, 6s);
|
||||
BossAI::JustEngagedWith(who);
|
||||
|
||||
events.ScheduleEvent(EVENT_IMPENDING_DOOM, 5s, 10s);
|
||||
events.ScheduleEvent(EVENT_LUCIFRON_CURSE, 10s, 15s);
|
||||
events.ScheduleEvent(EVENT_SHADOW_SHOCK, 3s, 6s);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -69,16 +62,16 @@ struct boss_lucifron : public BossAI
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_IMPENDING_DOOM:
|
||||
DoCastVictim(SPELL_IMPENDING_DOOM);
|
||||
events.ScheduleEvent(EVENT_IMPENDING_DOOM, 20s);
|
||||
DoCastSelf(SPELL_IMPENDING_DOOM);
|
||||
events.Repeat(20s, 25s);
|
||||
break;
|
||||
case EVENT_LUCIFRON_CURSE:
|
||||
DoCastVictim(SPELL_LUCIFRON_CURSE);
|
||||
events.ScheduleEvent(EVENT_LUCIFRON_CURSE, 15s);
|
||||
DoCastSelf(SPELL_LUCIFRON_CURSE);
|
||||
events.Repeat(20s, 25s);
|
||||
break;
|
||||
case EVENT_SHADOW_SHOCK:
|
||||
DoCastVictim(SPELL_SHADOW_SHOCK);
|
||||
events.ScheduleEvent(EVENT_SHADOW_SHOCK, 6s);
|
||||
events.Repeat(3s, 6s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
+111
-36
@@ -15,55 +15,88 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* ScriptData
|
||||
SDName: Boss_Magmadar
|
||||
SD%Complete: 75
|
||||
SDComment: Conflag on ground nyi
|
||||
SDCategory: Molten Core
|
||||
EndScriptData */
|
||||
/*
|
||||
* Lava Bomb requires additional research. Both spells can target mana-users. Doesn't look like they're used randomly. Only one spell is used every 12-15 seconds.
|
||||
Looks like the spell boss uses depends on HP PCT but exact PCT is unknown. That should be double-checked
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "molten_core.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "SpellInfo.h"
|
||||
#include "SpellScript.h"
|
||||
|
||||
enum Texts
|
||||
enum MagmadarTexts
|
||||
{
|
||||
EMOTE_FRENZY = 0
|
||||
EMOTE_FRENZY = 0,
|
||||
EMOTE_EXHAUSTED = 1
|
||||
};
|
||||
|
||||
enum Spells
|
||||
enum MagmadarSpells
|
||||
{
|
||||
SPELL_FRENZY = 19451,
|
||||
SPELL_MAGMA_SPIT = 19449,
|
||||
SPELL_PANIC = 19408,
|
||||
SPELL_LAVA_BOMB = 19428,
|
||||
SPELL_MAGMA_SPIT = 19449,
|
||||
|
||||
SPELL_FRENZY = 19451,
|
||||
SPELL_PANIC = 19408,
|
||||
SPELL_LAVA_BOMB_1 = 19411,
|
||||
SPELL_LAVA_BOMB_2 = 20474,
|
||||
|
||||
SPELL_SUMMON_LAVA_BOMB_1 = 20494,
|
||||
SPELL_SUMMON_LAVA_BOMB_2 = 20495
|
||||
};
|
||||
|
||||
enum Events
|
||||
enum MagmadarEvents
|
||||
{
|
||||
EVENT_FRENZY = 1,
|
||||
EVENT_PANIC = 2,
|
||||
EVENT_LAVA_BOMB = 3,
|
||||
EVENT_FRENZY = 1,
|
||||
EVENT_PANIC,
|
||||
EVENT_LAVA_BOMB_1,
|
||||
EVENT_LAVA_BOMB_2,
|
||||
|
||||
EVENT_EXHAUSTED
|
||||
};
|
||||
|
||||
// 11982 - Magmadar
|
||||
struct boss_magmadar : public BossAI
|
||||
{
|
||||
boss_magmadar(Creature* creature) : BossAI(creature, BOSS_MAGMADAR)
|
||||
{
|
||||
}
|
||||
boss_magmadar(Creature* creature) : BossAI(creature, BOSS_MAGMADAR), _lavaBombSwitched(false), _isExhausted(false) { }
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
BossAI::Reset();
|
||||
DoCast(me, SPELL_MAGMA_SPIT, true);
|
||||
_Reset();
|
||||
_lavaBombSwitched = false;
|
||||
_isExhausted = false;
|
||||
DoCastSelf(SPELL_MAGMA_SPIT);
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* victim) override
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(victim);
|
||||
events.ScheduleEvent(EVENT_FRENZY, 30s);
|
||||
events.ScheduleEvent(EVENT_PANIC, 20s);
|
||||
events.ScheduleEvent(EVENT_LAVA_BOMB, 12s);
|
||||
BossAI::JustEngagedWith(who);
|
||||
|
||||
events.ScheduleEvent(EVENT_FRENZY, 5s, 10s);
|
||||
events.ScheduleEvent(EVENT_PANIC, 5s, 10s);
|
||||
events.ScheduleEvent(EVENT_LAVA_BOMB_1, 10s, 15s);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
|
||||
{
|
||||
if (!_lavaBombSwitched && me->HealthBelowPctDamaged(60, damage))
|
||||
{
|
||||
_lavaBombSwitched = true;
|
||||
events.CancelEvent(EVENT_LAVA_BOMB_1);
|
||||
events.ScheduleEvent(EVENT_LAVA_BOMB_2, 10s, 15s);
|
||||
}
|
||||
|
||||
if (!_isExhausted && me->HealthBelowPctDamaged(2, damage))
|
||||
{
|
||||
_isExhausted = true;
|
||||
events.ScheduleEvent(EVENT_EXHAUSTED, 0s);
|
||||
}
|
||||
}
|
||||
|
||||
void OnSpellCast(SpellInfo const* spell) override
|
||||
{
|
||||
if (spell->Id == SPELL_FRENZY)
|
||||
Talk(EMOTE_FRENZY);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -81,18 +114,26 @@ struct boss_magmadar : public BossAI
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_FRENZY:
|
||||
Talk(EMOTE_FRENZY);
|
||||
DoCast(me, SPELL_FRENZY);
|
||||
events.ScheduleEvent(EVENT_FRENZY, 15s);
|
||||
DoCastSelf(SPELL_FRENZY);
|
||||
events.Repeat(15s, 20s);
|
||||
break;
|
||||
case EVENT_PANIC:
|
||||
DoCastVictim(SPELL_PANIC);
|
||||
events.ScheduleEvent(EVENT_PANIC, 35s);
|
||||
DoCastSelf(SPELL_PANIC);
|
||||
events.Repeat(30s, 35s);
|
||||
break;
|
||||
case EVENT_LAVA_BOMB:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, true, -SPELL_LAVA_BOMB))
|
||||
DoCast(target, SPELL_LAVA_BOMB);
|
||||
events.ScheduleEvent(EVENT_LAVA_BOMB, 12s);
|
||||
case EVENT_LAVA_BOMB_1:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
||||
DoCast(target, SPELL_LAVA_BOMB_1);
|
||||
events.Repeat(12s, 15s);
|
||||
break;
|
||||
case EVENT_LAVA_BOMB_2:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
||||
DoCast(target, SPELL_LAVA_BOMB_2);
|
||||
events.Repeat(12s, 15s);
|
||||
break;
|
||||
|
||||
case EVENT_EXHAUSTED:
|
||||
Talk(EMOTE_EXHAUSTED);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -102,9 +143,43 @@ struct boss_magmadar : public BossAI
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
bool _lavaBombSwitched;
|
||||
bool _isExhausted;
|
||||
};
|
||||
|
||||
// 19411, 20474 - Lava Bomb
|
||||
class spell_magmadar_lava_bomb : public SpellScript
|
||||
{
|
||||
bool Validate(SpellInfo const* /*spellInfo*/) override
|
||||
{
|
||||
return ValidateSpellInfo({ SPELL_SUMMON_LAVA_BOMB_1, SPELL_SUMMON_LAVA_BOMB_2 });
|
||||
}
|
||||
|
||||
void HandleDummy(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
switch (GetSpellInfo()->Id)
|
||||
{
|
||||
case SPELL_LAVA_BOMB_1:
|
||||
GetHitUnit()->CastSpell(GetHitUnit(), SPELL_SUMMON_LAVA_BOMB_1, true);
|
||||
break;
|
||||
case SPELL_LAVA_BOMB_2:
|
||||
GetHitUnit()->CastSpell(GetHitUnit(), SPELL_SUMMON_LAVA_BOMB_2, true);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_magmadar_lava_bomb::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_magmadar()
|
||||
{
|
||||
RegisterMoltenCoreCreatureAI(boss_magmadar);
|
||||
RegisterSpellScript(spell_magmadar_lava_bomb);
|
||||
}
|
||||
|
||||
@@ -19,40 +19,52 @@
|
||||
#include "Containers.h"
|
||||
#include "molten_core.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "SpellInfo.h"
|
||||
#include "SpellScript.h"
|
||||
|
||||
enum Spells
|
||||
enum ShazzrahSpells
|
||||
{
|
||||
SPELL_ARCANE_EXPLOSION = 19712,
|
||||
SPELL_SHAZZRAH_CURSE = 19713,
|
||||
SPELL_MAGIC_GROUNDING = 19714,
|
||||
SPELL_COUNTERSPELL = 19715,
|
||||
SPELL_SHAZZRAH_GATE_DUMMY = 23138, // Teleports to and attacks a random target.
|
||||
SPELL_SHAZZRAH_GATE = 23139,
|
||||
SPELL_SHAZZRAH_GATE = 23138,
|
||||
|
||||
SPELL_SHAZZRAH_GATE_TELE = 23139
|
||||
};
|
||||
|
||||
enum Events
|
||||
enum ShazzrahEvents
|
||||
{
|
||||
EVENT_ARCANE_EXPLOSION = 1,
|
||||
EVENT_ARCANE_EXPLOSION_TRIGGERED = 2,
|
||||
EVENT_SHAZZRAH_CURSE = 3,
|
||||
EVENT_MAGIC_GROUNDING = 4,
|
||||
EVENT_COUNTERSPELL = 5,
|
||||
EVENT_SHAZZRAH_GATE = 6,
|
||||
EVENT_ARCANE_EXPLOSION = 1,
|
||||
EVENT_SHAZZRAH_CURSE,
|
||||
EVENT_MAGIC_GROUNDING,
|
||||
EVENT_COUNTERSPELL,
|
||||
EVENT_SHAZZRAH_GATE
|
||||
};
|
||||
|
||||
// 12264 - Shazzrah
|
||||
struct boss_shazzrah : public BossAI
|
||||
{
|
||||
boss_shazzrah(Creature* creature) : BossAI(creature, BOSS_SHAZZRAH) { }
|
||||
|
||||
void JustEngagedWith(Unit* target) override
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(target);
|
||||
events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, 6s);
|
||||
events.ScheduleEvent(EVENT_SHAZZRAH_CURSE, 10s);
|
||||
events.ScheduleEvent(EVENT_MAGIC_GROUNDING, 24s);
|
||||
events.ScheduleEvent(EVENT_COUNTERSPELL, 15s);
|
||||
events.ScheduleEvent(EVENT_SHAZZRAH_GATE, 45s);
|
||||
BossAI::JustEngagedWith(who);
|
||||
|
||||
events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, 2s, 4s);
|
||||
events.ScheduleEvent(EVENT_SHAZZRAH_CURSE, 5s, 10s);
|
||||
events.ScheduleEvent(EVENT_MAGIC_GROUNDING, 6s);
|
||||
events.ScheduleEvent(EVENT_COUNTERSPELL, 10s, 15s);
|
||||
events.ScheduleEvent(EVENT_SHAZZRAH_GATE, 30s);
|
||||
}
|
||||
|
||||
void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
|
||||
{
|
||||
if (spellInfo->Id == SPELL_SHAZZRAH_GATE_TELE)
|
||||
{
|
||||
ResetThreatList();
|
||||
events.RescheduleEvent(EVENT_ARCANE_EXPLOSION, 500ms);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -70,32 +82,24 @@ struct boss_shazzrah : public BossAI
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_ARCANE_EXPLOSION:
|
||||
DoCastVictim(SPELL_ARCANE_EXPLOSION);
|
||||
events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, 4s, 7s);
|
||||
break;
|
||||
// Triggered subsequent to using "Gate of Shazzrah".
|
||||
case EVENT_ARCANE_EXPLOSION_TRIGGERED:
|
||||
DoCastVictim(SPELL_ARCANE_EXPLOSION);
|
||||
DoCastSelf(SPELL_ARCANE_EXPLOSION);
|
||||
events.Repeat(4s, 6s);
|
||||
break;
|
||||
case EVENT_SHAZZRAH_CURSE:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, true, -SPELL_SHAZZRAH_CURSE))
|
||||
DoCast(target, SPELL_SHAZZRAH_CURSE);
|
||||
events.ScheduleEvent(EVENT_SHAZZRAH_CURSE, 25s, 30s);
|
||||
DoCastSelf(SPELL_SHAZZRAH_CURSE);
|
||||
events.Repeat(20s, 30s);
|
||||
break;
|
||||
case EVENT_MAGIC_GROUNDING:
|
||||
DoCast(me, SPELL_MAGIC_GROUNDING);
|
||||
events.ScheduleEvent(EVENT_MAGIC_GROUNDING, 35s);
|
||||
DoCastSelf(SPELL_MAGIC_GROUNDING);
|
||||
events.Repeat(20s, 25s);
|
||||
break;
|
||||
case EVENT_COUNTERSPELL:
|
||||
DoCastVictim(SPELL_COUNTERSPELL);
|
||||
events.ScheduleEvent(EVENT_COUNTERSPELL, 16s, 20s);
|
||||
DoCastSelf(SPELL_COUNTERSPELL);
|
||||
events.Repeat(15s, 20s);
|
||||
break;
|
||||
case EVENT_SHAZZRAH_GATE:
|
||||
ResetThreatList();
|
||||
DoCastAOE(SPELL_SHAZZRAH_GATE_DUMMY);
|
||||
events.ScheduleEvent(EVENT_ARCANE_EXPLOSION_TRIGGERED, 2s);
|
||||
events.RescheduleEvent(EVENT_ARCANE_EXPLOSION, 3s, 6s);
|
||||
events.ScheduleEvent(EVENT_SHAZZRAH_GATE, 45s);
|
||||
DoCastSelf(SPELL_SHAZZRAH_GATE);
|
||||
events.Repeat(40s, 45s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -112,7 +116,7 @@ class spell_shazzrah_gate_dummy : public SpellScript
|
||||
{
|
||||
bool Validate(SpellInfo const* /*spellInfo*/) override
|
||||
{
|
||||
return ValidateSpellInfo({ SPELL_SHAZZRAH_GATE });
|
||||
return ValidateSpellInfo({ SPELL_SHAZZRAH_GATE_TELE });
|
||||
}
|
||||
|
||||
void FilterTargets(std::list<WorldObject*>& targets)
|
||||
@@ -127,12 +131,7 @@ class spell_shazzrah_gate_dummy : public SpellScript
|
||||
|
||||
void HandleScript(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (Unit* target = GetHitUnit())
|
||||
{
|
||||
target->CastSpell(GetCaster(), SPELL_SHAZZRAH_GATE, true);
|
||||
if (Creature* creature = GetCaster()->ToCreature())
|
||||
creature->AI()->AttackStart(target); // Attack the target which caster will teleport to.
|
||||
}
|
||||
GetHitUnit()->CastSpell(GetCaster(), SPELL_SHAZZRAH_GATE_TELE, true);
|
||||
}
|
||||
|
||||
void Register() override
|
||||
|
||||
+68
-74
@@ -15,60 +15,57 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* ScriptData
|
||||
SDName: Boss_Sulfuron_Harbringer
|
||||
SD%Complete: 80
|
||||
SDComment: Adds NYI
|
||||
SDCategory: Molten Core
|
||||
EndScriptData */
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "Containers.h"
|
||||
#include "molten_core.h"
|
||||
#include "ScriptedCreature.h"
|
||||
|
||||
enum Spells
|
||||
enum SulfuronSpells
|
||||
{
|
||||
// Sulfuron Harbringer
|
||||
SPELL_DARK_STRIKE = 19777,
|
||||
SPELL_DEMORALIZING_SHOUT = 19778,
|
||||
SPELL_INSPIRE = 19779,
|
||||
SPELL_KNOCKDOWN = 19780,
|
||||
SPELL_FLAMESPEAR = 19781,
|
||||
SPELL_HAND_OF_RAGNAROS = 19780,
|
||||
SPELL_FLAME_SPEAR = 19781,
|
||||
SPELL_THROW = 19785,
|
||||
|
||||
// Adds
|
||||
SPELL_HEAL = 19775,
|
||||
SPELL_SHADOWWORDPAIN = 19776,
|
||||
SPELL_IMMOLATE = 20294,
|
||||
// Flamewaker Priest
|
||||
SPELL_DARK_MENDING = 19775,
|
||||
SPELL_SHADOW_WORD_PAIN = 19776,
|
||||
SPELL_DARK_STRIKE = 19777,
|
||||
SPELL_IMMOLATE = 20294
|
||||
};
|
||||
|
||||
enum Events
|
||||
enum SulfuronEvents
|
||||
{
|
||||
EVENT_DARK_STRIKE = 1,
|
||||
EVENT_DEMORALIZING_SHOUT = 2,
|
||||
EVENT_INSPIRE = 3,
|
||||
EVENT_KNOCKDOWN = 4,
|
||||
EVENT_FLAMESPEAR = 5,
|
||||
// Sulfuron Harbringer
|
||||
EVENT_DEMORALIZING_SHOUT = 1,
|
||||
EVENT_INSPIRE,
|
||||
EVENT_HAND_OF_RAGNAROS,
|
||||
EVENT_FLAME_SPEAR,
|
||||
EVENT_THROW,
|
||||
|
||||
EVENT_HEAL = 6,
|
||||
EVENT_SHADOW_WORD_PAIN = 7,
|
||||
EVENT_IMMOLATE = 8,
|
||||
// Flamewaker Priest
|
||||
EVENT_DARK_MENDING,
|
||||
EVENT_SHADOW_WORD_PAIN,
|
||||
EVENT_DARK_STRIKE,
|
||||
EVENT_IMMOLATE
|
||||
};
|
||||
|
||||
// 12098 - Sulfuron Harbinger
|
||||
struct boss_sulfuron : public BossAI
|
||||
{
|
||||
boss_sulfuron(Creature* creature) : BossAI(creature, BOSS_SULFURON_HARBINGER)
|
||||
{
|
||||
}
|
||||
boss_sulfuron(Creature* creature) : BossAI(creature, BOSS_SULFURON_HARBINGER) { }
|
||||
|
||||
void JustEngagedWith(Unit* victim) override
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(victim);
|
||||
events.ScheduleEvent(EVENT_DARK_STRIKE, 10s);
|
||||
events.ScheduleEvent(EVENT_DEMORALIZING_SHOUT, 15s);
|
||||
events.ScheduleEvent(EVENT_INSPIRE, 13s);
|
||||
events.ScheduleEvent(EVENT_KNOCKDOWN, 6s);
|
||||
events.ScheduleEvent(EVENT_FLAMESPEAR, 2s);
|
||||
BossAI::JustEngagedWith(who);
|
||||
|
||||
events.ScheduleEvent(EVENT_DEMORALIZING_SHOUT, 10s, 15s);
|
||||
events.ScheduleEvent(EVENT_INSPIRE, 5s, 10s);
|
||||
events.ScheduleEvent(EVENT_HAND_OF_RAGNAROS, 5s, 10s);
|
||||
events.ScheduleEvent(EVENT_FLAME_SPEAR, 5s, 15s);
|
||||
events.ScheduleEvent(EVENT_THROW, 0s);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -85,13 +82,9 @@ struct boss_sulfuron : public BossAI
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_DARK_STRIKE:
|
||||
DoCast(me, SPELL_DARK_STRIKE);
|
||||
events.ScheduleEvent(EVENT_DARK_STRIKE, 15s, 18s);
|
||||
break;
|
||||
case EVENT_DEMORALIZING_SHOUT:
|
||||
DoCastVictim(SPELL_DEMORALIZING_SHOUT);
|
||||
events.ScheduleEvent(EVENT_DEMORALIZING_SHOUT, 15s, 20s);
|
||||
DoCastSelf(SPELL_DEMORALIZING_SHOUT);
|
||||
events.Repeat(25s, 35s);
|
||||
break;
|
||||
case EVENT_INSPIRE:
|
||||
{
|
||||
@@ -99,18 +92,21 @@ struct boss_sulfuron : public BossAI
|
||||
if (!healers.empty())
|
||||
DoCast(Trinity::Containers::SelectRandomContainerElement(healers), SPELL_INSPIRE);
|
||||
|
||||
DoCast(me, SPELL_INSPIRE);
|
||||
events.ScheduleEvent(EVENT_INSPIRE, 20s, 26s);
|
||||
events.Repeat(15s, 20s);
|
||||
break;
|
||||
}
|
||||
case EVENT_KNOCKDOWN:
|
||||
DoCastVictim(SPELL_KNOCKDOWN);
|
||||
events.ScheduleEvent(EVENT_KNOCKDOWN, 12s, 15s);
|
||||
case EVENT_HAND_OF_RAGNAROS:
|
||||
DoCastSelf(SPELL_HAND_OF_RAGNAROS);
|
||||
events.Repeat(10s, 25s);
|
||||
break;
|
||||
case EVENT_FLAMESPEAR:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true))
|
||||
DoCast(target, SPELL_FLAMESPEAR);
|
||||
events.ScheduleEvent(EVENT_FLAMESPEAR, 12s, 16s);
|
||||
case EVENT_FLAME_SPEAR:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
||||
DoCast(target, SPELL_FLAME_SPEAR);
|
||||
events.Repeat(10s, 20s);
|
||||
break;
|
||||
case EVENT_THROW:
|
||||
DoCastVictim(SPELL_THROW);
|
||||
events.Repeat(2s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -122,28 +118,22 @@ struct boss_sulfuron : public BossAI
|
||||
}
|
||||
};
|
||||
|
||||
// 11662 - Flamewaker Priest
|
||||
struct npc_flamewaker_priest : public ScriptedAI
|
||||
{
|
||||
npc_flamewaker_priest(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
}
|
||||
npc_flamewaker_priest(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
events.Reset();
|
||||
_events.Reset();
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
void JustEngagedWith(Unit* /*who*/) override
|
||||
{
|
||||
events.Reset();
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* victim) override
|
||||
{
|
||||
ScriptedAI::JustEngagedWith(victim);
|
||||
events.ScheduleEvent(EVENT_HEAL, 15s, 30s);
|
||||
events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 2s);
|
||||
events.ScheduleEvent(EVENT_IMMOLATE, 8s);
|
||||
_events.ScheduleEvent(EVENT_DARK_MENDING, 15s, 20s);
|
||||
_events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 4s, 6s);
|
||||
_events.ScheduleEvent(EVENT_DARK_STRIKE, 3s, 6s);
|
||||
_events.ScheduleEvent(EVENT_IMMOLATE, 3s, 6s);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -151,29 +141,33 @@ struct npc_flamewaker_priest : public ScriptedAI
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
_events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
while (uint32 eventId = _events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_HEAL:
|
||||
if (Unit* target = DoSelectLowestHpFriendly(60.0f, 1))
|
||||
DoCast(target, SPELL_HEAL);
|
||||
events.ScheduleEvent(EVENT_HEAL, 15s, 20s);
|
||||
case EVENT_DARK_MENDING:
|
||||
if (Unit* target = DoSelectLowestHpFriendly(60.0f))
|
||||
DoCast(target, SPELL_DARK_MENDING);
|
||||
_events.Repeat(15s, 20s);
|
||||
break;
|
||||
case EVENT_SHADOW_WORD_PAIN:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, true, -SPELL_SHADOWWORDPAIN))
|
||||
DoCast(target, SPELL_SHADOWWORDPAIN);
|
||||
events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 18s, 26s);
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, true, -SPELL_SHADOW_WORD_PAIN))
|
||||
DoCast(target, SPELL_SHADOW_WORD_PAIN);
|
||||
_events.Repeat(3s, 10s);
|
||||
break;
|
||||
case EVENT_DARK_STRIKE:
|
||||
DoCastVictim(SPELL_DARK_STRIKE);
|
||||
_events.Repeat(5s, 7s);
|
||||
break;
|
||||
case EVENT_IMMOLATE:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, true, -SPELL_IMMOLATE))
|
||||
DoCast(target, SPELL_IMMOLATE);
|
||||
events.ScheduleEvent(EVENT_IMMOLATE, 15s, 25s);
|
||||
_events.Repeat(4s, 8s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -185,7 +179,7 @@ struct npc_flamewaker_priest : public ScriptedAI
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap events;
|
||||
EventMap _events;
|
||||
};
|
||||
|
||||
void AddSC_boss_sulfuron()
|
||||
|
||||
Reference in New Issue
Block a user