mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-30 09:03:47 +00:00
refactor(Core/Scripts): restyle scripts lib with astyle (#3467)
This commit is contained in:
@@ -76,7 +76,7 @@ public:
|
||||
|
||||
void KilledUnit(Unit*)
|
||||
{
|
||||
if (urand(0,1))
|
||||
if (urand(0, 1))
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
|
||||
@@ -102,7 +102,7 @@ public:
|
||||
|
||||
if (eventId == EVENT_SPELL_INHIBIT_MAGIC)
|
||||
{
|
||||
Map::PlayerList const &PlayerList = me->GetMap()->GetPlayers();
|
||||
Map::PlayerList const& PlayerList = me->GetMap()->GetPlayers();
|
||||
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
|
||||
if (Player* player = i->GetSource())
|
||||
{
|
||||
@@ -172,51 +172,51 @@ public:
|
||||
|
||||
class spell_auchenai_possess : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_auchenai_possess() : SpellScriptLoader("spell_auchenai_possess") { }
|
||||
public:
|
||||
spell_auchenai_possess() : SpellScriptLoader("spell_auchenai_possess") { }
|
||||
|
||||
class spell_auchenai_possess_AuraScript : public AuraScript
|
||||
class spell_auchenai_possess_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_auchenai_possess_AuraScript);
|
||||
|
||||
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
PrepareAuraScript(spell_auchenai_possess_AuraScript);
|
||||
|
||||
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
if (Unit* caster = GetCaster())
|
||||
if (Unit* target = GetTarget())
|
||||
caster->CastSpell(target, 32830 /*POSSESS*/, true);
|
||||
}
|
||||
|
||||
void CalcPeriodic(AuraEffect const* /*effect*/, bool& isPeriodic, int32& amplitude)
|
||||
{
|
||||
isPeriodic = true;
|
||||
amplitude = 2000;
|
||||
}
|
||||
|
||||
void Update(AuraEffect* /*effect*/)
|
||||
{
|
||||
// Xinef: Charm is removed when target is at or below 50%hp
|
||||
if (Unit* owner = GetUnitOwner())
|
||||
if (owner->GetHealthPct() <= 50)
|
||||
SetDuration(0);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
// Base channel
|
||||
if (m_scriptSpellId == 33401)
|
||||
OnEffectRemove += AuraEffectRemoveFn(spell_auchenai_possess_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
|
||||
else
|
||||
{
|
||||
DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_auchenai_possess_AuraScript::CalcPeriodic, EFFECT_0, SPELL_AURA_MOD_CHARM);
|
||||
OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_auchenai_possess_AuraScript::Update, EFFECT_0, SPELL_AURA_MOD_CHARM);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_auchenai_possess_AuraScript();
|
||||
if (Unit* caster = GetCaster())
|
||||
if (Unit* target = GetTarget())
|
||||
caster->CastSpell(target, 32830 /*POSSESS*/, true);
|
||||
}
|
||||
|
||||
void CalcPeriodic(AuraEffect const* /*effect*/, bool& isPeriodic, int32& amplitude)
|
||||
{
|
||||
isPeriodic = true;
|
||||
amplitude = 2000;
|
||||
}
|
||||
|
||||
void Update(AuraEffect* /*effect*/)
|
||||
{
|
||||
// Xinef: Charm is removed when target is at or below 50%hp
|
||||
if (Unit* owner = GetUnitOwner())
|
||||
if (owner->GetHealthPct() <= 50)
|
||||
SetDuration(0);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
// Base channel
|
||||
if (m_scriptSpellId == 33401)
|
||||
OnEffectRemove += AuraEffectRemoveFn(spell_auchenai_possess_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
|
||||
else
|
||||
{
|
||||
DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_auchenai_possess_AuraScript::CalcPeriodic, EFFECT_0, SPELL_AURA_MOD_CHARM);
|
||||
OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_auchenai_possess_AuraScript::Update, EFFECT_0, SPELL_AURA_MOD_CHARM);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_auchenai_possess_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_shirrak_the_dead_watcher()
|
||||
|
||||
@@ -22,25 +22,25 @@
|
||||
|
||||
class instance_auchenai_crypts : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
instance_auchenai_crypts() : InstanceMapScript(ACScriptName, 558) { }
|
||||
public:
|
||||
instance_auchenai_crypts() : InstanceMapScript(ACScriptName, 558) { }
|
||||
|
||||
struct instance_auchenai_crypts_InstanceMapScript : public InstanceScript
|
||||
struct instance_auchenai_crypts_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_auchenai_crypts_InstanceMapScript(Map* map) : InstanceScript(map)
|
||||
{
|
||||
instance_auchenai_crypts_InstanceMapScript(Map* map) : InstanceScript(map)
|
||||
{
|
||||
SetBossNumber(EncounterCount);
|
||||
}
|
||||
|
||||
void Load(char const* data) override { LoadBossState(data); }
|
||||
|
||||
std::string GetSaveData() override { return DataHeader + GetBossSaveData(); }
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const override
|
||||
{
|
||||
return new instance_auchenai_crypts_InstanceMapScript(map);
|
||||
SetBossNumber(EncounterCount);
|
||||
}
|
||||
|
||||
void Load(char const* data) override { LoadBossState(data); }
|
||||
|
||||
std::string GetSaveData() override { return DataHeader + GetBossSaveData(); }
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const override
|
||||
{
|
||||
return new instance_auchenai_crypts_InstanceMapScript(map);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_instance_auchenai_crypts()
|
||||
|
||||
@@ -34,126 +34,126 @@ enum ePrince
|
||||
|
||||
class boss_nexusprince_shaffar : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_nexusprince_shaffar() : CreatureScript("boss_nexusprince_shaffar") { }
|
||||
public:
|
||||
boss_nexusprince_shaffar() : CreatureScript("boss_nexusprince_shaffar") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_nexusprince_shaffarAI (creature);
|
||||
}
|
||||
|
||||
struct boss_nexusprince_shaffarAI : public ScriptedAI
|
||||
{
|
||||
boss_nexusprince_shaffarAI(Creature* creature) : ScriptedAI(creature), summons(me)
|
||||
{
|
||||
return new boss_nexusprince_shaffarAI (creature);
|
||||
HasTaunted = false;
|
||||
}
|
||||
|
||||
struct boss_nexusprince_shaffarAI : public ScriptedAI
|
||||
EventMap events;
|
||||
SummonList summons;
|
||||
bool HasTaunted;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
boss_nexusprince_shaffarAI(Creature* creature) : ScriptedAI(creature), summons(me)
|
||||
float dist = 8.0f;
|
||||
float posX, posY, posZ, angle;
|
||||
me->GetHomePosition(posX, posY, posZ, angle);
|
||||
|
||||
summons.DespawnAll();
|
||||
events.Reset();
|
||||
me->SummonCreature(NPC_BEACON, posX - dist, posY - dist, posZ, angle, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 7200000);
|
||||
me->SummonCreature(NPC_BEACON, posX - dist, posY + dist, posZ, angle, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 7200000);
|
||||
me->SummonCreature(NPC_BEACON, posX + dist, posY, posZ, angle, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 7200000);
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who)
|
||||
{
|
||||
if (!HasTaunted && who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 100.0f))
|
||||
{
|
||||
HasTaunted = false;
|
||||
Talk(SAY_INTRO);
|
||||
HasTaunted = true;
|
||||
}
|
||||
}
|
||||
|
||||
void EnterCombat(Unit*)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
me->SetInCombatWithZone();
|
||||
summons.DoZoneInCombat();
|
||||
|
||||
events.ScheduleEvent(EVENT_SPELL_BEACON, 10000);
|
||||
events.ScheduleEvent(EVENT_SPELL_FR_FI, 4000);
|
||||
events.ScheduleEvent(EVENT_SPELL_FROST_NOVA, 15000);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
if (me->IsInCombat() && summon->GetEntry() == NPC_BEACON)
|
||||
{
|
||||
summon->CastSpell(summon, SPELL_ETHEREAL_BEACON_VISUAL, false);
|
||||
if (Unit* target = SelectTargetFromPlayerList(50.0f))
|
||||
summon->AI()->AttackStart(target);
|
||||
}
|
||||
|
||||
EventMap events;
|
||||
SummonList summons;
|
||||
bool HasTaunted;
|
||||
summons.Summon(summon);
|
||||
}
|
||||
|
||||
void Reset()
|
||||
void SummonedCreatureDespawn(Creature* summon)
|
||||
{
|
||||
summons.Despawn(summon);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
Talk(SAY_DEAD);
|
||||
summons.DespawnAll();
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.GetEvent())
|
||||
{
|
||||
float dist = 8.0f;
|
||||
float posX, posY, posZ, angle;
|
||||
me->GetHomePosition(posX, posY, posZ, angle);
|
||||
case EVENT_SPELL_FROST_NOVA:
|
||||
me->CastSpell(me, SPELL_FROSTNOVA, false);
|
||||
events.RepeatEvent(urand(16000, 23000));
|
||||
events.DelayEvents(1500);
|
||||
events.ScheduleEvent(EVENT_SPELL_BLINK, 1500);
|
||||
break;
|
||||
case EVENT_SPELL_FR_FI:
|
||||
me->CastSpell(me->GetVictim(), RAND(SPELL_FROSTBOLT, SPELL_FIREBALL), false);
|
||||
events.RepeatEvent(urand(3000, 4000));
|
||||
break;
|
||||
case EVENT_SPELL_BLINK:
|
||||
me->CastSpell(me, SPELL_BLINK, false);
|
||||
events.PopEvent();
|
||||
events.RescheduleEvent(EVENT_SPELL_FR_FI, 0);
|
||||
break;
|
||||
case EVENT_SPELL_BEACON:
|
||||
if (!urand(0, 3))
|
||||
Talk(SAY_SUMMON);
|
||||
|
||||
summons.DespawnAll();
|
||||
events.Reset();
|
||||
me->SummonCreature(NPC_BEACON, posX - dist, posY - dist, posZ, angle, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 7200000);
|
||||
me->SummonCreature(NPC_BEACON, posX - dist, posY + dist, posZ, angle, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 7200000);
|
||||
me->SummonCreature(NPC_BEACON, posX + dist, posY, posZ, angle, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 7200000);
|
||||
me->CastSpell(me, SPELL_ETHEREAL_BEACON, true);
|
||||
events.RepeatEvent(10000);
|
||||
break;
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who)
|
||||
{
|
||||
if (!HasTaunted && who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 100.0f))
|
||||
{
|
||||
Talk(SAY_INTRO);
|
||||
HasTaunted = true;
|
||||
}
|
||||
}
|
||||
|
||||
void EnterCombat(Unit*)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
me->SetInCombatWithZone();
|
||||
summons.DoZoneInCombat();
|
||||
|
||||
events.ScheduleEvent(EVENT_SPELL_BEACON, 10000);
|
||||
events.ScheduleEvent(EVENT_SPELL_FR_FI, 4000);
|
||||
events.ScheduleEvent(EVENT_SPELL_FROST_NOVA, 15000);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
if (me->IsInCombat() && summon->GetEntry() == NPC_BEACON)
|
||||
{
|
||||
summon->CastSpell(summon, SPELL_ETHEREAL_BEACON_VISUAL, false);
|
||||
if (Unit* target = SelectTargetFromPlayerList(50.0f))
|
||||
summon->AI()->AttackStart(target);
|
||||
}
|
||||
|
||||
summons.Summon(summon);
|
||||
}
|
||||
|
||||
void SummonedCreatureDespawn(Creature* summon)
|
||||
{
|
||||
summons.Despawn(summon);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
Talk(SAY_DEAD);
|
||||
summons.DespawnAll();
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.GetEvent())
|
||||
{
|
||||
case EVENT_SPELL_FROST_NOVA:
|
||||
me->CastSpell(me, SPELL_FROSTNOVA, false);
|
||||
events.RepeatEvent(urand(16000, 23000));
|
||||
events.DelayEvents(1500);
|
||||
events.ScheduleEvent(EVENT_SPELL_BLINK, 1500);
|
||||
break;
|
||||
case EVENT_SPELL_FR_FI:
|
||||
me->CastSpell(me->GetVictim(), RAND(SPELL_FROSTBOLT, SPELL_FIREBALL), false);
|
||||
events.RepeatEvent(urand(3000, 4000));
|
||||
break;
|
||||
case EVENT_SPELL_BLINK:
|
||||
me->CastSpell(me, SPELL_BLINK, false);
|
||||
events.PopEvent();
|
||||
events.RescheduleEvent(EVENT_SPELL_FR_FI, 0);
|
||||
break;
|
||||
case EVENT_SPELL_BEACON:
|
||||
if (!urand(0, 3))
|
||||
Talk(SAY_SUMMON);
|
||||
|
||||
me->CastSpell(me, SPELL_ETHEREAL_BEACON, true);
|
||||
events.RepeatEvent(10000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
enum Yor
|
||||
@@ -194,13 +194,13 @@ public:
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_DOUBLE_BREATH:
|
||||
if (me->IsWithinDist(me->GetVictim(), ATTACK_DISTANCE))
|
||||
DoCastVictim(SPELL_DOUBLE_BREATH);
|
||||
events.ScheduleEvent(EVENT_DOUBLE_BREATH, urand(6000, 9000));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
case EVENT_DOUBLE_BREATH:
|
||||
if (me->IsWithinDist(me->GetVictim(), ATTACK_DISTANCE))
|
||||
DoCastVictim(SPELL_DOUBLE_BREATH);
|
||||
events.ScheduleEvent(EVENT_DOUBLE_BREATH, urand(6000, 9000));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ public:
|
||||
struct boss_pandemoniusAI : public ScriptedAI
|
||||
{
|
||||
boss_pandemoniusAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
|
||||
EventMap events;
|
||||
|
||||
void Reset()
|
||||
@@ -83,43 +83,43 @@ public:
|
||||
|
||||
switch (events.GetEvent())
|
||||
{
|
||||
case EVENT_VOID_BLAST:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
|
||||
{
|
||||
DoCast(target, SPELL_VOID_BLAST);
|
||||
++VoidBlastCounter;
|
||||
}
|
||||
case EVENT_VOID_BLAST:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
|
||||
{
|
||||
DoCast(target, SPELL_VOID_BLAST);
|
||||
++VoidBlastCounter;
|
||||
}
|
||||
|
||||
if (VoidBlastCounter == 5)
|
||||
{
|
||||
VoidBlastCounter = 0;
|
||||
events.RescheduleEvent(EVENT_VOID_BLAST, urand(15000, 25000));
|
||||
}
|
||||
else
|
||||
{
|
||||
events.RescheduleEvent(EVENT_VOID_BLAST, 500);
|
||||
events.DelayEvents(EVENT_DARK_SHELL, 500);
|
||||
}
|
||||
break;
|
||||
case EVENT_DARK_SHELL:
|
||||
if (me->IsNonMeleeSpellCast(false))
|
||||
{
|
||||
me->InterruptNonMeleeSpells(true);
|
||||
}
|
||||
if (VoidBlastCounter == 5)
|
||||
{
|
||||
VoidBlastCounter = 0;
|
||||
events.RescheduleEvent(EVENT_VOID_BLAST, urand(15000, 25000));
|
||||
}
|
||||
else
|
||||
{
|
||||
events.RescheduleEvent(EVENT_VOID_BLAST, 500);
|
||||
events.DelayEvents(EVENT_DARK_SHELL, 500);
|
||||
}
|
||||
break;
|
||||
case EVENT_DARK_SHELL:
|
||||
if (me->IsNonMeleeSpellCast(false))
|
||||
{
|
||||
me->InterruptNonMeleeSpells(true);
|
||||
}
|
||||
|
||||
Talk(EMOTE_DARK_SHELL);
|
||||
DoCast(me, SPELL_DARK_SHELL);
|
||||
events.RescheduleEvent(EVENT_DARK_SHELL, 20000);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
Talk(EMOTE_DARK_SHELL);
|
||||
DoCast(me, SPELL_DARK_SHELL);
|
||||
events.RescheduleEvent(EVENT_DARK_SHELL, 20000);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
uint32 VoidBlastCounter;
|
||||
private:
|
||||
uint32 VoidBlastCounter;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -22,25 +22,25 @@
|
||||
|
||||
class instance_mana_tombs : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
instance_mana_tombs() : InstanceMapScript(MTScriptName, 557) { }
|
||||
public:
|
||||
instance_mana_tombs() : InstanceMapScript(MTScriptName, 557) { }
|
||||
|
||||
struct instance_mana_tombs_InstanceMapScript : public InstanceScript
|
||||
struct instance_mana_tombs_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_mana_tombs_InstanceMapScript(Map* map) : InstanceScript(map)
|
||||
{
|
||||
instance_mana_tombs_InstanceMapScript(Map* map) : InstanceScript(map)
|
||||
{
|
||||
SetBossNumber(EncounterCount);
|
||||
}
|
||||
|
||||
void Load(char const* data) override { LoadBossState(data); }
|
||||
|
||||
std::string GetSaveData() override { return DataHeader + GetBossSaveData(); }
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const override
|
||||
{
|
||||
return new instance_mana_tombs_InstanceMapScript(map);
|
||||
SetBossNumber(EncounterCount);
|
||||
}
|
||||
|
||||
void Load(char const* data) override { LoadBossState(data); }
|
||||
|
||||
std::string GetSaveData() override { return DataHeader + GetBossSaveData(); }
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const override
|
||||
{
|
||||
return new instance_mana_tombs_InstanceMapScript(map);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_instance_mana_tombs()
|
||||
|
||||
@@ -92,7 +92,7 @@ public:
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (urand(0,1))
|
||||
if (urand(0, 1))
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
@@ -242,7 +242,7 @@ public:
|
||||
Talk(SAY_SUMMON);
|
||||
me->CastSpell(me, SPELL_BANISH_SELF, true);
|
||||
for (uint8 i = 0; i < 5; ++i)
|
||||
me->SummonCreature(23132 /*NPC_BROOD_OF_ANZU*/, me->GetPositionX()+20*cos((float)i), me->GetPositionY()+20*sin((float)i), me->GetPositionZ()+25.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
|
||||
me->SummonCreature(23132 /*NPC_BROOD_OF_ANZU*/, me->GetPositionX() + 20 * cos((float)i), me->GetPositionY() + 20 * sin((float)i), me->GetPositionZ() + 25.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
@@ -268,7 +268,7 @@ public:
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING|UNIT_STATE_STUNNED))
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING | UNIT_STATE_STUNNED))
|
||||
return;
|
||||
|
||||
switch (events.GetEvent())
|
||||
|
||||
@@ -58,9 +58,9 @@ public:
|
||||
case DATA_IKISSDOOREVENT:
|
||||
if (data == DONE)
|
||||
{
|
||||
DoUseDoorOrButton(m_uiIkissDoorGUID, DAY*IN_MILLISECONDS);
|
||||
DoUseDoorOrButton(m_uiIkissDoorGUID, DAY * IN_MILLISECONDS);
|
||||
if (GameObject* coffer = instance->GetGameObject(_talonKingsCofferGUID))
|
||||
coffer->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE|GO_FLAG_INTERACT_COND);
|
||||
coffer->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE | GO_FLAG_INTERACT_COND);
|
||||
}
|
||||
break;
|
||||
case TYPE_ANZU_ENCOUNTER:
|
||||
|
||||
@@ -108,7 +108,7 @@ public:
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER && urand(0,1))
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER && urand(0, 1))
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
@@ -148,7 +148,7 @@ public:
|
||||
events.PopEvent();
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
@@ -58,7 +58,7 @@ public:
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER && urand(0,1))
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER && urand(0, 1))
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
@@ -101,24 +101,24 @@ public:
|
||||
events.PopEvent();
|
||||
break;
|
||||
case EVENT_SPELL_INCITE:
|
||||
{
|
||||
me->CastSpell(me, SPELL_INCITE_CHAOS, false);
|
||||
|
||||
std::list<HostileReference*> t_list = me->getThreatManager().getThreatList();
|
||||
for (std::list<HostileReference*>::const_iterator itr = t_list.begin(); itr!= t_list.end(); ++itr)
|
||||
{
|
||||
Unit* target = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid());
|
||||
if (target && target->GetTypeId() == TYPEID_PLAYER)
|
||||
me->CastSpell(target, SPELL_INCITE_CHAOS_B, true);
|
||||
}
|
||||
me->CastSpell(me, SPELL_INCITE_CHAOS, false);
|
||||
|
||||
DoResetThreat();
|
||||
InciteChaos = true;
|
||||
events.DelayEvents(15000);
|
||||
events.RepeatEvent(40000);
|
||||
events.ScheduleEvent(EVENT_INCITE_WAIT, 15000);
|
||||
break;
|
||||
}
|
||||
std::list<HostileReference*> t_list = me->getThreatManager().getThreatList();
|
||||
for (std::list<HostileReference*>::const_iterator itr = t_list.begin(); itr != t_list.end(); ++itr)
|
||||
{
|
||||
Unit* target = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid());
|
||||
if (target && target->GetTypeId() == TYPEID_PLAYER)
|
||||
me->CastSpell(target, SPELL_INCITE_CHAOS_B, true);
|
||||
}
|
||||
|
||||
DoResetThreat();
|
||||
InciteChaos = true;
|
||||
events.DelayEvents(15000);
|
||||
events.RepeatEvent(40000);
|
||||
events.ScheduleEvent(EVENT_INCITE_WAIT, 15000);
|
||||
break;
|
||||
}
|
||||
case EVENT_SPELL_CHARGE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
me->CastSpell(target, SPELL_CHARGE, false);
|
||||
|
||||
@@ -168,25 +168,25 @@ public:
|
||||
break;
|
||||
case EVENT_SUMMON_TRAVELER:
|
||||
spawnVoidTraveler();
|
||||
events.RepeatEvent(HealthBelowPct(20) ? 5000: 10000);
|
||||
events.RepeatEvent(HealthBelowPct(20) ? 5000 : 10000);
|
||||
break;
|
||||
case EVENT_SPELL_DRAWSHADOWS:
|
||||
{
|
||||
Map* map = me->GetMap();
|
||||
Map::PlayerList const &PlayerList = map->GetPlayers();
|
||||
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
|
||||
if (Player* player = i->GetSource())
|
||||
if (player->IsAlive() && !player->HasAura(SPELL_BANISH))
|
||||
player->TeleportTo(me->GetMapId(), VorpilPosition[0], VorpilPosition[1], VorpilPosition[2], 0, TELE_TO_NOT_LEAVE_COMBAT);
|
||||
{
|
||||
Map* map = me->GetMap();
|
||||
Map::PlayerList const& PlayerList = map->GetPlayers();
|
||||
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
|
||||
if (Player* player = i->GetSource())
|
||||
if (player->IsAlive() && !player->HasAura(SPELL_BANISH))
|
||||
player->TeleportTo(me->GetMapId(), VorpilPosition[0], VorpilPosition[1], VorpilPosition[2], 0, TELE_TO_NOT_LEAVE_COMBAT);
|
||||
|
||||
me->NearTeleportTo(VorpilPosition[0], VorpilPosition[1], VorpilPosition[2], 0.0f);
|
||||
me->CastSpell(me, SPELL_DRAW_SHADOWS, true);
|
||||
me->CastSpell(me, SPELL_RAIN_OF_FIRE_N);
|
||||
me->NearTeleportTo(VorpilPosition[0], VorpilPosition[1], VorpilPosition[2], 0.0f);
|
||||
me->CastSpell(me, SPELL_DRAW_SHADOWS, true);
|
||||
me->CastSpell(me, SPELL_RAIN_OF_FIRE_N);
|
||||
|
||||
events.RepeatEvent(24000);
|
||||
events.DelayEvents(6000);
|
||||
break;
|
||||
}
|
||||
events.RepeatEvent(24000);
|
||||
events.DelayEvents(6000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
|
||||
@@ -15,7 +15,7 @@ enum Murmur
|
||||
SPELL_MAGNETIC_PULL = 33689,
|
||||
SPELL_SONIC_SHOCK = 38797,
|
||||
SPELL_THUNDERING_STORM = 39365,
|
||||
|
||||
|
||||
SPELL_SONIC_BOOM_CAST_N = 33923,
|
||||
SPELL_SONIC_BOOM_CAST_H = 38796,
|
||||
SPELL_SONIC_BOOM_EFFECT_N = 38795,
|
||||
@@ -155,58 +155,58 @@ public:
|
||||
|
||||
class spell_murmur_sonic_boom_effect : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_murmur_sonic_boom_effect() : SpellScriptLoader("spell_murmur_sonic_boom_effect") { }
|
||||
|
||||
class spell_murmur_sonic_boom_effect_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_murmur_sonic_boom_effect_SpellScript)
|
||||
|
||||
public:
|
||||
spell_murmur_sonic_boom_effect() : SpellScriptLoader("spell_murmur_sonic_boom_effect") { }
|
||||
spell_murmur_sonic_boom_effect_SpellScript() : SpellScript() { }
|
||||
|
||||
class spell_murmur_sonic_boom_effect_SpellScript : public SpellScript
|
||||
void RecalculateDamage()
|
||||
{
|
||||
PrepareSpellScript(spell_murmur_sonic_boom_effect_SpellScript)
|
||||
|
||||
public:
|
||||
spell_murmur_sonic_boom_effect_SpellScript() : SpellScript() { }
|
||||
|
||||
void RecalculateDamage()
|
||||
{
|
||||
SetHitDamage(GetHitUnit()->CountPctFromMaxHealth(90));
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnHit += SpellHitFn(spell_murmur_sonic_boom_effect_SpellScript::RecalculateDamage);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_murmur_sonic_boom_effect_SpellScript();
|
||||
SetHitDamage(GetHitUnit()->CountPctFromMaxHealth(90));
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnHit += SpellHitFn(spell_murmur_sonic_boom_effect_SpellScript::RecalculateDamage);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_murmur_sonic_boom_effect_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_murmur_thundering_storm : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_murmur_thundering_storm() : SpellScriptLoader("spell_murmur_thundering_storm") { }
|
||||
public:
|
||||
spell_murmur_thundering_storm() : SpellScriptLoader("spell_murmur_thundering_storm") { }
|
||||
|
||||
class spell_murmur_thundering_storm_SpellScript : public SpellScript
|
||||
class spell_murmur_thundering_storm_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_murmur_thundering_storm_SpellScript);
|
||||
|
||||
void SelectTarget(std::list<WorldObject*>& targets)
|
||||
{
|
||||
PrepareSpellScript(spell_murmur_thundering_storm_SpellScript);
|
||||
|
||||
void SelectTarget(std::list<WorldObject*>& targets)
|
||||
{
|
||||
targets.remove_if(acore::AllWorldObjectsInExactRange(GetCaster(), 100.0f, true));
|
||||
targets.remove_if(acore::AllWorldObjectsInExactRange(GetCaster(), 25.0f, false));
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_murmur_thundering_storm_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_murmur_thundering_storm_SpellScript();
|
||||
targets.remove_if(acore::AllWorldObjectsInExactRange(GetCaster(), 100.0f, true));
|
||||
targets.remove_if(acore::AllWorldObjectsInExactRange(GetCaster(), 25.0f, false));
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_murmur_thundering_storm_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_murmur_thundering_storm_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_murmur()
|
||||
|
||||
@@ -91,7 +91,7 @@ public:
|
||||
cr->AI()->DoAction(1);
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case DATA_BLACKHEARTTHEINCITEREVENT:
|
||||
if (uiData == DONE)
|
||||
DoUseDoorOrButton(m_uiRefectoryDoorGUID);
|
||||
@@ -125,7 +125,7 @@ public:
|
||||
{
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "S L " << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' '
|
||||
<< m_auiEncounter[2] << ' ' << m_auiEncounter[3] << ' ' << m_auiEncounter[4];
|
||||
<< m_auiEncounter[2] << ' ' << m_auiEncounter[3] << ' ' << m_auiEncounter[4];
|
||||
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
@@ -60,193 +60,193 @@ enum Misc
|
||||
|
||||
class boss_gurtogg_bloodboil : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_gurtogg_bloodboil() : CreatureScript("boss_gurtogg_bloodboil") { }
|
||||
public:
|
||||
boss_gurtogg_bloodboil() : CreatureScript("boss_gurtogg_bloodboil") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_gurtogg_bloodboilAI>(creature);
|
||||
}
|
||||
|
||||
struct boss_gurtogg_bloodboilAI : public BossAI
|
||||
{
|
||||
boss_gurtogg_bloodboilAI(Creature* creature) : BossAI(creature, DATA_GURTOGG_BLOODBOIL)
|
||||
{
|
||||
return GetInstanceAI<boss_gurtogg_bloodboilAI>(creature);
|
||||
}
|
||||
|
||||
struct boss_gurtogg_bloodboilAI : public BossAI
|
||||
void Reset()
|
||||
{
|
||||
boss_gurtogg_bloodboilAI(Creature* creature) : BossAI(creature, DATA_GURTOGG_BLOODBOIL)
|
||||
BossAI::Reset();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
me->CastSpell(me, SPELL_ACIDIC_WOUND, true);
|
||||
events.ScheduleEvent(EVENT_SPELL_BLOOD_BOIL, 10000);
|
||||
events.ScheduleEvent(EVENT_SPELL_BEWILDERING_STRIKE, 28000, GROUP_DELAY);
|
||||
events.ScheduleEvent(EVENT_SPELL_FEL_ACID_BREATH, 38000);
|
||||
events.ScheduleEvent(EVENT_SPELL_EJECT, 14000);
|
||||
events.ScheduleEvent(EVENT_SPELL_ARCING_SMASH, 5000);
|
||||
events.ScheduleEvent(EVENT_SPELL_FEL_GEYSER, 60000);
|
||||
events.ScheduleEvent(EVENT_SPELL_BERSERK, 600000);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(SAY_SLAY);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
}
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
summon->CastSpell(summon, SPELL_FEL_GEYSER_DAMAGE, false);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPELL_BERSERK:
|
||||
Talk(SAY_ENRAGE);
|
||||
me->CastSpell(me, SPELL_BERSERK, true);
|
||||
break;
|
||||
case EVENT_SPELL_BLOOD_BOIL:
|
||||
me->CastCustomSpell(SPELL_BLOODBOIL, SPELLVALUE_MAX_TARGETS, 5, me, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_BLOOD_BOIL, 10000);
|
||||
break;
|
||||
case EVENT_SPELL_BEWILDERING_STRIKE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_BEWILDERING_STRIKE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_BEWILDERING_STRIKE, 30000, GROUP_DELAY);
|
||||
break;
|
||||
case EVENT_SPELL_FEL_ACID_BREATH:
|
||||
me->CastSpell(me->GetVictim(), me->HasAura(SPELL_FEL_RAGE_SELF) ? SPELL_FEL_ACID_BREATH2 : SPELL_FEL_ACID_BREATH1, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_FEL_ACID_BREATH, 30000);
|
||||
break;
|
||||
case EVENT_SPELL_EJECT:
|
||||
me->CastSpell(me->GetVictim(), me->HasAura(SPELL_FEL_RAGE_SELF) ? SPELL_EJECT2 : SPELL_EJECT1, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_EJECT, 20000);
|
||||
break;
|
||||
case EVENT_SPELL_ARCING_SMASH:
|
||||
me->CastSpell(me->GetVictim(), me->HasAura(SPELL_FEL_RAGE_SELF) ? SPELL_ARCING_SMASH2 : SPELL_ARCING_SMASH1, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_ARCING_SMASH, 15000);
|
||||
break;
|
||||
case EVENT_SPELL_FEL_GEYSER:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 40.0f, true))
|
||||
{
|
||||
me->RemoveAurasByType(SPELL_AURA_MOD_TAUNT);
|
||||
me->CastSpell(me, SPELL_FEL_RAGE_SELF, true);
|
||||
me->CastSpell(target, SPELL_FEL_RAGE_TARGET, true);
|
||||
me->CastSpell(target, SPELL_FEL_RAGE_2, true);
|
||||
me->CastSpell(target, SPELL_FEL_RAGE_3, true);
|
||||
me->CastSpell(target, SPELL_FEL_RAGE_SIZE, true);
|
||||
target->CastSpell(me, SPELL_TAUNT_GURTOGG, true);
|
||||
|
||||
me->CastSpell(target, SPELL_FEL_GEYSER_SUMMON, true);
|
||||
me->CastSpell(me, SPELL_FEL_GEYSER_STUN, true);
|
||||
me->CastSpell(me, SPELL_INSIGNIFICANCE, true);
|
||||
events.ScheduleEvent(EVENT_SPELL_CHARGE, 2000);
|
||||
events.DelayEvents(30000, GROUP_DELAY);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_SPELL_FEL_GEYSER, 90000);
|
||||
break;
|
||||
case EVENT_SPELL_CHARGE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_CHARGE, true);
|
||||
break;
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
}
|
||||
DoMeleeAttackIfReady();
|
||||
EnterEvadeIfOutOfCombatArea();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
me->CastSpell(me, SPELL_ACIDIC_WOUND, true);
|
||||
events.ScheduleEvent(EVENT_SPELL_BLOOD_BOIL, 10000);
|
||||
events.ScheduleEvent(EVENT_SPELL_BEWILDERING_STRIKE, 28000, GROUP_DELAY);
|
||||
events.ScheduleEvent(EVENT_SPELL_FEL_ACID_BREATH, 38000);
|
||||
events.ScheduleEvent(EVENT_SPELL_EJECT, 14000);
|
||||
events.ScheduleEvent(EVENT_SPELL_ARCING_SMASH, 5000);
|
||||
events.ScheduleEvent(EVENT_SPELL_FEL_GEYSER, 60000);
|
||||
events.ScheduleEvent(EVENT_SPELL_BERSERK, 600000);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(SAY_SLAY);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
}
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
summon->CastSpell(summon, SPELL_FEL_GEYSER_DAMAGE, false);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPELL_BERSERK:
|
||||
Talk(SAY_ENRAGE);
|
||||
me->CastSpell(me, SPELL_BERSERK, true);
|
||||
break;
|
||||
case EVENT_SPELL_BLOOD_BOIL:
|
||||
me->CastCustomSpell(SPELL_BLOODBOIL, SPELLVALUE_MAX_TARGETS, 5, me, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_BLOOD_BOIL, 10000);
|
||||
break;
|
||||
case EVENT_SPELL_BEWILDERING_STRIKE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_BEWILDERING_STRIKE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_BEWILDERING_STRIKE, 30000, GROUP_DELAY);
|
||||
break;
|
||||
case EVENT_SPELL_FEL_ACID_BREATH:
|
||||
me->CastSpell(me->GetVictim(), me->HasAura(SPELL_FEL_RAGE_SELF) ? SPELL_FEL_ACID_BREATH2 : SPELL_FEL_ACID_BREATH1, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_FEL_ACID_BREATH, 30000);
|
||||
break;
|
||||
case EVENT_SPELL_EJECT:
|
||||
me->CastSpell(me->GetVictim(), me->HasAura(SPELL_FEL_RAGE_SELF) ? SPELL_EJECT2 : SPELL_EJECT1, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_EJECT, 20000);
|
||||
break;
|
||||
case EVENT_SPELL_ARCING_SMASH:
|
||||
me->CastSpell(me->GetVictim(), me->HasAura(SPELL_FEL_RAGE_SELF) ? SPELL_ARCING_SMASH2 : SPELL_ARCING_SMASH1, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_ARCING_SMASH, 15000);
|
||||
break;
|
||||
case EVENT_SPELL_FEL_GEYSER:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 40.0f, true))
|
||||
{
|
||||
me->RemoveAurasByType(SPELL_AURA_MOD_TAUNT);
|
||||
me->CastSpell(me, SPELL_FEL_RAGE_SELF, true);
|
||||
me->CastSpell(target, SPELL_FEL_RAGE_TARGET, true);
|
||||
me->CastSpell(target, SPELL_FEL_RAGE_2, true);
|
||||
me->CastSpell(target, SPELL_FEL_RAGE_3, true);
|
||||
me->CastSpell(target, SPELL_FEL_RAGE_SIZE, true);
|
||||
target->CastSpell(me, SPELL_TAUNT_GURTOGG, true);
|
||||
|
||||
me->CastSpell(target, SPELL_FEL_GEYSER_SUMMON, true);
|
||||
me->CastSpell(me, SPELL_FEL_GEYSER_STUN, true);
|
||||
me->CastSpell(me, SPELL_INSIGNIFICANCE, true);
|
||||
events.ScheduleEvent(EVENT_SPELL_CHARGE, 2000);
|
||||
events.DelayEvents(30000, GROUP_DELAY);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_SPELL_FEL_GEYSER, 90000);
|
||||
break;
|
||||
case EVENT_SPELL_CHARGE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_CHARGE, true);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
EnterEvadeIfOutOfCombatArea();
|
||||
}
|
||||
|
||||
bool CheckEvadeIfOutOfCombatArea() const
|
||||
{
|
||||
return me->GetHomePosition().GetExactDist2d(me) > 105.0f;
|
||||
}
|
||||
};
|
||||
bool CheckEvadeIfOutOfCombatArea() const
|
||||
{
|
||||
return me->GetHomePosition().GetExactDist2d(me) > 105.0f;
|
||||
}
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
class spell_gurtogg_bloodboil : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_gurtogg_bloodboil() : SpellScriptLoader("spell_gurtogg_bloodboil") { }
|
||||
public:
|
||||
spell_gurtogg_bloodboil() : SpellScriptLoader("spell_gurtogg_bloodboil") { }
|
||||
|
||||
class spell_gurtogg_bloodboil_SpellScript : public SpellScript
|
||||
class spell_gurtogg_bloodboil_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_gurtogg_bloodboil_SpellScript);
|
||||
|
||||
void FilterTargets(std::list<WorldObject*>& targets)
|
||||
{
|
||||
PrepareSpellScript(spell_gurtogg_bloodboil_SpellScript);
|
||||
if (targets.empty())
|
||||
return;
|
||||
|
||||
void FilterTargets(std::list<WorldObject*>& targets)
|
||||
targets.sort(acore::ObjectDistanceOrderPred(GetCaster(), false));
|
||||
if (targets.size() > GetSpellValue()->MaxAffectedTargets)
|
||||
{
|
||||
if (targets.empty())
|
||||
return;
|
||||
|
||||
targets.sort(acore::ObjectDistanceOrderPred(GetCaster(), false));
|
||||
if (targets.size() > GetSpellValue()->MaxAffectedTargets)
|
||||
{
|
||||
std::list<WorldObject*>::iterator itr = targets.begin();
|
||||
std::advance(itr, GetSpellValue()->MaxAffectedTargets);
|
||||
targets.erase(itr, targets.end());
|
||||
}
|
||||
std::list<WorldObject*>::iterator itr = targets.begin();
|
||||
std::advance(itr, GetSpellValue()->MaxAffectedTargets);
|
||||
targets.erase(itr, targets.end());
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_gurtogg_bloodboil_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_gurtogg_bloodboil_SpellScript();
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_gurtogg_bloodboil_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_gurtogg_bloodboil_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_gurtogg_eject : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_gurtogg_eject() : SpellScriptLoader("spell_gurtogg_eject") { }
|
||||
public:
|
||||
spell_gurtogg_eject() : SpellScriptLoader("spell_gurtogg_eject") { }
|
||||
|
||||
class spell_gurtogg_eject_SpellScript : public SpellScript
|
||||
class spell_gurtogg_eject_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_gurtogg_eject_SpellScript);
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex effIndex)
|
||||
{
|
||||
PrepareSpellScript(spell_gurtogg_eject_SpellScript);
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex effIndex)
|
||||
{
|
||||
PreventHitEffect(effIndex);
|
||||
if (Unit* target = GetHitUnit())
|
||||
GetCaster()->getThreatManager().modifyThreatPercent(target, -20);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_gurtogg_eject_SpellScript::HandleScriptEffect, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_gurtogg_eject_SpellScript();
|
||||
PreventHitEffect(effIndex);
|
||||
if (Unit* target = GetHitUnit())
|
||||
GetCaster()->getThreatManager().modifyThreatPercent(target, -20);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_gurtogg_eject_SpellScript::HandleScriptEffect, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_gurtogg_eject_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_gurtogg_bloodboil()
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -55,305 +55,305 @@ enum Misc
|
||||
|
||||
class boss_mother_shahraz : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_mother_shahraz() : CreatureScript("boss_mother_shahraz") { }
|
||||
public:
|
||||
boss_mother_shahraz() : CreatureScript("boss_mother_shahraz") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_shahrazAI>(creature);
|
||||
}
|
||||
|
||||
struct boss_shahrazAI : public BossAI
|
||||
{
|
||||
boss_shahrazAI(Creature* creature) : BossAI(creature, DATA_MOTHER_SHAHRAZ)
|
||||
{
|
||||
return GetInstanceAI<boss_shahrazAI>(creature);
|
||||
}
|
||||
|
||||
struct boss_shahrazAI : public BossAI
|
||||
void Reset()
|
||||
{
|
||||
boss_shahrazAI(Creature* creature) : BossAI(creature, DATA_MOTHER_SHAHRAZ)
|
||||
BossAI::Reset();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
me->CastSpell(me, SPELL_SABER_LASH_AURA, true);
|
||||
me->CastSpell(me, SPELL_RANDOM_PERIODIC, true);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
|
||||
events.ScheduleEvent(EVENT_RANDOM_TALK, 60000);
|
||||
events.ScheduleEvent(EVENT_SPELL_PRISMATIC_AURA, 0);
|
||||
events.ScheduleEvent(EVENT_SPELL_ENRAGE, 600000);
|
||||
events.ScheduleEvent(EVENT_SPELL_SILENCING_SHRIEK, 30000);
|
||||
events.ScheduleEvent(EVENT_SPELL_FATAL_ATTRACTION, 50000);
|
||||
events.ScheduleEvent(EVENT_SPELL_SABER_LASH, 4000);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(SAY_SLAY);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_CHECK_HEALTH:
|
||||
if (HealthBelowPct(10))
|
||||
{
|
||||
me->CastSpell(me, SPELL_FRENZY, true);
|
||||
Talk(SAY_EMOTE_FRENZY);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
|
||||
break;
|
||||
case EVENT_SPELL_ENRAGE:
|
||||
me->CastSpell(me, SPELL_ENRAGE, true);
|
||||
Talk(SAY_ENRAGE);
|
||||
break;
|
||||
case EVENT_RANDOM_TALK:
|
||||
Talk(SAY_TAUNT);
|
||||
events.ScheduleEvent(EVENT_RANDOM_TALK, urand(60000, 120000));
|
||||
break;
|
||||
case EVENT_SPELL_SABER_LASH:
|
||||
me->CastSpell(me->GetVictim(), SPELL_SABER_LASH, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_SABER_LASH, 30000);
|
||||
break;
|
||||
case EVENT_SPELL_PRISMATIC_AURA:
|
||||
me->CastSpell(me, RAND(SPELL_PRISMATIC_AURA_SHADOW, SPELL_PRISMATIC_AURA_FIRE, SPELL_PRISMATIC_AURA_NATURE, SPELL_PRISMATIC_AURA_ARCANE, SPELL_PRISMATIC_AURA_FROST, SPELL_PRISMATIC_AURA_HOLY), false);
|
||||
events.ScheduleEvent(EVENT_SPELL_PRISMATIC_AURA, 15000);
|
||||
break;
|
||||
case EVENT_SPELL_SILENCING_SHRIEK:
|
||||
me->CastSpell(me, SPELL_SILENCING_SHRIEK, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_SILENCING_SHRIEK, 30000);
|
||||
break;
|
||||
case EVENT_SPELL_FATAL_ATTRACTION:
|
||||
Talk(SAY_SPELL);
|
||||
me->CastCustomSpell(SPELL_FATAL_ATTRACTION, SPELLVALUE_MAX_TARGETS, 3, me, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_FATAL_ATTRACTION, 60000);
|
||||
break;
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
me->CastSpell(me, SPELL_SABER_LASH_AURA, true);
|
||||
me->CastSpell(me, SPELL_RANDOM_PERIODIC, true);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
|
||||
events.ScheduleEvent(EVENT_RANDOM_TALK, 60000);
|
||||
events.ScheduleEvent(EVENT_SPELL_PRISMATIC_AURA, 0);
|
||||
events.ScheduleEvent(EVENT_SPELL_ENRAGE, 600000);
|
||||
events.ScheduleEvent(EVENT_SPELL_SILENCING_SHRIEK, 30000);
|
||||
events.ScheduleEvent(EVENT_SPELL_FATAL_ATTRACTION, 50000);
|
||||
events.ScheduleEvent(EVENT_SPELL_SABER_LASH, 4000);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(SAY_SLAY);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_CHECK_HEALTH:
|
||||
if (HealthBelowPct(10))
|
||||
{
|
||||
me->CastSpell(me, SPELL_FRENZY, true);
|
||||
Talk(SAY_EMOTE_FRENZY);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
|
||||
break;
|
||||
case EVENT_SPELL_ENRAGE:
|
||||
me->CastSpell(me, SPELL_ENRAGE, true);
|
||||
Talk(SAY_ENRAGE);
|
||||
break;
|
||||
case EVENT_RANDOM_TALK:
|
||||
Talk(SAY_TAUNT);
|
||||
events.ScheduleEvent(EVENT_RANDOM_TALK, urand(60000, 120000));
|
||||
break;
|
||||
case EVENT_SPELL_SABER_LASH:
|
||||
me->CastSpell(me->GetVictim(), SPELL_SABER_LASH, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_SABER_LASH, 30000);
|
||||
break;
|
||||
case EVENT_SPELL_PRISMATIC_AURA:
|
||||
me->CastSpell(me, RAND(SPELL_PRISMATIC_AURA_SHADOW, SPELL_PRISMATIC_AURA_FIRE, SPELL_PRISMATIC_AURA_NATURE, SPELL_PRISMATIC_AURA_ARCANE, SPELL_PRISMATIC_AURA_FROST, SPELL_PRISMATIC_AURA_HOLY), false);
|
||||
events.ScheduleEvent(EVENT_SPELL_PRISMATIC_AURA, 15000);
|
||||
break;
|
||||
case EVENT_SPELL_SILENCING_SHRIEK:
|
||||
me->CastSpell(me, SPELL_SILENCING_SHRIEK, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_SILENCING_SHRIEK, 30000);
|
||||
break;
|
||||
case EVENT_SPELL_FATAL_ATTRACTION:
|
||||
Talk(SAY_SPELL);
|
||||
me->CastCustomSpell(SPELL_FATAL_ATTRACTION, SPELLVALUE_MAX_TARGETS, 3, me, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_FATAL_ATTRACTION, 60000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
class spell_mother_shahraz_random_periodic : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_mother_shahraz_random_periodic() : SpellScriptLoader("spell_mother_shahraz_random_periodic") { }
|
||||
public:
|
||||
spell_mother_shahraz_random_periodic() : SpellScriptLoader("spell_mother_shahraz_random_periodic") { }
|
||||
|
||||
class spell_mother_shahraz_random_periodic_AuraScript : public AuraScript
|
||||
class spell_mother_shahraz_random_periodic_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_mother_shahraz_random_periodic_AuraScript);
|
||||
|
||||
void Update(AuraEffect const* effect)
|
||||
{
|
||||
PrepareAuraScript(spell_mother_shahraz_random_periodic_AuraScript);
|
||||
|
||||
void Update(AuraEffect const* effect)
|
||||
{
|
||||
PreventDefaultAction();
|
||||
if (effect->GetTickNumber()%5 == 1)
|
||||
GetUnitOwner()->CastSpell(GetUnitOwner(), RAND(SPELL_SINFUL_PERIODIC, SPELL_SINISTER_PERIODIC, SPELL_VILE_PERIODIC, SPELL_WICKED_PERIODIC), true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_mother_shahraz_random_periodic_AuraScript::Update, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_mother_shahraz_random_periodic_AuraScript();
|
||||
PreventDefaultAction();
|
||||
if (effect->GetTickNumber() % 5 == 1)
|
||||
GetUnitOwner()->CastSpell(GetUnitOwner(), RAND(SPELL_SINFUL_PERIODIC, SPELL_SINISTER_PERIODIC, SPELL_VILE_PERIODIC, SPELL_WICKED_PERIODIC), true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_mother_shahraz_random_periodic_AuraScript::Update, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_mother_shahraz_random_periodic_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_mother_shahraz_beam_periodic : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_mother_shahraz_beam_periodic() : SpellScriptLoader("spell_mother_shahraz_beam_periodic") { }
|
||||
public:
|
||||
spell_mother_shahraz_beam_periodic() : SpellScriptLoader("spell_mother_shahraz_beam_periodic") { }
|
||||
|
||||
class spell_mother_shahraz_beam_periodic_AuraScript : public AuraScript
|
||||
class spell_mother_shahraz_beam_periodic_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_mother_shahraz_beam_periodic_AuraScript);
|
||||
|
||||
void Update(AuraEffect const* effect)
|
||||
{
|
||||
PrepareAuraScript(spell_mother_shahraz_beam_periodic_AuraScript);
|
||||
|
||||
void Update(AuraEffect const* effect)
|
||||
{
|
||||
PreventDefaultAction();
|
||||
if (Unit* target = GetUnitOwner()->GetAI()->SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
GetUnitOwner()->CastSpell(target, GetSpellInfo()->Effects[effect->GetEffIndex()].TriggerSpell, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_mother_shahraz_beam_periodic_AuraScript::Update, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_mother_shahraz_beam_periodic_AuraScript();
|
||||
PreventDefaultAction();
|
||||
if (Unit* target = GetUnitOwner()->GetAI()->SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
GetUnitOwner()->CastSpell(target, GetSpellInfo()->Effects[effect->GetEffIndex()].TriggerSpell, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_mother_shahraz_beam_periodic_AuraScript::Update, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_mother_shahraz_beam_periodic_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_mother_shahraz_saber_lash : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_mother_shahraz_saber_lash() : SpellScriptLoader("spell_mother_shahraz_saber_lash") { }
|
||||
public:
|
||||
spell_mother_shahraz_saber_lash() : SpellScriptLoader("spell_mother_shahraz_saber_lash") { }
|
||||
|
||||
class spell_mother_shahraz_saber_lash_AuraScript : public AuraScript
|
||||
class spell_mother_shahraz_saber_lash_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_mother_shahraz_saber_lash_AuraScript);
|
||||
|
||||
bool CheckProc(ProcEventInfo& /*eventInfo*/)
|
||||
{
|
||||
PrepareAuraScript(spell_mother_shahraz_saber_lash_AuraScript);
|
||||
|
||||
bool CheckProc(ProcEventInfo& /*eventInfo*/)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
void Update(AuraEffect const* effect)
|
||||
{
|
||||
PreventDefaultAction();
|
||||
if (Unit* target = GetUnitOwner()->GetVictim())
|
||||
GetUnitOwner()->CastSpell(target, GetSpellInfo()->Effects[effect->GetEffIndex()].TriggerSpell, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
DoCheckProc += AuraCheckProcFn(spell_mother_shahraz_saber_lash_AuraScript::CheckProc);
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_mother_shahraz_saber_lash_AuraScript::Update, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_mother_shahraz_saber_lash_AuraScript();
|
||||
return false;
|
||||
}
|
||||
|
||||
void Update(AuraEffect const* effect)
|
||||
{
|
||||
PreventDefaultAction();
|
||||
if (Unit* target = GetUnitOwner()->GetVictim())
|
||||
GetUnitOwner()->CastSpell(target, GetSpellInfo()->Effects[effect->GetEffIndex()].TriggerSpell, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
DoCheckProc += AuraCheckProcFn(spell_mother_shahraz_saber_lash_AuraScript::CheckProc);
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_mother_shahraz_saber_lash_AuraScript::Update, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_mother_shahraz_saber_lash_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_mother_shahraz_fatal_attraction : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_mother_shahraz_fatal_attraction() : SpellScriptLoader("spell_mother_shahraz_fatal_attraction") { }
|
||||
public:
|
||||
spell_mother_shahraz_fatal_attraction() : SpellScriptLoader("spell_mother_shahraz_fatal_attraction") { }
|
||||
|
||||
class spell_mother_shahraz_fatal_attraction_SpellScript : public SpellScript
|
||||
class spell_mother_shahraz_fatal_attraction_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_mother_shahraz_fatal_attraction_SpellScript);
|
||||
|
||||
void FilterTargets(std::list<WorldObject*>& targets)
|
||||
{
|
||||
PrepareSpellScript(spell_mother_shahraz_fatal_attraction_SpellScript);
|
||||
|
||||
void FilterTargets(std::list<WorldObject*>& targets)
|
||||
{
|
||||
targets.remove_if(acore::UnitAuraCheck(true, SPELL_SABER_LASH_IMMUNITY));
|
||||
if (targets.size() <= 1)
|
||||
FinishCast(SPELL_FAILED_DONT_REPORT);
|
||||
}
|
||||
|
||||
void SetDest(SpellDestination& dest)
|
||||
{
|
||||
std::list<Spell::TargetInfo> const* targetsInfo = GetSpell()->GetUniqueTargetInfo();
|
||||
for (std::list<Spell::TargetInfo>::const_iterator ihit = targetsInfo->begin(); ihit != targetsInfo->end(); ++ihit)
|
||||
if (Unit* target = ObjectAccessor::GetUnit(*GetCaster(), ihit->targetGUID))
|
||||
{
|
||||
dest.Relocate(*target);
|
||||
if (roll_chance_i(50))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void HandleTeleportUnits(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (Unit* target = GetHitUnit())
|
||||
GetCaster()->CastSpell(target, SPELL_FATAL_ATTRACTION_AURA, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mother_shahraz_fatal_attraction_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY);
|
||||
OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_mother_shahraz_fatal_attraction_SpellScript::SetDest, EFFECT_1, TARGET_DEST_CASTER_RANDOM);
|
||||
OnEffectHitTarget += SpellEffectFn(spell_mother_shahraz_fatal_attraction_SpellScript::HandleTeleportUnits, EFFECT_1, SPELL_EFFECT_TELEPORT_UNITS);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_mother_shahraz_fatal_attraction_SpellScript();
|
||||
targets.remove_if(acore::UnitAuraCheck(true, SPELL_SABER_LASH_IMMUNITY));
|
||||
if (targets.size() <= 1)
|
||||
FinishCast(SPELL_FAILED_DONT_REPORT);
|
||||
}
|
||||
|
||||
void SetDest(SpellDestination& dest)
|
||||
{
|
||||
std::list<Spell::TargetInfo> const* targetsInfo = GetSpell()->GetUniqueTargetInfo();
|
||||
for (std::list<Spell::TargetInfo>::const_iterator ihit = targetsInfo->begin(); ihit != targetsInfo->end(); ++ihit)
|
||||
if (Unit* target = ObjectAccessor::GetUnit(*GetCaster(), ihit->targetGUID))
|
||||
{
|
||||
dest.Relocate(*target);
|
||||
if (roll_chance_i(50))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void HandleTeleportUnits(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (Unit* target = GetHitUnit())
|
||||
GetCaster()->CastSpell(target, SPELL_FATAL_ATTRACTION_AURA, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mother_shahraz_fatal_attraction_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY);
|
||||
OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_mother_shahraz_fatal_attraction_SpellScript::SetDest, EFFECT_1, TARGET_DEST_CASTER_RANDOM);
|
||||
OnEffectHitTarget += SpellEffectFn(spell_mother_shahraz_fatal_attraction_SpellScript::HandleTeleportUnits, EFFECT_1, SPELL_EFFECT_TELEPORT_UNITS);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_mother_shahraz_fatal_attraction_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_mother_shahraz_fatal_attraction_dummy : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_mother_shahraz_fatal_attraction_dummy() : SpellScriptLoader("spell_mother_shahraz_fatal_attraction_dummy") { }
|
||||
public:
|
||||
spell_mother_shahraz_fatal_attraction_dummy() : SpellScriptLoader("spell_mother_shahraz_fatal_attraction_dummy") { }
|
||||
|
||||
class spell_mother_shahraz_fatal_attraction_dummy_SpellScript : public SpellScript
|
||||
class spell_mother_shahraz_fatal_attraction_dummy_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_mother_shahraz_fatal_attraction_dummy_SpellScript);
|
||||
|
||||
void HandleDummy(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
PrepareSpellScript(spell_mother_shahraz_fatal_attraction_dummy_SpellScript);
|
||||
|
||||
void HandleDummy(SpellEffIndex /*effIndex*/)
|
||||
if (Unit* target = GetHitUnit())
|
||||
{
|
||||
if (Unit* target = GetHitUnit())
|
||||
{
|
||||
target->CastSpell(target, SPELL_FATAL_ATTRACTION_DAMAGE, true);
|
||||
if (AuraEffect* aurEff = target->GetAuraEffect(SPELL_FATAL_ATTRACTION_AURA, EFFECT_1))
|
||||
aurEff->SetAmount(aurEff->GetTickNumber());
|
||||
}
|
||||
target->CastSpell(target, SPELL_FATAL_ATTRACTION_DAMAGE, true);
|
||||
if (AuraEffect* aurEff = target->GetAuraEffect(SPELL_FATAL_ATTRACTION_AURA, EFFECT_1))
|
||||
aurEff->SetAmount(aurEff->GetTickNumber());
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_mother_shahraz_fatal_attraction_dummy_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_mother_shahraz_fatal_attraction_dummy_SpellScript();
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_mother_shahraz_fatal_attraction_dummy_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_mother_shahraz_fatal_attraction_dummy_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_mother_shahraz_fatal_attraction_aura : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_mother_shahraz_fatal_attraction_aura() : SpellScriptLoader("spell_mother_shahraz_fatal_attraction_aura") { }
|
||||
public:
|
||||
spell_mother_shahraz_fatal_attraction_aura() : SpellScriptLoader("spell_mother_shahraz_fatal_attraction_aura") { }
|
||||
|
||||
class spell_mother_shahraz_fatal_attraction_aura_AuraScript : public AuraScript
|
||||
class spell_mother_shahraz_fatal_attraction_aura_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_mother_shahraz_fatal_attraction_aura_AuraScript);
|
||||
|
||||
void Update(AuraEffect const* effect)
|
||||
{
|
||||
PrepareAuraScript(spell_mother_shahraz_fatal_attraction_aura_AuraScript);
|
||||
|
||||
void Update(AuraEffect const* effect)
|
||||
{
|
||||
if (effect->GetTickNumber() > uint32(effect->GetAmount()+1))
|
||||
{
|
||||
PreventDefaultAction();
|
||||
SetDuration(0);
|
||||
}
|
||||
}
|
||||
|
||||
void Register()
|
||||
if (effect->GetTickNumber() > uint32(effect->GetAmount() + 1))
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_mother_shahraz_fatal_attraction_aura_AuraScript::Update, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
|
||||
PreventDefaultAction();
|
||||
SetDuration(0);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_mother_shahraz_fatal_attraction_aura_AuraScript();
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_mother_shahraz_fatal_attraction_aura_AuraScript::Update, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_mother_shahraz_fatal_attraction_aura_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_mother_shahraz()
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -79,96 +79,96 @@ enum Misc
|
||||
|
||||
class boss_shade_of_akama : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_shade_of_akama() : CreatureScript("boss_shade_of_akama") { }
|
||||
public:
|
||||
boss_shade_of_akama() : CreatureScript("boss_shade_of_akama") { }
|
||||
|
||||
struct boss_shade_of_akamaAI : public BossAI
|
||||
struct boss_shade_of_akamaAI : public BossAI
|
||||
{
|
||||
boss_shade_of_akamaAI(Creature* creature) : BossAI(creature, DATA_SHADE_OF_AKAMA), summonsChanneler(me), summonsGenerator(me)
|
||||
{
|
||||
boss_shade_of_akamaAI(Creature* creature) : BossAI(creature, DATA_SHADE_OF_AKAMA), summonsChanneler(me), summonsGenerator(me)
|
||||
{
|
||||
events2.ScheduleEvent(EVENT_SHADE_GATHER_NPCS, 1000);
|
||||
}
|
||||
events2.ScheduleEvent(EVENT_SHADE_GATHER_NPCS, 1000);
|
||||
}
|
||||
|
||||
SummonList summonsChanneler;
|
||||
SummonList summonsGenerator;
|
||||
EventMap events2;
|
||||
SummonList summonsChanneler;
|
||||
SummonList summonsGenerator;
|
||||
EventMap events2;
|
||||
|
||||
void ChannelersAction(int32 action)
|
||||
{
|
||||
for (SummonList::const_iterator i = summonsChanneler.begin(); i != summonsChanneler.end(); ++i)
|
||||
if (Creature* summon = ObjectAccessor::GetCreature(*me, *i))
|
||||
void ChannelersAction(int32 action)
|
||||
{
|
||||
for (SummonList::const_iterator i = summonsChanneler.begin(); i != summonsChanneler.end(); ++i)
|
||||
if (Creature* summon = ObjectAccessor::GetCreature(*me, *i))
|
||||
{
|
||||
if (action == ACTION_CHANNELERS_START_CHANNEL)
|
||||
{
|
||||
if (action == ACTION_CHANNELERS_START_CHANNEL)
|
||||
{
|
||||
summon->CastSpell(me, SPELL_SHADE_SOUL_CHANNEL, true);
|
||||
summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
else if (action == ACTION_START_ENCOUNTER)
|
||||
{
|
||||
summon->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
else if (action == ACTION_KILL_CHANNELERS)
|
||||
{
|
||||
Unit::Kill(me, summon);
|
||||
}
|
||||
summon->CastSpell(me, SPELL_SHADE_SOUL_CHANNEL, true);
|
||||
summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
else if (action == ACTION_START_ENCOUNTER)
|
||||
{
|
||||
summon->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
else if (action == ACTION_KILL_CHANNELERS)
|
||||
{
|
||||
Unit::Kill(me, summon);
|
||||
}
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC|UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->SetWalk(true);
|
||||
}
|
||||
|
||||
void EnterEvadeMode()
|
||||
{
|
||||
BossAI::EnterEvadeMode();
|
||||
summonsGenerator.DoAction(ACTION_DESPAWN_ALL);
|
||||
events2.ScheduleEvent(EVENT_SHADE_RESET_ENCOUNTER, 20000);
|
||||
me->SetVisible(false);
|
||||
ChannelersAction(ACTION_KILL_CHANNELERS);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
summonsGenerator.DoAction(ACTION_DESPAWN_ALL);
|
||||
summonsChanneler.DespawnAll();
|
||||
me->CastSpell(me, SPELL_SHADE_OF_AKAMA_TRIGGER, true);
|
||||
if (Creature* akama = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_AKAMA_SHADE)))
|
||||
{
|
||||
akama->SetHomePosition(*akama);
|
||||
akama->AI()->DoAction(ACTION_SHADE_DIED);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
}
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->SetWalk(true);
|
||||
}
|
||||
|
||||
void DoAction(int32 param)
|
||||
{
|
||||
if (param == ACTION_START_ENCOUNTER)
|
||||
{
|
||||
summonsGenerator.DoAction(ACTION_START_ENCOUNTER);
|
||||
ChannelersAction(ACTION_START_ENCOUNTER);
|
||||
events.ScheduleEvent(EVENT_SHADE_CHECK_DISTANCE, 1000);
|
||||
}
|
||||
else if (param == ACTION_AKAMA_DIED)
|
||||
{
|
||||
EnterEvadeMode();
|
||||
}
|
||||
}
|
||||
void EnterEvadeMode()
|
||||
{
|
||||
BossAI::EnterEvadeMode();
|
||||
summonsGenerator.DoAction(ACTION_DESPAWN_ALL);
|
||||
events2.ScheduleEvent(EVENT_SHADE_RESET_ENCOUNTER, 20000);
|
||||
me->SetVisible(false);
|
||||
ChannelersAction(ACTION_KILL_CHANNELERS);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
summonsGenerator.DoAction(ACTION_DESPAWN_ALL);
|
||||
summonsChanneler.DespawnAll();
|
||||
me->CastSpell(me, SPELL_SHADE_OF_AKAMA_TRIGGER, true);
|
||||
if (Creature* akama = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_AKAMA_SHADE)))
|
||||
{
|
||||
events2.Update(diff);
|
||||
switch (events2.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SHADE_GATHER_NPCS:
|
||||
akama->SetHomePosition(*akama);
|
||||
akama->AI()->DoAction(ACTION_SHADE_DIED);
|
||||
}
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
}
|
||||
|
||||
void DoAction(int32 param)
|
||||
{
|
||||
if (param == ACTION_START_ENCOUNTER)
|
||||
{
|
||||
summonsGenerator.DoAction(ACTION_START_ENCOUNTER);
|
||||
ChannelersAction(ACTION_START_ENCOUNTER);
|
||||
events.ScheduleEvent(EVENT_SHADE_CHECK_DISTANCE, 1000);
|
||||
}
|
||||
else if (param == ACTION_AKAMA_DIED)
|
||||
{
|
||||
EnterEvadeMode();
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
events2.Update(diff);
|
||||
switch (events2.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SHADE_GATHER_NPCS:
|
||||
{
|
||||
std::list<Creature*> ChannelerList;
|
||||
me->GetCreaturesWithEntryInRange(ChannelerList, 100.0f, NPC_ASHTONGUE_CHANNELER);
|
||||
@@ -183,245 +183,245 @@ class boss_shade_of_akama : public CreatureScript
|
||||
summonsChanneler.Respawn();
|
||||
summonsGenerator.Respawn();
|
||||
ChannelersAction(ACTION_CHANNELERS_START_CHANNEL);
|
||||
|
||||
|
||||
if (Creature* akama = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_AKAMA_SHADE)))
|
||||
akama->Respawn(true);
|
||||
break;
|
||||
}
|
||||
case EVENT_SHADE_RESET_ENCOUNTER:
|
||||
me->SetVisible(true);
|
||||
summonsGenerator.Respawn();
|
||||
summonsChanneler.Respawn();
|
||||
ChannelersAction(ACTION_CHANNELERS_START_CHANNEL);
|
||||
case EVENT_SHADE_RESET_ENCOUNTER:
|
||||
me->SetVisible(true);
|
||||
summonsGenerator.Respawn();
|
||||
summonsChanneler.Respawn();
|
||||
ChannelersAction(ACTION_CHANNELERS_START_CHANNEL);
|
||||
|
||||
if (Creature* akama = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_AKAMA_SHADE)))
|
||||
akama->Respawn(true);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SHADE_CHECK_DISTANCE:
|
||||
if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() != POINT_MOTION_TYPE)
|
||||
{
|
||||
int32 slow = me->GetMaxNegativeAuraModifier(SPELL_AURA_MOD_DECREASE_SPEED);
|
||||
if (slow > -100)
|
||||
{
|
||||
me->SetWalk(true);
|
||||
me->GetMotionMaster()->MovePoint(POINT_START, 510.0f, 400.7993f, 112.7837f);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int32 slow = me->GetMaxNegativeAuraModifier(SPELL_AURA_MOD_DECREASE_SPEED);
|
||||
if (slow < -100)
|
||||
me->GetMotionMaster()->Clear();
|
||||
else if (slow == 0)
|
||||
{
|
||||
summonsGenerator.DoAction(ACTION_NO_SORCERERS);
|
||||
me->SetWalk(false);
|
||||
}
|
||||
}
|
||||
|
||||
if (me->IsWithinMeleeRange(me->GetVictim()))
|
||||
{
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
DoResetThreat();
|
||||
me->GetVictim()->InterruptNonMeleeSpells(false);
|
||||
me->AddThreat(me->GetVictim(), 1000000.0f);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC|UNIT_FLAG_NOT_SELECTABLE);
|
||||
summonsGenerator.DoAction(ACTION_STOP_SPAWNING);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_SHADE_CHECK_DISTANCE, 1000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
EnterEvadeIfOutOfCombatArea();
|
||||
if (Creature* akama = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_AKAMA_SHADE)))
|
||||
akama->Respawn(true);
|
||||
break;
|
||||
}
|
||||
|
||||
bool CheckEvadeIfOutOfCombatArea() const
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
return !SelectTargetFromPlayerList(120.0f);
|
||||
}
|
||||
};
|
||||
case EVENT_SHADE_CHECK_DISTANCE:
|
||||
if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() != POINT_MOTION_TYPE)
|
||||
{
|
||||
int32 slow = me->GetMaxNegativeAuraModifier(SPELL_AURA_MOD_DECREASE_SPEED);
|
||||
if (slow > -100)
|
||||
{
|
||||
me->SetWalk(true);
|
||||
me->GetMotionMaster()->MovePoint(POINT_START, 510.0f, 400.7993f, 112.7837f);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int32 slow = me->GetMaxNegativeAuraModifier(SPELL_AURA_MOD_DECREASE_SPEED);
|
||||
if (slow < -100)
|
||||
me->GetMotionMaster()->Clear();
|
||||
else if (slow == 0)
|
||||
{
|
||||
summonsGenerator.DoAction(ACTION_NO_SORCERERS);
|
||||
me->SetWalk(false);
|
||||
}
|
||||
}
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_shade_of_akamaAI>(creature);
|
||||
if (me->IsWithinMeleeRange(me->GetVictim()))
|
||||
{
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
DoResetThreat();
|
||||
me->GetVictim()->InterruptNonMeleeSpells(false);
|
||||
me->AddThreat(me->GetVictim(), 1000000.0f);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NOT_SELECTABLE);
|
||||
summonsGenerator.DoAction(ACTION_STOP_SPAWNING);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_SHADE_CHECK_DISTANCE, 1000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
EnterEvadeIfOutOfCombatArea();
|
||||
}
|
||||
|
||||
bool CheckEvadeIfOutOfCombatArea() const
|
||||
{
|
||||
return !SelectTargetFromPlayerList(120.0f);
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_shade_of_akamaAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
class npc_akama_shade : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_akama_shade() : CreatureScript("npc_akama_shade") { }
|
||||
public:
|
||||
npc_akama_shade() : CreatureScript("npc_akama_shade") { }
|
||||
|
||||
struct npc_akamaAI : public ScriptedAI
|
||||
struct npc_akamaAI : public ScriptedAI
|
||||
{
|
||||
npc_akamaAI(Creature* creature) : ScriptedAI(creature), summons(me)
|
||||
{
|
||||
npc_akamaAI(Creature* creature) : ScriptedAI(creature), summons(me)
|
||||
{
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
EventMap events;
|
||||
EventMap events2;
|
||||
SummonList summons;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
if (instance->GetBossState(DATA_SHADE_OF_AKAMA) == DONE)
|
||||
{
|
||||
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
|
||||
return;
|
||||
}
|
||||
|
||||
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
|
||||
me->CastSpell(me, SPELL_STEALTH, true);
|
||||
events.Reset();
|
||||
events2.Reset();
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 point)
|
||||
{
|
||||
if (type != POINT_MOTION_TYPE || point != POINT_CHANNEL_SOUL)
|
||||
return;
|
||||
|
||||
me->SetFacingTo(0.0f);
|
||||
events2.ScheduleEvent(EVENT_AKAMA_SCENE1, 1000);
|
||||
events2.ScheduleEvent(EVENT_AKAMA_SCENE2, 16500);
|
||||
events2.ScheduleEvent(EVENT_AKAMA_SCENE3, 17500);
|
||||
events2.ScheduleEvent(EVENT_AKAMA_SCENE4, 27000);
|
||||
events2.ScheduleEvent(EVENT_AKAMA_SCENE5, 37000);
|
||||
events2.ScheduleEvent(EVENT_AKAMA_SCENE6, 51000);
|
||||
events2.ScheduleEvent(EVENT_AKAMA_SCENE7, 56000);
|
||||
}
|
||||
|
||||
void DoAction(int32 param)
|
||||
{
|
||||
if (param == ACTION_SHADE_DIED)
|
||||
events2.ScheduleEvent(EVENT_AKAMA_SCENE0, 1000);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
if (Creature* shade = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_SHADE_OF_AKAMA)))
|
||||
shade->AI()->DoAction(ACTION_AKAMA_DIED);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
events.ScheduleEvent(EVENT_SPELL_CHAIN_LIGHTNING, 2000);
|
||||
events.ScheduleEvent(EVENT_SPELL_DESTRUCTIVE_POISON, 5000);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
float dist = frand(30.0f, 32.0f);
|
||||
summon->SetWalk(true);
|
||||
summon->GetMotionMaster()->MovePoint(POINT_START, summon->GetPositionX()+dist*cos(summon->GetOrientation()), summon->GetPositionY()+dist*sin(summon->GetOrientation()), summon->GetPositionZ(), false);
|
||||
summons.Summon(summon);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
events2.Update(diff);
|
||||
switch (events2.ExecuteEvent())
|
||||
{
|
||||
case EVENT_AKAMA_START_ENCOUNTER:
|
||||
me->RemoveAura(SPELL_STEALTH);
|
||||
me->SetWalk(true);
|
||||
me->GetMotionMaster()->MovePoint(POINT_START, 517.4877f, 400.7993f, 112.7837f, false);
|
||||
events2.ScheduleEvent(EVENT_AKAMA_START_CHANNEL, 11000);
|
||||
break;
|
||||
case EVENT_AKAMA_START_CHANNEL:
|
||||
me->CastSpell(me, SPELL_AKAMA_SOUL_CHANNEL, false);
|
||||
if (Creature* shade = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_SHADE_OF_AKAMA)))
|
||||
{
|
||||
shade->AI()->AttackStart(me);
|
||||
shade->GetMotionMaster()->Clear();
|
||||
shade->AI()->DoAction(ACTION_START_ENCOUNTER);
|
||||
}
|
||||
break;
|
||||
case EVENT_AKAMA_SCENE0:
|
||||
me->SetWalk(true);
|
||||
me->GetMotionMaster()->MovePoint(POINT_CHANNEL_SOUL, 467.0f, 400.7993f, 118.537f);
|
||||
break;
|
||||
case EVENT_AKAMA_SCENE1:
|
||||
me->CastSpell(me, SPELL_AKAMA_SOUL_RETRIEVE, true);
|
||||
break;
|
||||
case EVENT_AKAMA_SCENE2:
|
||||
Talk(SAY_BROKEN_FREE_0);
|
||||
break;
|
||||
case EVENT_AKAMA_SCENE3:
|
||||
me->SummonCreatureGroup(SUMMON_GROUP_BROKENS);
|
||||
break;
|
||||
case EVENT_AKAMA_SCENE4:
|
||||
Talk(SAY_BROKEN_FREE_1);
|
||||
break;
|
||||
case EVENT_AKAMA_SCENE5:
|
||||
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
|
||||
if (Creature* broken = ObjectAccessor::GetCreature(*me, *itr))
|
||||
broken->SetStandState(UNIT_STAND_STATE_KNEEL);
|
||||
Talk(SAY_BROKEN_FREE_2);
|
||||
break;
|
||||
case EVENT_AKAMA_SCENE6:
|
||||
if (Creature* broken = summons.GetCreatureWithEntry(NPC_ASHTONGUE_BROKEN))
|
||||
broken->AI()->Talk(SAY_BROKEN_S1);
|
||||
break;
|
||||
case EVENT_AKAMA_SCENE7:
|
||||
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
|
||||
if (Creature* broken = ObjectAccessor::GetCreature(*me, *itr))
|
||||
broken->AI()->Talk(SAY_BROKEN_S2);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPELL_CHAIN_LIGHTNING:
|
||||
me->CastSpell(me->GetVictim(), SPELL_CHAIN_LIGHTNING, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_CHAIN_LIGHTNING, urand(10000, 15000));
|
||||
break;
|
||||
case EVENT_SPELL_DESTRUCTIVE_POISON:
|
||||
me->CastSpell(me, SPELL_DESTRUCTIVE_POISON, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_DESTRUCTIVE_POISON, urand(4000, 5000));
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
void sGossipSelect(Player* player, uint32 /*sender*/, uint32 action)
|
||||
{
|
||||
if (action == 0)
|
||||
{
|
||||
CloseGossipMenuFor(player);
|
||||
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
|
||||
events2.ScheduleEvent(EVENT_AKAMA_START_ENCOUNTER, 0);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<npc_akamaAI>(creature);
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
EventMap events;
|
||||
EventMap events2;
|
||||
SummonList summons;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
if (instance->GetBossState(DATA_SHADE_OF_AKAMA) == DONE)
|
||||
{
|
||||
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
|
||||
return;
|
||||
}
|
||||
|
||||
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
|
||||
me->CastSpell(me, SPELL_STEALTH, true);
|
||||
events.Reset();
|
||||
events2.Reset();
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 point)
|
||||
{
|
||||
if (type != POINT_MOTION_TYPE || point != POINT_CHANNEL_SOUL)
|
||||
return;
|
||||
|
||||
me->SetFacingTo(0.0f);
|
||||
events2.ScheduleEvent(EVENT_AKAMA_SCENE1, 1000);
|
||||
events2.ScheduleEvent(EVENT_AKAMA_SCENE2, 16500);
|
||||
events2.ScheduleEvent(EVENT_AKAMA_SCENE3, 17500);
|
||||
events2.ScheduleEvent(EVENT_AKAMA_SCENE4, 27000);
|
||||
events2.ScheduleEvent(EVENT_AKAMA_SCENE5, 37000);
|
||||
events2.ScheduleEvent(EVENT_AKAMA_SCENE6, 51000);
|
||||
events2.ScheduleEvent(EVENT_AKAMA_SCENE7, 56000);
|
||||
}
|
||||
|
||||
void DoAction(int32 param)
|
||||
{
|
||||
if (param == ACTION_SHADE_DIED)
|
||||
events2.ScheduleEvent(EVENT_AKAMA_SCENE0, 1000);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
if (Creature* shade = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_SHADE_OF_AKAMA)))
|
||||
shade->AI()->DoAction(ACTION_AKAMA_DIED);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
events.ScheduleEvent(EVENT_SPELL_CHAIN_LIGHTNING, 2000);
|
||||
events.ScheduleEvent(EVENT_SPELL_DESTRUCTIVE_POISON, 5000);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
float dist = frand(30.0f, 32.0f);
|
||||
summon->SetWalk(true);
|
||||
summon->GetMotionMaster()->MovePoint(POINT_START, summon->GetPositionX() + dist * cos(summon->GetOrientation()), summon->GetPositionY() + dist * sin(summon->GetOrientation()), summon->GetPositionZ(), false);
|
||||
summons.Summon(summon);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
events2.Update(diff);
|
||||
switch (events2.ExecuteEvent())
|
||||
{
|
||||
case EVENT_AKAMA_START_ENCOUNTER:
|
||||
me->RemoveAura(SPELL_STEALTH);
|
||||
me->SetWalk(true);
|
||||
me->GetMotionMaster()->MovePoint(POINT_START, 517.4877f, 400.7993f, 112.7837f, false);
|
||||
events2.ScheduleEvent(EVENT_AKAMA_START_CHANNEL, 11000);
|
||||
break;
|
||||
case EVENT_AKAMA_START_CHANNEL:
|
||||
me->CastSpell(me, SPELL_AKAMA_SOUL_CHANNEL, false);
|
||||
if (Creature* shade = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_SHADE_OF_AKAMA)))
|
||||
{
|
||||
shade->AI()->AttackStart(me);
|
||||
shade->GetMotionMaster()->Clear();
|
||||
shade->AI()->DoAction(ACTION_START_ENCOUNTER);
|
||||
}
|
||||
break;
|
||||
case EVENT_AKAMA_SCENE0:
|
||||
me->SetWalk(true);
|
||||
me->GetMotionMaster()->MovePoint(POINT_CHANNEL_SOUL, 467.0f, 400.7993f, 118.537f);
|
||||
break;
|
||||
case EVENT_AKAMA_SCENE1:
|
||||
me->CastSpell(me, SPELL_AKAMA_SOUL_RETRIEVE, true);
|
||||
break;
|
||||
case EVENT_AKAMA_SCENE2:
|
||||
Talk(SAY_BROKEN_FREE_0);
|
||||
break;
|
||||
case EVENT_AKAMA_SCENE3:
|
||||
me->SummonCreatureGroup(SUMMON_GROUP_BROKENS);
|
||||
break;
|
||||
case EVENT_AKAMA_SCENE4:
|
||||
Talk(SAY_BROKEN_FREE_1);
|
||||
break;
|
||||
case EVENT_AKAMA_SCENE5:
|
||||
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
|
||||
if (Creature* broken = ObjectAccessor::GetCreature(*me, *itr))
|
||||
broken->SetStandState(UNIT_STAND_STATE_KNEEL);
|
||||
Talk(SAY_BROKEN_FREE_2);
|
||||
break;
|
||||
case EVENT_AKAMA_SCENE6:
|
||||
if (Creature* broken = summons.GetCreatureWithEntry(NPC_ASHTONGUE_BROKEN))
|
||||
broken->AI()->Talk(SAY_BROKEN_S1);
|
||||
break;
|
||||
case EVENT_AKAMA_SCENE7:
|
||||
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
|
||||
if (Creature* broken = ObjectAccessor::GetCreature(*me, *itr))
|
||||
broken->AI()->Talk(SAY_BROKEN_S2);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPELL_CHAIN_LIGHTNING:
|
||||
me->CastSpell(me->GetVictim(), SPELL_CHAIN_LIGHTNING, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_CHAIN_LIGHTNING, urand(10000, 15000));
|
||||
break;
|
||||
case EVENT_SPELL_DESTRUCTIVE_POISON:
|
||||
me->CastSpell(me, SPELL_DESTRUCTIVE_POISON, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_DESTRUCTIVE_POISON, urand(4000, 5000));
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
void sGossipSelect(Player* player, uint32 /*sender*/, uint32 action)
|
||||
{
|
||||
if (action == 0)
|
||||
{
|
||||
CloseGossipMenuFor(player);
|
||||
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
|
||||
events2.ScheduleEvent(EVENT_AKAMA_START_ENCOUNTER, 0);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<npc_akamaAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
// ########################################################
|
||||
@@ -430,180 +430,180 @@ class npc_akama_shade : public CreatureScript
|
||||
|
||||
class npc_creature_generator_akama : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_creature_generator_akama() : CreatureScript("npc_creature_generator_akama") { }
|
||||
public:
|
||||
npc_creature_generator_akama() : CreatureScript("npc_creature_generator_akama") { }
|
||||
|
||||
struct npc_creature_generator_akamaAI : public NullCreatureAI
|
||||
struct npc_creature_generator_akamaAI : public NullCreatureAI
|
||||
{
|
||||
npc_creature_generator_akamaAI(Creature* creature) : NullCreatureAI(creature), summons(me)
|
||||
{
|
||||
npc_creature_generator_akamaAI(Creature* creature) : NullCreatureAI(creature), summons(me)
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
summons.DespawnAll();
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
if (summon->GetEntry() == NPC_ASHTONGUE_SORCERER)
|
||||
{
|
||||
instance = creature->GetInstanceScript();
|
||||
std::list<Creature*> channelerList;
|
||||
me->GetCreaturesWithEntryInRange(channelerList, 120.0f, NPC_ASHTONGUE_CHANNELER);
|
||||
for (std::list<Creature*>::const_iterator itr = channelerList.begin(); itr != channelerList.end(); ++itr)
|
||||
{
|
||||
if ((*itr)->IsAlive() || (*itr)->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
|
||||
continue;
|
||||
|
||||
summon->SetInCombatWithZone();
|
||||
summon->SetReactState(REACT_PASSIVE);
|
||||
summon->GetMotionMaster()->MovePoint(POINT_START, **itr);
|
||||
(*itr)->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void Reset()
|
||||
summon->SetInCombatWithZone();
|
||||
if (Unit* akama = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_AKAMA_SHADE)))
|
||||
{
|
||||
summon->AddThreat(akama, 500.0f);
|
||||
summon->AI()->AttackStart(akama);
|
||||
}
|
||||
}
|
||||
|
||||
void SummonedCreatureDies(Creature* summon, Unit*)
|
||||
{
|
||||
summon->DespawnOrUnsummon(10000);
|
||||
summons.Despawn(summon);
|
||||
}
|
||||
|
||||
void DoAction(int32 param)
|
||||
{
|
||||
if (param == ACTION_STOP_SPAWNING || param == ACTION_DESPAWN_ALL)
|
||||
{
|
||||
events.Reset();
|
||||
summons.DespawnAll();
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
if (summon->GetEntry() == NPC_ASHTONGUE_SORCERER)
|
||||
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
|
||||
{
|
||||
std::list<Creature*> channelerList;
|
||||
me->GetCreaturesWithEntryInRange(channelerList, 120.0f, NPC_ASHTONGUE_CHANNELER);
|
||||
for (std::list<Creature*>::const_iterator itr = channelerList.begin(); itr != channelerList.end(); ++itr)
|
||||
if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr))
|
||||
{
|
||||
if ((*itr)->IsAlive() || (*itr)->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
|
||||
if (summon->GetEntry() != NPC_ASHTONGUE_SORCERER)
|
||||
continue;
|
||||
|
||||
summon->InterruptNonMeleeSpells(false);
|
||||
summon->GetMotionMaster()->Clear();
|
||||
summon->SetInCombatWithZone();
|
||||
summon->SetReactState(REACT_PASSIVE);
|
||||
summon->GetMotionMaster()->MovePoint(POINT_START, **itr);
|
||||
(*itr)->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
summon->SetInCombatWithZone();
|
||||
if (Unit* akama = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_AKAMA_SHADE)))
|
||||
{
|
||||
summon->AddThreat(akama, 500.0f);
|
||||
summon->AI()->AttackStart(akama);
|
||||
}
|
||||
}
|
||||
|
||||
void SummonedCreatureDies(Creature* summon, Unit*)
|
||||
if (param == ACTION_DESPAWN_ALL)
|
||||
summons.DespawnAll();
|
||||
else if (param == ACTION_NO_SORCERERS)
|
||||
events.CancelEvent(EVENT_SUMMON_ASHTONGUE_SORCERER);
|
||||
else if (param == ACTION_START_ENCOUNTER)
|
||||
{
|
||||
summon->DespawnOrUnsummon(10000);
|
||||
summons.Despawn(summon);
|
||||
events.ScheduleEvent(EVENT_SUMMON_WAVE_B, 5000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ASHTONGUE_DEFENDER, 20000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ASHTONGUE_SORCERER, 35000);
|
||||
}
|
||||
|
||||
void DoAction(int32 param)
|
||||
{
|
||||
if (param == ACTION_STOP_SPAWNING || param == ACTION_DESPAWN_ALL)
|
||||
{
|
||||
events.Reset();
|
||||
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
|
||||
{
|
||||
if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr))
|
||||
{
|
||||
if (summon->GetEntry() != NPC_ASHTONGUE_SORCERER)
|
||||
continue;
|
||||
summon->InterruptNonMeleeSpells(false);
|
||||
summon->GetMotionMaster()->Clear();
|
||||
summon->SetInCombatWithZone();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (param == ACTION_DESPAWN_ALL)
|
||||
summons.DespawnAll();
|
||||
else if (param == ACTION_NO_SORCERERS)
|
||||
events.CancelEvent(EVENT_SUMMON_ASHTONGUE_SORCERER);
|
||||
else if (param == ACTION_START_ENCOUNTER)
|
||||
{
|
||||
events.ScheduleEvent(EVENT_SUMMON_WAVE_B, 5000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ASHTONGUE_DEFENDER, 20000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ASHTONGUE_SORCERER, 35000);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
events.Update(diff);
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SUMMON_WAVE_B:
|
||||
me->CastSpell(me, SPELL_ASHTONGUE_WAVE_B, true);
|
||||
events.ScheduleEvent(EVENT_SUMMON_WAVE_B, 45000);
|
||||
break;
|
||||
case EVENT_SUMMON_ASHTONGUE_SORCERER: // left
|
||||
me->CastSpell(me, SPELL_SUMMON_ASHTONGUE_SORCERER, true);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ASHTONGUE_SORCERER, 45000);
|
||||
break;
|
||||
case EVENT_SUMMON_ASHTONGUE_DEFENDER: // right
|
||||
me->CastSpell(me, SPELL_SUMMON_ASHTONGUE_DEFENDER, true);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ASHTONGUE_DEFENDER, 45000);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap events;
|
||||
SummonList summons;
|
||||
InstanceScript* instance;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<npc_creature_generator_akamaAI>(creature);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
events.Update(diff);
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SUMMON_WAVE_B:
|
||||
me->CastSpell(me, SPELL_ASHTONGUE_WAVE_B, true);
|
||||
events.ScheduleEvent(EVENT_SUMMON_WAVE_B, 45000);
|
||||
break;
|
||||
case EVENT_SUMMON_ASHTONGUE_SORCERER: // left
|
||||
me->CastSpell(me, SPELL_SUMMON_ASHTONGUE_SORCERER, true);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ASHTONGUE_SORCERER, 45000);
|
||||
break;
|
||||
case EVENT_SUMMON_ASHTONGUE_DEFENDER: // right
|
||||
me->CastSpell(me, SPELL_SUMMON_ASHTONGUE_DEFENDER, true);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ASHTONGUE_DEFENDER, 45000);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap events;
|
||||
SummonList summons;
|
||||
InstanceScript* instance;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<npc_creature_generator_akamaAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
class spell_shade_of_akama_shade_soul_channel : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_shade_of_akama_shade_soul_channel() : SpellScriptLoader("spell_shade_of_akama_shade_soul_channel") { }
|
||||
public:
|
||||
spell_shade_of_akama_shade_soul_channel() : SpellScriptLoader("spell_shade_of_akama_shade_soul_channel") { }
|
||||
|
||||
class spell_shade_of_akama_shade_soul_channel_AuraScript : public AuraScript
|
||||
class spell_shade_of_akama_shade_soul_channel_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_shade_of_akama_shade_soul_channel_AuraScript)
|
||||
|
||||
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
PrepareAuraScript(spell_shade_of_akama_shade_soul_channel_AuraScript)
|
||||
|
||||
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
if (Unit* caster = GetCaster())
|
||||
caster->SetFacingToObject(GetTarget());
|
||||
}
|
||||
|
||||
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
if (Aura* aura = GetTarget()->GetAura(GetSpellInfo()->Effects[EFFECT_1].TriggerSpell))
|
||||
aura->ModStackAmount(-1);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
AfterEffectApply += AuraEffectApplyFn(spell_shade_of_akama_shade_soul_channel_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
AfterEffectRemove += AuraEffectRemoveFn(spell_shade_of_akama_shade_soul_channel_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_shade_of_akama_shade_soul_channel_AuraScript();
|
||||
if (Unit* caster = GetCaster())
|
||||
caster->SetFacingToObject(GetTarget());
|
||||
}
|
||||
|
||||
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
if (Aura* aura = GetTarget()->GetAura(GetSpellInfo()->Effects[EFFECT_1].TriggerSpell))
|
||||
aura->ModStackAmount(-1);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
AfterEffectApply += AuraEffectApplyFn(spell_shade_of_akama_shade_soul_channel_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
AfterEffectRemove += AuraEffectRemoveFn(spell_shade_of_akama_shade_soul_channel_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_shade_of_akama_shade_soul_channel_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_shade_of_akama_akama_soul_expel : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_shade_of_akama_akama_soul_expel() : SpellScriptLoader("spell_shade_of_akama_akama_soul_expel") { }
|
||||
public:
|
||||
spell_shade_of_akama_akama_soul_expel() : SpellScriptLoader("spell_shade_of_akama_akama_soul_expel") { }
|
||||
|
||||
class spell_shade_of_akama_akama_soul_expel_SpellScript : public SpellScript
|
||||
class spell_shade_of_akama_akama_soul_expel_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_shade_of_akama_akama_soul_expel_SpellScript);
|
||||
|
||||
void SetDest(SpellDestination& dest)
|
||||
{
|
||||
PrepareSpellScript(spell_shade_of_akama_akama_soul_expel_SpellScript);
|
||||
|
||||
void SetDest(SpellDestination& dest)
|
||||
{
|
||||
// Adjust effect summon position
|
||||
Position const offset = { 0.0f, 0.0f, 25.0f, 0.0f };
|
||||
dest.RelocateOffset(offset);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_shade_of_akama_akama_soul_expel_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER_RADIUS);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_shade_of_akama_akama_soul_expel_SpellScript();
|
||||
// Adjust effect summon position
|
||||
Position const offset = { 0.0f, 0.0f, 25.0f, 0.0f };
|
||||
dest.RelocateOffset(offset);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_shade_of_akama_akama_soul_expel_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER_RADIUS);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_shade_of_akama_akama_soul_expel_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_shade_of_akama()
|
||||
|
||||
@@ -35,160 +35,160 @@ enum Supremus
|
||||
|
||||
class boss_supremus : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_supremus() : CreatureScript("boss_supremus") { }
|
||||
public:
|
||||
boss_supremus() : CreatureScript("boss_supremus") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_supremusAI>(creature);
|
||||
}
|
||||
|
||||
struct boss_supremusAI : public BossAI
|
||||
{
|
||||
boss_supremusAI(Creature* creature) : BossAI(creature, DATA_SUPREMUS)
|
||||
{
|
||||
return GetInstanceAI<boss_supremusAI>(creature);
|
||||
}
|
||||
|
||||
struct boss_supremusAI : public BossAI
|
||||
void Reset()
|
||||
{
|
||||
boss_supremusAI(Creature* creature) : BossAI(creature, DATA_SUPREMUS)
|
||||
BossAI::Reset();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
|
||||
SchedulePhase(false);
|
||||
events.ScheduleEvent(EVENT_SPELL_BERSERK, 900000);
|
||||
events.ScheduleEvent(EVENT_SPELL_MOLTEN_FLAMES, 4000);
|
||||
}
|
||||
|
||||
void SchedulePhase(bool run)
|
||||
{
|
||||
events.CancelEventGroup(EVENT_GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_SWITCH_PHASE, 60000);
|
||||
DoResetThreat();
|
||||
|
||||
if (!run)
|
||||
{
|
||||
events.ScheduleEvent(EVENT_SPELL_HATEFUL_STRIKE, 5000, EVENT_GROUP_ABILITIES);
|
||||
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);
|
||||
}
|
||||
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);
|
||||
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 JustDied(Unit* killer)
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
if (summon->GetEntry() == NPC_SUPREMUS_PUNCH_STALKER)
|
||||
{
|
||||
summon->ToTempSummon()->InitStats(20000);
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_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);
|
||||
}
|
||||
|
||||
void SummonedCreatureDespawn(Creature* summon)
|
||||
{
|
||||
summons.Despawn(summon);
|
||||
}
|
||||
|
||||
Unit* FindHatefulStrikeTarget()
|
||||
{
|
||||
Unit* target = nullptr;
|
||||
ThreatContainer::StorageType const& threatlist = me->getThreatManager().getThreatList();
|
||||
for (ThreatContainer::StorageType::const_iterator i = threatlist.begin(); i != threatlist.end(); ++i)
|
||||
{
|
||||
Unit* unit = ObjectAccessor::GetUnit(*me, (*i)->getUnitGuid());
|
||||
if (unit && me->IsWithinMeleeRange(unit))
|
||||
if (!target || unit->GetHealth() > target->GetHealth())
|
||||
target = unit;
|
||||
}
|
||||
|
||||
void Reset()
|
||||
return target;
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
BossAI::Reset();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
|
||||
SchedulePhase(false);
|
||||
events.ScheduleEvent(EVENT_SPELL_BERSERK, 900000);
|
||||
events.ScheduleEvent(EVENT_SPELL_MOLTEN_FLAMES, 4000);
|
||||
}
|
||||
|
||||
void SchedulePhase(bool run)
|
||||
{
|
||||
events.CancelEventGroup(EVENT_GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_SWITCH_PHASE, 60000);
|
||||
DoResetThreat();
|
||||
|
||||
if (!run)
|
||||
{
|
||||
events.ScheduleEvent(EVENT_SPELL_HATEFUL_STRIKE, 5000, EVENT_GROUP_ABILITIES);
|
||||
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);
|
||||
}
|
||||
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);
|
||||
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 JustDied(Unit* killer)
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
if (summon->GetEntry() == NPC_SUPREMUS_PUNCH_STALKER)
|
||||
{
|
||||
summon->ToTempSummon()->InitStats(20000);
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_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);
|
||||
}
|
||||
|
||||
void SummonedCreatureDespawn(Creature* summon)
|
||||
{
|
||||
summons.Despawn(summon);
|
||||
}
|
||||
|
||||
Unit* FindHatefulStrikeTarget()
|
||||
{
|
||||
Unit* target = nullptr;
|
||||
ThreatContainer::StorageType const &threatlist = me->getThreatManager().getThreatList();
|
||||
for (ThreatContainer::StorageType::const_iterator i = threatlist.begin(); i != threatlist.end(); ++i)
|
||||
{
|
||||
Unit* unit = ObjectAccessor::GetUnit(*me, (*i)->getUnitGuid());
|
||||
if (unit && me->IsWithinMeleeRange(unit))
|
||||
if (!target || unit->GetHealth() > target->GetHealth())
|
||||
target = unit;
|
||||
}
|
||||
|
||||
return target;
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
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);
|
||||
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(SELECT_TARGET_RANDOM, 0, 100, true))
|
||||
{
|
||||
DoResetThreat();
|
||||
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;
|
||||
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(SELECT_TARGET_RANDOM, 0, 100, true))
|
||||
{
|
||||
DoResetThreat();
|
||||
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(SELECT_TARGET_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;
|
||||
}
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CHECK_DIST, 1, EVENT_GROUP_ABILITIES);
|
||||
break;
|
||||
case EVENT_SPELL_VOLCANIC_ERUPTION:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_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();
|
||||
EnterEvadeIfOutOfCombatArea();
|
||||
}
|
||||
|
||||
bool CheckEvadeIfOutOfCombatArea() const
|
||||
{
|
||||
return me->GetPositionX() < 565 || me->GetPositionX() > 865 || me->GetPositionY() < 545 || me->GetPositionY() > 1000;
|
||||
}
|
||||
};
|
||||
DoMeleeAttackIfReady();
|
||||
EnterEvadeIfOutOfCombatArea();
|
||||
}
|
||||
|
||||
bool CheckEvadeIfOutOfCombatArea() const
|
||||
{
|
||||
return me->GetPositionX() < 565 || me->GetPositionX() > 865 || me->GetPositionY() < 545 || me->GetPositionY() > 1000;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
void AddSC_boss_supremus()
|
||||
|
||||
@@ -59,268 +59,268 @@ struct ShadowOfDeathSelector : public acore::unary_function<Unit*, bool>
|
||||
|
||||
class boss_teron_gorefiend : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_teron_gorefiend() : CreatureScript("boss_teron_gorefiend") { }
|
||||
public:
|
||||
boss_teron_gorefiend() : CreatureScript("boss_teron_gorefiend") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_teron_gorefiendAI>(creature);
|
||||
}
|
||||
|
||||
struct boss_teron_gorefiendAI : public BossAI
|
||||
{
|
||||
boss_teron_gorefiendAI(Creature* creature) : BossAI(creature, DATA_TERON_GOREFIEND)
|
||||
{
|
||||
return GetInstanceAI<boss_teron_gorefiendAI>(creature);
|
||||
intro = false;
|
||||
}
|
||||
|
||||
struct boss_teron_gorefiendAI : public BossAI
|
||||
bool intro;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
boss_teron_gorefiendAI(Creature* creature) : BossAI(creature, DATA_TERON_GOREFIEND)
|
||||
BossAI::Reset();
|
||||
me->CastSpell(me, SPELL_SHADOW_OF_DEATH_REMOVE, true);
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 id)
|
||||
{
|
||||
if (type || !me->IsAlive())
|
||||
return;
|
||||
|
||||
if (id == SET_DATA_INTRO && !intro)
|
||||
{
|
||||
intro = false;
|
||||
intro = true;
|
||||
Talk(SAY_INTRO);
|
||||
}
|
||||
}
|
||||
|
||||
bool intro;
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
events.ScheduleEvent(EVENT_SPELL_INCINERATE, 24000);
|
||||
events.ScheduleEvent(EVENT_SPELL_DOOM_BLOSSOM, 10000);
|
||||
events.ScheduleEvent(EVENT_SPELL_CRUSHING_SHADOWS, 17000);
|
||||
events.ScheduleEvent(EVENT_SPELL_SHADOW_OF_DEATH, 20000);
|
||||
}
|
||||
|
||||
void Reset()
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_TALK_KILL) == 0)
|
||||
{
|
||||
BossAI::Reset();
|
||||
me->CastSpell(me, SPELL_SHADOW_OF_DEATH_REMOVE, true);
|
||||
Talk(SAY_SLAY);
|
||||
events.ScheduleEvent(EVENT_TALK_KILL, 6000);
|
||||
}
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 id)
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
Talk(SAY_DEATH);
|
||||
me->CastSpell(me, SPELL_SHADOW_OF_DEATH_REMOVE, true);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim() )
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
if (type || !me->IsAlive())
|
||||
return;
|
||||
|
||||
if (id == SET_DATA_INTRO && !intro)
|
||||
{
|
||||
intro = true;
|
||||
Talk(SAY_INTRO);
|
||||
}
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
events.ScheduleEvent(EVENT_SPELL_INCINERATE, 24000);
|
||||
events.ScheduleEvent(EVENT_SPELL_DOOM_BLOSSOM, 10000);
|
||||
events.ScheduleEvent(EVENT_SPELL_CRUSHING_SHADOWS, 17000);
|
||||
events.ScheduleEvent(EVENT_SPELL_SHADOW_OF_DEATH, 20000);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_TALK_KILL) == 0)
|
||||
{
|
||||
Talk(SAY_SLAY);
|
||||
events.ScheduleEvent(EVENT_TALK_KILL, 6000);
|
||||
}
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
Talk(SAY_DEATH);
|
||||
me->CastSpell(me, SPELL_SHADOW_OF_DEATH_REMOVE, true);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim() )
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPELL_INCINERATE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
{
|
||||
if (roll_chance_i(50))
|
||||
Talk(SAY_INCINERATE);
|
||||
me->CastSpell(target, SPELL_INCINERATE, false);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_SPELL_INCINERATE, 25000);
|
||||
break;
|
||||
case EVENT_SPELL_DOOM_BLOSSOM:
|
||||
case EVENT_SPELL_INCINERATE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
{
|
||||
if (roll_chance_i(50))
|
||||
Talk(SAY_BLOSSOM);
|
||||
Talk(SAY_INCINERATE);
|
||||
me->CastSpell(target, SPELL_INCINERATE, false);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_SPELL_INCINERATE, 25000);
|
||||
break;
|
||||
case EVENT_SPELL_DOOM_BLOSSOM:
|
||||
if (roll_chance_i(50))
|
||||
Talk(SAY_BLOSSOM);
|
||||
|
||||
me->CastSpell(me, SPELL_SUMMON_DOOM_BLOSSOM, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_DOOM_BLOSSOM, 40000);
|
||||
break;
|
||||
case EVENT_SPELL_CRUSHING_SHADOWS:
|
||||
if (roll_chance_i(20))
|
||||
Talk(SAY_CRUSHING);
|
||||
me->CastCustomSpell(SPELL_CRUSHING_SHADOWS, SPELLVALUE_MAX_TARGETS, 5, me, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_CRUSHING_SHADOWS, 15000);
|
||||
break;
|
||||
case EVENT_SPELL_SHADOW_OF_DEATH:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, ShadowOfDeathSelector()))
|
||||
me->CastSpell(target, SPELL_SHADOW_OF_DEATH, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_SHADOW_OF_DEATH, 30000);
|
||||
break;
|
||||
}
|
||||
me->CastSpell(me, SPELL_SUMMON_DOOM_BLOSSOM, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_DOOM_BLOSSOM, 40000);
|
||||
break;
|
||||
case EVENT_SPELL_CRUSHING_SHADOWS:
|
||||
if (roll_chance_i(20))
|
||||
Talk(SAY_CRUSHING);
|
||||
me->CastCustomSpell(SPELL_CRUSHING_SHADOWS, SPELLVALUE_MAX_TARGETS, 5, me, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_CRUSHING_SHADOWS, 15000);
|
||||
break;
|
||||
case EVENT_SPELL_SHADOW_OF_DEATH:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, ShadowOfDeathSelector()))
|
||||
me->CastSpell(target, SPELL_SHADOW_OF_DEATH, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_SHADOW_OF_DEATH, 30000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
EnterEvadeIfOutOfCombatArea();
|
||||
}
|
||||
|
||||
bool CheckEvadeIfOutOfCombatArea() const
|
||||
{
|
||||
return me->GetDistance(me->GetHomePosition()) > 100.0f;
|
||||
}
|
||||
};
|
||||
DoMeleeAttackIfReady();
|
||||
EnterEvadeIfOutOfCombatArea();
|
||||
}
|
||||
|
||||
bool CheckEvadeIfOutOfCombatArea() const
|
||||
{
|
||||
return me->GetDistance(me->GetHomePosition()) > 100.0f;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
class spell_teron_gorefiend_shadow_of_death : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_teron_gorefiend_shadow_of_death() : SpellScriptLoader("spell_teron_gorefiend_shadow_of_death") { }
|
||||
public:
|
||||
spell_teron_gorefiend_shadow_of_death() : SpellScriptLoader("spell_teron_gorefiend_shadow_of_death") { }
|
||||
|
||||
class spell_teron_gorefiend_shadow_of_death_AuraScript : public AuraScript
|
||||
class spell_teron_gorefiend_shadow_of_death_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_teron_gorefiend_shadow_of_death_AuraScript)
|
||||
|
||||
void Absorb(AuraEffect* /*aurEff*/, DamageInfo& /*dmgInfo*/, uint32& /*absorbAmount*/)
|
||||
{
|
||||
PrepareAuraScript(spell_teron_gorefiend_shadow_of_death_AuraScript)
|
||||
|
||||
void Absorb(AuraEffect* /*aurEff*/, DamageInfo & /*dmgInfo*/, uint32 & /*absorbAmount*/)
|
||||
{
|
||||
PreventDefaultAction();
|
||||
}
|
||||
|
||||
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
InstanceScript* instance = GetTarget()->GetInstanceScript();
|
||||
if (!GetCaster() || !instance || !instance->IsEncounterInProgress())
|
||||
return;
|
||||
|
||||
GetTarget()->CastSpell(GetTarget(), SPELL_SUMMON_SPIRIT, true);
|
||||
GetTarget()->CastSpell(GetTarget(), SPELL_POSSESS_SPIRIT_IMMUNE, true);
|
||||
GetTarget()->CastSpell(GetTarget(), SPELL_SPIRITUAL_VENGEANCE, true);
|
||||
GetTarget()->CastSpell(GetTarget(), SPELL_SUMMON_SKELETON1, true);
|
||||
GetTarget()->CastSpell(GetTarget(), SPELL_SUMMON_SKELETON2, true);
|
||||
GetTarget()->CastSpell(GetTarget(), SPELL_SUMMON_SKELETON3, true);
|
||||
GetTarget()->CastSpell(GetTarget(), SPELL_SUMMON_SKELETON4, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectAbsorb += AuraEffectAbsorbFn(spell_teron_gorefiend_shadow_of_death_AuraScript::Absorb, EFFECT_0);
|
||||
AfterEffectRemove += AuraEffectRemoveFn(spell_teron_gorefiend_shadow_of_death_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_teron_gorefiend_shadow_of_death_AuraScript();
|
||||
PreventDefaultAction();
|
||||
}
|
||||
|
||||
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
InstanceScript* instance = GetTarget()->GetInstanceScript();
|
||||
if (!GetCaster() || !instance || !instance->IsEncounterInProgress())
|
||||
return;
|
||||
|
||||
GetTarget()->CastSpell(GetTarget(), SPELL_SUMMON_SPIRIT, true);
|
||||
GetTarget()->CastSpell(GetTarget(), SPELL_POSSESS_SPIRIT_IMMUNE, true);
|
||||
GetTarget()->CastSpell(GetTarget(), SPELL_SPIRITUAL_VENGEANCE, true);
|
||||
GetTarget()->CastSpell(GetTarget(), SPELL_SUMMON_SKELETON1, true);
|
||||
GetTarget()->CastSpell(GetTarget(), SPELL_SUMMON_SKELETON2, true);
|
||||
GetTarget()->CastSpell(GetTarget(), SPELL_SUMMON_SKELETON3, true);
|
||||
GetTarget()->CastSpell(GetTarget(), SPELL_SUMMON_SKELETON4, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectAbsorb += AuraEffectAbsorbFn(spell_teron_gorefiend_shadow_of_death_AuraScript::Absorb, EFFECT_0);
|
||||
AfterEffectRemove += AuraEffectRemoveFn(spell_teron_gorefiend_shadow_of_death_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_teron_gorefiend_shadow_of_death_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_teron_gorefiend_spirit_lance : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_teron_gorefiend_spirit_lance() : SpellScriptLoader("spell_teron_gorefiend_spirit_lance") { }
|
||||
public:
|
||||
spell_teron_gorefiend_spirit_lance() : SpellScriptLoader("spell_teron_gorefiend_spirit_lance") { }
|
||||
|
||||
class spell_teron_gorefiend_spirit_lance_AuraScript : public AuraScript
|
||||
class spell_teron_gorefiend_spirit_lance_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_teron_gorefiend_spirit_lance_AuraScript);
|
||||
|
||||
void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
|
||||
{
|
||||
PrepareAuraScript(spell_teron_gorefiend_spirit_lance_AuraScript);
|
||||
|
||||
void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
|
||||
{
|
||||
if (AuraEffect* effect = GetAura()->GetEffect(EFFECT_2))
|
||||
amount -= (amount / effect->GetTotalTicks()) * effect->GetTickNumber();
|
||||
}
|
||||
|
||||
void Update(AuraEffect const* /*effect*/)
|
||||
{
|
||||
PreventDefaultAction();
|
||||
if (AuraEffect* effect = GetAura()->GetEffect(EFFECT_1))
|
||||
effect->RecalculateAmount();
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_teron_gorefiend_spirit_lance_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_DECREASE_SPEED);
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_teron_gorefiend_spirit_lance_AuraScript::Update, EFFECT_2, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_teron_gorefiend_spirit_lance_AuraScript();
|
||||
if (AuraEffect* effect = GetAura()->GetEffect(EFFECT_2))
|
||||
amount -= (amount / effect->GetTotalTicks()) * effect->GetTickNumber();
|
||||
}
|
||||
|
||||
void Update(AuraEffect const* /*effect*/)
|
||||
{
|
||||
PreventDefaultAction();
|
||||
if (AuraEffect* effect = GetAura()->GetEffect(EFFECT_1))
|
||||
effect->RecalculateAmount();
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_teron_gorefiend_spirit_lance_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_DECREASE_SPEED);
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_teron_gorefiend_spirit_lance_AuraScript::Update, EFFECT_2, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_teron_gorefiend_spirit_lance_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_teron_gorefiend_spiritual_vengeance : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_teron_gorefiend_spiritual_vengeance() : SpellScriptLoader("spell_teron_gorefiend_spiritual_vengeance") { }
|
||||
public:
|
||||
spell_teron_gorefiend_spiritual_vengeance() : SpellScriptLoader("spell_teron_gorefiend_spiritual_vengeance") { }
|
||||
|
||||
class spell_teron_gorefiend_spiritual_vengeance_AuraScript : public AuraScript
|
||||
class spell_teron_gorefiend_spiritual_vengeance_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_teron_gorefiend_spiritual_vengeance_AuraScript)
|
||||
|
||||
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
PrepareAuraScript(spell_teron_gorefiend_spiritual_vengeance_AuraScript)
|
||||
|
||||
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
Unit::Kill(nullptr, GetTarget());
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
AfterEffectRemove += AuraEffectRemoveFn(spell_teron_gorefiend_spiritual_vengeance_AuraScript::HandleEffectRemove, EFFECT_2, SPELL_AURA_MOD_PACIFY_SILENCE, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_teron_gorefiend_spiritual_vengeance_AuraScript();
|
||||
Unit::Kill(nullptr, GetTarget());
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
AfterEffectRemove += AuraEffectRemoveFn(spell_teron_gorefiend_spiritual_vengeance_AuraScript::HandleEffectRemove, EFFECT_2, SPELL_AURA_MOD_PACIFY_SILENCE, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_teron_gorefiend_spiritual_vengeance_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_teron_gorefiend_shadowy_construct : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_teron_gorefiend_shadowy_construct() : SpellScriptLoader("spell_teron_gorefiend_shadowy_construct") { }
|
||||
public:
|
||||
spell_teron_gorefiend_shadowy_construct() : SpellScriptLoader("spell_teron_gorefiend_shadowy_construct") { }
|
||||
|
||||
class spell_teron_gorefiend_shadowy_construct_AuraScript : public AuraScript
|
||||
class spell_teron_gorefiend_shadowy_construct_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_teron_gorefiend_shadowy_construct_AuraScript)
|
||||
|
||||
bool Load()
|
||||
{
|
||||
PrepareAuraScript(spell_teron_gorefiend_shadowy_construct_AuraScript)
|
||||
|
||||
bool Load()
|
||||
{
|
||||
return GetUnitOwner()->GetTypeId() == TYPEID_UNIT;
|
||||
}
|
||||
|
||||
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NORMAL, true);
|
||||
GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_ALLOW_ID, SPELL_SPIRIT_LANCE, true);
|
||||
GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_ALLOW_ID, SPELL_SPIRIT_CHAINS, true);
|
||||
GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_ALLOW_ID, SPELL_SPIRIT_VOLLEY, true);
|
||||
|
||||
GetUnitOwner()->ToCreature()->SetInCombatWithZone();
|
||||
Map::PlayerList const& playerList = GetUnitOwner()->GetMap()->GetPlayers();
|
||||
for (Map::PlayerList::const_iterator i = playerList.begin(); i != playerList.end(); ++i)
|
||||
if (Player* player = i->GetSource())
|
||||
{
|
||||
if (GetUnitOwner()->IsValidAttackTarget(player))
|
||||
GetUnitOwner()->AddThreat(player, 1000000.0f);
|
||||
}
|
||||
|
||||
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_BRIEF_STUN, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
AfterEffectApply += AuraEffectApplyFn(spell_teron_gorefiend_shadowy_construct_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_teron_gorefiend_shadowy_construct_AuraScript();
|
||||
return GetUnitOwner()->GetTypeId() == TYPEID_UNIT;
|
||||
}
|
||||
|
||||
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NORMAL, true);
|
||||
GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_ALLOW_ID, SPELL_SPIRIT_LANCE, true);
|
||||
GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_ALLOW_ID, SPELL_SPIRIT_CHAINS, true);
|
||||
GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_ALLOW_ID, SPELL_SPIRIT_VOLLEY, true);
|
||||
|
||||
GetUnitOwner()->ToCreature()->SetInCombatWithZone();
|
||||
Map::PlayerList const& playerList = GetUnitOwner()->GetMap()->GetPlayers();
|
||||
for (Map::PlayerList::const_iterator i = playerList.begin(); i != playerList.end(); ++i)
|
||||
if (Player* player = i->GetSource())
|
||||
{
|
||||
if (GetUnitOwner()->IsValidAttackTarget(player))
|
||||
GetUnitOwner()->AddThreat(player, 1000000.0f);
|
||||
}
|
||||
|
||||
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_BRIEF_STUN, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
AfterEffectApply += AuraEffectApplyFn(spell_teron_gorefiend_shadowy_construct_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_teron_gorefiend_shadowy_construct_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_teron_gorefiend()
|
||||
|
||||
@@ -130,60 +130,60 @@ public:
|
||||
|
||||
class spell_najentus_needle_spine : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_najentus_needle_spine() : SpellScriptLoader("spell_najentus_needle_spine") { }
|
||||
public:
|
||||
spell_najentus_needle_spine() : SpellScriptLoader("spell_najentus_needle_spine") { }
|
||||
|
||||
class spell_najentus_needle_spine_SpellScript : public SpellScript
|
||||
class spell_najentus_needle_spine_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_najentus_needle_spine_SpellScript);
|
||||
|
||||
void HandleDummy(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
PrepareSpellScript(spell_najentus_needle_spine_SpellScript);
|
||||
|
||||
void HandleDummy(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (Unit* target = GetHitUnit())
|
||||
GetCaster()->CastSpell(target, SPELL_NEEDLE_SPINE_DAMAGE, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_najentus_needle_spine_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_najentus_needle_spine_SpellScript();
|
||||
if (Unit* target = GetHitUnit())
|
||||
GetCaster()->CastSpell(target, SPELL_NEEDLE_SPINE_DAMAGE, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_najentus_needle_spine_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_najentus_needle_spine_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_najentus_hurl_spine : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_najentus_hurl_spine() : SpellScriptLoader("spell_najentus_hurl_spine") { }
|
||||
public:
|
||||
spell_najentus_hurl_spine() : SpellScriptLoader("spell_najentus_hurl_spine") { }
|
||||
|
||||
class spell_najentus_hurl_spine_SpellScript : public SpellScript
|
||||
class spell_najentus_hurl_spine_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_najentus_hurl_spine_SpellScript);
|
||||
|
||||
void HandleSchoolDamage(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
PrepareSpellScript(spell_najentus_hurl_spine_SpellScript);
|
||||
|
||||
void HandleSchoolDamage(SpellEffIndex /*effIndex*/)
|
||||
Unit* target = GetHitUnit();
|
||||
if (target && target->HasAura(SPELL_TIDAL_SHIELD))
|
||||
{
|
||||
Unit* target = GetHitUnit();
|
||||
if (target && target->HasAura(SPELL_TIDAL_SHIELD))
|
||||
{
|
||||
target->RemoveAurasDueToSpell(SPELL_TIDAL_SHIELD);
|
||||
target->CastSpell(target, SPELL_TIDAL_BURST, true);
|
||||
}
|
||||
target->RemoveAurasDueToSpell(SPELL_TIDAL_SHIELD);
|
||||
target->CastSpell(target, SPELL_TIDAL_BURST, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_najentus_hurl_spine_SpellScript::HandleSchoolDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_najentus_hurl_spine_SpellScript();
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_najentus_hurl_spine_SpellScript::HandleSchoolDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_najentus_hurl_spine_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_najentus()
|
||||
|
||||
@@ -99,24 +99,24 @@ struct HammerOfJusticeSelector : public acore::unary_function<Unit*, bool>
|
||||
|
||||
class VerasEnvenom : public BasicEvent
|
||||
{
|
||||
public:
|
||||
VerasEnvenom(Unit& owner, uint64 targetGUID) : _owner(owner), _targetGUID(targetGUID) { }
|
||||
public:
|
||||
VerasEnvenom(Unit& owner, uint64 targetGUID) : _owner(owner), _targetGUID(targetGUID) { }
|
||||
|
||||
bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/)
|
||||
bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/)
|
||||
{
|
||||
if (Player* target = ObjectAccessor::GetPlayer(_owner, _targetGUID))
|
||||
{
|
||||
if (Player* target = ObjectAccessor::GetPlayer(_owner, _targetGUID))
|
||||
{
|
||||
target->m_clientGUIDs.insert(_owner.GetGUID());
|
||||
_owner.CastSpell(target, SPELL_ENVENOM, true);
|
||||
target->RemoveAurasDueToSpell(SPELL_DEADLY_POISON);
|
||||
target->m_clientGUIDs.erase(_owner.GetGUID());
|
||||
}
|
||||
return true;
|
||||
target->m_clientGUIDs.insert(_owner.GetGUID());
|
||||
_owner.CastSpell(target, SPELL_ENVENOM, true);
|
||||
target->RemoveAurasDueToSpell(SPELL_DEADLY_POISON);
|
||||
target->m_clientGUIDs.erase(_owner.GetGUID());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
Unit& _owner;
|
||||
uint64 _targetGUID;
|
||||
private:
|
||||
Unit& _owner;
|
||||
uint64 _targetGUID;
|
||||
};
|
||||
|
||||
class boss_illidari_council : public CreatureScript
|
||||
@@ -265,477 +265,477 @@ struct boss_illidari_council_memberAI : public ScriptedAI
|
||||
|
||||
class boss_gathios_the_shatterer : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_gathios_the_shatterer() : CreatureScript("boss_gathios_the_shatterer") { }
|
||||
public:
|
||||
boss_gathios_the_shatterer() : CreatureScript("boss_gathios_the_shatterer") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_gathios_the_shattererAI>(creature);
|
||||
}
|
||||
|
||||
struct boss_gathios_the_shattererAI : public boss_illidari_council_memberAI
|
||||
{
|
||||
boss_gathios_the_shattererAI(Creature* creature) : boss_illidari_council_memberAI(creature) { }
|
||||
|
||||
Creature* SelectCouncilMember()
|
||||
{
|
||||
return GetInstanceAI<boss_gathios_the_shattererAI>(creature);
|
||||
if (roll_chance_i(50))
|
||||
return ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_LADY_MALANDE));
|
||||
|
||||
if (roll_chance_i(20))
|
||||
if (Creature* veras = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_VERAS_DARKSHADOW)))
|
||||
if (!veras->HasAura(SPELL_VANISH))
|
||||
return veras;
|
||||
|
||||
return ObjectAccessor::GetCreature(*me, instance->GetData64(RAND(NPC_GATHIOS_THE_SHATTERER, NPC_HIGH_NETHERMANCER_ZEREVOR)));
|
||||
}
|
||||
|
||||
struct boss_gathios_the_shattererAI : public boss_illidari_council_memberAI
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
boss_gathios_the_shattererAI(Creature* creature) : boss_illidari_council_memberAI(creature) { }
|
||||
boss_illidari_council_memberAI::EnterCombat(who);
|
||||
events.ScheduleEvent(EVENT_SPELL_BLESSING, 10000);
|
||||
events.ScheduleEvent(EVENT_SPELL_AURA, 0);
|
||||
events.ScheduleEvent(EVENT_SPELL_SEAL, 2000);
|
||||
events.ScheduleEvent(EVENT_SPELL_HAMMER_OF_JUSTICE, 6000);
|
||||
events.ScheduleEvent(EVENT_SPELL_JUDGEMENT, 8000);
|
||||
events.ScheduleEvent(EVENT_SPELL_CONSECRATION, 4000);
|
||||
}
|
||||
|
||||
Creature* SelectCouncilMember()
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
if (roll_chance_i(50))
|
||||
return ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_LADY_MALANDE));
|
||||
|
||||
if (roll_chance_i(20))
|
||||
if (Creature* veras = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_VERAS_DARKSHADOW)))
|
||||
if (!veras->HasAura(SPELL_VANISH))
|
||||
return veras;
|
||||
|
||||
return ObjectAccessor::GetCreature(*me, instance->GetData64(RAND(NPC_GATHIOS_THE_SHATTERER, NPC_HIGH_NETHERMANCER_ZEREVOR)));
|
||||
case EVENT_SPELL_BLESSING:
|
||||
if (Unit* member = SelectCouncilMember())
|
||||
me->CastSpell(member, RAND(SPELL_BLESSING_OF_SPELL_WARDING, SPELL_BLESSING_OF_PROTECTION), false);
|
||||
events.ScheduleEvent(EVENT_SPELL_BLESSING, 15000);
|
||||
break;
|
||||
case EVENT_SPELL_AURA:
|
||||
me->CastSpell(me, RAND(SPELL_DEVOTION_AURA, SPELL_CHROMATIC_RESISTANCE_AURA), false);
|
||||
events.ScheduleEvent(EVENT_SPELL_AURA, 60000);
|
||||
break;
|
||||
case EVENT_SPELL_CONSECRATION:
|
||||
if (roll_chance_i(50))
|
||||
Talk(SAY_COUNCIL_SPECIAL);
|
||||
me->CastSpell(me, SPELL_CONSECRATION, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_AURA, 30000);
|
||||
break;
|
||||
case EVENT_SPELL_HAMMER_OF_JUSTICE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, HammerOfJusticeSelector(me)))
|
||||
{
|
||||
me->CastSpell(target, SPELL_HAMMER_OF_JUSTICE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_HAMMER_OF_JUSTICE, 20000);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_SPELL_HAMMER_OF_JUSTICE, 0);
|
||||
break;
|
||||
case EVENT_SPELL_SEAL:
|
||||
me->CastSpell(me, RAND(SPELL_SEAL_OF_COMMAND, SPELL_SEAL_OF_BLOOD), false);
|
||||
events.ScheduleEvent(EVENT_SPELL_SEAL, 20000);
|
||||
break;
|
||||
case EVENT_SPELL_JUDGEMENT:
|
||||
me->CastSpell(me->GetVictim(), SPELL_JUDGEMENT, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_JUDGEMENT, 20000);
|
||||
break;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
boss_illidari_council_memberAI::EnterCombat(who);
|
||||
events.ScheduleEvent(EVENT_SPELL_BLESSING, 10000);
|
||||
events.ScheduleEvent(EVENT_SPELL_AURA, 0);
|
||||
events.ScheduleEvent(EVENT_SPELL_SEAL, 2000);
|
||||
events.ScheduleEvent(EVENT_SPELL_HAMMER_OF_JUSTICE, 6000);
|
||||
events.ScheduleEvent(EVENT_SPELL_JUDGEMENT, 8000);
|
||||
events.ScheduleEvent(EVENT_SPELL_CONSECRATION, 4000);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPELL_BLESSING:
|
||||
if (Unit* member = SelectCouncilMember())
|
||||
me->CastSpell(member, RAND(SPELL_BLESSING_OF_SPELL_WARDING, SPELL_BLESSING_OF_PROTECTION), false);
|
||||
events.ScheduleEvent(EVENT_SPELL_BLESSING, 15000);
|
||||
break;
|
||||
case EVENT_SPELL_AURA:
|
||||
me->CastSpell(me, RAND(SPELL_DEVOTION_AURA, SPELL_CHROMATIC_RESISTANCE_AURA), false);
|
||||
events.ScheduleEvent(EVENT_SPELL_AURA, 60000);
|
||||
break;
|
||||
case EVENT_SPELL_CONSECRATION:
|
||||
if (roll_chance_i(50))
|
||||
Talk(SAY_COUNCIL_SPECIAL);
|
||||
me->CastSpell(me, SPELL_CONSECRATION, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_AURA, 30000);
|
||||
break;
|
||||
case EVENT_SPELL_HAMMER_OF_JUSTICE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, HammerOfJusticeSelector(me)))
|
||||
{
|
||||
me->CastSpell(target, SPELL_HAMMER_OF_JUSTICE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_HAMMER_OF_JUSTICE, 20000);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_SPELL_HAMMER_OF_JUSTICE, 0);
|
||||
break;
|
||||
case EVENT_SPELL_SEAL:
|
||||
me->CastSpell(me, RAND(SPELL_SEAL_OF_COMMAND, SPELL_SEAL_OF_BLOOD), false);
|
||||
events.ScheduleEvent(EVENT_SPELL_SEAL, 20000);
|
||||
break;
|
||||
case EVENT_SPELL_JUDGEMENT:
|
||||
me->CastSpell(me->GetVictim(), SPELL_JUDGEMENT, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_JUDGEMENT, 20000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
class boss_high_nethermancer_zerevor : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_high_nethermancer_zerevor() : CreatureScript("boss_high_nethermancer_zerevor") { }
|
||||
public:
|
||||
boss_high_nethermancer_zerevor() : CreatureScript("boss_high_nethermancer_zerevor") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_high_nethermancer_zerevorAI>(creature);
|
||||
}
|
||||
|
||||
struct boss_high_nethermancer_zerevorAI : public boss_illidari_council_memberAI
|
||||
{
|
||||
boss_high_nethermancer_zerevorAI(Creature* creature) : boss_illidari_council_memberAI(creature) { }
|
||||
|
||||
void AttackStart(Unit* who)
|
||||
{
|
||||
return GetInstanceAI<boss_high_nethermancer_zerevorAI>(creature);
|
||||
if (who && me->Attack(who, true))
|
||||
me->GetMotionMaster()->MoveChase(who, 20.0f);
|
||||
}
|
||||
|
||||
struct boss_high_nethermancer_zerevorAI : public boss_illidari_council_memberAI
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
boss_high_nethermancer_zerevorAI(Creature* creature) : boss_illidari_council_memberAI(creature) { }
|
||||
boss_illidari_council_memberAI::EnterCombat(who);
|
||||
events.ScheduleEvent(EVENT_SPELL_FLAMESTRIKE, 25000);
|
||||
events.ScheduleEvent(EVENT_SPELL_BLIZZARD, 5000);
|
||||
events.ScheduleEvent(EVENT_SPELL_ARCANE_BOLT, 15000);
|
||||
events.ScheduleEvent(EVENT_SPELL_DAMPEN_MAGIC, 0);
|
||||
events.ScheduleEvent(EVENT_SPELL_ARCANE_EXPLOSION, 10000);
|
||||
}
|
||||
|
||||
void AttackStart(Unit* who)
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
if (who && me->Attack(who, true))
|
||||
me->GetMotionMaster()->MoveChase(who, 20.0f);
|
||||
case EVENT_SPELL_DAMPEN_MAGIC:
|
||||
me->CastSpell(me, SPELL_DAMPEN_MAGIC, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_DAMPEN_MAGIC, 120000);
|
||||
break;
|
||||
case EVENT_SPELL_ARCANE_BOLT:
|
||||
me->CastSpell(me->GetVictim(), SPELL_ARCANE_BOLT, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_ARCANE_BOLT, 3000);
|
||||
break;
|
||||
case EVENT_SPELL_FLAMESTRIKE:
|
||||
if (roll_chance_i(50))
|
||||
Talk(SAY_COUNCIL_SPECIAL);
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f))
|
||||
me->CastSpell(target, SPELL_FLAMESTRIKE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_FLAMESTRIKE, 40000);
|
||||
break;
|
||||
case EVENT_SPELL_BLIZZARD:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f))
|
||||
me->CastSpell(target, SPELL_BLIZZARD, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_BLIZZARD, 40000);
|
||||
break;
|
||||
case EVENT_SPELL_ARCANE_EXPLOSION:
|
||||
if (SelectTarget(SELECT_TARGET_RANDOM, 0, 10.0f))
|
||||
me->CastSpell(me, SPELL_ARCANE_EXPLOSION, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_ARCANE_EXPLOSION, 10000);
|
||||
break;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
boss_illidari_council_memberAI::EnterCombat(who);
|
||||
events.ScheduleEvent(EVENT_SPELL_FLAMESTRIKE, 25000);
|
||||
events.ScheduleEvent(EVENT_SPELL_BLIZZARD, 5000);
|
||||
events.ScheduleEvent(EVENT_SPELL_ARCANE_BOLT, 15000);
|
||||
events.ScheduleEvent(EVENT_SPELL_DAMPEN_MAGIC, 0);
|
||||
events.ScheduleEvent(EVENT_SPELL_ARCANE_EXPLOSION, 10000);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPELL_DAMPEN_MAGIC:
|
||||
me->CastSpell(me, SPELL_DAMPEN_MAGIC, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_DAMPEN_MAGIC, 120000);
|
||||
break;
|
||||
case EVENT_SPELL_ARCANE_BOLT:
|
||||
me->CastSpell(me->GetVictim(), SPELL_ARCANE_BOLT, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_ARCANE_BOLT, 3000);
|
||||
break;
|
||||
case EVENT_SPELL_FLAMESTRIKE:
|
||||
if (roll_chance_i(50))
|
||||
Talk(SAY_COUNCIL_SPECIAL);
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f))
|
||||
me->CastSpell(target, SPELL_FLAMESTRIKE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_FLAMESTRIKE, 40000);
|
||||
break;
|
||||
case EVENT_SPELL_BLIZZARD:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f))
|
||||
me->CastSpell(target, SPELL_BLIZZARD, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_BLIZZARD, 40000);
|
||||
break;
|
||||
case EVENT_SPELL_ARCANE_EXPLOSION:
|
||||
if (SelectTarget(SELECT_TARGET_RANDOM, 0, 10.0f))
|
||||
me->CastSpell(me, SPELL_ARCANE_EXPLOSION, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_ARCANE_EXPLOSION, 10000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
class boss_lady_malande : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_lady_malande() : CreatureScript("boss_lady_malande") { }
|
||||
public:
|
||||
boss_lady_malande() : CreatureScript("boss_lady_malande") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_lady_malandeAI>(creature);
|
||||
}
|
||||
|
||||
struct boss_lady_malandeAI : public boss_illidari_council_memberAI
|
||||
{
|
||||
boss_lady_malandeAI(Creature* creature) : boss_illidari_council_memberAI(creature) { }
|
||||
|
||||
void AttackStart(Unit* who)
|
||||
{
|
||||
return GetInstanceAI<boss_lady_malandeAI>(creature);
|
||||
if (who && me->Attack(who, true))
|
||||
me->GetMotionMaster()->MoveChase(who, 20.0f);
|
||||
}
|
||||
|
||||
struct boss_lady_malandeAI : public boss_illidari_council_memberAI
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
boss_lady_malandeAI(Creature* creature) : boss_illidari_council_memberAI(creature) { }
|
||||
boss_illidari_council_memberAI::EnterCombat(who);
|
||||
events.ScheduleEvent(EVENT_SPELL_REFLECTIVE_SHIELD, 10000);
|
||||
events.ScheduleEvent(EVENT_SPELL_CIRCLE_OF_HEALING, 20000);
|
||||
events.ScheduleEvent(EVENT_SPELL_DIVINE_WRATH, 5000);
|
||||
events.ScheduleEvent(EVENT_SPELL_EMPOWERED_SMITE, 15000);
|
||||
}
|
||||
|
||||
void AttackStart(Unit* who)
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
if (who && me->Attack(who, true))
|
||||
me->GetMotionMaster()->MoveChase(who, 20.0f);
|
||||
case EVENT_SPELL_CIRCLE_OF_HEALING:
|
||||
me->CastSpell(me, SPELL_CIRCLE_OF_HEALING, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_CIRCLE_OF_HEALING, 20000);
|
||||
break;
|
||||
case EVENT_SPELL_REFLECTIVE_SHIELD:
|
||||
if (roll_chance_i(50))
|
||||
Talk(SAY_COUNCIL_SPECIAL);
|
||||
me->CastSpell(me, SPELL_REFLECTIVE_SHIELD, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_REFLECTIVE_SHIELD, 40000);
|
||||
break;
|
||||
case EVENT_SPELL_DIVINE_WRATH:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f))
|
||||
me->CastSpell(target, SPELL_DIVINE_WRATH, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_DIVINE_WRATH, 20000);
|
||||
break;
|
||||
case EVENT_SPELL_EMPOWERED_SMITE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_EMPOWERED_SMITE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_EMPOWERED_SMITE, 3000);
|
||||
break;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
boss_illidari_council_memberAI::EnterCombat(who);
|
||||
events.ScheduleEvent(EVENT_SPELL_REFLECTIVE_SHIELD, 10000);
|
||||
events.ScheduleEvent(EVENT_SPELL_CIRCLE_OF_HEALING, 20000);
|
||||
events.ScheduleEvent(EVENT_SPELL_DIVINE_WRATH, 5000);
|
||||
events.ScheduleEvent(EVENT_SPELL_EMPOWERED_SMITE, 15000);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPELL_CIRCLE_OF_HEALING:
|
||||
me->CastSpell(me, SPELL_CIRCLE_OF_HEALING, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_CIRCLE_OF_HEALING, 20000);
|
||||
break;
|
||||
case EVENT_SPELL_REFLECTIVE_SHIELD:
|
||||
if (roll_chance_i(50))
|
||||
Talk(SAY_COUNCIL_SPECIAL);
|
||||
me->CastSpell(me, SPELL_REFLECTIVE_SHIELD, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_REFLECTIVE_SHIELD, 40000);
|
||||
break;
|
||||
case EVENT_SPELL_DIVINE_WRATH:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f))
|
||||
me->CastSpell(target, SPELL_DIVINE_WRATH, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_DIVINE_WRATH, 20000);
|
||||
break;
|
||||
case EVENT_SPELL_EMPOWERED_SMITE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_EMPOWERED_SMITE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_EMPOWERED_SMITE, 3000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
class boss_veras_darkshadow : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_veras_darkshadow() : CreatureScript("boss_veras_darkshadow") { }
|
||||
public:
|
||||
boss_veras_darkshadow() : CreatureScript("boss_veras_darkshadow") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_veras_darkshadowAI>(creature);
|
||||
}
|
||||
|
||||
struct boss_veras_darkshadowAI : public boss_illidari_council_memberAI
|
||||
{
|
||||
boss_veras_darkshadowAI(Creature* creature) : boss_illidari_council_memberAI(creature) { }
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
return GetInstanceAI<boss_veras_darkshadowAI>(creature);
|
||||
me->SetCanDualWield(true);
|
||||
boss_illidari_council_memberAI::EnterCombat(who);
|
||||
events.ScheduleEvent(EVENT_SPELL_VANISH, 10000);
|
||||
events.ScheduleEvent(EVENT_SPELL_ENRAGE, 900000);
|
||||
}
|
||||
|
||||
struct boss_veras_darkshadowAI : public boss_illidari_council_memberAI
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
boss_veras_darkshadowAI(Creature* creature) : boss_illidari_council_memberAI(creature) { }
|
||||
summon->CastSpell(summon, SPELL_VANISH_VISUAL, true);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
me->SetCanDualWield(true);
|
||||
boss_illidari_council_memberAI::EnterCombat(who);
|
||||
events.ScheduleEvent(EVENT_SPELL_VANISH, 10000);
|
||||
events.ScheduleEvent(EVENT_SPELL_ENRAGE, 900000);
|
||||
case EVENT_SPELL_VANISH:
|
||||
if (roll_chance_i(50))
|
||||
Talk(SAY_COUNCIL_SPECIAL);
|
||||
me->CastSpell(me, SPELL_DEADLY_STRIKE, false);
|
||||
me->CastSpell(me, SPELL_VANISH, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_VANISH, 60000);
|
||||
events.ScheduleEvent(EVENT_SPELL_VANISH_OUT, 29000);
|
||||
break;
|
||||
case EVENT_SPELL_VANISH_OUT:
|
||||
me->CastSpell(me, SPELL_VANISH_OUT, false);
|
||||
break;
|
||||
case EVENT_SPELL_ENRAGE:
|
||||
DoResetThreat();
|
||||
if (Creature* council = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_ILLIDARI_COUNCIL)))
|
||||
council->GetAI()->DoAction(ACTION_ENRAGE);
|
||||
break;
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summon->CastSpell(summon, SPELL_VANISH_VISUAL, true);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPELL_VANISH:
|
||||
if (roll_chance_i(50))
|
||||
Talk(SAY_COUNCIL_SPECIAL);
|
||||
me->CastSpell(me, SPELL_DEADLY_STRIKE, false);
|
||||
me->CastSpell(me, SPELL_VANISH, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_VANISH, 60000);
|
||||
events.ScheduleEvent(EVENT_SPELL_VANISH_OUT, 29000);
|
||||
break;
|
||||
case EVENT_SPELL_VANISH_OUT:
|
||||
me->CastSpell(me, SPELL_VANISH_OUT, false);
|
||||
break;
|
||||
case EVENT_SPELL_ENRAGE:
|
||||
DoResetThreat();
|
||||
if (Creature* council = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_ILLIDARI_COUNCIL)))
|
||||
council->GetAI()->DoAction(ACTION_ENRAGE);
|
||||
break;
|
||||
}
|
||||
|
||||
if (events.GetNextEventTime(EVENT_SPELL_VANISH_OUT) == 0)
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
if (events.GetNextEventTime(EVENT_SPELL_VANISH_OUT) == 0)
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
class spell_illidari_council_balance_of_power : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_illidari_council_balance_of_power() : SpellScriptLoader("spell_illidari_council_balance_of_power") { }
|
||||
public:
|
||||
spell_illidari_council_balance_of_power() : SpellScriptLoader("spell_illidari_council_balance_of_power") { }
|
||||
|
||||
class spell_illidari_council_balance_of_power_AuraScript : public AuraScript
|
||||
class spell_illidari_council_balance_of_power_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_illidari_council_balance_of_power_AuraScript);
|
||||
|
||||
void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
|
||||
{
|
||||
PrepareAuraScript(spell_illidari_council_balance_of_power_AuraScript);
|
||||
|
||||
void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
|
||||
{
|
||||
// Set absorbtion amount to unlimited (no absorb)
|
||||
amount = -1;
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_illidari_council_balance_of_power_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_illidari_council_balance_of_power_AuraScript();
|
||||
// Set absorbtion amount to unlimited (no absorb)
|
||||
amount = -1;
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_illidari_council_balance_of_power_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_illidari_council_balance_of_power_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_illidari_council_empyreal_balance : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_illidari_council_empyreal_balance() : SpellScriptLoader("spell_illidari_council_empyreal_balance") { }
|
||||
public:
|
||||
spell_illidari_council_empyreal_balance() : SpellScriptLoader("spell_illidari_council_empyreal_balance") { }
|
||||
|
||||
class spell_illidari_council_empyreal_balance_SpellScript : public SpellScript
|
||||
class spell_illidari_council_empyreal_balance_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_illidari_council_empyreal_balance_SpellScript);
|
||||
|
||||
bool Load()
|
||||
{
|
||||
PrepareSpellScript(spell_illidari_council_empyreal_balance_SpellScript);
|
||||
|
||||
bool Load()
|
||||
{
|
||||
_sharedHealth = 0;
|
||||
_sharedHealthMax = 0;
|
||||
_targetCount = 0;
|
||||
return GetCaster()->GetTypeId() == TYPEID_UNIT;
|
||||
}
|
||||
|
||||
void HandleDummy(SpellEffIndex effIndex)
|
||||
{
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
if (Unit* target = GetHitUnit())
|
||||
{
|
||||
_targetCount++;
|
||||
_sharedHealth += target->GetHealth();
|
||||
_sharedHealthMax += target->GetMaxHealth();
|
||||
}
|
||||
}
|
||||
|
||||
void HandleAfterCast()
|
||||
{
|
||||
if (_targetCount != 4)
|
||||
{
|
||||
GetCaster()->ToCreature()->AI()->EnterEvadeMode();
|
||||
return;
|
||||
}
|
||||
|
||||
float pct = (_sharedHealth / _sharedHealthMax) * 100.0f;
|
||||
std::list<Spell::TargetInfo> const* targetsInfo = GetSpell()->GetUniqueTargetInfo();
|
||||
for (std::list<Spell::TargetInfo>::const_iterator ihit = targetsInfo->begin(); ihit != targetsInfo->end(); ++ihit)
|
||||
if (Creature* target = ObjectAccessor::GetCreature(*GetCaster(), ihit->targetGUID))
|
||||
{
|
||||
target->LowerPlayerDamageReq(target->GetMaxHealth());
|
||||
target->SetHealth(CalculatePct(target->GetMaxHealth(), pct));
|
||||
}
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_illidari_council_empyreal_balance_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
AfterCast += SpellCastFn(spell_illidari_council_empyreal_balance_SpellScript::HandleAfterCast);
|
||||
}
|
||||
|
||||
private:
|
||||
float _sharedHealth;
|
||||
float _sharedHealthMax;
|
||||
uint8 _targetCount;
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_illidari_council_empyreal_balance_SpellScript();
|
||||
_sharedHealth = 0;
|
||||
_sharedHealthMax = 0;
|
||||
_targetCount = 0;
|
||||
return GetCaster()->GetTypeId() == TYPEID_UNIT;
|
||||
}
|
||||
|
||||
void HandleDummy(SpellEffIndex effIndex)
|
||||
{
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
if (Unit* target = GetHitUnit())
|
||||
{
|
||||
_targetCount++;
|
||||
_sharedHealth += target->GetHealth();
|
||||
_sharedHealthMax += target->GetMaxHealth();
|
||||
}
|
||||
}
|
||||
|
||||
void HandleAfterCast()
|
||||
{
|
||||
if (_targetCount != 4)
|
||||
{
|
||||
GetCaster()->ToCreature()->AI()->EnterEvadeMode();
|
||||
return;
|
||||
}
|
||||
|
||||
float pct = (_sharedHealth / _sharedHealthMax) * 100.0f;
|
||||
std::list<Spell::TargetInfo> const* targetsInfo = GetSpell()->GetUniqueTargetInfo();
|
||||
for (std::list<Spell::TargetInfo>::const_iterator ihit = targetsInfo->begin(); ihit != targetsInfo->end(); ++ihit)
|
||||
if (Creature* target = ObjectAccessor::GetCreature(*GetCaster(), ihit->targetGUID))
|
||||
{
|
||||
target->LowerPlayerDamageReq(target->GetMaxHealth());
|
||||
target->SetHealth(CalculatePct(target->GetMaxHealth(), pct));
|
||||
}
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_illidari_council_empyreal_balance_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
AfterCast += SpellCastFn(spell_illidari_council_empyreal_balance_SpellScript::HandleAfterCast);
|
||||
}
|
||||
|
||||
private:
|
||||
float _sharedHealth;
|
||||
float _sharedHealthMax;
|
||||
uint8 _targetCount;
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_illidari_council_empyreal_balance_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_illidari_council_reflective_shield : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_illidari_council_reflective_shield() : SpellScriptLoader("spell_illidari_council_reflective_shield") { }
|
||||
public:
|
||||
spell_illidari_council_reflective_shield() : SpellScriptLoader("spell_illidari_council_reflective_shield") { }
|
||||
|
||||
class spell_illidari_council_reflective_shield_AuraScript : public AuraScript
|
||||
class spell_illidari_council_reflective_shield_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_illidari_council_reflective_shield_AuraScript);
|
||||
|
||||
void ReflectDamage(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount)
|
||||
{
|
||||
PrepareAuraScript(spell_illidari_council_reflective_shield_AuraScript);
|
||||
Unit* target = GetTarget();
|
||||
if (dmgInfo.GetAttacker() == target)
|
||||
return;
|
||||
|
||||
void ReflectDamage(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount)
|
||||
{
|
||||
Unit* target = GetTarget();
|
||||
if (dmgInfo.GetAttacker() == target)
|
||||
return;
|
||||
|
||||
int32 bp = absorbAmount / 2;
|
||||
target->CastCustomSpell(dmgInfo.GetAttacker(), SPELL_REFLECTIVE_SHIELD_T, &bp, nullptr, nullptr, true, NULL, aurEff);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
AfterEffectAbsorb += AuraEffectAbsorbFn(spell_illidari_council_reflective_shield_AuraScript::ReflectDamage, EFFECT_0);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_illidari_council_reflective_shield_AuraScript();
|
||||
int32 bp = absorbAmount / 2;
|
||||
target->CastCustomSpell(dmgInfo.GetAttacker(), SPELL_REFLECTIVE_SHIELD_T, &bp, nullptr, nullptr, true, NULL, aurEff);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
AfterEffectAbsorb += AuraEffectAbsorbFn(spell_illidari_council_reflective_shield_AuraScript::ReflectDamage, EFFECT_0);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_illidari_council_reflective_shield_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_illidari_council_judgement : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_illidari_council_judgement() : SpellScriptLoader("spell_illidari_council_judgement") { }
|
||||
public:
|
||||
spell_illidari_council_judgement() : SpellScriptLoader("spell_illidari_council_judgement") { }
|
||||
|
||||
class spell_illidari_council_judgement_SpellScript : public SpellScript
|
||||
class spell_illidari_council_judgement_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_illidari_council_judgement_SpellScript);
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
PrepareSpellScript(spell_illidari_council_judgement_SpellScript);
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
|
||||
Unit::AuraEffectList const& auras = GetCaster()->GetAuraEffectsByType(SPELL_AURA_DUMMY);
|
||||
for (Unit::AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
|
||||
{
|
||||
Unit::AuraEffectList const& auras = GetCaster()->GetAuraEffectsByType(SPELL_AURA_DUMMY);
|
||||
for (Unit::AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
|
||||
{
|
||||
if ((*i)->GetSpellInfo()->GetSpellSpecific() == SPELL_SPECIFIC_SEAL && (*i)->GetEffIndex() == EFFECT_2)
|
||||
if (sSpellMgr->GetSpellInfo((*i)->GetAmount()))
|
||||
{
|
||||
GetCaster()->CastSpell(GetHitUnit(), (*i)->GetAmount(), true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ((*i)->GetSpellInfo()->GetSpellSpecific() == SPELL_SPECIFIC_SEAL && (*i)->GetEffIndex() == EFFECT_2)
|
||||
if (sSpellMgr->GetSpellInfo((*i)->GetAmount()))
|
||||
{
|
||||
GetCaster()->CastSpell(GetHitUnit(), (*i)->GetAmount(), true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_illidari_council_judgement_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_illidari_council_judgement_SpellScript();
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_illidari_council_judgement_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_illidari_council_judgement_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_illidari_council_deadly_strike : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_illidari_council_deadly_strike() : SpellScriptLoader("spell_illidari_council_deadly_strike") { }
|
||||
public:
|
||||
spell_illidari_council_deadly_strike() : SpellScriptLoader("spell_illidari_council_deadly_strike") { }
|
||||
|
||||
class spell_illidari_council_deadly_strike_AuraScript : public AuraScript
|
||||
class spell_illidari_council_deadly_strike_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_illidari_council_deadly_strike_AuraScript);
|
||||
|
||||
void Update(AuraEffect const* effect)
|
||||
{
|
||||
PrepareAuraScript(spell_illidari_council_deadly_strike_AuraScript);
|
||||
|
||||
void Update(AuraEffect const* effect)
|
||||
{
|
||||
PreventDefaultAction();
|
||||
if (Unit* target = GetUnitOwner()->GetAI()->SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
|
||||
{
|
||||
GetUnitOwner()->CastSpell(target, GetSpellInfo()->Effects[effect->GetEffIndex()].TriggerSpell, true);
|
||||
GetUnitOwner()->m_Events.AddEvent(new VerasEnvenom(*GetUnitOwner(), target->GetGUID()), GetUnitOwner()->m_Events.CalculateTime(urand(1500, 3500)));
|
||||
}
|
||||
}
|
||||
|
||||
void Register()
|
||||
PreventDefaultAction();
|
||||
if (Unit* target = GetUnitOwner()->GetAI()->SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_illidari_council_deadly_strike_AuraScript::Update, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
|
||||
GetUnitOwner()->CastSpell(target, GetSpellInfo()->Effects[effect->GetEffIndex()].TriggerSpell, true);
|
||||
GetUnitOwner()->m_Events.AddEvent(new VerasEnvenom(*GetUnitOwner(), target->GetGUID()), GetUnitOwner()->m_Events.CalculateTime(urand(1500, 3500)));
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_illidari_council_deadly_strike_AuraScript();
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_illidari_council_deadly_strike_AuraScript::Update, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_illidari_council_deadly_strike_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_illidari_council()
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -41,7 +41,7 @@ enum Misc
|
||||
EVENT_KILL_TALK = 5
|
||||
};
|
||||
|
||||
const Position advisorsPosition[MAX_ADVISORS+2] =
|
||||
const Position advisorsPosition[MAX_ADVISORS + 2] =
|
||||
{
|
||||
{459.61f, -534.81f, -7.54f, 3.82f},
|
||||
{463.83f, -540.23f, -7.54f, 3.15f},
|
||||
@@ -52,150 +52,150 @@ const Position advisorsPosition[MAX_ADVISORS+2] =
|
||||
|
||||
class boss_fathomlord_karathress : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_fathomlord_karathress() : CreatureScript("boss_fathomlord_karathress") { }
|
||||
public:
|
||||
boss_fathomlord_karathress() : CreatureScript("boss_fathomlord_karathress") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_fathomlord_karathressAI>(creature);
|
||||
}
|
||||
|
||||
struct boss_fathomlord_karathressAI : public BossAI
|
||||
{
|
||||
boss_fathomlord_karathressAI(Creature* creature) : BossAI(creature, DATA_FATHOM_LORD_KARATHRESS)
|
||||
{
|
||||
return GetInstanceAI<boss_fathomlord_karathressAI>(creature);
|
||||
}
|
||||
|
||||
struct boss_fathomlord_karathressAI : public BossAI
|
||||
void Reset()
|
||||
{
|
||||
boss_fathomlord_karathressAI(Creature* creature) : BossAI(creature, DATA_FATHOM_LORD_KARATHRESS)
|
||||
BossAI::Reset();
|
||||
|
||||
me->SummonCreature(NPC_FATHOM_GUARD_TIDALVESS, advisorsPosition[0], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 600000);
|
||||
me->SummonCreature(NPC_FATHOM_GUARD_SHARKKIS, advisorsPosition[1], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 600000);
|
||||
me->SummonCreature(NPC_FATHOM_GUARD_CARIBDIS, advisorsPosition[2], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 600000);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
if (summon->GetEntry() == NPC_SEER_OLUM)
|
||||
{
|
||||
summon->SetWalk(true);
|
||||
summon->GetMotionMaster()->MovePoint(0, advisorsPosition[MAX_ADVISORS + 1], false);
|
||||
}
|
||||
}
|
||||
|
||||
void Reset()
|
||||
void SummonedCreatureDies(Creature* summon, Unit*)
|
||||
{
|
||||
summons.Despawn(summon);
|
||||
if (summon->GetEntry() == NPC_FATHOM_GUARD_TIDALVESS)
|
||||
Talk(SAY_GAIN_ABILITY1);
|
||||
if (summon->GetEntry() == NPC_FATHOM_GUARD_SHARKKIS)
|
||||
Talk(SAY_GAIN_ABILITY2);
|
||||
if (summon->GetEntry() == NPC_FATHOM_GUARD_CARIBDIS)
|
||||
Talk(SAY_GAIN_ABILITY3);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
BossAI::Reset();
|
||||
|
||||
me->SummonCreature(NPC_FATHOM_GUARD_TIDALVESS, advisorsPosition[0], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 600000);
|
||||
me->SummonCreature(NPC_FATHOM_GUARD_SHARKKIS, advisorsPosition[1], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 600000);
|
||||
me->SummonCreature(NPC_FATHOM_GUARD_CARIBDIS, advisorsPosition[2], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 600000);
|
||||
Talk(SAY_SLAY);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
}
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
BossAI::JustDied(killer);
|
||||
me->SummonCreature(NPC_SEER_OLUM, advisorsPosition[MAX_ADVISORS], TEMPSUMMON_TIMED_DESPAWN, 3600000);
|
||||
if (GameObject* gobject = me->FindNearestGameObject(GO_CAGE, 100.0f))
|
||||
gobject->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
Talk(SAY_AGGRO);
|
||||
me->CallForHelp(10.0f);
|
||||
|
||||
events.ScheduleEvent(EVENT_SPELL_CATACLYSMIC_BOLT, 10000);
|
||||
events.ScheduleEvent(EVENT_SPELL_ENRAGE, 600000);
|
||||
events.ScheduleEvent(EVENT_SPELL_SEAR_NOVA, 25000);
|
||||
events.ScheduleEvent(EVENT_HEALTH_CHECK, 1000);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
summons.Summon(summon);
|
||||
if (summon->GetEntry() == NPC_SEER_OLUM)
|
||||
{
|
||||
summon->SetWalk(true);
|
||||
summon->GetMotionMaster()->MovePoint(0, advisorsPosition[MAX_ADVISORS+1], false);
|
||||
}
|
||||
}
|
||||
case EVENT_SPELL_ENRAGE:
|
||||
me->CastSpell(me, SPELL_ENRAGE, true);
|
||||
break;
|
||||
case EVENT_SPELL_CATACLYSMIC_BOLT:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, PowerUsersSelector(me, POWER_MANA, 50.0f, true)))
|
||||
me->CastSpell(target, SPELL_CATACLYSMIC_BOLT, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_CATACLYSMIC_BOLT, 6000);
|
||||
break;
|
||||
case EVENT_SPELL_SEAR_NOVA:
|
||||
me->CastSpell(me, SPELL_SEAR_NOVA, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_SEAR_NOVA, 20000 + urand(0, 20000));
|
||||
break;
|
||||
case EVENT_HEALTH_CHECK:
|
||||
if (me->HealthBelowPct(76))
|
||||
{
|
||||
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
|
||||
if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr))
|
||||
if (summon->GetMaxHealth() > 500000)
|
||||
summon->CastSpell(me, SPELL_BLESSING_OF_THE_TIDES, true);
|
||||
|
||||
void SummonedCreatureDies(Creature* summon, Unit*)
|
||||
{
|
||||
summons.Despawn(summon);
|
||||
if (summon->GetEntry() == NPC_FATHOM_GUARD_TIDALVESS)
|
||||
Talk(SAY_GAIN_ABILITY1);
|
||||
if (summon->GetEntry() == NPC_FATHOM_GUARD_SHARKKIS)
|
||||
Talk(SAY_GAIN_ABILITY2);
|
||||
if (summon->GetEntry() == NPC_FATHOM_GUARD_CARIBDIS)
|
||||
Talk(SAY_GAIN_ABILITY3);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(SAY_SLAY);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
BossAI::JustDied(killer);
|
||||
me->SummonCreature(NPC_SEER_OLUM, advisorsPosition[MAX_ADVISORS], TEMPSUMMON_TIMED_DESPAWN, 3600000);
|
||||
if (GameObject* gobject = me->FindNearestGameObject(GO_CAGE, 100.0f))
|
||||
gobject->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
Talk(SAY_AGGRO);
|
||||
me->CallForHelp(10.0f);
|
||||
|
||||
events.ScheduleEvent(EVENT_SPELL_CATACLYSMIC_BOLT, 10000);
|
||||
events.ScheduleEvent(EVENT_SPELL_ENRAGE, 600000);
|
||||
events.ScheduleEvent(EVENT_SPELL_SEAR_NOVA, 25000);
|
||||
events.ScheduleEvent(EVENT_HEALTH_CHECK, 1000);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPELL_ENRAGE:
|
||||
me->CastSpell(me, SPELL_ENRAGE, true);
|
||||
if (me->HasAura(SPELL_BLESSING_OF_THE_TIDES))
|
||||
Talk(SAY_GAIN_BLESSING);
|
||||
break;
|
||||
case EVENT_SPELL_CATACLYSMIC_BOLT:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, PowerUsersSelector(me, POWER_MANA, 50.0f, true)))
|
||||
me->CastSpell(target, SPELL_CATACLYSMIC_BOLT, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_CATACLYSMIC_BOLT, 6000);
|
||||
break;
|
||||
case EVENT_SPELL_SEAR_NOVA:
|
||||
me->CastSpell(me, SPELL_SEAR_NOVA, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_SEAR_NOVA, 20000+urand(0, 20000));
|
||||
break;
|
||||
case EVENT_HEALTH_CHECK:
|
||||
if (me->HealthBelowPct(76))
|
||||
{
|
||||
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
|
||||
if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr))
|
||||
if (summon->GetMaxHealth() > 500000)
|
||||
summon->CastSpell(me, SPELL_BLESSING_OF_THE_TIDES, true);
|
||||
|
||||
if (me->HasAura(SPELL_BLESSING_OF_THE_TIDES))
|
||||
Talk(SAY_GAIN_BLESSING);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_HEALTH_CHECK, 1000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
events.ScheduleEvent(EVENT_HEALTH_CHECK, 1000);
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
class spell_karathress_power_of_caribdis : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_karathress_power_of_caribdis() : SpellScriptLoader("spell_karathress_power_of_caribdis") { }
|
||||
public:
|
||||
spell_karathress_power_of_caribdis() : SpellScriptLoader("spell_karathress_power_of_caribdis") { }
|
||||
|
||||
class spell_karathress_power_of_caribdis_AuraScript : public AuraScript
|
||||
class spell_karathress_power_of_caribdis_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_karathress_power_of_caribdis_AuraScript);
|
||||
|
||||
void OnPeriodic(AuraEffect const* aurEff)
|
||||
{
|
||||
PrepareAuraScript(spell_karathress_power_of_caribdis_AuraScript);
|
||||
|
||||
void OnPeriodic(AuraEffect const* aurEff)
|
||||
{
|
||||
PreventDefaultAction();
|
||||
if (Unit* victim = GetUnitOwner()->GetVictim())
|
||||
GetUnitOwner()->CastSpell(victim, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_karathress_power_of_caribdis_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_karathress_power_of_caribdis_AuraScript();
|
||||
PreventDefaultAction();
|
||||
if (Unit* victim = GetUnitOwner()->GetVictim())
|
||||
GetUnitOwner()->CastSpell(victim, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_karathress_power_of_caribdis_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_karathress_power_of_caribdis_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_fathomlord_karathress()
|
||||
|
||||
@@ -78,289 +78,289 @@ enum Misc
|
||||
|
||||
class boss_hydross_the_unstable : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_hydross_the_unstable() : CreatureScript("boss_hydross_the_unstable") { }
|
||||
public:
|
||||
boss_hydross_the_unstable() : CreatureScript("boss_hydross_the_unstable") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_hydross_the_unstableAI>(creature);
|
||||
}
|
||||
|
||||
struct boss_hydross_the_unstableAI : public BossAI
|
||||
{
|
||||
boss_hydross_the_unstableAI(Creature* creature) : BossAI(creature, DATA_HYDROSS_THE_UNSTABLE)
|
||||
{
|
||||
return GetInstanceAI<boss_hydross_the_unstableAI>(creature);
|
||||
}
|
||||
|
||||
struct boss_hydross_the_unstableAI : public BossAI
|
||||
void Reset()
|
||||
{
|
||||
boss_hydross_the_unstableAI(Creature* creature) : BossAI(creature, DATA_HYDROSS_THE_UNSTABLE)
|
||||
BossAI::Reset();
|
||||
}
|
||||
|
||||
void JustReachedHome()
|
||||
{
|
||||
BossAI::JustReachedHome();
|
||||
if (!me->HasAura(SPELL_BLUE_BEAM))
|
||||
me->RemoveAurasDueToSpell(SPELL_CLEANSING_FIELD_AURA);
|
||||
}
|
||||
|
||||
void SetForm(bool corrupt, bool initial)
|
||||
{
|
||||
events.CancelEventGroup(GROUP_ABILITIES);
|
||||
DoResetThreat();
|
||||
|
||||
if (corrupt)
|
||||
{
|
||||
me->SetMeleeDamageSchool(SPELL_SCHOOL_NATURE);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, true);
|
||||
me->CastSpell(me, SPELL_CORRUPTION, true);
|
||||
events.ScheduleEvent(EVENT_SPELL_MARK_OF_CORRUPTION1, 0, GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_SPELL_MARK_OF_CORRUPTION2, 15000, GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_SPELL_MARK_OF_CORRUPTION3, 30000, GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_SPELL_MARK_OF_CORRUPTION4, 45000, GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_SPELL_MARK_OF_CORRUPTION5, 60000, GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_SPELL_MARK_OF_CORRUPTION6, 75000, GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_SPELL_VILE_SLUDGE, 7000, GROUP_ABILITIES);
|
||||
}
|
||||
else
|
||||
{
|
||||
me->SetMeleeDamageSchool(SPELL_SCHOOL_FROST);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, false);
|
||||
me->RemoveAurasDueToSpell(SPELL_CORRUPTION);
|
||||
events.ScheduleEvent(EVENT_SPELL_MARK_OF_HYDROSS1, 0, GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_SPELL_MARK_OF_HYDROSS2, 15000, GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_SPELL_MARK_OF_HYDROSS3, 30000, GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_SPELL_MARK_OF_HYDROSS4, 45000, GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_SPELL_MARK_OF_HYDROSS5, 60000, GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_SPELL_MARK_OF_HYDROSS6, 75000, GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_SPELL_WATER_TOMB, 7000, GROUP_ABILITIES);
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
}
|
||||
if (initial)
|
||||
return;
|
||||
|
||||
void JustReachedHome()
|
||||
if (corrupt)
|
||||
{
|
||||
BossAI::JustReachedHome();
|
||||
if (!me->HasAura(SPELL_BLUE_BEAM))
|
||||
me->RemoveAurasDueToSpell(SPELL_CLEANSING_FIELD_AURA);
|
||||
Talk(SAY_SWITCH_TO_CORRUPT);
|
||||
for (uint32 i = SPELL_SUMMON_CORRUPTED1; i <= SPELL_SUMMON_CORRUPTED4; ++i)
|
||||
me->CastSpell(me, i, true);
|
||||
}
|
||||
|
||||
void SetForm(bool corrupt, bool initial)
|
||||
else
|
||||
{
|
||||
events.CancelEventGroup(GROUP_ABILITIES);
|
||||
DoResetThreat();
|
||||
|
||||
if (corrupt)
|
||||
{
|
||||
me->SetMeleeDamageSchool(SPELL_SCHOOL_NATURE);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, false);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, true);
|
||||
me->CastSpell(me, SPELL_CORRUPTION, true);
|
||||
events.ScheduleEvent(EVENT_SPELL_MARK_OF_CORRUPTION1, 0, GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_SPELL_MARK_OF_CORRUPTION2, 15000, GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_SPELL_MARK_OF_CORRUPTION3, 30000, GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_SPELL_MARK_OF_CORRUPTION4, 45000, GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_SPELL_MARK_OF_CORRUPTION5, 60000, GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_SPELL_MARK_OF_CORRUPTION6, 75000, GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_SPELL_VILE_SLUDGE, 7000, GROUP_ABILITIES);
|
||||
}
|
||||
else
|
||||
{
|
||||
me->SetMeleeDamageSchool(SPELL_SCHOOL_FROST);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, false);
|
||||
me->RemoveAurasDueToSpell(SPELL_CORRUPTION);
|
||||
events.ScheduleEvent(EVENT_SPELL_MARK_OF_HYDROSS1, 0, GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_SPELL_MARK_OF_HYDROSS2, 15000, GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_SPELL_MARK_OF_HYDROSS3, 30000, GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_SPELL_MARK_OF_HYDROSS4, 45000, GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_SPELL_MARK_OF_HYDROSS5, 60000, GROUP_ABILITIES);
|
||||
events.ScheduleEvent(EVENT_SPELL_MARK_OF_HYDROSS6, 75000, GROUP_ABILITIES);
|
||||
Talk(SAY_SWITCH_TO_CLEAN);
|
||||
for (uint32 i = SPELL_SUMMON_PURIFIED1; i <= SPELL_SUMMON_PURIFIED4; ++i)
|
||||
me->CastSpell(me, i, true);
|
||||
}
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
events.ScheduleEvent(EVENT_SPELL_ENRAGE, 600000);
|
||||
events.ScheduleEvent(EVENT_CHECK_AURA, 1000);
|
||||
SetForm(false, true);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(me->HasAura(SPELL_CORRUPTION) ? SAY_CORRUPT_SLAY : SAY_CLEAN_SLAY);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
}
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
summon->CastSpell(summon, SPELL_ELEMENTAL_SPAWNIN, true);
|
||||
summon->SetInCombatWithZone();
|
||||
|
||||
if (summon->GetEntry() == NPC_PURE_SPAWN_OF_HYDROSS)
|
||||
summon->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true);
|
||||
else
|
||||
summon->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, true);
|
||||
}
|
||||
|
||||
void SummonedCreatureDespawn(Creature* summon)
|
||||
{
|
||||
summons.Despawn(summon);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
Talk(me->HasAura(SPELL_CORRUPTION) ? SAY_CORRUPT_DEATH : SAY_CLEAN_DEATH);
|
||||
BossAI::JustDied(killer);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_CHECK_AURA:
|
||||
if (me->HasAura(SPELL_BLUE_BEAM) == me->HasAura(SPELL_CORRUPTION))
|
||||
SetForm(!me->HasAura(SPELL_BLUE_BEAM), false);
|
||||
events.ScheduleEvent(EVENT_CHECK_AURA, 1000);
|
||||
break;
|
||||
case EVENT_SPELL_ENRAGE:
|
||||
me->CastSpell(me, SPELL_ENRAGE, true);
|
||||
break;
|
||||
case EVENT_SPELL_MARK_OF_HYDROSS1:
|
||||
me->CastSpell(me, SPELL_MARK_OF_HYDROSS1, false);
|
||||
break;
|
||||
case EVENT_SPELL_MARK_OF_HYDROSS2:
|
||||
me->CastSpell(me, SPELL_MARK_OF_HYDROSS2, false);
|
||||
break;
|
||||
case EVENT_SPELL_MARK_OF_HYDROSS3:
|
||||
me->CastSpell(me, SPELL_MARK_OF_HYDROSS3, false);
|
||||
break;
|
||||
case EVENT_SPELL_MARK_OF_HYDROSS4:
|
||||
me->CastSpell(me, SPELL_MARK_OF_HYDROSS4, false);
|
||||
break;
|
||||
case EVENT_SPELL_MARK_OF_HYDROSS5:
|
||||
me->CastSpell(me, SPELL_MARK_OF_HYDROSS5, false);
|
||||
break;
|
||||
case EVENT_SPELL_MARK_OF_HYDROSS6:
|
||||
me->CastSpell(me, SPELL_MARK_OF_HYDROSS6, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_MARK_OF_HYDROSS6, 15000, GROUP_ABILITIES);
|
||||
break;
|
||||
case EVENT_SPELL_MARK_OF_CORRUPTION1:
|
||||
me->CastSpell(me, SPELL_MARK_OF_CORRUPTION1, false);
|
||||
break;
|
||||
case EVENT_SPELL_MARK_OF_CORRUPTION2:
|
||||
me->CastSpell(me, SPELL_MARK_OF_CORRUPTION2, false);
|
||||
break;
|
||||
case EVENT_SPELL_MARK_OF_CORRUPTION3:
|
||||
me->CastSpell(me, SPELL_MARK_OF_CORRUPTION3, false);
|
||||
break;
|
||||
case EVENT_SPELL_MARK_OF_CORRUPTION4:
|
||||
me->CastSpell(me, SPELL_MARK_OF_CORRUPTION4, false);
|
||||
break;
|
||||
case EVENT_SPELL_MARK_OF_CORRUPTION5:
|
||||
me->CastSpell(me, SPELL_MARK_OF_CORRUPTION5, false);
|
||||
break;
|
||||
case EVENT_SPELL_MARK_OF_CORRUPTION6:
|
||||
me->CastSpell(me, SPELL_MARK_OF_CORRUPTION6, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_MARK_OF_CORRUPTION6, 15000, GROUP_ABILITIES);
|
||||
break;
|
||||
case EVENT_SPELL_WATER_TOMB:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 60.0f, true))
|
||||
me->CastSpell(target, SPELL_WATER_TOMB, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_WATER_TOMB, 7000, GROUP_ABILITIES);
|
||||
}
|
||||
break;
|
||||
case EVENT_SPELL_VILE_SLUDGE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 60.0f, true))
|
||||
me->CastSpell(target, SPELL_VILE_SLUDGE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_VILE_SLUDGE, 15000, GROUP_ABILITIES);
|
||||
break;
|
||||
|
||||
if (initial)
|
||||
return;
|
||||
|
||||
if (corrupt)
|
||||
{
|
||||
Talk(SAY_SWITCH_TO_CORRUPT);
|
||||
for (uint32 i = SPELL_SUMMON_CORRUPTED1; i <= SPELL_SUMMON_CORRUPTED4; ++i)
|
||||
me->CastSpell(me, i, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
Talk(SAY_SWITCH_TO_CLEAN);
|
||||
for (uint32 i = SPELL_SUMMON_PURIFIED1; i <= SPELL_SUMMON_PURIFIED4; ++i)
|
||||
me->CastSpell(me, i, true);
|
||||
}
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
events.ScheduleEvent(EVENT_SPELL_ENRAGE, 600000);
|
||||
events.ScheduleEvent(EVENT_CHECK_AURA, 1000);
|
||||
SetForm(false, true);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(me->HasAura(SPELL_CORRUPTION) ? SAY_CORRUPT_SLAY : SAY_CLEAN_SLAY);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
}
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
summon->CastSpell(summon, SPELL_ELEMENTAL_SPAWNIN, true);
|
||||
summon->SetInCombatWithZone();
|
||||
|
||||
if (summon->GetEntry() == NPC_PURE_SPAWN_OF_HYDROSS)
|
||||
summon->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true);
|
||||
else
|
||||
summon->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, true);
|
||||
}
|
||||
|
||||
void SummonedCreatureDespawn(Creature* summon)
|
||||
{
|
||||
summons.Despawn(summon);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
Talk(me->HasAura(SPELL_CORRUPTION) ? SAY_CORRUPT_DEATH : SAY_CLEAN_DEATH);
|
||||
BossAI::JustDied(killer);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_CHECK_AURA:
|
||||
if (me->HasAura(SPELL_BLUE_BEAM) == me->HasAura(SPELL_CORRUPTION))
|
||||
SetForm(!me->HasAura(SPELL_BLUE_BEAM), false);
|
||||
events.ScheduleEvent(EVENT_CHECK_AURA, 1000);
|
||||
break;
|
||||
case EVENT_SPELL_ENRAGE:
|
||||
me->CastSpell(me, SPELL_ENRAGE, true);
|
||||
break;
|
||||
case EVENT_SPELL_MARK_OF_HYDROSS1:
|
||||
me->CastSpell(me, SPELL_MARK_OF_HYDROSS1, false);
|
||||
break;
|
||||
case EVENT_SPELL_MARK_OF_HYDROSS2:
|
||||
me->CastSpell(me, SPELL_MARK_OF_HYDROSS2, false);
|
||||
break;
|
||||
case EVENT_SPELL_MARK_OF_HYDROSS3:
|
||||
me->CastSpell(me, SPELL_MARK_OF_HYDROSS3, false);
|
||||
break;
|
||||
case EVENT_SPELL_MARK_OF_HYDROSS4:
|
||||
me->CastSpell(me, SPELL_MARK_OF_HYDROSS4, false);
|
||||
break;
|
||||
case EVENT_SPELL_MARK_OF_HYDROSS5:
|
||||
me->CastSpell(me, SPELL_MARK_OF_HYDROSS5, false);
|
||||
break;
|
||||
case EVENT_SPELL_MARK_OF_HYDROSS6:
|
||||
me->CastSpell(me, SPELL_MARK_OF_HYDROSS6, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_MARK_OF_HYDROSS6, 15000, GROUP_ABILITIES);
|
||||
break;
|
||||
case EVENT_SPELL_MARK_OF_CORRUPTION1:
|
||||
me->CastSpell(me, SPELL_MARK_OF_CORRUPTION1, false);
|
||||
break;
|
||||
case EVENT_SPELL_MARK_OF_CORRUPTION2:
|
||||
me->CastSpell(me, SPELL_MARK_OF_CORRUPTION2, false);
|
||||
break;
|
||||
case EVENT_SPELL_MARK_OF_CORRUPTION3:
|
||||
me->CastSpell(me, SPELL_MARK_OF_CORRUPTION3, false);
|
||||
break;
|
||||
case EVENT_SPELL_MARK_OF_CORRUPTION4:
|
||||
me->CastSpell(me, SPELL_MARK_OF_CORRUPTION4, false);
|
||||
break;
|
||||
case EVENT_SPELL_MARK_OF_CORRUPTION5:
|
||||
me->CastSpell(me, SPELL_MARK_OF_CORRUPTION5, false);
|
||||
break;
|
||||
case EVENT_SPELL_MARK_OF_CORRUPTION6:
|
||||
me->CastSpell(me, SPELL_MARK_OF_CORRUPTION6, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_MARK_OF_CORRUPTION6, 15000, GROUP_ABILITIES);
|
||||
break;
|
||||
case EVENT_SPELL_WATER_TOMB:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 60.0f, true))
|
||||
me->CastSpell(target, SPELL_WATER_TOMB, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_WATER_TOMB, 7000, GROUP_ABILITIES);
|
||||
break;
|
||||
case EVENT_SPELL_VILE_SLUDGE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 60.0f, true))
|
||||
me->CastSpell(target, SPELL_VILE_SLUDGE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_VILE_SLUDGE, 15000, GROUP_ABILITIES);
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
class spell_hydross_cleansing_field_aura : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_hydross_cleansing_field_aura() : SpellScriptLoader("spell_hydross_cleansing_field_aura") { }
|
||||
public:
|
||||
spell_hydross_cleansing_field_aura() : SpellScriptLoader("spell_hydross_cleansing_field_aura") { }
|
||||
|
||||
class spell_hydross_cleansing_field_aura_AuraScript : public AuraScript
|
||||
class spell_hydross_cleansing_field_aura_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_hydross_cleansing_field_aura_AuraScript)
|
||||
|
||||
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
PrepareAuraScript(spell_hydross_cleansing_field_aura_AuraScript)
|
||||
|
||||
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
if (GetTarget()->GetEntry() == NPC_HYDROSS_THE_UNSTABLE)
|
||||
if (Unit* caster = GetCaster())
|
||||
caster->CastSpell(caster, SPELL_CLEANSING_FIELD, true);
|
||||
}
|
||||
|
||||
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
if (GetTarget()->GetEntry() == NPC_HYDROSS_THE_UNSTABLE)
|
||||
if (Unit* caster = GetCaster())
|
||||
caster->CastSpell(caster, SPELL_CLEANSING_FIELD, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
AfterEffectApply += AuraEffectApplyFn(spell_hydross_cleansing_field_aura_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
AfterEffectRemove += AuraEffectRemoveFn(spell_hydross_cleansing_field_aura_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_hydross_cleansing_field_aura_AuraScript();
|
||||
if (GetTarget()->GetEntry() == NPC_HYDROSS_THE_UNSTABLE)
|
||||
if (Unit* caster = GetCaster())
|
||||
caster->CastSpell(caster, SPELL_CLEANSING_FIELD, true);
|
||||
}
|
||||
|
||||
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
if (GetTarget()->GetEntry() == NPC_HYDROSS_THE_UNSTABLE)
|
||||
if (Unit* caster = GetCaster())
|
||||
caster->CastSpell(caster, SPELL_CLEANSING_FIELD, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
AfterEffectApply += AuraEffectApplyFn(spell_hydross_cleansing_field_aura_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
AfterEffectRemove += AuraEffectRemoveFn(spell_hydross_cleansing_field_aura_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_hydross_cleansing_field_aura_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_hydross_cleansing_field_command : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_hydross_cleansing_field_command() : SpellScriptLoader("spell_hydross_cleansing_field_command") { }
|
||||
public:
|
||||
spell_hydross_cleansing_field_command() : SpellScriptLoader("spell_hydross_cleansing_field_command") { }
|
||||
|
||||
class spell_hydross_cleansing_field_command_AuraScript : public AuraScript
|
||||
class spell_hydross_cleansing_field_command_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_hydross_cleansing_field_command_AuraScript)
|
||||
|
||||
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
PrepareAuraScript(spell_hydross_cleansing_field_command_AuraScript)
|
||||
|
||||
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
if (GetTarget()->HasUnitState(UNIT_STATE_CASTING))
|
||||
GetTarget()->InterruptNonMeleeSpells(false);
|
||||
else
|
||||
GetTarget()->CastSpell(GetTarget(), SPELL_BLUE_BEAM, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
AfterEffectRemove += AuraEffectApplyFn(spell_hydross_cleansing_field_command_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_hydross_cleansing_field_command_AuraScript();
|
||||
if (GetTarget()->HasUnitState(UNIT_STATE_CASTING))
|
||||
GetTarget()->InterruptNonMeleeSpells(false);
|
||||
else
|
||||
GetTarget()->CastSpell(GetTarget(), SPELL_BLUE_BEAM, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
AfterEffectRemove += AuraEffectApplyFn(spell_hydross_cleansing_field_command_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_hydross_cleansing_field_command_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_hydross_mark_of_hydross : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_hydross_mark_of_hydross() : SpellScriptLoader("spell_hydross_mark_of_hydross") { }
|
||||
public:
|
||||
spell_hydross_mark_of_hydross() : SpellScriptLoader("spell_hydross_mark_of_hydross") { }
|
||||
|
||||
class spell_hydross_mark_of_hydross_AuraScript : public AuraScript
|
||||
class spell_hydross_mark_of_hydross_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_hydross_mark_of_hydross_AuraScript)
|
||||
|
||||
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
PrepareAuraScript(spell_hydross_mark_of_hydross_AuraScript)
|
||||
|
||||
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
GetTarget()->RemoveAurasByType(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, GetCasterGUID(), GetAura());
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectApply += AuraEffectApplyFn(spell_hydross_mark_of_hydross_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_hydross_mark_of_hydross_AuraScript();
|
||||
GetTarget()->RemoveAurasByType(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, GetCasterGUID(), GetAura());
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectApply += AuraEffectApplyFn(spell_hydross_mark_of_hydross_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_hydross_mark_of_hydross_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_hydross_the_unstable()
|
||||
|
||||
@@ -31,7 +31,7 @@ enum Spells
|
||||
SPELL_MAGIC_BARRIER = 38112,
|
||||
SPELL_FORKED_LIGHTNING = 38145,
|
||||
|
||||
SPELL_SUMMON_ENCHANTED_ELEMENTAL= 38017,
|
||||
SPELL_SUMMON_ENCHANTED_ELEMENTAL = 38017,
|
||||
SPELL_SUMMON_COILFANG_ELITE = 38248,
|
||||
SPELL_SUMMON_COILFANG_STRIDER = 38241,
|
||||
SPELL_SUMMON_TAINTED_ELEMENTAL = 38140,
|
||||
@@ -69,217 +69,217 @@ enum Misc
|
||||
|
||||
class startFollow : public BasicEvent
|
||||
{
|
||||
public:
|
||||
startFollow(Unit* owner) : _owner(owner) { }
|
||||
public:
|
||||
startFollow(Unit* owner) : _owner(owner) { }
|
||||
|
||||
bool Execute(uint64 /*execTime*/, uint32 /*diff*/)
|
||||
{
|
||||
if (InstanceScript* instance = _owner->GetInstanceScript())
|
||||
if (Creature* vashj = ObjectAccessor::GetCreature(*_owner, instance->GetData64(NPC_LADY_VASHJ)))
|
||||
_owner->GetMotionMaster()->MoveFollow(vashj, 3.0f, vashj->GetAngle(_owner), MOTION_SLOT_CONTROLLED);
|
||||
return true;
|
||||
}
|
||||
bool Execute(uint64 /*execTime*/, uint32 /*diff*/)
|
||||
{
|
||||
if (InstanceScript* instance = _owner->GetInstanceScript())
|
||||
if (Creature* vashj = ObjectAccessor::GetCreature(*_owner, instance->GetData64(NPC_LADY_VASHJ)))
|
||||
_owner->GetMotionMaster()->MoveFollow(vashj, 3.0f, vashj->GetAngle(_owner), MOTION_SLOT_CONTROLLED);
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
Unit* _owner;
|
||||
private:
|
||||
Unit* _owner;
|
||||
};
|
||||
|
||||
class boss_lady_vashj : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_lady_vashj() : CreatureScript("boss_lady_vashj") { }
|
||||
public:
|
||||
boss_lady_vashj() : CreatureScript("boss_lady_vashj") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_lady_vashjAI>(creature);
|
||||
}
|
||||
|
||||
struct boss_lady_vashjAI : public BossAI
|
||||
{
|
||||
boss_lady_vashjAI(Creature* creature) : BossAI(creature, DATA_LADY_VASHJ)
|
||||
{
|
||||
return GetInstanceAI<boss_lady_vashjAI>(creature);
|
||||
intro = false;
|
||||
}
|
||||
|
||||
struct boss_lady_vashjAI : public BossAI
|
||||
bool intro;
|
||||
int32 count;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
boss_lady_vashjAI(Creature* creature) : BossAI(creature, DATA_LADY_VASHJ)
|
||||
count = 0;
|
||||
BossAI::Reset();
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
intro = false;
|
||||
Talk(SAY_SLAY);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
BossAI::JustDied(killer);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
me->CastSpell(me, SPELL_REMOVE_TAINTED_CORES, true);
|
||||
events.ScheduleEvent(EVENT_SPELL_SHOCK_BLAST, 10000);
|
||||
events.ScheduleEvent(EVENT_SPELL_STATIC_CHARGE, 15000);
|
||||
events.ScheduleEvent(EVENT_SPELL_ENTANGLE, 20000);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
if (summon->GetEntry() == WORLD_TRIGGER)
|
||||
summon->CastSpell(summon, SPELL_MAGIC_BARRIER, false);
|
||||
else if (summon->GetEntry() == NPC_ENCHANTED_ELEMENTAL)
|
||||
{
|
||||
summon->SetWalk(true);
|
||||
summon->m_Events.AddEvent(new startFollow(summon), summon->m_Events.CalculateTime(0));
|
||||
}
|
||||
else if (summon->GetEntry() == NPC_TOXIC_SPOREBAT)
|
||||
summon->GetMotionMaster()->MoveRandom(30.0f);
|
||||
else if (summon->GetEntry() != NPC_TAINTED_ELEMENTAL)
|
||||
summon->GetMotionMaster()->MovePoint(POINT_HOME, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), true, true);
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who)
|
||||
{
|
||||
if (!intro && who->GetTypeId() == TYPEID_PLAYER)
|
||||
{
|
||||
intro = true;
|
||||
Talk(SAY_INTRO);
|
||||
}
|
||||
|
||||
bool intro;
|
||||
int32 count;
|
||||
BossAI::MoveInLineOfSight(who);
|
||||
}
|
||||
|
||||
void Reset()
|
||||
void MovementInform(uint32 type, uint32 id)
|
||||
{
|
||||
if (type != POINT_MOTION_TYPE || id != POINT_HOME)
|
||||
return;
|
||||
|
||||
me->SetFacingTo(me->GetHomePosition().GetOrientation());
|
||||
instance->SetData(DATA_ACTIVATE_SHIELD, 0);
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_SPELL_FORKED_LIGHTNING, 3000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_A, 0);
|
||||
events.ScheduleEvent(EVENT_SUMMON_B, 45000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_C, 60000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_D, 50000);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH2, 1000);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
EnterEvadeIfOutOfCombatArea();
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
count = 0;
|
||||
BossAI::Reset();
|
||||
case EVENT_SPELL_SHOCK_BLAST:
|
||||
me->CastSpell(me->GetVictim(), SPELL_SHOCK_BLAST, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_SHOCK_BLAST, urand(10000, 20000));
|
||||
break;
|
||||
case EVENT_SPELL_STATIC_CHARGE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f))
|
||||
me->CastSpell(target, SPELL_STATIC_CHARGE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_STATIC_CHARGE, 20000);
|
||||
break;
|
||||
case EVENT_SPELL_ENTANGLE:
|
||||
me->CastSpell(me, SPELL_ENTANGLE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_ENTANGLE, 30000);
|
||||
break;
|
||||
case EVENT_CHECK_HEALTH:
|
||||
if (me->HealthBelowPct(71))
|
||||
{
|
||||
Talk(SAY_PHASE2);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->GetMotionMaster()->MovePoint(POINT_HOME, me->GetHomePosition().GetPositionX(), me->GetHomePosition().GetPositionY(), me->GetHomePosition().GetPositionZ(), true, true);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
|
||||
break;
|
||||
case EVENT_SPELL_FORKED_LIGHTNING:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 60.0f))
|
||||
me->CastSpell(target, SPELL_FORKED_LIGHTNING, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_FORKED_LIGHTNING, urand(2500, 5000));
|
||||
break;
|
||||
case EVENT_SUMMON_A:
|
||||
me->CastSpell(me, SPELL_SUMMON_ENCHANTED_ELEMENTAL, true);
|
||||
events.ScheduleEvent(EVENT_SUMMON_A, 2500);
|
||||
break;
|
||||
case EVENT_SUMMON_B:
|
||||
me->CastSpell(me, SPELL_SUMMON_COILFANG_ELITE, true);
|
||||
events.ScheduleEvent(EVENT_SUMMON_B, 45000);
|
||||
break;
|
||||
case EVENT_SUMMON_C:
|
||||
me->CastSpell(me, SPELL_SUMMON_COILFANG_STRIDER, true);
|
||||
events.ScheduleEvent(EVENT_SUMMON_C, 60000);
|
||||
break;
|
||||
case EVENT_SUMMON_D:
|
||||
me->CastSpell(me, SPELL_SUMMON_TAINTED_ELEMENTAL, true);
|
||||
events.ScheduleEvent(EVENT_SUMMON_D, 50000);
|
||||
break;
|
||||
case EVENT_CHECK_HEALTH2:
|
||||
if (!me->HasAura(SPELL_MAGIC_BARRIER))
|
||||
{
|
||||
Talk(SAY_PHASE3);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->GetMotionMaster()->MoveChase(me->GetVictim());
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_SPELL_SHOCK_BLAST, 10000);
|
||||
events.ScheduleEvent(EVENT_SPELL_STATIC_CHARGE, 15000);
|
||||
events.ScheduleEvent(EVENT_SPELL_ENTANGLE, 20000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_SPOREBAT, 5000);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH2, 1000);
|
||||
break;
|
||||
case EVENT_SUMMON_SPOREBAT:
|
||||
me->CastSpell(me, SPELL_SUMMON_TOXIC_SPOREBAT, true);
|
||||
events.ScheduleEvent(EVENT_SUMMON_SPOREBAT, 20000 - 1000 * std::min(count++, 16));
|
||||
break;
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
if (me->GetReactState() != REACT_AGGRESSIVE || !me->isAttackReady())
|
||||
return;
|
||||
|
||||
if (!me->IsWithinMeleeRange(me->GetVictim()))
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(SAY_SLAY);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
}
|
||||
me->resetAttackTimer();
|
||||
me->SetSheath(SHEATH_STATE_RANGED);
|
||||
me->CastSpell(me->GetVictim(), roll_chance_i(33) ? SPELL_MULTI_SHOT : SPELL_SHOOT, false);
|
||||
if (roll_chance_i(15))
|
||||
Talk(SAY_BOWSHOT);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
else
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
BossAI::JustDied(killer);
|
||||
me->SetSheath(SHEATH_STATE_MELEE);
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
me->CastSpell(me, SPELL_REMOVE_TAINTED_CORES, true);
|
||||
events.ScheduleEvent(EVENT_SPELL_SHOCK_BLAST, 10000);
|
||||
events.ScheduleEvent(EVENT_SPELL_STATIC_CHARGE, 15000);
|
||||
events.ScheduleEvent(EVENT_SPELL_ENTANGLE, 20000);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
if (summon->GetEntry() == WORLD_TRIGGER)
|
||||
summon->CastSpell(summon, SPELL_MAGIC_BARRIER, false);
|
||||
else if (summon->GetEntry() == NPC_ENCHANTED_ELEMENTAL)
|
||||
{
|
||||
summon->SetWalk(true);
|
||||
summon->m_Events.AddEvent(new startFollow(summon), summon->m_Events.CalculateTime(0));
|
||||
}
|
||||
else if (summon->GetEntry() == NPC_TOXIC_SPOREBAT)
|
||||
summon->GetMotionMaster()->MoveRandom(30.0f);
|
||||
else if (summon->GetEntry() != NPC_TAINTED_ELEMENTAL)
|
||||
summon->GetMotionMaster()->MovePoint(POINT_HOME, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), true, true);
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who)
|
||||
{
|
||||
if (!intro && who->GetTypeId() == TYPEID_PLAYER)
|
||||
{
|
||||
intro = true;
|
||||
Talk(SAY_INTRO);
|
||||
}
|
||||
|
||||
BossAI::MoveInLineOfSight(who);
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 id)
|
||||
{
|
||||
if (type != POINT_MOTION_TYPE || id != POINT_HOME)
|
||||
return;
|
||||
|
||||
me->SetFacingTo(me->GetHomePosition().GetOrientation());
|
||||
instance->SetData(DATA_ACTIVATE_SHIELD, 0);
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_SPELL_FORKED_LIGHTNING, 3000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_A, 0);
|
||||
events.ScheduleEvent(EVENT_SUMMON_B, 45000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_C, 60000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_D, 50000);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH2, 1000);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
EnterEvadeIfOutOfCombatArea();
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPELL_SHOCK_BLAST:
|
||||
me->CastSpell(me->GetVictim(), SPELL_SHOCK_BLAST, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_SHOCK_BLAST, urand(10000, 20000));
|
||||
break;
|
||||
case EVENT_SPELL_STATIC_CHARGE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f))
|
||||
me->CastSpell(target, SPELL_STATIC_CHARGE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_STATIC_CHARGE, 20000);
|
||||
break;
|
||||
case EVENT_SPELL_ENTANGLE:
|
||||
me->CastSpell(me, SPELL_ENTANGLE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_ENTANGLE, 30000);
|
||||
break;
|
||||
case EVENT_CHECK_HEALTH:
|
||||
if (me->HealthBelowPct(71))
|
||||
{
|
||||
Talk(SAY_PHASE2);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->GetMotionMaster()->MovePoint(POINT_HOME, me->GetHomePosition().GetPositionX(), me->GetHomePosition().GetPositionY(), me->GetHomePosition().GetPositionZ(), true, true);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
|
||||
break;
|
||||
case EVENT_SPELL_FORKED_LIGHTNING:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 60.0f))
|
||||
me->CastSpell(target, SPELL_FORKED_LIGHTNING, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_FORKED_LIGHTNING, urand(2500, 5000));
|
||||
break;
|
||||
case EVENT_SUMMON_A:
|
||||
me->CastSpell(me, SPELL_SUMMON_ENCHANTED_ELEMENTAL, true);
|
||||
events.ScheduleEvent(EVENT_SUMMON_A, 2500);
|
||||
break;
|
||||
case EVENT_SUMMON_B:
|
||||
me->CastSpell(me, SPELL_SUMMON_COILFANG_ELITE, true);
|
||||
events.ScheduleEvent(EVENT_SUMMON_B, 45000);
|
||||
break;
|
||||
case EVENT_SUMMON_C:
|
||||
me->CastSpell(me, SPELL_SUMMON_COILFANG_STRIDER, true);
|
||||
events.ScheduleEvent(EVENT_SUMMON_C, 60000);
|
||||
break;
|
||||
case EVENT_SUMMON_D:
|
||||
me->CastSpell(me, SPELL_SUMMON_TAINTED_ELEMENTAL, true);
|
||||
events.ScheduleEvent(EVENT_SUMMON_D, 50000);
|
||||
break;
|
||||
case EVENT_CHECK_HEALTH2:
|
||||
if (!me->HasAura(SPELL_MAGIC_BARRIER))
|
||||
{
|
||||
Talk(SAY_PHASE3);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->GetMotionMaster()->MoveChase(me->GetVictim());
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_SPELL_SHOCK_BLAST, 10000);
|
||||
events.ScheduleEvent(EVENT_SPELL_STATIC_CHARGE, 15000);
|
||||
events.ScheduleEvent(EVENT_SPELL_ENTANGLE, 20000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_SPOREBAT, 5000);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH2, 1000);
|
||||
break;
|
||||
case EVENT_SUMMON_SPOREBAT:
|
||||
me->CastSpell(me, SPELL_SUMMON_TOXIC_SPOREBAT, true);
|
||||
events.ScheduleEvent(EVENT_SUMMON_SPOREBAT, 20000 - 1000*std::min(count++, 16));
|
||||
break;
|
||||
}
|
||||
|
||||
if (me->GetReactState() != REACT_AGGRESSIVE || !me->isAttackReady())
|
||||
return;
|
||||
|
||||
if (!me->IsWithinMeleeRange(me->GetVictim()))
|
||||
{
|
||||
me->resetAttackTimer();
|
||||
me->SetSheath(SHEATH_STATE_RANGED);
|
||||
me->CastSpell(me->GetVictim(), roll_chance_i(33) ? SPELL_MULTI_SHOT : SPELL_SHOOT, false);
|
||||
if (roll_chance_i(15))
|
||||
Talk(SAY_BOWSHOT);
|
||||
}
|
||||
else
|
||||
{
|
||||
me->SetSheath(SHEATH_STATE_MELEE);
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
}
|
||||
|
||||
bool CheckEvadeIfOutOfCombatArea() const
|
||||
{
|
||||
return me->GetHomePosition().GetExactDist2d(me) > 80.0f || !SelectTargetFromPlayerList(100.0f);
|
||||
}
|
||||
};
|
||||
bool CheckEvadeIfOutOfCombatArea() const
|
||||
{
|
||||
return me->GetHomePosition().GetExactDist2d(me) > 80.0f || !SelectTargetFromPlayerList(100.0f);
|
||||
}
|
||||
};
|
||||
};
|
||||
/*
|
||||
|
||||
@@ -384,111 +384,111 @@ public:
|
||||
|
||||
class spell_lady_vashj_magic_barrier : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_lady_vashj_magic_barrier() : SpellScriptLoader("spell_lady_vashj_magic_barrier") { }
|
||||
public:
|
||||
spell_lady_vashj_magic_barrier() : SpellScriptLoader("spell_lady_vashj_magic_barrier") { }
|
||||
|
||||
class spell_lady_vashj_magic_barrier_AuraScript : public AuraScript
|
||||
class spell_lady_vashj_magic_barrier_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_lady_vashj_magic_barrier_AuraScript)
|
||||
|
||||
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
PrepareAuraScript(spell_lady_vashj_magic_barrier_AuraScript)
|
||||
|
||||
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
Unit::DealDamage(GetTarget(), GetTarget(), GetTarget()->CountPctFromMaxHealth(5));
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
AfterEffectRemove += AuraEffectRemoveFn(spell_lady_vashj_magic_barrier_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_SCHOOL_IMMUNITY, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_lady_vashj_magic_barrier_AuraScript();
|
||||
Unit::DealDamage(GetTarget(), GetTarget(), GetTarget()->CountPctFromMaxHealth(5));
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
AfterEffectRemove += AuraEffectRemoveFn(spell_lady_vashj_magic_barrier_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_SCHOOL_IMMUNITY, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_lady_vashj_magic_barrier_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_lady_vashj_remove_tainted_cores : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_lady_vashj_remove_tainted_cores() : SpellScriptLoader("spell_lady_vashj_remove_tainted_cores") { }
|
||||
public:
|
||||
spell_lady_vashj_remove_tainted_cores() : SpellScriptLoader("spell_lady_vashj_remove_tainted_cores") { }
|
||||
|
||||
class spell_lady_vashj_remove_tainted_cores_SpellScript : public SpellScript
|
||||
class spell_lady_vashj_remove_tainted_cores_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_lady_vashj_remove_tainted_cores_SpellScript);
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex effIndex)
|
||||
{
|
||||
PrepareSpellScript(spell_lady_vashj_remove_tainted_cores_SpellScript);
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex effIndex)
|
||||
{
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
if (Player* target = GetHitPlayer())
|
||||
target->DestroyItemCount(ITEM_TAINTED_CORE, -1, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_lady_vashj_remove_tainted_cores_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_lady_vashj_remove_tainted_cores_SpellScript();
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
if (Player* target = GetHitPlayer())
|
||||
target->DestroyItemCount(ITEM_TAINTED_CORE, -1, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_lady_vashj_remove_tainted_cores_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_lady_vashj_remove_tainted_cores_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_lady_vashj_summon_sporebat : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_lady_vashj_summon_sporebat() : SpellScriptLoader("spell_lady_vashj_summon_sporebat") { }
|
||||
public:
|
||||
spell_lady_vashj_summon_sporebat() : SpellScriptLoader("spell_lady_vashj_summon_sporebat") { }
|
||||
|
||||
class spell_lady_vashj_summon_sporebat_SpellScript : public SpellScript
|
||||
class spell_lady_vashj_summon_sporebat_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_lady_vashj_summon_sporebat_SpellScript);
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex effIndex)
|
||||
{
|
||||
PrepareSpellScript(spell_lady_vashj_summon_sporebat_SpellScript);
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex effIndex)
|
||||
{
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
GetCaster()->CastSpell(GetCaster(), RAND(SPELL_SUMMON_SPOREBAT1, SPELL_SUMMON_SPOREBAT2, SPELL_SUMMON_SPOREBAT3, SPELL_SUMMON_SPOREBAT4), true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_lady_vashj_summon_sporebat_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_lady_vashj_summon_sporebat_SpellScript();
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
GetCaster()->CastSpell(GetCaster(), RAND(SPELL_SUMMON_SPOREBAT1, SPELL_SUMMON_SPOREBAT2, SPELL_SUMMON_SPOREBAT3, SPELL_SUMMON_SPOREBAT4), true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_lady_vashj_summon_sporebat_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_lady_vashj_summon_sporebat_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_lady_vashj_spore_drop_effect : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_lady_vashj_spore_drop_effect() : SpellScriptLoader("spell_lady_vashj_spore_drop_effect") { }
|
||||
public:
|
||||
spell_lady_vashj_spore_drop_effect() : SpellScriptLoader("spell_lady_vashj_spore_drop_effect") { }
|
||||
|
||||
class spell_lady_vashj_spore_drop_effect_SpellScript : public SpellScript
|
||||
class spell_lady_vashj_spore_drop_effect_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_lady_vashj_spore_drop_effect_SpellScript);
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex effIndex)
|
||||
{
|
||||
PrepareSpellScript(spell_lady_vashj_spore_drop_effect_SpellScript);
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex effIndex)
|
||||
{
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
if (Unit* target = GetHitUnit())
|
||||
target->CastSpell(target, SPELL_TOXIC_SPORES, true, nullptr, nullptr, GetCaster()->GetGUID());
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_lady_vashj_spore_drop_effect_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_lady_vashj_spore_drop_effect_SpellScript();
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
if (Unit* target = GetHitUnit())
|
||||
target->CastSpell(target, SPELL_TOXIC_SPORES, true, nullptr, nullptr, GetCaster()->GetGUID());
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_lady_vashj_spore_drop_effect_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_lady_vashj_spore_drop_effect_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_lady_vashj()
|
||||
|
||||
@@ -60,7 +60,7 @@ enum Misc
|
||||
EVENT_SPELL_SHADOW_BOLT = 20
|
||||
};
|
||||
|
||||
const Position channelersPos[MAX_CHANNELERS] =
|
||||
const Position channelersPos[MAX_CHANNELERS] =
|
||||
{
|
||||
{367.11f, -421.48f, 29.52f, 5.0f},
|
||||
{380.11f, -435.48f, 29.52f, 2.5f},
|
||||
@@ -69,437 +69,437 @@ const Position channelersPos[MAX_CHANNELERS] =
|
||||
|
||||
class boss_leotheras_the_blind : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_leotheras_the_blind() : CreatureScript("boss_leotheras_the_blind") { }
|
||||
public:
|
||||
boss_leotheras_the_blind() : CreatureScript("boss_leotheras_the_blind") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_leotheras_the_blindAI>(creature);
|
||||
}
|
||||
|
||||
struct boss_leotheras_the_blindAI : public BossAI
|
||||
{
|
||||
boss_leotheras_the_blindAI(Creature* creature) : BossAI(creature, DATA_LEOTHERAS_THE_BLIND)
|
||||
{
|
||||
return GetInstanceAI<boss_leotheras_the_blindAI>(creature);
|
||||
}
|
||||
|
||||
struct boss_leotheras_the_blindAI : public BossAI
|
||||
void Reset()
|
||||
{
|
||||
boss_leotheras_the_blindAI(Creature* creature) : BossAI(creature, DATA_LEOTHERAS_THE_BLIND)
|
||||
BossAI::Reset();
|
||||
me->CastSpell(me, SPELL_CLEAR_CONSUMING_MADNESS, true);
|
||||
me->CastSpell(me, SPELL_DUAL_WIELD, true);
|
||||
me->SetStandState(UNIT_STAND_STATE_KNEEL);
|
||||
me->LoadEquipment(0, true);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
}
|
||||
|
||||
void InitializeAI()
|
||||
{
|
||||
BossAI::InitializeAI();
|
||||
SummonChannelers();
|
||||
}
|
||||
|
||||
void JustReachedHome()
|
||||
{
|
||||
BossAI::JustReachedHome();
|
||||
SummonChannelers();
|
||||
}
|
||||
|
||||
void SummonChannelers()
|
||||
{
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_BANISH, false);
|
||||
me->CastSpell(me, SPELL_BANISH, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_BANISH, true);
|
||||
|
||||
summons.DespawnAll();
|
||||
for (uint8 i = 0; i < MAX_CHANNELERS; ++i)
|
||||
me->SummonCreature(NPC_GREYHEART_SPELLBINDER, channelersPos[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000);
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* /*who*/) { }
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
}
|
||||
|
||||
void SummonedCreatureDies(Creature* summon, Unit*)
|
||||
{
|
||||
me->SetInCombatWithZone();
|
||||
summons.Despawn(summon);
|
||||
if (summon->GetEntry() == NPC_GREYHEART_SPELLBINDER)
|
||||
if (!summons.HasEntry(NPC_GREYHEART_SPELLBINDER))
|
||||
{
|
||||
me->RemoveAllAuras();
|
||||
me->LoadEquipment();
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
events.ScheduleEvent(EVENT_SPELL_BERSERK, 600000);
|
||||
events.ScheduleEvent(EVENT_HEALTH_CHECK, 1000);
|
||||
events.ScheduleEvent(EVENT_SWITCH_TO_DEMON, 55000);
|
||||
events.ScheduleEvent(EVENT_SPELL_WHIRLWIND, 10000);
|
||||
}
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(me->GetDisplayId() != me->GetNativeDisplayId() ? SAY_DEMON_SLAY : SAY_NIGHTELF_SLAY);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
}
|
||||
}
|
||||
|
||||
void Reset()
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
me->CastSpell(me, SPELL_CLEAR_CONSUMING_MADNESS, true);
|
||||
Talk(SAY_DEATH);
|
||||
BossAI::JustDied(killer);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
me->SetStandState(UNIT_STAND_STATE_KNEEL);
|
||||
}
|
||||
|
||||
void AttackStart(Unit* who)
|
||||
{
|
||||
if (who && me->Attack(who, true))
|
||||
me->GetMotionMaster()->MoveChase(who, me->GetDisplayId() == me->GetNativeDisplayId() ? 0.0f : 25.0f);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
BossAI::Reset();
|
||||
me->CastSpell(me, SPELL_CLEAR_CONSUMING_MADNESS, true);
|
||||
me->CastSpell(me, SPELL_DUAL_WIELD, true);
|
||||
me->SetStandState(UNIT_STAND_STATE_KNEEL);
|
||||
me->LoadEquipment(0, true);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
}
|
||||
|
||||
void InitializeAI()
|
||||
{
|
||||
BossAI::InitializeAI();
|
||||
SummonChannelers();
|
||||
}
|
||||
|
||||
void JustReachedHome()
|
||||
{
|
||||
BossAI::JustReachedHome();
|
||||
SummonChannelers();
|
||||
}
|
||||
|
||||
void SummonChannelers()
|
||||
{
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_BANISH, false);
|
||||
me->CastSpell(me, SPELL_BANISH, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_BANISH, true);
|
||||
|
||||
summons.DespawnAll();
|
||||
for (uint8 i = 0; i < MAX_CHANNELERS; ++i)
|
||||
me->SummonCreature(NPC_GREYHEART_SPELLBINDER, channelersPos[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000);
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* /*who*/) { }
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
}
|
||||
|
||||
void SummonedCreatureDies(Creature* summon, Unit*)
|
||||
{
|
||||
me->SetInCombatWithZone();
|
||||
summons.Despawn(summon);
|
||||
if (summon->GetEntry() == NPC_GREYHEART_SPELLBINDER)
|
||||
if (!summons.HasEntry(NPC_GREYHEART_SPELLBINDER))
|
||||
case EVENT_SPELL_BERSERK:
|
||||
me->CastSpell(me, SPELL_BERSERK, true);
|
||||
break;
|
||||
case EVENT_HEALTH_CHECK:
|
||||
if (me->HealthBelowPct(15))
|
||||
{
|
||||
me->RemoveAllAuras();
|
||||
me->LoadEquipment();
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
events.ScheduleEvent(EVENT_SPELL_BERSERK, 600000);
|
||||
events.ScheduleEvent(EVENT_HEALTH_CHECK, 1000);
|
||||
events.ScheduleEvent(EVENT_SWITCH_TO_DEMON, 55000);
|
||||
events.ScheduleEvent(EVENT_SPELL_WHIRLWIND, 10000);
|
||||
}
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(me->GetDisplayId() != me->GetNativeDisplayId() ? SAY_DEMON_SLAY : SAY_NIGHTELF_SLAY);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
me->CastSpell(me, SPELL_CLEAR_CONSUMING_MADNESS, true);
|
||||
Talk(SAY_DEATH);
|
||||
BossAI::JustDied(killer);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
me->SetStandState(UNIT_STAND_STATE_KNEEL);
|
||||
}
|
||||
|
||||
void AttackStart(Unit* who)
|
||||
{
|
||||
if (who && me->Attack(who, true))
|
||||
me->GetMotionMaster()->MoveChase(who, me->GetDisplayId() == me->GetNativeDisplayId() ? 0.0f : 25.0f);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
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_HEALTH_CHECK:
|
||||
if (me->HealthBelowPct(15))
|
||||
if (me->GetDisplayId() != me->GetNativeDisplayId())
|
||||
{
|
||||
if (me->GetDisplayId() != me->GetNativeDisplayId())
|
||||
{
|
||||
DoResetThreat();
|
||||
me->LoadEquipment();
|
||||
me->RemoveAurasDueToSpell(SPELL_METAMORPHOSIS);
|
||||
events.ScheduleEvent(EVENT_SPELL_WHIRLWIND, 10000);
|
||||
}
|
||||
events.CancelEvent(EVENT_SWITCH_TO_DEMON);
|
||||
events.CancelEvent(EVENT_SPELL_INSIDIOUS_WHISPER);
|
||||
events.DelayEvents(10000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_DEMON, 4000);
|
||||
events.ScheduleEvent(EVENT_RESTORE_FIGHT, 6000);
|
||||
me->SetStandState(UNIT_STAND_STATE_KNEEL);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->GetMotionMaster()->Clear();
|
||||
me->StopMoving();
|
||||
Talk(SAY_FINAL_FORM);
|
||||
break;
|
||||
DoResetThreat();
|
||||
me->LoadEquipment();
|
||||
me->RemoveAurasDueToSpell(SPELL_METAMORPHOSIS);
|
||||
events.ScheduleEvent(EVENT_SPELL_WHIRLWIND, 10000);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_HEALTH_CHECK, 1000);
|
||||
events.CancelEvent(EVENT_SWITCH_TO_DEMON);
|
||||
events.CancelEvent(EVENT_SPELL_INSIDIOUS_WHISPER);
|
||||
events.DelayEvents(10000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_DEMON, 4000);
|
||||
events.ScheduleEvent(EVENT_RESTORE_FIGHT, 6000);
|
||||
me->SetStandState(UNIT_STAND_STATE_KNEEL);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->GetMotionMaster()->Clear();
|
||||
me->StopMoving();
|
||||
Talk(SAY_FINAL_FORM);
|
||||
break;
|
||||
case EVENT_SWITCH_TO_DEMON:
|
||||
DoResetThreat();
|
||||
Talk(SAY_SWITCH_TO_DEMON);
|
||||
me->LoadEquipment(0, true);
|
||||
me->GetMotionMaster()->MoveChase(me->GetVictim(), 25.0f);
|
||||
me->CastSpell(me, SPELL_METAMORPHOSIS, true);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_HEALTH_CHECK, 1000);
|
||||
break;
|
||||
case EVENT_SWITCH_TO_DEMON:
|
||||
DoResetThreat();
|
||||
Talk(SAY_SWITCH_TO_DEMON);
|
||||
me->LoadEquipment(0, true);
|
||||
me->GetMotionMaster()->MoveChase(me->GetVictim(), 25.0f);
|
||||
me->CastSpell(me, SPELL_METAMORPHOSIS, true);
|
||||
|
||||
events.CancelEvent(EVENT_SPELL_WHIRLWIND);
|
||||
events.ScheduleEvent(EVENT_SPELL_INSIDIOUS_WHISPER, 25000);
|
||||
events.ScheduleEvent(EVENT_SWITCH_TO_ELF, 60000);
|
||||
break;
|
||||
case EVENT_SWITCH_TO_ELF:
|
||||
DoResetThreat();
|
||||
me->LoadEquipment();
|
||||
me->GetMotionMaster()->MoveChase(me->GetVictim(), 0.0f);
|
||||
me->RemoveAurasDueToSpell(SPELL_METAMORPHOSIS);
|
||||
events.ScheduleEvent(EVENT_SWITCH_TO_DEMON, 55000);
|
||||
events.ScheduleEvent(EVENT_SPELL_WHIRLWIND, 10000);
|
||||
break;
|
||||
case EVENT_SPELL_WHIRLWIND:
|
||||
me->CastSpell(me, SPELL_WHIRLWIND, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_WHIRLWIND, 27000);
|
||||
break;
|
||||
case EVENT_SPELL_INSIDIOUS_WHISPER:
|
||||
Talk(SAY_INNER_DEMONS);
|
||||
me->CastCustomSpell(SPELL_INSIDIOUS_WHISPER, SPELLVALUE_MAX_TARGETS, 5, me, false);
|
||||
break;
|
||||
case EVENT_SUMMON_DEMON:
|
||||
me->CastSpell(me, SPELL_SUMMON_SHADOW_OF_LEOTHERAS, true);
|
||||
break;
|
||||
case EVENT_RESTORE_FIGHT:
|
||||
me->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->GetMotionMaster()->MoveChase(me->GetVictim());
|
||||
break;
|
||||
}
|
||||
|
||||
if (me->GetDisplayId() == me->GetNativeDisplayId())
|
||||
DoMeleeAttackIfReady();
|
||||
else if (me->isAttackReady(BASE_ATTACK))
|
||||
{
|
||||
me->CastSpell(me->GetVictim(), SPELL_CHAOS_BLAST, false);
|
||||
me->setAttackTimer(BASE_ATTACK, 2000);
|
||||
}
|
||||
events.CancelEvent(EVENT_SPELL_WHIRLWIND);
|
||||
events.ScheduleEvent(EVENT_SPELL_INSIDIOUS_WHISPER, 25000);
|
||||
events.ScheduleEvent(EVENT_SWITCH_TO_ELF, 60000);
|
||||
break;
|
||||
case EVENT_SWITCH_TO_ELF:
|
||||
DoResetThreat();
|
||||
me->LoadEquipment();
|
||||
me->GetMotionMaster()->MoveChase(me->GetVictim(), 0.0f);
|
||||
me->RemoveAurasDueToSpell(SPELL_METAMORPHOSIS);
|
||||
events.ScheduleEvent(EVENT_SWITCH_TO_DEMON, 55000);
|
||||
events.ScheduleEvent(EVENT_SPELL_WHIRLWIND, 10000);
|
||||
break;
|
||||
case EVENT_SPELL_WHIRLWIND:
|
||||
me->CastSpell(me, SPELL_WHIRLWIND, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_WHIRLWIND, 27000);
|
||||
break;
|
||||
case EVENT_SPELL_INSIDIOUS_WHISPER:
|
||||
Talk(SAY_INNER_DEMONS);
|
||||
me->CastCustomSpell(SPELL_INSIDIOUS_WHISPER, SPELLVALUE_MAX_TARGETS, 5, me, false);
|
||||
break;
|
||||
case EVENT_SUMMON_DEMON:
|
||||
me->CastSpell(me, SPELL_SUMMON_SHADOW_OF_LEOTHERAS, true);
|
||||
break;
|
||||
case EVENT_RESTORE_FIGHT:
|
||||
me->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->GetMotionMaster()->MoveChase(me->GetVictim());
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
if (me->GetDisplayId() == me->GetNativeDisplayId())
|
||||
DoMeleeAttackIfReady();
|
||||
else if (me->isAttackReady(BASE_ATTACK))
|
||||
{
|
||||
me->CastSpell(me->GetVictim(), SPELL_CHAOS_BLAST, false);
|
||||
me->setAttackTimer(BASE_ATTACK, 2000);
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
class npc_inner_demon : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_inner_demon() : CreatureScript("npc_inner_demon") { }
|
||||
public:
|
||||
npc_inner_demon() : CreatureScript("npc_inner_demon") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new npc_inner_demonAI(creature);
|
||||
}
|
||||
|
||||
struct npc_inner_demonAI : public ScriptedAI
|
||||
{
|
||||
npc_inner_demonAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
return new npc_inner_demonAI(creature);
|
||||
}
|
||||
|
||||
struct npc_inner_demonAI : public ScriptedAI
|
||||
uint64 ownerGUID;
|
||||
EventMap events;
|
||||
|
||||
void EnterEvadeMode()
|
||||
{
|
||||
npc_inner_demonAI(Creature* creature) : ScriptedAI(creature)
|
||||
me->DespawnOrUnsummon(1);
|
||||
}
|
||||
|
||||
void IsSummonedBy(Unit* summoner)
|
||||
{
|
||||
if (!summoner)
|
||||
return;
|
||||
|
||||
ownerGUID = summoner->GetGUID();
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_SPELL_SHADOW_BOLT, 4000);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
if (Unit* unit = ObjectAccessor::GetUnit(*me, ownerGUID))
|
||||
unit->RemoveAurasDueToSpell(SPELL_INSIDIOUS_WHISPER);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* who, uint32& damage, DamageEffectType, SpellSchoolMask)
|
||||
{
|
||||
if (!who || who->GetGUID() != ownerGUID)
|
||||
damage = 0;
|
||||
}
|
||||
|
||||
bool CanAIAttack(const Unit* who) const
|
||||
{
|
||||
return who->GetGUID() == ownerGUID;
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPELL_SHADOW_BOLT:
|
||||
me->CastSpell(me->GetVictim(), SPELL_SHADOW_BOLT, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_SHADOW_BOLT, 6000);
|
||||
break;
|
||||
}
|
||||
|
||||
uint64 ownerGUID;
|
||||
EventMap events;
|
||||
|
||||
void EnterEvadeMode()
|
||||
{
|
||||
me->DespawnOrUnsummon(1);
|
||||
}
|
||||
|
||||
void IsSummonedBy(Unit* summoner)
|
||||
{
|
||||
if (!summoner)
|
||||
return;
|
||||
|
||||
ownerGUID = summoner->GetGUID();
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_SPELL_SHADOW_BOLT, 4000);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
if (Unit* unit = ObjectAccessor::GetUnit(*me, ownerGUID))
|
||||
unit->RemoveAurasDueToSpell(SPELL_INSIDIOUS_WHISPER);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* who, uint32& damage, DamageEffectType, SpellSchoolMask)
|
||||
{
|
||||
if (!who || who->GetGUID() != ownerGUID)
|
||||
damage = 0;
|
||||
}
|
||||
|
||||
bool CanAIAttack(const Unit* who) const
|
||||
{
|
||||
return who->GetGUID() == ownerGUID;
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPELL_SHADOW_BOLT:
|
||||
me->CastSpell(me->GetVictim(), SPELL_SHADOW_BOLT, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_SHADOW_BOLT, 6000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
class spell_leotheras_whirlwind : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_leotheras_whirlwind() : SpellScriptLoader("spell_leotheras_whirlwind") { }
|
||||
public:
|
||||
spell_leotheras_whirlwind() : SpellScriptLoader("spell_leotheras_whirlwind") { }
|
||||
|
||||
class spell_leotheras_whirlwind_SpellScript : public SpellScript
|
||||
class spell_leotheras_whirlwind_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_leotheras_whirlwind_SpellScript);
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex effIndex)
|
||||
{
|
||||
PrepareSpellScript(spell_leotheras_whirlwind_SpellScript);
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
GetCaster()->getThreatManager().resetAllAggro();
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex effIndex)
|
||||
{
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
GetCaster()->getThreatManager().resetAllAggro();
|
||||
if (roll_chance_i(33))
|
||||
if (Unit* target = GetCaster()->GetAI()->SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true))
|
||||
target->CastSpell(GetCaster(), SPELL_TAUNT, true);
|
||||
|
||||
if (roll_chance_i(33))
|
||||
if (Unit* target = GetCaster()->GetAI()->SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true))
|
||||
target->CastSpell(GetCaster(), SPELL_TAUNT, true);
|
||||
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_leotheras_whirlwind_SpellScript::HandleScriptEffect, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_leotheras_whirlwind_SpellScript();
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_leotheras_whirlwind_SpellScript::HandleScriptEffect, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_leotheras_whirlwind_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_leotheras_chaos_blast : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_leotheras_chaos_blast() : SpellScriptLoader("spell_leotheras_chaos_blast") { }
|
||||
public:
|
||||
spell_leotheras_chaos_blast() : SpellScriptLoader("spell_leotheras_chaos_blast") { }
|
||||
|
||||
class spell_leotheras_chaos_blast_SpellScript : public SpellScript
|
||||
class spell_leotheras_chaos_blast_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_leotheras_chaos_blast_SpellScript);
|
||||
|
||||
void HandleDummy(SpellEffIndex effIndex)
|
||||
{
|
||||
PrepareSpellScript(spell_leotheras_chaos_blast_SpellScript);
|
||||
|
||||
void HandleDummy(SpellEffIndex effIndex)
|
||||
{
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
if (Unit* target = GetHitUnit())
|
||||
GetCaster()->CastSpell(target, SPELL_CHAOS_BLAST_TRIGGER, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_leotheras_chaos_blast_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_leotheras_chaos_blast_SpellScript();
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
if (Unit* target = GetHitUnit())
|
||||
GetCaster()->CastSpell(target, SPELL_CHAOS_BLAST_TRIGGER, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_leotheras_chaos_blast_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_leotheras_chaos_blast_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_leotheras_insidious_whisper : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_leotheras_insidious_whisper() : SpellScriptLoader("spell_leotheras_insidious_whisper") { }
|
||||
public:
|
||||
spell_leotheras_insidious_whisper() : SpellScriptLoader("spell_leotheras_insidious_whisper") { }
|
||||
|
||||
class spell_leotheras_insidious_whisper_SpellScript : public SpellScript
|
||||
class spell_leotheras_insidious_whisper_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_leotheras_insidious_whisper_SpellScript);
|
||||
|
||||
void FilterTargets(std::list<WorldObject*>& unitList)
|
||||
{
|
||||
PrepareSpellScript(spell_leotheras_insidious_whisper_SpellScript);
|
||||
|
||||
void FilterTargets(std::list<WorldObject*>& unitList)
|
||||
{
|
||||
if (Unit* victim = GetCaster()->GetVictim())
|
||||
unitList.remove_if(acore::ObjectGUIDCheck(victim->GetGUID(), true));
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_leotheras_insidious_whisper_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_leotheras_insidious_whisper_SpellScript();
|
||||
if (Unit* victim = GetCaster()->GetVictim())
|
||||
unitList.remove_if(acore::ObjectGUIDCheck(victim->GetGUID(), true));
|
||||
}
|
||||
|
||||
class spell_leotheras_insidious_whisper_AuraScript : public AuraScript
|
||||
void Register()
|
||||
{
|
||||
PrepareAuraScript(spell_leotheras_insidious_whisper_AuraScript)
|
||||
|
||||
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_INNER_DEMON, true);
|
||||
}
|
||||
|
||||
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEFAULT)
|
||||
if (InstanceScript* instance = GetUnitOwner()->GetInstanceScript())
|
||||
if (Creature* leotheras = ObjectAccessor::GetCreature(*GetUnitOwner(), instance->GetData64(NPC_LEOTHERAS_THE_BLIND)))
|
||||
leotheras->CastSpell(GetUnitOwner(), SPELL_CONSUMING_MADNESS, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
AfterEffectApply += AuraEffectApplyFn(spell_leotheras_insidious_whisper_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
AfterEffectRemove += AuraEffectRemoveFn(spell_leotheras_insidious_whisper_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_leotheras_insidious_whisper_AuraScript();
|
||||
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_leotheras_insidious_whisper_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_leotheras_insidious_whisper_SpellScript();
|
||||
}
|
||||
|
||||
class spell_leotheras_insidious_whisper_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_leotheras_insidious_whisper_AuraScript)
|
||||
|
||||
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_INNER_DEMON, true);
|
||||
}
|
||||
|
||||
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEFAULT)
|
||||
if (InstanceScript* instance = GetUnitOwner()->GetInstanceScript())
|
||||
if (Creature* leotheras = ObjectAccessor::GetCreature(*GetUnitOwner(), instance->GetData64(NPC_LEOTHERAS_THE_BLIND)))
|
||||
leotheras->CastSpell(GetUnitOwner(), SPELL_CONSUMING_MADNESS, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
AfterEffectApply += AuraEffectApplyFn(spell_leotheras_insidious_whisper_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
AfterEffectRemove += AuraEffectRemoveFn(spell_leotheras_insidious_whisper_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_leotheras_insidious_whisper_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_leotheras_demon_link : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_leotheras_demon_link() : SpellScriptLoader("spell_leotheras_demon_link") { }
|
||||
public:
|
||||
spell_leotheras_demon_link() : SpellScriptLoader("spell_leotheras_demon_link") { }
|
||||
|
||||
class spell_leotheras_demon_link_AuraScript : public AuraScript
|
||||
class spell_leotheras_demon_link_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_leotheras_demon_link_AuraScript);
|
||||
|
||||
void OnPeriodic(AuraEffect const* aurEff)
|
||||
{
|
||||
PrepareAuraScript(spell_leotheras_demon_link_AuraScript);
|
||||
|
||||
void OnPeriodic(AuraEffect const* aurEff)
|
||||
{
|
||||
PreventDefaultAction();
|
||||
if (Unit* victim = GetUnitOwner()->GetVictim())
|
||||
GetUnitOwner()->CastSpell(victim, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_leotheras_demon_link_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_leotheras_demon_link_AuraScript();
|
||||
PreventDefaultAction();
|
||||
if (Unit* victim = GetUnitOwner()->GetVictim())
|
||||
GetUnitOwner()->CastSpell(victim, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_leotheras_demon_link_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_leotheras_demon_link_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_leotheras_clear_consuming_madness : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_leotheras_clear_consuming_madness() : SpellScriptLoader("spell_leotheras_clear_consuming_madness") { }
|
||||
public:
|
||||
spell_leotheras_clear_consuming_madness() : SpellScriptLoader("spell_leotheras_clear_consuming_madness") { }
|
||||
|
||||
class spell_leotheras_clear_consuming_madness_SpellScript : public SpellScript
|
||||
class spell_leotheras_clear_consuming_madness_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_leotheras_clear_consuming_madness_SpellScript);
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex effIndex)
|
||||
{
|
||||
PrepareSpellScript(spell_leotheras_clear_consuming_madness_SpellScript);
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex effIndex)
|
||||
{
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
if (Unit* target = GetHitUnit())
|
||||
Unit::Kill(GetCaster(), target);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_leotheras_clear_consuming_madness_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_leotheras_clear_consuming_madness_SpellScript();
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
if (Unit* target = GetHitUnit())
|
||||
Unit::Kill(GetCaster(), target);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_leotheras_clear_consuming_madness_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_leotheras_clear_consuming_madness_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_leotheras_the_blind()
|
||||
|
||||
@@ -48,257 +48,257 @@ const Position positions[MAX_SUMMONS] =
|
||||
|
||||
class boss_the_lurker_below : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_the_lurker_below() : CreatureScript("boss_the_lurker_below") { }
|
||||
public:
|
||||
boss_the_lurker_below() : CreatureScript("boss_the_lurker_below") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_the_lurker_belowAI>(creature);
|
||||
}
|
||||
|
||||
struct boss_the_lurker_belowAI : public BossAI
|
||||
{
|
||||
boss_the_lurker_belowAI(Creature* creature) : BossAI(creature, DATA_THE_LURKER_BELOW) { }
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
return GetInstanceAI<boss_the_lurker_belowAI>(creature);
|
||||
BossAI::Reset();
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->SetStandState(UNIT_STAND_STATE_SUBMERGED);
|
||||
me->SetVisible(false);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
|
||||
// Reset summons
|
||||
summons.DespawnAll();
|
||||
}
|
||||
|
||||
struct boss_the_lurker_belowAI : public BossAI
|
||||
void JustSummoned(Creature* summon) override
|
||||
{
|
||||
boss_the_lurker_belowAI(Creature* creature) : BossAI(creature, DATA_THE_LURKER_BELOW) { }
|
||||
summon->SetInCombatWithZone();
|
||||
summons.Summon(summon);
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
void DoAction(int32 param) override
|
||||
{
|
||||
if (param == ACTION_START_EVENT)
|
||||
{
|
||||
BossAI::Reset();
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->SetStandState(UNIT_STAND_STATE_SUBMERGED);
|
||||
me->SetVisible(false);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
|
||||
// Reset summons
|
||||
summons.DespawnAll();
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->setAttackTimer(BASE_ATTACK, 6000);
|
||||
me->SetVisible(true);
|
||||
me->UpdateObjectVisibility(true);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
me->SetInCombatWithZone();
|
||||
}
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon) override
|
||||
{
|
||||
summon->SetInCombatWithZone();
|
||||
summons.Summon(summon);
|
||||
}
|
||||
void JustDied(Unit* killer) override
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
}
|
||||
|
||||
void DoAction(int32 param) override
|
||||
void AttackStart(Unit* who) override
|
||||
{
|
||||
if (who && me->GetReactState() == REACT_AGGRESSIVE)
|
||||
me->Attack(who, true);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
{
|
||||
events.ScheduleEvent(EVENT_SPELL_WHIRL, 18000);
|
||||
events.ScheduleEvent(EVENT_SPELL_SPOUT, 45000);
|
||||
events.ScheduleEvent(EVENT_SPELL_GEYSER, 10000);
|
||||
events.ScheduleEvent(EVENT_PHASE_2, 125000);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
if (param == ACTION_START_EVENT)
|
||||
{
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
case EVENT_SPELL_WHIRL:
|
||||
me->CastSpell(me, SPELL_WHIRL, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_WHIRL, 18000);
|
||||
break;
|
||||
case EVENT_SPELL_GEYSER:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
me->CastSpell(target, SPELL_GEYSER, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_GEYSER, 10000);
|
||||
break;
|
||||
case EVENT_SPELL_SPOUT:
|
||||
Talk(EMOTE_TAKE_BREATH);
|
||||
me->CastSpell(me, SPELL_SPOUT_VISUAL, TRIGGERED_IGNORE_SET_FACING);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->SetFacingToObject(me->GetVictim());
|
||||
me->SetTarget(0);
|
||||
events.ScheduleEvent(EVENT_SPELL_SPOUT, 60000);
|
||||
events.RescheduleEvent(EVENT_SPELL_WHIRL, 18000);
|
||||
events.RescheduleEvent(EVENT_SPELL_GEYSER, 25000);
|
||||
events.ScheduleEvent(EVENT_SPELL_SPOUT_PERIODIC, 3000);
|
||||
break;
|
||||
case EVENT_SPELL_SPOUT_PERIODIC:
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
me->CastSpell(me, SPELL_SPOUT_PERIODIC, true);
|
||||
break;
|
||||
case EVENT_PHASE_2:
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_PHASE_1, 60000);
|
||||
me->SetStandState(UNIT_STAND_STATE_SUBMERGED);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
for (uint8 i = 0; i < MAX_SUMMONS; ++i)
|
||||
me->SummonCreature(i < 6 ? NPC_COILFANG_AMBUSHER : NPC_COILFANG_GUARDIAN, positions[i].GetPositionX(), positions[i].GetPositionY(), positions[i].GetPositionZ(), positions[i].GetAngle(me), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
|
||||
break;
|
||||
case EVENT_PHASE_1:
|
||||
me->setAttackTimer(BASE_ATTACK, 6000);
|
||||
me->SetVisible(true);
|
||||
me->UpdateObjectVisibility(true);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
me->SetInCombatWithZone();
|
||||
}
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_SPELL_SPOUT, 10000);
|
||||
events.ScheduleEvent(EVENT_PHASE_2, 120000);
|
||||
break;
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer) override
|
||||
if (me->getStandState() != UNIT_STAND_STATE_STAND || !me->isAttackReady() || me->GetReactState() != REACT_AGGRESSIVE)
|
||||
return;
|
||||
|
||||
Unit* target = nullptr;
|
||||
if (me->IsWithinMeleeRange(me->GetVictim()))
|
||||
target = me->GetVictim();
|
||||
else
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
ThreatContainer::StorageType const& t_list = me->getThreatManager().getThreatList();
|
||||
for (ThreatContainer::StorageType::const_iterator itr = t_list.begin(); itr != t_list.end(); ++itr)
|
||||
if (Unit* threatTarget = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid()))
|
||||
if (me->IsWithinMeleeRange(threatTarget))
|
||||
{
|
||||
target = threatTarget;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void AttackStart(Unit* who) override
|
||||
{
|
||||
if (who && me->GetReactState() == REACT_AGGRESSIVE)
|
||||
me->Attack(who, true);
|
||||
}
|
||||
if (target)
|
||||
me->AttackerStateUpdate(target);
|
||||
else if ((target = SelectTarget(SELECT_TARGET_RANDOM, 0)))
|
||||
me->CastSpell(target, SPELL_WATER_BOLT, false);
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
{
|
||||
events.ScheduleEvent(EVENT_SPELL_WHIRL, 18000);
|
||||
events.ScheduleEvent(EVENT_SPELL_SPOUT, 45000);
|
||||
events.ScheduleEvent(EVENT_SPELL_GEYSER, 10000);
|
||||
events.ScheduleEvent(EVENT_PHASE_2, 125000);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPELL_WHIRL:
|
||||
me->CastSpell(me, SPELL_WHIRL, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_WHIRL, 18000);
|
||||
break;
|
||||
case EVENT_SPELL_GEYSER:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
me->CastSpell(target, SPELL_GEYSER, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_GEYSER, 10000);
|
||||
break;
|
||||
case EVENT_SPELL_SPOUT:
|
||||
Talk(EMOTE_TAKE_BREATH);
|
||||
me->CastSpell(me, SPELL_SPOUT_VISUAL, TRIGGERED_IGNORE_SET_FACING);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->SetFacingToObject(me->GetVictim());
|
||||
me->SetTarget(0);
|
||||
events.ScheduleEvent(EVENT_SPELL_SPOUT, 60000);
|
||||
events.RescheduleEvent(EVENT_SPELL_WHIRL, 18000);
|
||||
events.RescheduleEvent(EVENT_SPELL_GEYSER, 25000);
|
||||
events.ScheduleEvent(EVENT_SPELL_SPOUT_PERIODIC, 3000);
|
||||
break;
|
||||
case EVENT_SPELL_SPOUT_PERIODIC:
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
me->CastSpell(me, SPELL_SPOUT_PERIODIC, true);
|
||||
break;
|
||||
case EVENT_PHASE_2:
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_PHASE_1, 60000);
|
||||
me->SetStandState(UNIT_STAND_STATE_SUBMERGED);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
for (uint8 i = 0; i < MAX_SUMMONS; ++i)
|
||||
me->SummonCreature(i < 6 ? NPC_COILFANG_AMBUSHER : NPC_COILFANG_GUARDIAN, positions[i].GetPositionX(), positions[i].GetPositionY(), positions[i].GetPositionZ(), positions[i].GetAngle(me), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
|
||||
break;
|
||||
case EVENT_PHASE_1:
|
||||
me->setAttackTimer(BASE_ATTACK, 6000);
|
||||
me->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_SPELL_SPOUT, 10000);
|
||||
events.ScheduleEvent(EVENT_PHASE_2, 120000);
|
||||
break;
|
||||
}
|
||||
|
||||
if (me->getStandState() != UNIT_STAND_STATE_STAND || !me->isAttackReady() || me->GetReactState() != REACT_AGGRESSIVE)
|
||||
return;
|
||||
|
||||
Unit* target = nullptr;
|
||||
if (me->IsWithinMeleeRange(me->GetVictim()))
|
||||
target = me->GetVictim();
|
||||
else
|
||||
{
|
||||
ThreatContainer::StorageType const &t_list = me->getThreatManager().getThreatList();
|
||||
for (ThreatContainer::StorageType::const_iterator itr = t_list.begin(); itr!= t_list.end(); ++itr)
|
||||
if (Unit* threatTarget = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid()))
|
||||
if (me->IsWithinMeleeRange(threatTarget))
|
||||
{
|
||||
target = threatTarget;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (target)
|
||||
me->AttackerStateUpdate(target);
|
||||
else if ((target = SelectTarget(SELECT_TARGET_RANDOM, 0)))
|
||||
me->CastSpell(target, SPELL_WATER_BOLT, false);
|
||||
|
||||
me->resetAttackTimer();
|
||||
}
|
||||
};
|
||||
me->resetAttackTimer();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
class go_strange_pool : public GameObjectScript
|
||||
{
|
||||
public:
|
||||
go_strange_pool() : GameObjectScript("go_strange_pool") { }
|
||||
public:
|
||||
go_strange_pool() : GameObjectScript("go_strange_pool") { }
|
||||
|
||||
bool OnGossipHello(Player* player, GameObject* go) override
|
||||
{
|
||||
if (InstanceScript* instance = go->GetInstanceScript())
|
||||
if (roll_chance_i(instance->GetBossState(DATA_THE_LURKER_BELOW) != DONE ? 25 : 0) && !instance->IsEncounterInProgress())
|
||||
{
|
||||
player->CastSpell(player, SPELL_LURKER_SPAWN_TRIGGER, true);
|
||||
if (Creature* lurker = ObjectAccessor::GetCreature(*go, instance->GetData64(NPC_THE_LURKER_BELOW)))
|
||||
lurker->AI()->DoAction(ACTION_START_EVENT);
|
||||
return true;
|
||||
}
|
||||
bool OnGossipHello(Player* player, GameObject* go) override
|
||||
{
|
||||
if (InstanceScript* instance = go->GetInstanceScript())
|
||||
if (roll_chance_i(instance->GetBossState(DATA_THE_LURKER_BELOW) != DONE ? 25 : 0) && !instance->IsEncounterInProgress())
|
||||
{
|
||||
player->CastSpell(player, SPELL_LURKER_SPAWN_TRIGGER, true);
|
||||
if (Creature* lurker = ObjectAccessor::GetCreature(*go, instance->GetData64(NPC_THE_LURKER_BELOW)))
|
||||
lurker->AI()->DoAction(ACTION_START_EVENT);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
class spell_lurker_below_spout : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_lurker_below_spout() : SpellScriptLoader("spell_lurker_below_spout") { }
|
||||
public:
|
||||
spell_lurker_below_spout() : SpellScriptLoader("spell_lurker_below_spout") { }
|
||||
|
||||
class spell_lurker_below_spout_AuraScript : public AuraScript
|
||||
class spell_lurker_below_spout_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_lurker_below_spout_AuraScript);
|
||||
|
||||
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
PrepareAuraScript(spell_lurker_below_spout_AuraScript);
|
||||
|
||||
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
SetDuration(13000);
|
||||
}
|
||||
|
||||
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
if (Creature* creature = GetUnitOwner()->ToCreature())
|
||||
{
|
||||
creature->resetAttackTimer();
|
||||
creature->SetReactState(REACT_AGGRESSIVE);
|
||||
if (Unit* target = creature->GetVictim())
|
||||
creature->SetTarget(target->GetGUID());
|
||||
}
|
||||
}
|
||||
|
||||
void OnPeriodic(AuraEffect const* aurEff)
|
||||
{
|
||||
PreventDefaultAction();
|
||||
GetUnitOwner()->SetFacingTo(Position::NormalizeOrientation(GetUnitOwner()->GetOrientation()+0.1f));
|
||||
GetUnitOwner()->CastSpell(GetUnitOwner(), aurEff->GetAmount(), true);
|
||||
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectApply += AuraEffectApplyFn(spell_lurker_below_spout_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
|
||||
OnEffectRemove += AuraEffectRemoveFn(spell_lurker_below_spout_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_lurker_below_spout_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_lurker_below_spout_AuraScript();
|
||||
SetDuration(13000);
|
||||
}
|
||||
|
||||
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
if (Creature* creature = GetUnitOwner()->ToCreature())
|
||||
{
|
||||
creature->resetAttackTimer();
|
||||
creature->SetReactState(REACT_AGGRESSIVE);
|
||||
if (Unit* target = creature->GetVictim())
|
||||
creature->SetTarget(target->GetGUID());
|
||||
}
|
||||
}
|
||||
|
||||
void OnPeriodic(AuraEffect const* aurEff)
|
||||
{
|
||||
PreventDefaultAction();
|
||||
GetUnitOwner()->SetFacingTo(Position::NormalizeOrientation(GetUnitOwner()->GetOrientation() + 0.1f));
|
||||
GetUnitOwner()->CastSpell(GetUnitOwner(), aurEff->GetAmount(), true);
|
||||
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectApply += AuraEffectApplyFn(spell_lurker_below_spout_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
|
||||
OnEffectRemove += AuraEffectRemoveFn(spell_lurker_below_spout_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_lurker_below_spout_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_lurker_below_spout_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
class HasInLineCheck
|
||||
{
|
||||
public:
|
||||
HasInLineCheck(Unit* caster) : _caster(caster) { }
|
||||
public:
|
||||
HasInLineCheck(Unit* caster) : _caster(caster) { }
|
||||
|
||||
bool operator()(WorldObject* unit)
|
||||
{
|
||||
return !_caster->HasInLine(unit, 5.0f) || (unit->GetTypeId() == TYPEID_UNIT && unit->ToUnit()->IsUnderWater());
|
||||
}
|
||||
bool operator()(WorldObject* unit)
|
||||
{
|
||||
return !_caster->HasInLine(unit, 5.0f) || (unit->GetTypeId() == TYPEID_UNIT && unit->ToUnit()->IsUnderWater());
|
||||
}
|
||||
|
||||
private:
|
||||
Unit* _caster;
|
||||
private:
|
||||
Unit* _caster;
|
||||
};
|
||||
|
||||
class spell_lurker_below_spout_cone : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_lurker_below_spout_cone() : SpellScriptLoader("spell_lurker_below_spout_cone") { }
|
||||
public:
|
||||
spell_lurker_below_spout_cone() : SpellScriptLoader("spell_lurker_below_spout_cone") { }
|
||||
|
||||
class spell_lurker_below_spout_cone_SpellScript : public SpellScript
|
||||
class spell_lurker_below_spout_cone_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_lurker_below_spout_cone_SpellScript);
|
||||
|
||||
void FilterTargets(std::list<WorldObject*>& targets)
|
||||
{
|
||||
PrepareSpellScript(spell_lurker_below_spout_cone_SpellScript);
|
||||
|
||||
void FilterTargets(std::list<WorldObject*>& targets)
|
||||
{
|
||||
targets.remove_if(HasInLineCheck(GetCaster()));
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_lurker_below_spout_cone_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_CONE_ENEMY_24);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_lurker_below_spout_cone_SpellScript();
|
||||
targets.remove_if(HasInLineCheck(GetCaster()));
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_lurker_below_spout_cone_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_CONE_ENEMY_24);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_lurker_below_spout_cone_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_the_lurker_below()
|
||||
|
||||
@@ -53,181 +53,181 @@ const uint32 waterGlobuleId[4] = {SPELL_SUMMON_WATER_GLOBULE_1, SPELL_SUMMON_WAT
|
||||
|
||||
class boss_morogrim_tidewalker : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_morogrim_tidewalker() : CreatureScript("boss_morogrim_tidewalker") { }
|
||||
public:
|
||||
boss_morogrim_tidewalker() : CreatureScript("boss_morogrim_tidewalker") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_morogrim_tidewalkerAI>(creature);
|
||||
}
|
||||
|
||||
struct boss_morogrim_tidewalkerAI : public BossAI
|
||||
{
|
||||
boss_morogrim_tidewalkerAI(Creature* creature) : BossAI(creature, DATA_MOROGRIM_TIDEWALKER)
|
||||
{
|
||||
return GetInstanceAI<boss_morogrim_tidewalkerAI>(creature);
|
||||
}
|
||||
|
||||
struct boss_morogrim_tidewalkerAI : public BossAI
|
||||
void Reset()
|
||||
{
|
||||
boss_morogrim_tidewalkerAI(Creature* creature) : BossAI(creature, DATA_MOROGRIM_TIDEWALKER)
|
||||
BossAI::Reset();
|
||||
}
|
||||
|
||||
void KilledUnit(Unit*)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(SAY_SLAY);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
}
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
summon->SetInCombatWithZone();
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
BossAI::JustDied(killer);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
events.ScheduleEvent(EVENT_SPELL_TIDAL_WAVE, 10000);
|
||||
events.ScheduleEvent(EVENT_SPELL_WATERY_GRAVE, 28000);
|
||||
events.ScheduleEvent(EVENT_SPELL_EARTHQUAKE, 40000);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPELL_TIDAL_WAVE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_TIDAL_WAVE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_TIDAL_WAVE, 20000);
|
||||
break;
|
||||
case EVENT_SPELL_WATERY_GRAVE:
|
||||
Talk(SAY_SUMMON_BUBLE);
|
||||
if (me->HealthAbovePct(25))
|
||||
{
|
||||
Talk(EMOTE_WATERY_GRAVE);
|
||||
me->CastCustomSpell(SPELL_WATERY_GRAVE, SPELLVALUE_MAX_TARGETS, 4, me, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
Talk(EMOTE_WATERY_GLOBULES);
|
||||
for (uint8 i = 0; i < 4; ++i)
|
||||
me->CastSpell(me, waterGlobuleId[i], true);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_SPELL_WATERY_GRAVE, 25000);
|
||||
break;
|
||||
case EVENT_SPELL_EARTHQUAKE:
|
||||
Talk(EMOTE_EARTHQUAKE);
|
||||
me->CastSpell(me, SPELL_EARTHQUAKE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_EARTHQUAKE, urand(45000, 60000));
|
||||
events.ScheduleEvent(EVENT_SUMMON_MURLOCS, 8000);
|
||||
break;
|
||||
case EVENT_SUMMON_MURLOCS:
|
||||
Talk(SAY_SUMMON);
|
||||
for (uint32 i = SPELL_SUMMON_MURLOC1; i < SPELL_SUMMON_MURLOC1 + 11; ++i)
|
||||
me->CastSpell(me, i, true);
|
||||
break;
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
}
|
||||
|
||||
void KilledUnit(Unit*)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(SAY_SLAY);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
}
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
summon->SetInCombatWithZone();
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
BossAI::JustDied(killer);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
events.ScheduleEvent(EVENT_SPELL_TIDAL_WAVE, 10000);
|
||||
events.ScheduleEvent(EVENT_SPELL_WATERY_GRAVE, 28000);
|
||||
events.ScheduleEvent(EVENT_SPELL_EARTHQUAKE, 40000);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPELL_TIDAL_WAVE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_TIDAL_WAVE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_TIDAL_WAVE, 20000);
|
||||
break;
|
||||
case EVENT_SPELL_WATERY_GRAVE:
|
||||
Talk(SAY_SUMMON_BUBLE);
|
||||
if (me->HealthAbovePct(25))
|
||||
{
|
||||
Talk(EMOTE_WATERY_GRAVE);
|
||||
me->CastCustomSpell(SPELL_WATERY_GRAVE, SPELLVALUE_MAX_TARGETS, 4, me, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
Talk(EMOTE_WATERY_GLOBULES);
|
||||
for (uint8 i = 0; i < 4; ++i)
|
||||
me->CastSpell(me, waterGlobuleId[i], true);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_SPELL_WATERY_GRAVE, 25000);
|
||||
break;
|
||||
case EVENT_SPELL_EARTHQUAKE:
|
||||
Talk(EMOTE_EARTHQUAKE);
|
||||
me->CastSpell(me, SPELL_EARTHQUAKE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_EARTHQUAKE, urand(45000, 60000));
|
||||
events.ScheduleEvent(EVENT_SUMMON_MURLOCS, 8000);
|
||||
break;
|
||||
case EVENT_SUMMON_MURLOCS:
|
||||
Talk(SAY_SUMMON);
|
||||
for (uint32 i = SPELL_SUMMON_MURLOC1; i < SPELL_SUMMON_MURLOC1+11; ++i)
|
||||
me->CastSpell(me, i, true);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
class spell_morogrim_tidewalker_watery_grave : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_morogrim_tidewalker_watery_grave() : SpellScriptLoader("spell_morogrim_tidewalker_watery_grave") { }
|
||||
public:
|
||||
spell_morogrim_tidewalker_watery_grave() : SpellScriptLoader("spell_morogrim_tidewalker_watery_grave") { }
|
||||
|
||||
class spell_morogrim_tidewalker_watery_grave_SpellScript : public SpellScript
|
||||
class spell_morogrim_tidewalker_watery_grave_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_morogrim_tidewalker_watery_grave_SpellScript);
|
||||
|
||||
bool Load()
|
||||
{
|
||||
PrepareSpellScript(spell_morogrim_tidewalker_watery_grave_SpellScript);
|
||||
|
||||
bool Load()
|
||||
{
|
||||
targetNumber = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
void HandleDummy(SpellEffIndex effIndex)
|
||||
{
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
if (Unit* target = GetHitUnit())
|
||||
if (targetNumber < 4)
|
||||
GetCaster()->CastSpell(target, wateryGraveId[targetNumber++], true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_morogrim_tidewalker_watery_grave_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
|
||||
private:
|
||||
uint8 targetNumber;
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_morogrim_tidewalker_watery_grave_SpellScript();
|
||||
targetNumber = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
void HandleDummy(SpellEffIndex effIndex)
|
||||
{
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
if (Unit* target = GetHitUnit())
|
||||
if (targetNumber < 4)
|
||||
GetCaster()->CastSpell(target, wateryGraveId[targetNumber++], true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_morogrim_tidewalker_watery_grave_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
|
||||
private:
|
||||
uint8 targetNumber;
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_morogrim_tidewalker_watery_grave_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_morogrim_tidewalker_water_globule_new_target : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_morogrim_tidewalker_water_globule_new_target() : SpellScriptLoader("spell_morogrim_tidewalker_water_globule_new_target") { }
|
||||
public:
|
||||
spell_morogrim_tidewalker_water_globule_new_target() : SpellScriptLoader("spell_morogrim_tidewalker_water_globule_new_target") { }
|
||||
|
||||
class spell_morogrim_tidewalker_water_globule_new_target_SpellScript : public SpellScript
|
||||
class spell_morogrim_tidewalker_water_globule_new_target_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_morogrim_tidewalker_water_globule_new_target_SpellScript);
|
||||
|
||||
void FilterTargets(std::list<WorldObject*>& unitList)
|
||||
{
|
||||
PrepareSpellScript(spell_morogrim_tidewalker_water_globule_new_target_SpellScript);
|
||||
|
||||
void FilterTargets(std::list<WorldObject*>& unitList)
|
||||
{
|
||||
acore::Containers::RandomResizeList(unitList, 1);
|
||||
}
|
||||
|
||||
void HandleDummy(SpellEffIndex effIndex)
|
||||
{
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
|
||||
// Xinef: if we have target we currently follow, return
|
||||
if (Unit* target = GetCaster()->GetVictim())
|
||||
if (GetCaster()->getThreatManager().getThreat(target) >= 100000.0f)
|
||||
return;
|
||||
|
||||
// Xinef: acquire new target
|
||||
if (Unit* target = GetHitUnit())
|
||||
GetCaster()->AddThreat(target, 1000000.0f);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_morogrim_tidewalker_water_globule_new_target_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
|
||||
OnEffectHitTarget += SpellEffectFn(spell_morogrim_tidewalker_water_globule_new_target_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_morogrim_tidewalker_water_globule_new_target_SpellScript();
|
||||
acore::Containers::RandomResizeList(unitList, 1);
|
||||
}
|
||||
|
||||
void HandleDummy(SpellEffIndex effIndex)
|
||||
{
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
|
||||
// Xinef: if we have target we currently follow, return
|
||||
if (Unit* target = GetCaster()->GetVictim())
|
||||
if (GetCaster()->getThreatManager().getThreat(target) >= 100000.0f)
|
||||
return;
|
||||
|
||||
// Xinef: acquire new target
|
||||
if (Unit* target = GetHitUnit())
|
||||
GetCaster()->AddThreat(target, 1000000.0f);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_morogrim_tidewalker_water_globule_new_target_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
|
||||
OnEffectHitTarget += SpellEffectFn(spell_morogrim_tidewalker_water_globule_new_target_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_morogrim_tidewalker_water_globule_new_target_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_morogrim_tidewalker()
|
||||
|
||||
@@ -18,381 +18,381 @@ DoorData const doorData[] =
|
||||
|
||||
class instance_serpent_shrine : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
instance_serpent_shrine() : InstanceMapScript("instance_serpent_shrine", 548) { }
|
||||
public:
|
||||
instance_serpent_shrine() : InstanceMapScript("instance_serpent_shrine", 548) { }
|
||||
|
||||
struct instance_serpentshrine_cavern_InstanceMapScript : public InstanceScript
|
||||
struct instance_serpentshrine_cavern_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_serpentshrine_cavern_InstanceMapScript(Map* map) : InstanceScript(map)
|
||||
{
|
||||
instance_serpentshrine_cavern_InstanceMapScript(Map* map) : InstanceScript(map)
|
||||
{
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
SetBossNumber(MAX_ENCOUNTERS);
|
||||
LoadDoorData(doorData);
|
||||
|
||||
LadyVashjGUID = 0;
|
||||
memset(&ShieldGeneratorGUID, 0, sizeof(ShieldGeneratorGUID));
|
||||
AliveKeepersCount = 0;
|
||||
LeotherasTheBlindGUID = 0;
|
||||
LurkerBelowGUID = 0;
|
||||
}
|
||||
|
||||
bool SetBossState(uint32 type, EncounterState state)
|
||||
{
|
||||
if (!InstanceScript::SetBossState(type, state))
|
||||
return false;
|
||||
|
||||
if (type == DATA_LADY_VASHJ)
|
||||
for (uint8 i = 0; i < 4; ++i)
|
||||
if (GameObject* gobject = instance->GetGameObject(ShieldGeneratorGUID[i]))
|
||||
gobject->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* go)
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_LADY_VASHJ_BRIDGE_CONSOLE:
|
||||
case GO_COILFANG_BRIDGE1:
|
||||
case GO_COILFANG_BRIDGE2:
|
||||
case GO_COILFANG_BRIDGE3:
|
||||
AddDoor(go, true);
|
||||
break;
|
||||
case GO_SHIELD_GENERATOR1:
|
||||
case GO_SHIELD_GENERATOR2:
|
||||
case GO_SHIELD_GENERATOR3:
|
||||
case GO_SHIELD_GENERATOR4:
|
||||
ShieldGeneratorGUID[go->GetEntry()-GO_SHIELD_GENERATOR1] = go->GetGUID();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectRemove(GameObject* go)
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_LADY_VASHJ_BRIDGE_CONSOLE:
|
||||
case GO_COILFANG_BRIDGE1:
|
||||
case GO_COILFANG_BRIDGE2:
|
||||
case GO_COILFANG_BRIDGE3:
|
||||
AddDoor(go, false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case NPC_COILFANG_SHATTERER:
|
||||
case NPC_COILFANG_PRIESTESS:
|
||||
if (creature->GetPositionX() > -110.0f && creature->GetPositionX() < 155.0f && creature->GetPositionY() > -610.0f && creature->GetPositionY() < -280.0f)
|
||||
AliveKeepersCount += creature->IsAlive() ? 0 : -1; // retarded SmartAI calls JUST_RESPAWNED in AIInit...
|
||||
break;
|
||||
case NPC_THE_LURKER_BELOW:
|
||||
LurkerBelowGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_LEOTHERAS_THE_BLIND:
|
||||
LeotherasTheBlindGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_CYCLONE_KARATHRESS:
|
||||
creature->GetMotionMaster()->MoveRandom(50.0f);
|
||||
break;
|
||||
case NPC_LADY_VASHJ:
|
||||
LadyVashjGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_ENCHANTED_ELEMENTAL:
|
||||
case NPC_COILFANG_ELITE:
|
||||
case NPC_COILFANG_STRIDER:
|
||||
case NPC_TAINTED_ELEMENTAL:
|
||||
if (Creature* vashj = instance->GetCreature(LadyVashjGUID))
|
||||
vashj->AI()->JustSummoned(creature);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
uint64 GetData64(uint32 identifier) const
|
||||
{
|
||||
switch (identifier)
|
||||
{
|
||||
case NPC_THE_LURKER_BELOW:
|
||||
return LurkerBelowGUID;
|
||||
case NPC_LEOTHERAS_THE_BLIND:
|
||||
return LeotherasTheBlindGUID;
|
||||
case NPC_LADY_VASHJ:
|
||||
return LadyVashjGUID;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 /*data*/)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case DATA_PLATFORM_KEEPER_RESPAWNED:
|
||||
++AliveKeepersCount;
|
||||
break;
|
||||
case DATA_PLATFORM_KEEPER_DIED:
|
||||
--AliveKeepersCount;
|
||||
break;
|
||||
case DATA_BRIDGE_ACTIVATED:
|
||||
SetBossState(DATA_BRIDGE_EMERGED, NOT_STARTED);
|
||||
SetBossState(DATA_BRIDGE_EMERGED, DONE);
|
||||
break;
|
||||
case DATA_ACTIVATE_SHIELD:
|
||||
if (Creature* vashj = instance->GetCreature(LadyVashjGUID))
|
||||
for (uint8 i = 0; i < 4; ++i)
|
||||
if (GameObject* gobject = instance->GetGameObject(ShieldGeneratorGUID[i]))
|
||||
{
|
||||
gobject->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
vashj->SummonTrigger(gobject->GetPositionX(), gobject->GetPositionY(), gobject->GetPositionZ(), 0.0f, 0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 type) const
|
||||
{
|
||||
if (type == DATA_ALIVE_KEEPERS)
|
||||
return AliveKeepersCount;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "S C " << GetBossSaveData();
|
||||
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void Load(char const* str)
|
||||
{
|
||||
if (!str)
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA(str);
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
|
||||
std::istringstream loadStream(str);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
|
||||
if (dataHead1 == 'S' && dataHead2 == 'C')
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
|
||||
{
|
||||
uint32 tmpState;
|
||||
loadStream >> tmpState;
|
||||
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
|
||||
tmpState = NOT_STARTED;
|
||||
SetBossState(i, EncounterState(tmpState));
|
||||
}
|
||||
}
|
||||
else
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
}
|
||||
|
||||
private:
|
||||
uint64 LadyVashjGUID;
|
||||
uint64 ShieldGeneratorGUID[4];
|
||||
uint64 LurkerBelowGUID;
|
||||
uint64 LeotherasTheBlindGUID;
|
||||
int32 AliveKeepersCount;
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_serpentshrine_cavern_InstanceMapScript(map);
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
SetBossNumber(MAX_ENCOUNTERS);
|
||||
LoadDoorData(doorData);
|
||||
|
||||
LadyVashjGUID = 0;
|
||||
memset(&ShieldGeneratorGUID, 0, sizeof(ShieldGeneratorGUID));
|
||||
AliveKeepersCount = 0;
|
||||
LeotherasTheBlindGUID = 0;
|
||||
LurkerBelowGUID = 0;
|
||||
}
|
||||
|
||||
bool SetBossState(uint32 type, EncounterState state)
|
||||
{
|
||||
if (!InstanceScript::SetBossState(type, state))
|
||||
return false;
|
||||
|
||||
if (type == DATA_LADY_VASHJ)
|
||||
for (uint8 i = 0; i < 4; ++i)
|
||||
if (GameObject* gobject = instance->GetGameObject(ShieldGeneratorGUID[i]))
|
||||
gobject->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* go)
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_LADY_VASHJ_BRIDGE_CONSOLE:
|
||||
case GO_COILFANG_BRIDGE1:
|
||||
case GO_COILFANG_BRIDGE2:
|
||||
case GO_COILFANG_BRIDGE3:
|
||||
AddDoor(go, true);
|
||||
break;
|
||||
case GO_SHIELD_GENERATOR1:
|
||||
case GO_SHIELD_GENERATOR2:
|
||||
case GO_SHIELD_GENERATOR3:
|
||||
case GO_SHIELD_GENERATOR4:
|
||||
ShieldGeneratorGUID[go->GetEntry() - GO_SHIELD_GENERATOR1] = go->GetGUID();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectRemove(GameObject* go)
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_LADY_VASHJ_BRIDGE_CONSOLE:
|
||||
case GO_COILFANG_BRIDGE1:
|
||||
case GO_COILFANG_BRIDGE2:
|
||||
case GO_COILFANG_BRIDGE3:
|
||||
AddDoor(go, false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case NPC_COILFANG_SHATTERER:
|
||||
case NPC_COILFANG_PRIESTESS:
|
||||
if (creature->GetPositionX() > -110.0f && creature->GetPositionX() < 155.0f && creature->GetPositionY() > -610.0f && creature->GetPositionY() < -280.0f)
|
||||
AliveKeepersCount += creature->IsAlive() ? 0 : -1; // retarded SmartAI calls JUST_RESPAWNED in AIInit...
|
||||
break;
|
||||
case NPC_THE_LURKER_BELOW:
|
||||
LurkerBelowGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_LEOTHERAS_THE_BLIND:
|
||||
LeotherasTheBlindGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_CYCLONE_KARATHRESS:
|
||||
creature->GetMotionMaster()->MoveRandom(50.0f);
|
||||
break;
|
||||
case NPC_LADY_VASHJ:
|
||||
LadyVashjGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_ENCHANTED_ELEMENTAL:
|
||||
case NPC_COILFANG_ELITE:
|
||||
case NPC_COILFANG_STRIDER:
|
||||
case NPC_TAINTED_ELEMENTAL:
|
||||
if (Creature* vashj = instance->GetCreature(LadyVashjGUID))
|
||||
vashj->AI()->JustSummoned(creature);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
uint64 GetData64(uint32 identifier) const
|
||||
{
|
||||
switch (identifier)
|
||||
{
|
||||
case NPC_THE_LURKER_BELOW:
|
||||
return LurkerBelowGUID;
|
||||
case NPC_LEOTHERAS_THE_BLIND:
|
||||
return LeotherasTheBlindGUID;
|
||||
case NPC_LADY_VASHJ:
|
||||
return LadyVashjGUID;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 /*data*/)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case DATA_PLATFORM_KEEPER_RESPAWNED:
|
||||
++AliveKeepersCount;
|
||||
break;
|
||||
case DATA_PLATFORM_KEEPER_DIED:
|
||||
--AliveKeepersCount;
|
||||
break;
|
||||
case DATA_BRIDGE_ACTIVATED:
|
||||
SetBossState(DATA_BRIDGE_EMERGED, NOT_STARTED);
|
||||
SetBossState(DATA_BRIDGE_EMERGED, DONE);
|
||||
break;
|
||||
case DATA_ACTIVATE_SHIELD:
|
||||
if (Creature* vashj = instance->GetCreature(LadyVashjGUID))
|
||||
for (uint8 i = 0; i < 4; ++i)
|
||||
if (GameObject* gobject = instance->GetGameObject(ShieldGeneratorGUID[i]))
|
||||
{
|
||||
gobject->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
vashj->SummonTrigger(gobject->GetPositionX(), gobject->GetPositionY(), gobject->GetPositionZ(), 0.0f, 0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 type) const
|
||||
{
|
||||
if (type == DATA_ALIVE_KEEPERS)
|
||||
return AliveKeepersCount;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "S C " << GetBossSaveData();
|
||||
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void Load(char const* str)
|
||||
{
|
||||
if (!str)
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA(str);
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
|
||||
std::istringstream loadStream(str);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
|
||||
if (dataHead1 == 'S' && dataHead2 == 'C')
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
|
||||
{
|
||||
uint32 tmpState;
|
||||
loadStream >> tmpState;
|
||||
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
|
||||
tmpState = NOT_STARTED;
|
||||
SetBossState(i, EncounterState(tmpState));
|
||||
}
|
||||
}
|
||||
else
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
}
|
||||
|
||||
private:
|
||||
uint64 LadyVashjGUID;
|
||||
uint64 ShieldGeneratorGUID[4];
|
||||
uint64 LurkerBelowGUID;
|
||||
uint64 LeotherasTheBlindGUID;
|
||||
int32 AliveKeepersCount;
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_serpentshrine_cavern_InstanceMapScript(map);
|
||||
}
|
||||
};
|
||||
|
||||
class spell_serpentshrine_cavern_serpentshrine_parasite : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_serpentshrine_cavern_serpentshrine_parasite() : SpellScriptLoader("spell_serpentshrine_cavern_serpentshrine_parasite") { }
|
||||
public:
|
||||
spell_serpentshrine_cavern_serpentshrine_parasite() : SpellScriptLoader("spell_serpentshrine_cavern_serpentshrine_parasite") { }
|
||||
|
||||
class spell_serpentshrine_cavern_serpentshrine_parasite_AuraScript : public AuraScript
|
||||
class spell_serpentshrine_cavern_serpentshrine_parasite_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_serpentshrine_cavern_serpentshrine_parasite_AuraScript)
|
||||
|
||||
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
PrepareAuraScript(spell_serpentshrine_cavern_serpentshrine_parasite_AuraScript)
|
||||
|
||||
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
if (GetTarget()->GetInstanceScript() && GetTarget()->GetInstanceScript()->IsEncounterInProgress())
|
||||
GetTarget()->CastSpell(GetTarget(), SPELL_SUMMON_SERPENTSHRINE_PARASITE, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
AfterEffectRemove += AuraEffectRemoveFn(spell_serpentshrine_cavern_serpentshrine_parasite_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_serpentshrine_cavern_serpentshrine_parasite_AuraScript();
|
||||
if (GetTarget()->GetInstanceScript() && GetTarget()->GetInstanceScript()->IsEncounterInProgress())
|
||||
GetTarget()->CastSpell(GetTarget(), SPELL_SUMMON_SERPENTSHRINE_PARASITE, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
AfterEffectRemove += AuraEffectRemoveFn(spell_serpentshrine_cavern_serpentshrine_parasite_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_serpentshrine_cavern_serpentshrine_parasite_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_serpentshrine_cavern_serpentshrine_parasite_trigger : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_serpentshrine_cavern_serpentshrine_parasite_trigger() : SpellScriptLoader("spell_serpentshrine_cavern_serpentshrine_parasite_trigger") { }
|
||||
public:
|
||||
spell_serpentshrine_cavern_serpentshrine_parasite_trigger() : SpellScriptLoader("spell_serpentshrine_cavern_serpentshrine_parasite_trigger") { }
|
||||
|
||||
class spell_serpentshrine_cavern_serpentshrine_parasite_trigger_AuraScript : public AuraScript
|
||||
class spell_serpentshrine_cavern_serpentshrine_parasite_trigger_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_serpentshrine_cavern_serpentshrine_parasite_trigger_AuraScript)
|
||||
|
||||
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
PrepareAuraScript(spell_serpentshrine_cavern_serpentshrine_parasite_trigger_AuraScript)
|
||||
|
||||
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
if (GetTarget()->GetInstanceScript() && GetTarget()->GetInstanceScript()->IsEncounterInProgress())
|
||||
GetTarget()->CastSpell(GetTarget(), SPELL_SUMMON_SERPENTSHRINE_PARASITE, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
AfterEffectRemove += AuraEffectRemoveFn(spell_serpentshrine_cavern_serpentshrine_parasite_trigger_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_serpentshrine_cavern_serpentshrine_parasite_trigger_AuraScript();
|
||||
if (GetTarget()->GetInstanceScript() && GetTarget()->GetInstanceScript()->IsEncounterInProgress())
|
||||
GetTarget()->CastSpell(GetTarget(), SPELL_SUMMON_SERPENTSHRINE_PARASITE, true);
|
||||
}
|
||||
|
||||
class spell_serpentshrine_cavern_serpentshrine_parasite_trigger_SpellScript : public SpellScript
|
||||
void Register()
|
||||
{
|
||||
PrepareSpellScript(spell_serpentshrine_cavern_serpentshrine_parasite_trigger_SpellScript);
|
||||
|
||||
void HandleApplyAura(SpellEffIndex effIndex)
|
||||
{
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
if (Creature* target = GetHitCreature())
|
||||
target->DespawnOrUnsummon(1);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_serpentshrine_cavern_serpentshrine_parasite_trigger_SpellScript::HandleApplyAura, EFFECT_0, SPELL_EFFECT_APPLY_AURA);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_serpentshrine_cavern_serpentshrine_parasite_trigger_SpellScript();
|
||||
AfterEffectRemove += AuraEffectRemoveFn(spell_serpentshrine_cavern_serpentshrine_parasite_trigger_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_serpentshrine_cavern_serpentshrine_parasite_trigger_AuraScript();
|
||||
}
|
||||
|
||||
class spell_serpentshrine_cavern_serpentshrine_parasite_trigger_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_serpentshrine_cavern_serpentshrine_parasite_trigger_SpellScript);
|
||||
|
||||
void HandleApplyAura(SpellEffIndex effIndex)
|
||||
{
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
if (Creature* target = GetHitCreature())
|
||||
target->DespawnOrUnsummon(1);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_serpentshrine_cavern_serpentshrine_parasite_trigger_SpellScript::HandleApplyAura, EFFECT_0, SPELL_EFFECT_APPLY_AURA);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_serpentshrine_cavern_serpentshrine_parasite_trigger_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_serpentshrine_cavern_infection : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_serpentshrine_cavern_infection() : SpellScriptLoader("spell_serpentshrine_cavern_infection") { }
|
||||
public:
|
||||
spell_serpentshrine_cavern_infection() : SpellScriptLoader("spell_serpentshrine_cavern_infection") { }
|
||||
|
||||
class spell_serpentshrine_cavern_infection_AuraScript : public AuraScript
|
||||
class spell_serpentshrine_cavern_infection_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_serpentshrine_cavern_infection_AuraScript)
|
||||
|
||||
void HandleEffectRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
PrepareAuraScript(spell_serpentshrine_cavern_infection_AuraScript)
|
||||
|
||||
void HandleEffectRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
|
||||
if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE && GetTarget()->GetInstanceScript())
|
||||
{
|
||||
if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE && GetTarget()->GetInstanceScript())
|
||||
{
|
||||
CustomSpellValues values;
|
||||
values.AddSpellMod(SPELLVALUE_MAX_TARGETS, 1);
|
||||
values.AddSpellMod(SPELLVALUE_BASE_POINT0, aurEff->GetAmount()+500);
|
||||
values.AddSpellMod(SPELLVALUE_BASE_POINT1, aurEff->GetAmount()+500);
|
||||
GetTarget()->CastCustomSpell(SPELL_RAMPART_INFECTION, values, GetTarget(), TRIGGERED_FULL_MASK, nullptr);
|
||||
}
|
||||
CustomSpellValues values;
|
||||
values.AddSpellMod(SPELLVALUE_MAX_TARGETS, 1);
|
||||
values.AddSpellMod(SPELLVALUE_BASE_POINT0, aurEff->GetAmount() + 500);
|
||||
values.AddSpellMod(SPELLVALUE_BASE_POINT1, aurEff->GetAmount() + 500);
|
||||
GetTarget()->CastCustomSpell(SPELL_RAMPART_INFECTION, values, GetTarget(), TRIGGERED_FULL_MASK, nullptr);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
AfterEffectRemove += AuraEffectRemoveFn(spell_serpentshrine_cavern_infection_AuraScript::HandleEffectRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_serpentshrine_cavern_infection_AuraScript();
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
AfterEffectRemove += AuraEffectRemoveFn(spell_serpentshrine_cavern_infection_AuraScript::HandleEffectRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_serpentshrine_cavern_infection_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_serpentshrine_cavern_coilfang_water : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_serpentshrine_cavern_coilfang_water() : SpellScriptLoader("spell_serpentshrine_cavern_coilfang_water") { }
|
||||
public:
|
||||
spell_serpentshrine_cavern_coilfang_water() : SpellScriptLoader("spell_serpentshrine_cavern_coilfang_water") { }
|
||||
|
||||
class spell_serpentshrine_cavern_coilfang_water_AuraScript : public AuraScript
|
||||
class spell_serpentshrine_cavern_coilfang_water_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_serpentshrine_cavern_coilfang_water_AuraScript)
|
||||
|
||||
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
PrepareAuraScript(spell_serpentshrine_cavern_coilfang_water_AuraScript)
|
||||
|
||||
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
if (InstanceScript* instance = GetUnitOwner()->GetInstanceScript())
|
||||
if (instance->GetBossState(DATA_THE_LURKER_BELOW) != DONE)
|
||||
if (instance->GetData(DATA_ALIVE_KEEPERS) == 0)
|
||||
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SCALDING_WATER, true);
|
||||
}
|
||||
|
||||
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
GetUnitOwner()->RemoveAurasDueToSpell(SPELL_SCALDING_WATER);
|
||||
}
|
||||
|
||||
void CalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude)
|
||||
{
|
||||
InstanceScript* instance = GetUnitOwner()->GetInstanceScript();
|
||||
if (!instance || instance->GetBossState(DATA_THE_LURKER_BELOW) == DONE)
|
||||
return;
|
||||
|
||||
isPeriodic = true;
|
||||
amplitude = 8*IN_MILLISECONDS;
|
||||
}
|
||||
|
||||
|
||||
void HandlePeriodic(AuraEffect const* /*aurEff*/)
|
||||
{
|
||||
PreventDefaultAction();
|
||||
InstanceScript* instance = GetUnitOwner()->GetInstanceScript();
|
||||
if (!instance || GetUnitOwner()->GetMapId() != 548)
|
||||
{
|
||||
SetDuration(0);
|
||||
return;
|
||||
}
|
||||
|
||||
if (instance->GetBossState(DATA_THE_LURKER_BELOW) == DONE || instance->GetData(DATA_ALIVE_KEEPERS) == 0 || GetUnitOwner()->GetPositionZ() > -20.5f || !GetUnitOwner()->IsInWater())
|
||||
return;
|
||||
|
||||
for (uint8 i = 0; i < 3; ++i)
|
||||
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_FRENZY_WATER, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
AfterEffectApply += AuraEffectApplyFn(spell_serpentshrine_cavern_coilfang_water_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
AfterEffectRemove += AuraEffectRemoveFn(spell_serpentshrine_cavern_coilfang_water_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
|
||||
DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_serpentshrine_cavern_coilfang_water_AuraScript::CalcPeriodic, EFFECT_0, SPELL_AURA_DUMMY);
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_serpentshrine_cavern_coilfang_water_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_serpentshrine_cavern_coilfang_water_AuraScript();
|
||||
if (InstanceScript* instance = GetUnitOwner()->GetInstanceScript())
|
||||
if (instance->GetBossState(DATA_THE_LURKER_BELOW) != DONE)
|
||||
if (instance->GetData(DATA_ALIVE_KEEPERS) == 0)
|
||||
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SCALDING_WATER, true);
|
||||
}
|
||||
|
||||
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
GetUnitOwner()->RemoveAurasDueToSpell(SPELL_SCALDING_WATER);
|
||||
}
|
||||
|
||||
void CalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude)
|
||||
{
|
||||
InstanceScript* instance = GetUnitOwner()->GetInstanceScript();
|
||||
if (!instance || instance->GetBossState(DATA_THE_LURKER_BELOW) == DONE)
|
||||
return;
|
||||
|
||||
isPeriodic = true;
|
||||
amplitude = 8 * IN_MILLISECONDS;
|
||||
}
|
||||
|
||||
|
||||
void HandlePeriodic(AuraEffect const* /*aurEff*/)
|
||||
{
|
||||
PreventDefaultAction();
|
||||
InstanceScript* instance = GetUnitOwner()->GetInstanceScript();
|
||||
if (!instance || GetUnitOwner()->GetMapId() != 548)
|
||||
{
|
||||
SetDuration(0);
|
||||
return;
|
||||
}
|
||||
|
||||
if (instance->GetBossState(DATA_THE_LURKER_BELOW) == DONE || instance->GetData(DATA_ALIVE_KEEPERS) == 0 || GetUnitOwner()->GetPositionZ() > -20.5f || !GetUnitOwner()->IsInWater())
|
||||
return;
|
||||
|
||||
for (uint8 i = 0; i < 3; ++i)
|
||||
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_FRENZY_WATER, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
AfterEffectApply += AuraEffectApplyFn(spell_serpentshrine_cavern_coilfang_water_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
AfterEffectRemove += AuraEffectRemoveFn(spell_serpentshrine_cavern_coilfang_water_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
|
||||
DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_serpentshrine_cavern_coilfang_water_AuraScript::CalcPeriodic, EFFECT_0, SPELL_AURA_DUMMY);
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_serpentshrine_cavern_coilfang_water_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_serpentshrine_cavern_coilfang_water_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_instance_serpentshrine_cavern()
|
||||
|
||||
@@ -41,7 +41,7 @@ enum SSNPCs
|
||||
|
||||
NPC_COILFANG_SHATTERER = 21301,
|
||||
NPC_COILFANG_PRIESTESS = 21220,
|
||||
|
||||
|
||||
NPC_ENCHANTED_ELEMENTAL = 21958,
|
||||
NPC_COILFANG_ELITE = 22055,
|
||||
NPC_COILFANG_STRIDER = 22056,
|
||||
|
||||
@@ -17,9 +17,9 @@
|
||||
#define TEXT_RETREAT "Ahune Retreats. His defenses diminish."
|
||||
#define TEXT_RESURFACE "Ahune will soon resurface."
|
||||
|
||||
const Position AhuneSummonPos = {-97.3473f, -233.139f, -1.27587f, M_PI/2};
|
||||
const Position AhuneSummonPos = {-97.3473f, -233.139f, -1.27587f, M_PI / 2};
|
||||
const Position TotemPos[3] = { {-115.141f, -143.317f, -2.09467f, 4.92772f}, {-120.178f, -144.398f, -2.23786f, 4.92379f}, {-125.277f, -145.463f, -1.95209f, 4.97877f} };
|
||||
const Position MinionSummonPos = {-97.154404f, -204.382675f, -1.19f, M_PI/2};
|
||||
const Position MinionSummonPos = {-97.154404f, -204.382675f, -1.19f, M_PI / 2};
|
||||
|
||||
enum NPCs
|
||||
{
|
||||
@@ -86,7 +86,7 @@ public:
|
||||
|
||||
struct boss_ahuneAI : public ScriptedAI
|
||||
{
|
||||
boss_ahuneAI(Creature *c) : ScriptedAI(c), summons(me)
|
||||
boss_ahuneAI(Creature* c) : ScriptedAI(c), summons(me)
|
||||
{
|
||||
SetCombatMovement(false);
|
||||
SetEquipmentSlots(false, 54806, EQUIP_UNEQUIP, EQUIP_UNEQUIP);
|
||||
@@ -139,8 +139,8 @@ public:
|
||||
events.RescheduleEvent(EVENT_ATTACK, 2000);
|
||||
break;
|
||||
case EVENT_SUMMON_TOTEMS:
|
||||
for (uint8 i=0; i<3; ++i)
|
||||
DoSummon(NPC_TOTEM, TotemPos[i], 10*60*1000, TEMPSUMMON_TIMED_DESPAWN);
|
||||
for (uint8 i = 0; i < 3; ++i)
|
||||
DoSummon(NPC_TOTEM, TotemPos[i], 10 * 60 * 1000, TEMPSUMMON_TIMED_DESPAWN);
|
||||
events.PopEvent();
|
||||
break;
|
||||
case EVENT_INVOKER_SAY_1:
|
||||
@@ -177,8 +177,8 @@ public:
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
break;
|
||||
case EVENT_TOTEMS_ATTACK:
|
||||
for (uint8 i=0; i<3; ++i)
|
||||
if (Creature* bunny = me->FindNearestCreature(NPC_TOTEM_BUNNY_1+i, 150.0f, true))
|
||||
for (uint8 i = 0; i < 3; ++i)
|
||||
if (Creature* bunny = me->FindNearestCreature(NPC_TOTEM_BUNNY_1 + i, 150.0f, true))
|
||||
bunny->CastSpell(me, SPELL_TOTEM_BEAM, false);
|
||||
events.PopEvent();
|
||||
events.RescheduleEvent(EVENT_SUBMERGE, 10000);
|
||||
@@ -212,35 +212,35 @@ public:
|
||||
|
||||
case EVENT_SPELL_COLD_SLAP:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_NEAREST, 0, 5.0f, true))
|
||||
if (target->GetPositionZ() < me->GetPositionZ()+6.0f)
|
||||
if (target->GetPositionZ() < me->GetPositionZ() + 6.0f)
|
||||
{
|
||||
int32 dmg = urand(5500,6000);
|
||||
int32 dmg = urand(5500, 6000);
|
||||
me->CastCustomSpell(target, SPELL_COLD_SLAP, &dmg, nullptr, nullptr, false);
|
||||
float x, y, z;
|
||||
target->GetNearPoint(target, x, y, z, target->GetObjectSize(), 30.0f, target->GetAngle(me->GetPositionX(), me->GetPositionY()) + M_PI);
|
||||
target->GetMotionMaster()->MoveJump(x, y, z+20.0f, 10.0f, 20.0f);
|
||||
target->GetMotionMaster()->MoveJump(x, y, z + 20.0f, 10.0f, 20.0f);
|
||||
}
|
||||
events.RepeatEvent(1500);
|
||||
break;
|
||||
case EVENT_SPELL_SUMMON_HAILSTONE:
|
||||
{
|
||||
float dist = (float)urand(3,10);
|
||||
float angle = rand_norm()*2*M_PI;
|
||||
me->CastSpell(MinionSummonPos.GetPositionX()+cos(angle)*dist, MinionSummonPos.GetPositionY()+sin(angle)*dist, MinionSummonPos.GetPositionZ(), SPELL_SUMMON_HAILSTONE, false);
|
||||
float dist = (float)urand(3, 10);
|
||||
float angle = rand_norm() * 2 * M_PI;
|
||||
me->CastSpell(MinionSummonPos.GetPositionX() + cos(angle)*dist, MinionSummonPos.GetPositionY() + sin(angle)*dist, MinionSummonPos.GetPositionZ(), SPELL_SUMMON_HAILSTONE, false);
|
||||
events.RepeatEvent(30000);
|
||||
}
|
||||
break;
|
||||
case EVENT_SPELL_SUMMON_COLDWAVE:
|
||||
for (uint8 i=0; i<2; ++i)
|
||||
for (uint8 i = 0; i < 2; ++i)
|
||||
{
|
||||
float dist = (float)urand(3,10);
|
||||
float angle = rand_norm()*2*M_PI;
|
||||
me->CastSpell(MinionSummonPos.GetPositionX()+cos(angle)*dist, MinionSummonPos.GetPositionY()+sin(angle)*dist, MinionSummonPos.GetPositionZ(), SPELL_SUMMON_COLDWAVE, false);
|
||||
float dist = (float)urand(3, 10);
|
||||
float angle = rand_norm() * 2 * M_PI;
|
||||
me->CastSpell(MinionSummonPos.GetPositionX() + cos(angle)*dist, MinionSummonPos.GetPositionY() + sin(angle)*dist, MinionSummonPos.GetPositionZ(), SPELL_SUMMON_COLDWAVE, false);
|
||||
}
|
||||
{
|
||||
float dist = (float)urand(3,10);
|
||||
float angle = rand_norm()*2*M_PI;
|
||||
me->CastSpell(MinionSummonPos.GetPositionX()+cos(angle)*dist, MinionSummonPos.GetPositionY()+sin(angle)*dist, MinionSummonPos.GetPositionZ(), SPELL_SUMMON_FROSTWIND, false);
|
||||
float dist = (float)urand(3, 10);
|
||||
float angle = rand_norm() * 2 * M_PI;
|
||||
me->CastSpell(MinionSummonPos.GetPositionX() + cos(angle)*dist, MinionSummonPos.GetPositionY() + sin(angle)*dist, MinionSummonPos.GetPositionZ(), SPELL_SUMMON_FROSTWIND, false);
|
||||
}
|
||||
events.RepeatEvent(6000);
|
||||
break;
|
||||
@@ -292,7 +292,7 @@ public:
|
||||
{
|
||||
summons.DespawnAll();
|
||||
me->DespawnOrUnsummon(15000);
|
||||
if (GameObject* chest = me->SummonGameObject(187892, MinionSummonPos.GetPositionX(), MinionSummonPos.GetPositionY(), MinionSummonPos.GetPositionZ(), M_PI/2, 0.0f, 0.0f, 0.0f, 0.0f, 900000000)) // loot
|
||||
if (GameObject* chest = me->SummonGameObject(187892, MinionSummonPos.GetPositionX(), MinionSummonPos.GetPositionY(), MinionSummonPos.GetPositionZ(), M_PI / 2, 0.0f, 0.0f, 0.0f, 0.0f, 900000000)) // loot
|
||||
me->RemoveGameObject(chest, false);
|
||||
|
||||
bool finished = false;
|
||||
@@ -302,7 +302,7 @@ public:
|
||||
if (Player* player = i->GetSource())
|
||||
{
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, 25740, 1, me);
|
||||
|
||||
|
||||
if (player->GetGroup() && !finished)
|
||||
{
|
||||
finished = true;
|
||||
@@ -314,9 +314,9 @@ public:
|
||||
};
|
||||
|
||||
class go_ahune_ice_stone : public GameObjectScript
|
||||
{
|
||||
public:
|
||||
go_ahune_ice_stone() : GameObjectScript("go_ahune_ice_stone") { }
|
||||
{
|
||||
public:
|
||||
go_ahune_ice_stone() : GameObjectScript("go_ahune_ice_stone") { }
|
||||
|
||||
bool OnGossipHello(Player* player, GameObject* go) override
|
||||
{
|
||||
@@ -327,7 +327,7 @@ public:
|
||||
if (go->FindNearestCreature(NPC_AHUNE, 200.0f, true))
|
||||
return true;
|
||||
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Disturb the stone and summon Lord Ahune.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1337);
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Disturb the stone and summon Lord Ahune.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1337);
|
||||
SendGossipMenuFor(player, GOSSIP_TEXT_ID, go->GetGUID());
|
||||
return true;
|
||||
}
|
||||
@@ -336,7 +336,7 @@ public:
|
||||
{
|
||||
if (!player || !go)
|
||||
return true;
|
||||
if (action != GOSSIP_ACTION_INFO_DEF+1337)
|
||||
if (action != GOSSIP_ACTION_INFO_DEF + 1337)
|
||||
return true;
|
||||
if (!player->HasItemCount(ITEM_MAGMA_TOTEM))
|
||||
return true;
|
||||
@@ -374,7 +374,7 @@ public:
|
||||
|
||||
struct npc_ahune_frozen_coreAI : public NullCreatureAI
|
||||
{
|
||||
npc_ahune_frozen_coreAI(Creature *c) : NullCreatureAI(c) {}
|
||||
npc_ahune_frozen_coreAI(Creature* c) : NullCreatureAI(c) {}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
|
||||
@@ -39,7 +39,7 @@ public:
|
||||
{
|
||||
counter = DATA_FLAMECALLER_000;
|
||||
}
|
||||
|
||||
|
||||
void Load(char const* /*data*/) override { LoadBossState(DataHeader); }
|
||||
|
||||
void OnCreatureCreate(Creature* creature) override
|
||||
|
||||
@@ -89,7 +89,7 @@ public:
|
||||
break;
|
||||
case EVENT_SPELL_LUNG:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
DoCast(target, SPELL_LUNG_BURST);
|
||||
DoCast(target, SPELL_LUNG_BURST);
|
||||
events.RepeatEvent(urand(7000, 12000));
|
||||
break;
|
||||
case EVENT_SPELL_ENVELOPING:
|
||||
|
||||
@@ -27,7 +27,7 @@ enum MekgineerSteamrigger
|
||||
EVENT_SPELL_SHRINK = 4,
|
||||
EVENT_SPELL_SAW = 5,
|
||||
EVENT_SPELL_NET = 6
|
||||
|
||||
|
||||
};
|
||||
|
||||
class boss_mekgineer_steamrigger : public CreatureScript
|
||||
@@ -88,11 +88,11 @@ public:
|
||||
{
|
||||
Talk(SAY_MECHANICS);
|
||||
|
||||
me->SummonCreature(NPC_STREAMRIGGER_MECHANIC, me->GetPositionX()+15.0f, me->GetPositionY()+15.0f, me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
|
||||
me->SummonCreature(NPC_STREAMRIGGER_MECHANIC, me->GetPositionX()-15.0f, me->GetPositionY()+15.0f, me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
|
||||
me->SummonCreature(NPC_STREAMRIGGER_MECHANIC, me->GetPositionX()-15.0f, me->GetPositionY()-15.0f, me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
|
||||
if (urand(0,1))
|
||||
me->SummonCreature(NPC_STREAMRIGGER_MECHANIC, me->GetPositionX()+15.0f, me->GetPositionY()-15.0f, me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
|
||||
me->SummonCreature(NPC_STREAMRIGGER_MECHANIC, me->GetPositionX() + 15.0f, me->GetPositionY() + 15.0f, me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
|
||||
me->SummonCreature(NPC_STREAMRIGGER_MECHANIC, me->GetPositionX() - 15.0f, me->GetPositionY() + 15.0f, me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
|
||||
me->SummonCreature(NPC_STREAMRIGGER_MECHANIC, me->GetPositionX() - 15.0f, me->GetPositionY() - 15.0f, me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
|
||||
if (urand(0, 1))
|
||||
me->SummonCreature(NPC_STREAMRIGGER_MECHANIC, me->GetPositionX() + 15.0f, me->GetPositionY() - 15.0f, me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* cr)
|
||||
@@ -127,7 +127,7 @@ public:
|
||||
case EVENT_CHECK_HP25:
|
||||
case EVENT_CHECK_HP50:
|
||||
case EVENT_CHECK_HP75:
|
||||
if (me->HealthBelowPct(eventId*25))
|
||||
if (me->HealthBelowPct(eventId * 25))
|
||||
{
|
||||
SummonMechanics();
|
||||
events.PopEvent();
|
||||
|
||||
@@ -38,172 +38,174 @@ public:
|
||||
|
||||
class instance_steam_vault : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
instance_steam_vault() : InstanceMapScript("instance_steam_vault", 545) { }
|
||||
public:
|
||||
instance_steam_vault() : InstanceMapScript("instance_steam_vault", 545) { }
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_steam_vault_InstanceMapScript(map);
|
||||
}
|
||||
|
||||
struct instance_steam_vault_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_steam_vault_InstanceMapScript(Map* map) : InstanceScript(map) {}
|
||||
|
||||
uint32 m_auiEncounter[MAX_ENCOUNTER];
|
||||
|
||||
uint64 MekgineerGUID;
|
||||
uint64 MainChambersDoor;
|
||||
uint64 AccessPanelHydro;
|
||||
uint64 AccessPanelMek;
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
return new instance_steam_vault_InstanceMapScript(map);
|
||||
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
|
||||
|
||||
MekgineerGUID = 0;
|
||||
MainChambersDoor = 0;
|
||||
AccessPanelHydro = 0;
|
||||
AccessPanelMek = 0;
|
||||
}
|
||||
|
||||
struct instance_steam_vault_InstanceMapScript : public InstanceScript
|
||||
bool IsEncounterInProgress() const
|
||||
{
|
||||
instance_steam_vault_InstanceMapScript(Map* map) : InstanceScript(map) {}
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
if (m_auiEncounter[i] == IN_PROGRESS)
|
||||
return true;
|
||||
|
||||
uint32 m_auiEncounter[MAX_ENCOUNTER];
|
||||
return false;
|
||||
}
|
||||
|
||||
uint64 MekgineerGUID;
|
||||
uint64 MainChambersDoor;
|
||||
uint64 AccessPanelHydro;
|
||||
uint64 AccessPanelMek;
|
||||
|
||||
void Initialize()
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
|
||||
|
||||
MekgineerGUID = 0;
|
||||
MainChambersDoor = 0;
|
||||
AccessPanelHydro = 0;
|
||||
AccessPanelMek = 0;
|
||||
case NPC_MEKGINEER_STEAMRIGGER:
|
||||
MekgineerGUID = creature->GetGUID();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool IsEncounterInProgress() const
|
||||
void OnGameObjectCreate(GameObject* go)
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
if (m_auiEncounter[i] == IN_PROGRESS)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
case GO_MAIN_CHAMBERS_DOOR:
|
||||
MainChambersDoor = go->GetGUID();
|
||||
if (GetData(TYPE_HYDROMANCER_THESPIA) == SPECIAL && GetData(TYPE_MEKGINEER_STEAMRIGGER) == SPECIAL)
|
||||
HandleGameObject(0, true, go);
|
||||
break;
|
||||
case GO_ACCESS_PANEL_HYDRO:
|
||||
AccessPanelHydro = go->GetGUID();
|
||||
if (GetData(TYPE_HYDROMANCER_THESPIA) == DONE)
|
||||
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
else if (GetData(TYPE_HYDROMANCER_THESPIA) == SPECIAL)
|
||||
HandleGameObject(0, true, go);
|
||||
break;
|
||||
case GO_ACCESS_PANEL_MEK:
|
||||
AccessPanelMek = go->GetGUID();
|
||||
if (GetData(TYPE_MEKGINEER_STEAMRIGGER) == DONE)
|
||||
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
else if (GetData(TYPE_MEKGINEER_STEAMRIGGER) == SPECIAL)
|
||||
HandleGameObject(0, true, go);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
void SetData(uint32 type, uint32 data)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case NPC_MEKGINEER_STEAMRIGGER: MekgineerGUID = creature->GetGUID(); break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* go)
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_MAIN_CHAMBERS_DOOR:
|
||||
MainChambersDoor = go->GetGUID();
|
||||
if (GetData(TYPE_HYDROMANCER_THESPIA) == SPECIAL && GetData(TYPE_MEKGINEER_STEAMRIGGER) == SPECIAL)
|
||||
HandleGameObject(0, true, go);
|
||||
break;
|
||||
case GO_ACCESS_PANEL_HYDRO:
|
||||
AccessPanelHydro = go->GetGUID();
|
||||
if (GetData(TYPE_HYDROMANCER_THESPIA) == DONE)
|
||||
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
else if (GetData(TYPE_HYDROMANCER_THESPIA) == SPECIAL)
|
||||
HandleGameObject(0, true, go);
|
||||
break;
|
||||
case GO_ACCESS_PANEL_MEK:
|
||||
AccessPanelMek = go->GetGUID();
|
||||
if (GetData(TYPE_MEKGINEER_STEAMRIGGER) == DONE)
|
||||
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
else if (GetData(TYPE_MEKGINEER_STEAMRIGGER) == SPECIAL)
|
||||
HandleGameObject(0, true, go);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 data)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case TYPE_HYDROMANCER_THESPIA:
|
||||
if (data == SPECIAL)
|
||||
{
|
||||
if (GetData(TYPE_MEKGINEER_STEAMRIGGER) == SPECIAL)
|
||||
HandleGameObject(MainChambersDoor, true);
|
||||
}
|
||||
else if (data == DONE)
|
||||
{
|
||||
if (GameObject* panel = instance->GetGameObject(AccessPanelHydro))
|
||||
panel->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
|
||||
m_auiEncounter[type] = data;
|
||||
break;
|
||||
case TYPE_MEKGINEER_STEAMRIGGER:
|
||||
if (data == SPECIAL)
|
||||
{
|
||||
if (GetData(TYPE_HYDROMANCER_THESPIA) == SPECIAL)
|
||||
HandleGameObject(MainChambersDoor, true);
|
||||
}
|
||||
else if (data == DONE)
|
||||
{
|
||||
if (GameObject* panel = instance->GetGameObject(AccessPanelMek))
|
||||
panel->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
|
||||
m_auiEncounter[type] = data;
|
||||
break;
|
||||
case TYPE_WARLORD_KALITHRESH:
|
||||
m_auiEncounter[type] = data;
|
||||
break;
|
||||
}
|
||||
|
||||
if (data == DONE || data == SPECIAL)
|
||||
SaveToDB();
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 type) const
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case TYPE_HYDROMANCER_THESPIA:
|
||||
case TYPE_MEKGINEER_STEAMRIGGER:
|
||||
case TYPE_WARLORD_KALITHRESH:
|
||||
return m_auiEncounter[type];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint64 GetData64(uint32 data) const
|
||||
{
|
||||
if (data == TYPE_MEKGINEER_STEAMRIGGER)
|
||||
return MekgineerGUID;
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
std::ostringstream stream;
|
||||
stream << "S V " << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' ' << m_auiEncounter[2];
|
||||
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return stream.str();
|
||||
}
|
||||
|
||||
void Load(const char* strIn)
|
||||
{
|
||||
if (!strIn)
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
}
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
std::istringstream loadStream(strIn);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
|
||||
if (dataHead1 == 'S' && dataHead2 == 'V')
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
case TYPE_HYDROMANCER_THESPIA:
|
||||
if (data == SPECIAL)
|
||||
{
|
||||
loadStream >> m_auiEncounter[i];
|
||||
if (m_auiEncounter[i] == IN_PROGRESS)
|
||||
m_auiEncounter[i] = NOT_STARTED;
|
||||
if (GetData(TYPE_MEKGINEER_STEAMRIGGER) == SPECIAL)
|
||||
HandleGameObject(MainChambersDoor, true);
|
||||
}
|
||||
else if (data == DONE)
|
||||
{
|
||||
if (GameObject* panel = instance->GetGameObject(AccessPanelHydro))
|
||||
panel->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
m_auiEncounter[type] = data;
|
||||
break;
|
||||
case TYPE_MEKGINEER_STEAMRIGGER:
|
||||
if (data == SPECIAL)
|
||||
{
|
||||
if (GetData(TYPE_HYDROMANCER_THESPIA) == SPECIAL)
|
||||
HandleGameObject(MainChambersDoor, true);
|
||||
}
|
||||
else if (data == DONE)
|
||||
{
|
||||
if (GameObject* panel = instance->GetGameObject(AccessPanelMek))
|
||||
panel->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
|
||||
m_auiEncounter[type] = data;
|
||||
break;
|
||||
case TYPE_WARLORD_KALITHRESH:
|
||||
m_auiEncounter[type] = data;
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
if (data == DONE || data == SPECIAL)
|
||||
SaveToDB();
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 type) const
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case TYPE_HYDROMANCER_THESPIA:
|
||||
case TYPE_MEKGINEER_STEAMRIGGER:
|
||||
case TYPE_WARLORD_KALITHRESH:
|
||||
return m_auiEncounter[type];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint64 GetData64(uint32 data) const
|
||||
{
|
||||
if (data == TYPE_MEKGINEER_STEAMRIGGER)
|
||||
return MekgineerGUID;
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
std::ostringstream stream;
|
||||
stream << "S V " << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' ' << m_auiEncounter[2];
|
||||
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return stream.str();
|
||||
}
|
||||
|
||||
void Load(const char* strIn)
|
||||
{
|
||||
if (!strIn)
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
}
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
std::istringstream loadStream(strIn);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
|
||||
if (dataHead1 == 'S' && dataHead2 == 'V')
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
{
|
||||
loadStream >> m_auiEncounter[i];
|
||||
if (m_auiEncounter[i] == IN_PROGRESS)
|
||||
m_auiEncounter[i] = NOT_STARTED;
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
void AddSC_instance_steam_vault()
|
||||
|
||||
@@ -183,7 +183,7 @@ public:
|
||||
void CalcPeriodic(AuraEffect const* /*effect*/, bool& isPeriodic, int32& amplitude)
|
||||
{
|
||||
isPeriodic = true;
|
||||
amplitude = urand(10*IN_MILLISECONDS, 200*IN_MILLISECONDS);
|
||||
amplitude = urand(10 * IN_MILLISECONDS, 200 * IN_MILLISECONDS);
|
||||
}
|
||||
|
||||
void Update(AuraEffect* /*effect*/)
|
||||
|
||||
@@ -44,221 +44,221 @@ enum Events
|
||||
|
||||
class boss_gruul : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_gruul() : CreatureScript("boss_gruul") { }
|
||||
public:
|
||||
boss_gruul() : CreatureScript("boss_gruul") { }
|
||||
|
||||
struct boss_gruulAI : public BossAI
|
||||
struct boss_gruulAI : public BossAI
|
||||
{
|
||||
boss_gruulAI(Creature* creature) : BossAI(creature, DATA_GRUUL) { }
|
||||
|
||||
void Reset()
|
||||
{
|
||||
boss_gruulAI(Creature* creature) : BossAI(creature, DATA_GRUUL) { }
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_Reset();
|
||||
_caveInTimer = 29000;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
events.ScheduleEvent(EVENT_GROWTH, 30000);
|
||||
events.ScheduleEvent(EVENT_CAVE_IN, _caveInTimer);
|
||||
events.ScheduleEvent(EVENT_REVERBERATION, 20000);
|
||||
events.ScheduleEvent(EVENT_HURTFUL_STRIKE, 10000);
|
||||
events.ScheduleEvent(EVENT_GROUND_SLAM, 35000);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*who*/)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_RECENTLY_SPOKEN) == 0)
|
||||
{
|
||||
events.ScheduleEvent(EVENT_RECENTLY_SPOKEN, 5000);
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_GROWTH:
|
||||
Talk(EMOTE_GROW);
|
||||
DoCast(me, SPELL_GROWTH);
|
||||
events.ScheduleEvent(EVENT_GROWTH, 30000);
|
||||
break;
|
||||
case EVENT_CAVE_IN:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
me->CastSpell(target, SPELL_CAVE_IN, false);
|
||||
if (_caveInTimer >= 4000)
|
||||
_caveInTimer -= 1500;
|
||||
events.ScheduleEvent(EVENT_CAVE_IN, _caveInTimer);
|
||||
break;
|
||||
case EVENT_REVERBERATION:
|
||||
me->CastSpell(me, SPELL_REVERBERATION, false);
|
||||
events.ScheduleEvent(EVENT_REVERBERATION, 22000);
|
||||
break;
|
||||
case EVENT_HURTFUL_STRIKE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1, 5.0f))
|
||||
me->CastSpell(target, SPELL_HURTFUL_STRIKE, false);
|
||||
events.ScheduleEvent(EVENT_HURTFUL_STRIKE, 15000);
|
||||
break;
|
||||
case EVENT_GROUND_SLAM:
|
||||
Talk(SAY_SLAM);
|
||||
me->CastSpell(me, SPELL_GROUND_SLAM, false);
|
||||
events.DelayEvents(8001);
|
||||
events.ScheduleEvent(EVENT_GROUND_SLAM, 60000);
|
||||
events.ScheduleEvent(EVENT_SHATTER, 8000);
|
||||
break;
|
||||
case EVENT_SHATTER:
|
||||
Talk(SAY_SHATTER);
|
||||
me->CastSpell(me, SPELL_SHATTER, false);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
uint32 _caveInTimer;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_gruulAI>(creature);
|
||||
_Reset();
|
||||
_caveInTimer = 29000;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
events.ScheduleEvent(EVENT_GROWTH, 30000);
|
||||
events.ScheduleEvent(EVENT_CAVE_IN, _caveInTimer);
|
||||
events.ScheduleEvent(EVENT_REVERBERATION, 20000);
|
||||
events.ScheduleEvent(EVENT_HURTFUL_STRIKE, 10000);
|
||||
events.ScheduleEvent(EVENT_GROUND_SLAM, 35000);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*who*/)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_RECENTLY_SPOKEN) == 0)
|
||||
{
|
||||
events.ScheduleEvent(EVENT_RECENTLY_SPOKEN, 5000);
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_GROWTH:
|
||||
Talk(EMOTE_GROW);
|
||||
DoCast(me, SPELL_GROWTH);
|
||||
events.ScheduleEvent(EVENT_GROWTH, 30000);
|
||||
break;
|
||||
case EVENT_CAVE_IN:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
me->CastSpell(target, SPELL_CAVE_IN, false);
|
||||
if (_caveInTimer >= 4000)
|
||||
_caveInTimer -= 1500;
|
||||
events.ScheduleEvent(EVENT_CAVE_IN, _caveInTimer);
|
||||
break;
|
||||
case EVENT_REVERBERATION:
|
||||
me->CastSpell(me, SPELL_REVERBERATION, false);
|
||||
events.ScheduleEvent(EVENT_REVERBERATION, 22000);
|
||||
break;
|
||||
case EVENT_HURTFUL_STRIKE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1, 5.0f))
|
||||
me->CastSpell(target, SPELL_HURTFUL_STRIKE, false);
|
||||
events.ScheduleEvent(EVENT_HURTFUL_STRIKE, 15000);
|
||||
break;
|
||||
case EVENT_GROUND_SLAM:
|
||||
Talk(SAY_SLAM);
|
||||
me->CastSpell(me, SPELL_GROUND_SLAM, false);
|
||||
events.DelayEvents(8001);
|
||||
events.ScheduleEvent(EVENT_GROUND_SLAM, 60000);
|
||||
events.ScheduleEvent(EVENT_SHATTER, 8000);
|
||||
break;
|
||||
case EVENT_SHATTER:
|
||||
Talk(SAY_SHATTER);
|
||||
me->CastSpell(me, SPELL_SHATTER, false);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
uint32 _caveInTimer;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_gruulAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
class spell_gruul_ground_slam : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_gruul_ground_slam() : SpellScriptLoader("spell_gruul_ground_slam") { }
|
||||
public:
|
||||
spell_gruul_ground_slam() : SpellScriptLoader("spell_gruul_ground_slam") { }
|
||||
|
||||
class spell_gruul_ground_slam_SpellScript : public SpellScript
|
||||
class spell_gruul_ground_slam_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_gruul_ground_slam_SpellScript);
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
PrepareSpellScript(spell_gruul_ground_slam_SpellScript);
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (Unit* target = GetHitUnit())
|
||||
target->KnockbackFrom(GetCaster()->GetPositionX(), GetCaster()->GetPositionY(), 15.0f, 15.0f);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_gruul_ground_slam_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_gruul_ground_slam_SpellScript();
|
||||
if (Unit* target = GetHitUnit())
|
||||
target->KnockbackFrom(GetCaster()->GetPositionX(), GetCaster()->GetPositionY(), 15.0f, 15.0f);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_gruul_ground_slam_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_gruul_ground_slam_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_gruul_ground_slam_trigger : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_gruul_ground_slam_trigger() : SpellScriptLoader("spell_gruul_ground_slam_trigger") { }
|
||||
public:
|
||||
spell_gruul_ground_slam_trigger() : SpellScriptLoader("spell_gruul_ground_slam_trigger") { }
|
||||
|
||||
class spell_gruul_ground_slam_trigger_AuraScript : public AuraScript
|
||||
class spell_gruul_ground_slam_trigger_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_gruul_ground_slam_trigger_AuraScript);
|
||||
|
||||
void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
PrepareAuraScript(spell_gruul_ground_slam_trigger_AuraScript);
|
||||
|
||||
void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
if (GetUnitOwner()->GetAuraCount(GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell) == 5)
|
||||
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_STONED, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
AfterEffectRemove += AuraEffectRemoveFn(spell_gruul_ground_slam_trigger_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_gruul_ground_slam_trigger_AuraScript();
|
||||
if (GetUnitOwner()->GetAuraCount(GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell) == 5)
|
||||
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_STONED, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
AfterEffectRemove += AuraEffectRemoveFn(spell_gruul_ground_slam_trigger_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_gruul_ground_slam_trigger_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_gruul_shatter : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_gruul_shatter() : SpellScriptLoader("spell_gruul_shatter") { }
|
||||
public:
|
||||
spell_gruul_shatter() : SpellScriptLoader("spell_gruul_shatter") { }
|
||||
|
||||
class spell_gruul_shatter_SpellScript : public SpellScript
|
||||
class spell_gruul_shatter_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_gruul_shatter_SpellScript);
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
PrepareSpellScript(spell_gruul_shatter_SpellScript);
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
|
||||
if (Unit* target = GetHitUnit())
|
||||
{
|
||||
if (Unit* target = GetHitUnit())
|
||||
{
|
||||
target->RemoveAurasDueToSpell(SPELL_STONED);
|
||||
target->CastSpell((Unit*)NULL, SPELL_SHATTER_EFFECT, true);
|
||||
}
|
||||
target->RemoveAurasDueToSpell(SPELL_STONED);
|
||||
target->CastSpell((Unit*)NULL, SPELL_SHATTER_EFFECT, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_gruul_shatter_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_gruul_shatter_SpellScript();
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_gruul_shatter_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_gruul_shatter_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_gruul_shatter_effect : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_gruul_shatter_effect() : SpellScriptLoader("spell_gruul_shatter_effect") { }
|
||||
public:
|
||||
spell_gruul_shatter_effect() : SpellScriptLoader("spell_gruul_shatter_effect") { }
|
||||
|
||||
class spell_gruul_shatter_effect_SpellScript : public SpellScript
|
||||
class spell_gruul_shatter_effect_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_gruul_shatter_effect_SpellScript);
|
||||
|
||||
void CalculateDamage()
|
||||
{
|
||||
PrepareSpellScript(spell_gruul_shatter_effect_SpellScript);
|
||||
if (!GetHitUnit())
|
||||
return;
|
||||
|
||||
void CalculateDamage()
|
||||
{
|
||||
if (!GetHitUnit())
|
||||
return;
|
||||
float radius = GetSpellInfo()->Effects[EFFECT_0].CalcRadius(GetCaster());
|
||||
if (!radius)
|
||||
return;
|
||||
|
||||
float radius = GetSpellInfo()->Effects[EFFECT_0].CalcRadius(GetCaster());
|
||||
if (!radius)
|
||||
return;
|
||||
|
||||
float distance = GetCaster()->GetDistance2d(GetHitUnit());
|
||||
if (distance > 1.0f)
|
||||
SetHitDamage(int32(GetHitDamage() * ((radius - distance) / radius)));
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnHit += SpellHitFn(spell_gruul_shatter_effect_SpellScript::CalculateDamage);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_gruul_shatter_effect_SpellScript();
|
||||
float distance = GetCaster()->GetDistance2d(GetHitUnit());
|
||||
if (distance > 1.0f)
|
||||
SetHitDamage(int32(GetHitDamage() * ((radius - distance) / radius)));
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnHit += SpellHitFn(spell_gruul_shatter_effect_SpellScript::CalculateDamage);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_gruul_shatter_effect_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_gruul()
|
||||
|
||||
@@ -24,149 +24,149 @@ MinionData const minionData[] =
|
||||
|
||||
class instance_gruuls_lair : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
instance_gruuls_lair() : InstanceMapScript("instance_gruuls_lair", 565) { }
|
||||
public:
|
||||
instance_gruuls_lair() : InstanceMapScript("instance_gruuls_lair", 565) { }
|
||||
|
||||
struct instance_gruuls_lair_InstanceMapScript : public InstanceScript
|
||||
struct instance_gruuls_lair_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_gruuls_lair_InstanceMapScript(Map* map) : InstanceScript(map)
|
||||
{
|
||||
instance_gruuls_lair_InstanceMapScript(Map* map) : InstanceScript(map)
|
||||
{
|
||||
SetBossNumber(MAX_ENCOUNTER);
|
||||
LoadDoorData(doorData);
|
||||
LoadMinionData(minionData);
|
||||
SetBossNumber(MAX_ENCOUNTER);
|
||||
LoadDoorData(doorData);
|
||||
LoadMinionData(minionData);
|
||||
|
||||
_maulgarGUID = 0;
|
||||
_addsKilled = 0;
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case NPC_MAULGAR:
|
||||
_maulgarGUID = creature->GetGUID();
|
||||
[[fallthrough]];
|
||||
case NPC_KROSH_FIREHAND:
|
||||
case NPC_OLM_THE_SUMMONER:
|
||||
case NPC_KIGGLER_THE_CRAZED:
|
||||
case NPC_BLINDEYE_THE_SEER:
|
||||
AddMinion(creature, true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnCreatureRemove(Creature* creature)
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case NPC_MAULGAR:
|
||||
case NPC_KROSH_FIREHAND:
|
||||
case NPC_OLM_THE_SUMMONER:
|
||||
case NPC_KIGGLER_THE_CRAZED:
|
||||
case NPC_BLINDEYE_THE_SEER:
|
||||
AddMinion(creature, false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* go)
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_MAULGAR_DOOR:
|
||||
case GO_GRUUL_DOOR:
|
||||
AddDoor(go, true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectRemove(GameObject* go)
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_MAULGAR_DOOR:
|
||||
case GO_GRUUL_DOOR:
|
||||
AddDoor(go, false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool SetBossState(uint32 id, EncounterState state)
|
||||
{
|
||||
if (!InstanceScript::SetBossState(id, state))
|
||||
return false;
|
||||
|
||||
if (id == DATA_MAULGAR && state == NOT_STARTED)
|
||||
_addsKilled = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 /*id*/)
|
||||
{
|
||||
if (type == DATA_ADDS_KILLED)
|
||||
if (Creature* maulgar = instance->GetCreature(_maulgarGUID))
|
||||
maulgar->AI()->DoAction(++_addsKilled);
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 type) const
|
||||
{
|
||||
if (type == DATA_ADDS_KILLED)
|
||||
return _addsKilled;
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "G L " << GetBossSaveData();
|
||||
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void Load(char const* str)
|
||||
{
|
||||
if (!str)
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA(str);
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
|
||||
std::istringstream loadStream(str);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
|
||||
if (dataHead1 == 'G' && dataHead2 == 'L')
|
||||
{
|
||||
for (uint32 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
{
|
||||
uint32 tmpState;
|
||||
loadStream >> tmpState;
|
||||
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
|
||||
tmpState = NOT_STARTED;
|
||||
SetBossState(i, EncounterState(tmpState));
|
||||
}
|
||||
}
|
||||
else
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
}
|
||||
|
||||
protected:
|
||||
uint32 _addsKilled;
|
||||
uint64 _maulgarGUID;
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_gruuls_lair_InstanceMapScript(map);
|
||||
_maulgarGUID = 0;
|
||||
_addsKilled = 0;
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case NPC_MAULGAR:
|
||||
_maulgarGUID = creature->GetGUID();
|
||||
[[fallthrough]];
|
||||
case NPC_KROSH_FIREHAND:
|
||||
case NPC_OLM_THE_SUMMONER:
|
||||
case NPC_KIGGLER_THE_CRAZED:
|
||||
case NPC_BLINDEYE_THE_SEER:
|
||||
AddMinion(creature, true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnCreatureRemove(Creature* creature)
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case NPC_MAULGAR:
|
||||
case NPC_KROSH_FIREHAND:
|
||||
case NPC_OLM_THE_SUMMONER:
|
||||
case NPC_KIGGLER_THE_CRAZED:
|
||||
case NPC_BLINDEYE_THE_SEER:
|
||||
AddMinion(creature, false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* go)
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_MAULGAR_DOOR:
|
||||
case GO_GRUUL_DOOR:
|
||||
AddDoor(go, true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectRemove(GameObject* go)
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_MAULGAR_DOOR:
|
||||
case GO_GRUUL_DOOR:
|
||||
AddDoor(go, false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool SetBossState(uint32 id, EncounterState state)
|
||||
{
|
||||
if (!InstanceScript::SetBossState(id, state))
|
||||
return false;
|
||||
|
||||
if (id == DATA_MAULGAR && state == NOT_STARTED)
|
||||
_addsKilled = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 /*id*/)
|
||||
{
|
||||
if (type == DATA_ADDS_KILLED)
|
||||
if (Creature* maulgar = instance->GetCreature(_maulgarGUID))
|
||||
maulgar->AI()->DoAction(++_addsKilled);
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 type) const
|
||||
{
|
||||
if (type == DATA_ADDS_KILLED)
|
||||
return _addsKilled;
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "G L " << GetBossSaveData();
|
||||
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void Load(char const* str)
|
||||
{
|
||||
if (!str)
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA(str);
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
|
||||
std::istringstream loadStream(str);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
|
||||
if (dataHead1 == 'G' && dataHead2 == 'L')
|
||||
{
|
||||
for (uint32 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
{
|
||||
uint32 tmpState;
|
||||
loadStream >> tmpState;
|
||||
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
|
||||
tmpState = NOT_STARTED;
|
||||
SetBossState(i, EncounterState(tmpState));
|
||||
}
|
||||
}
|
||||
else
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
}
|
||||
|
||||
protected:
|
||||
uint32 _addsKilled;
|
||||
uint64 _maulgarGUID;
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_gruuls_lair_InstanceMapScript(map);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_instance_gruuls_lair()
|
||||
|
||||
@@ -24,171 +24,171 @@ enum eEnums
|
||||
|
||||
class boss_broggok : public CreatureScript
|
||||
{
|
||||
public:
|
||||
public:
|
||||
|
||||
boss_broggok() : CreatureScript("boss_broggok")
|
||||
boss_broggok() : CreatureScript("boss_broggok")
|
||||
{
|
||||
}
|
||||
|
||||
struct boss_broggokAI : public ScriptedAI
|
||||
{
|
||||
boss_broggokAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
struct boss_broggokAI : public ScriptedAI
|
||||
InstanceScript* instance;
|
||||
EventMap events;
|
||||
bool canAttack;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
boss_broggokAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
events.Reset();
|
||||
|
||||
InstanceScript* instance;
|
||||
EventMap events;
|
||||
bool canAttack;
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NON_ATTACKABLE);
|
||||
canAttack = false;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NON_ATTACKABLE);
|
||||
canAttack = false;
|
||||
|
||||
if (instance)
|
||||
instance->SetData(DATA_BROGGOK, NOT_STARTED);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summoned)
|
||||
{
|
||||
summoned->setFaction(16);
|
||||
summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
summoned->CastSpell(summoned, SPELL_POISON, false, 0, 0, me->GetGUID());
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim() || !canAttack)
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.GetEvent())
|
||||
{
|
||||
case EVENT_SPELL_SLIME:
|
||||
me->CastSpell(me->GetVictim(), SPELL_SLIME_SPRAY, false);
|
||||
events.RepeatEvent(urand(7000, 12000));
|
||||
break;
|
||||
case EVENT_SPELL_BOLT:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
me->CastSpell(target, SPELL_POISON_BOLT, false);
|
||||
events.RepeatEvent(urand(6000, 11000));
|
||||
break;
|
||||
case EVENT_SPELL_POISON:
|
||||
me->CastSpell(me, SPELL_POISON_CLOUD, false);
|
||||
events.RepeatEvent(20000);
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
if (instance)
|
||||
{
|
||||
instance->HandleGameObject(instance->GetData64(DATA_DOOR4), true);
|
||||
instance->HandleGameObject(instance->GetData64(DATA_DOOR5), true);
|
||||
instance->SetData(DATA_BROGGOK, DONE);
|
||||
}
|
||||
}
|
||||
|
||||
void DoAction(int32 action)
|
||||
{
|
||||
switch (action)
|
||||
{
|
||||
case ACTION_PREPARE_BROGGOK:
|
||||
me->SetInCombatWithZone();
|
||||
break;
|
||||
case ACTION_ACTIVATE_BROGGOK:
|
||||
events.ScheduleEvent(EVENT_SPELL_SLIME, 10000);
|
||||
events.ScheduleEvent(EVENT_SPELL_POISON, 5000);
|
||||
events.ScheduleEvent(EVENT_SPELL_BOLT, 7000);
|
||||
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NON_ATTACKABLE);
|
||||
canAttack = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_broggokAI(creature);
|
||||
if (instance)
|
||||
instance->SetData(DATA_BROGGOK, NOT_STARTED);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summoned)
|
||||
{
|
||||
summoned->setFaction(16);
|
||||
summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
summoned->CastSpell(summoned, SPELL_POISON, false, 0, 0, me->GetGUID());
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim() || !canAttack)
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.GetEvent())
|
||||
{
|
||||
case EVENT_SPELL_SLIME:
|
||||
me->CastSpell(me->GetVictim(), SPELL_SLIME_SPRAY, false);
|
||||
events.RepeatEvent(urand(7000, 12000));
|
||||
break;
|
||||
case EVENT_SPELL_BOLT:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
me->CastSpell(target, SPELL_POISON_BOLT, false);
|
||||
events.RepeatEvent(urand(6000, 11000));
|
||||
break;
|
||||
case EVENT_SPELL_POISON:
|
||||
me->CastSpell(me, SPELL_POISON_CLOUD, false);
|
||||
events.RepeatEvent(20000);
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
if (instance)
|
||||
{
|
||||
instance->HandleGameObject(instance->GetData64(DATA_DOOR4), true);
|
||||
instance->HandleGameObject(instance->GetData64(DATA_DOOR5), true);
|
||||
instance->SetData(DATA_BROGGOK, DONE);
|
||||
}
|
||||
}
|
||||
|
||||
void DoAction(int32 action)
|
||||
{
|
||||
switch (action)
|
||||
{
|
||||
case ACTION_PREPARE_BROGGOK:
|
||||
me->SetInCombatWithZone();
|
||||
break;
|
||||
case ACTION_ACTIVATE_BROGGOK:
|
||||
events.ScheduleEvent(EVENT_SPELL_SLIME, 10000);
|
||||
events.ScheduleEvent(EVENT_SPELL_POISON, 5000);
|
||||
events.ScheduleEvent(EVENT_SPELL_BOLT, 7000);
|
||||
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NON_ATTACKABLE);
|
||||
canAttack = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_broggokAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
class go_broggok_lever : public GameObjectScript
|
||||
{
|
||||
public:
|
||||
go_broggok_lever() : GameObjectScript("go_broggok_lever") {}
|
||||
public:
|
||||
go_broggok_lever() : GameObjectScript("go_broggok_lever") {}
|
||||
|
||||
bool OnGossipHello(Player* /*player*/, GameObject* go) override
|
||||
{
|
||||
if (InstanceScript* instance = go->GetInstanceScript())
|
||||
if (instance->GetData(DATA_BROGGOK) != DONE && instance->GetData(DATA_BROGGOK) != IN_PROGRESS)
|
||||
if (Creature* broggok = ObjectAccessor::GetCreature(*go, instance->GetData64(DATA_BROGGOK)))
|
||||
{
|
||||
instance->SetData(DATA_BROGGOK, IN_PROGRESS);
|
||||
broggok->AI()->DoAction(ACTION_PREPARE_BROGGOK);
|
||||
}
|
||||
bool OnGossipHello(Player* /*player*/, GameObject* go) override
|
||||
{
|
||||
if (InstanceScript* instance = go->GetInstanceScript())
|
||||
if (instance->GetData(DATA_BROGGOK) != DONE && instance->GetData(DATA_BROGGOK) != IN_PROGRESS)
|
||||
if (Creature* broggok = ObjectAccessor::GetCreature(*go, instance->GetData64(DATA_BROGGOK)))
|
||||
{
|
||||
instance->SetData(DATA_BROGGOK, IN_PROGRESS);
|
||||
broggok->AI()->DoAction(ACTION_PREPARE_BROGGOK);
|
||||
}
|
||||
|
||||
go->UseDoorOrButton();
|
||||
return false;
|
||||
}
|
||||
go->UseDoorOrButton();
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
// 30914, 38462 - Poison (Broggok)
|
||||
class spell_broggok_poison_cloud : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_broggok_poison_cloud() : SpellScriptLoader("spell_broggok_poison_cloud") { }
|
||||
public:
|
||||
spell_broggok_poison_cloud() : SpellScriptLoader("spell_broggok_poison_cloud") { }
|
||||
|
||||
class spell_broggok_poison_cloud_AuraScript : public AuraScript
|
||||
class spell_broggok_poison_cloud_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_broggok_poison_cloud_AuraScript);
|
||||
|
||||
bool Validate(SpellInfo const* spellInfo)
|
||||
{
|
||||
PrepareAuraScript(spell_broggok_poison_cloud_AuraScript);
|
||||
|
||||
bool Validate(SpellInfo const* spellInfo)
|
||||
{
|
||||
if (!sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_0].TriggerSpell))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
void PeriodicTick(AuraEffect const* aurEff)
|
||||
{
|
||||
PreventDefaultAction();
|
||||
|
||||
uint32 triggerSpell = GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell;
|
||||
int32 mod = int32(((float(aurEff->GetTickNumber()) / aurEff->GetTotalTicks()) * 0.9f + 0.1f) * 10000 * 2 / 3);
|
||||
GetTarget()->CastCustomSpell(triggerSpell, SPELLVALUE_RADIUS_MOD, mod, (Unit*)NULL, TRIGGERED_FULL_MASK, NULL, aurEff);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_broggok_poison_cloud_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_broggok_poison_cloud_AuraScript();
|
||||
if (!sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_0].TriggerSpell))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
void PeriodicTick(AuraEffect const* aurEff)
|
||||
{
|
||||
PreventDefaultAction();
|
||||
|
||||
uint32 triggerSpell = GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell;
|
||||
int32 mod = int32(((float(aurEff->GetTickNumber()) / aurEff->GetTotalTicks()) * 0.9f + 0.1f) * 10000 * 2 / 3);
|
||||
GetTarget()->CastCustomSpell(triggerSpell, SPELLVALUE_RADIUS_MOD, mod, (Unit*)NULL, TRIGGERED_FULL_MASK, NULL, aurEff);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_broggok_poison_cloud_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_broggok_poison_cloud_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_broggok()
|
||||
|
||||
@@ -53,295 +53,295 @@ const float ShadowmoonChannelers[5][4] =
|
||||
|
||||
class boss_kelidan_the_breaker : public CreatureScript
|
||||
{
|
||||
public:
|
||||
public:
|
||||
|
||||
boss_kelidan_the_breaker() : CreatureScript("boss_kelidan_the_breaker")
|
||||
boss_kelidan_the_breaker() : CreatureScript("boss_kelidan_the_breaker")
|
||||
{
|
||||
}
|
||||
|
||||
struct boss_kelidan_the_breakerAI : public ScriptedAI
|
||||
{
|
||||
boss_kelidan_the_breakerAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
instance = creature->GetInstanceScript();
|
||||
memset(&channelers, 0, sizeof(channelers));
|
||||
}
|
||||
|
||||
struct boss_kelidan_the_breakerAI : public ScriptedAI
|
||||
InstanceScript* instance;
|
||||
EventMap events;
|
||||
uint64 channelers[5];
|
||||
uint32 checkTimer;
|
||||
bool addYell;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
boss_kelidan_the_breakerAI(Creature* creature) : ScriptedAI(creature)
|
||||
addYell = false;
|
||||
checkTimer = 5000;
|
||||
|
||||
events.Reset();
|
||||
ApplyImmunities(true);
|
||||
SummonChannelers();
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NON_ATTACKABLE);
|
||||
if (instance)
|
||||
instance->SetData(DATA_KELIDAN, NOT_STARTED);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
events.ScheduleEvent(EVENT_SPELL_VOLLEY, 1000);
|
||||
events.ScheduleEvent(EVENT_SPELL_CORRUPTION, 5000);
|
||||
events.ScheduleEvent(EVENT_SPELL_BURNING_NOVA, 15000);
|
||||
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
Talk(SAY_WAKE);
|
||||
|
||||
if (instance)
|
||||
instance->SetData(DATA_KELIDAN, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (urand(0, 1))
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
void DoAction(int32 param)
|
||||
{
|
||||
if (param == ACTION_CHANNELER_ENGAGED)
|
||||
{
|
||||
instance = creature->GetInstanceScript();
|
||||
memset(&channelers, 0, sizeof(channelers));
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
EventMap events;
|
||||
uint64 channelers[5];
|
||||
uint32 checkTimer;
|
||||
bool addYell;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
addYell = false;
|
||||
checkTimer = 5000;
|
||||
|
||||
events.Reset();
|
||||
ApplyImmunities(true);
|
||||
SummonChannelers();
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NON_ATTACKABLE);
|
||||
if (instance)
|
||||
instance->SetData(DATA_KELIDAN, NOT_STARTED);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
events.ScheduleEvent(EVENT_SPELL_VOLLEY, 1000);
|
||||
events.ScheduleEvent(EVENT_SPELL_CORRUPTION, 5000);
|
||||
events.ScheduleEvent(EVENT_SPELL_BURNING_NOVA, 15000);
|
||||
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
Talk(SAY_WAKE);
|
||||
|
||||
if (instance)
|
||||
instance->SetData(DATA_KELIDAN, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (urand(0,1))
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
void DoAction(int32 param)
|
||||
{
|
||||
if (param == ACTION_CHANNELER_ENGAGED)
|
||||
{
|
||||
if (!addYell)
|
||||
{
|
||||
addYell = true;
|
||||
Talk(SAY_ADD_AGGRO);
|
||||
|
||||
for (uint8 i = 0; i < 5; ++i)
|
||||
{
|
||||
Creature* channeler = ObjectAccessor::GetCreature(*me, channelers[i]);
|
||||
if (channeler && !channeler->IsInCombat())
|
||||
channeler->SetInCombatWithZone();
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (param == ACTION_CHANNELER_DIED)
|
||||
if (!addYell)
|
||||
{
|
||||
addYell = true;
|
||||
Talk(SAY_ADD_AGGRO);
|
||||
|
||||
for (uint8 i = 0; i < 5; ++i)
|
||||
{
|
||||
Creature* channeler = ObjectAccessor::GetCreature(*me, channelers[i]);
|
||||
if (channeler && channeler->IsAlive())
|
||||
return;
|
||||
}
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NON_ATTACKABLE);
|
||||
if (Unit* target = me->SelectNearestPlayer(100.0f))
|
||||
AttackStart(target);
|
||||
}
|
||||
}
|
||||
|
||||
void CheckChannelers()
|
||||
{
|
||||
if (addYell)
|
||||
{
|
||||
if (!SelectTargetFromPlayerList(100.0f))
|
||||
EnterEvadeMode();
|
||||
return;
|
||||
}
|
||||
|
||||
SummonChannelers();
|
||||
for (uint8 i = 0; i < 5; ++i)
|
||||
{
|
||||
Creature* channeler = ObjectAccessor::GetCreature(*me, channelers[i]);
|
||||
if (channeler && !channeler->HasUnitState(UNIT_STATE_CASTING) && !channeler->IsInCombat())
|
||||
{
|
||||
Creature* target = ObjectAccessor::GetCreature(*me, channelers[(i+2)%5]);
|
||||
if (target)
|
||||
channeler->CastSpell(target, SPELL_CHANNELING, false);
|
||||
if (channeler && !channeler->IsInCombat())
|
||||
channeler->SetInCombatWithZone();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SummonChannelers()
|
||||
else if (param == ACTION_CHANNELER_DIED)
|
||||
{
|
||||
for (uint8 i = 0; i < 5; ++i)
|
||||
{
|
||||
Creature* channeler = ObjectAccessor::GetCreature(*me, channelers[i]);
|
||||
if (channeler && channeler->isDead())
|
||||
{
|
||||
channeler->DespawnOrUnsummon(1);
|
||||
channeler = nullptr;
|
||||
}
|
||||
if (!channeler)
|
||||
channeler = me->SummonCreature(NPC_CHANNELER, ShadowmoonChannelers[i][0], ShadowmoonChannelers[i][1], ShadowmoonChannelers[i][2], ShadowmoonChannelers[i][3], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000);
|
||||
|
||||
channelers[i] = channeler ? channeler->GetGUID() : 0;
|
||||
if (channeler && channeler->IsAlive())
|
||||
return;
|
||||
}
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NON_ATTACKABLE);
|
||||
if (Unit* target = me->SelectNearestPlayer(100.0f))
|
||||
AttackStart(target);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
Talk(SAY_DIE);
|
||||
if (instance)
|
||||
{
|
||||
// Xinef: load grid with start doors
|
||||
me->GetMap()->LoadGrid(0, -111.0f);
|
||||
instance->SetData(DATA_KELIDAN, DONE);
|
||||
instance->HandleGameObject(instance->GetData64(DATA_DOOR1), true);
|
||||
instance->HandleGameObject(instance->GetData64(DATA_DOOR6), true);
|
||||
}
|
||||
}
|
||||
|
||||
void ApplyImmunities(bool apply)
|
||||
{
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_CHARM, apply);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DISORIENTED, apply);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DISTRACT, apply);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FEAR, apply);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_ROOT, apply);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SILENCE, apply);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SLEEP, apply);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SNARE, apply);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_STUN, apply);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FREEZE, apply);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_KNOCKOUT, apply);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, apply);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_BANISH, apply);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SHACKLE, apply);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_TURN, apply);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_HORROR, apply);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DAZE, apply);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SAPPED, apply);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
{
|
||||
checkTimer += diff;
|
||||
if (checkTimer >= 5000)
|
||||
{
|
||||
checkTimer = 0;
|
||||
CheckChannelers();
|
||||
if (!me->HasUnitState(UNIT_STATE_CASTING))
|
||||
me->CastSpell(me, SPELL_EVOCATION, false);
|
||||
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.GetEvent())
|
||||
{
|
||||
case EVENT_SPELL_VOLLEY:
|
||||
me->CastSpell(me, SPELL_SHADOW_BOLT_VOLLEY, false);
|
||||
events.RepeatEvent(urand(8000, 13000));
|
||||
break;
|
||||
case EVENT_SPELL_CORRUPTION:
|
||||
me->CastSpell(me, SPELL_CORRUPTION, false);
|
||||
events.RepeatEvent(urand(30000, 50000));
|
||||
break;
|
||||
case EVENT_SPELL_BURNING_NOVA:
|
||||
Talk(SAY_NOVA);
|
||||
|
||||
ApplyImmunities(false);
|
||||
me->AddAura(SPELL_BURNING_NOVA, me);
|
||||
ApplyImmunities(true);
|
||||
|
||||
if (IsHeroic())
|
||||
DoTeleportAll(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
|
||||
|
||||
events.DelayEvents(6000, 0);
|
||||
events.RepeatEvent(urand(25000, 32000));
|
||||
events.ScheduleEvent(EVENT_SPELL_FIRE_NOVA, 5000);
|
||||
break;
|
||||
case EVENT_SPELL_FIRE_NOVA:
|
||||
me->CastSpell(me, SPELL_FIRE_NOVA, true);
|
||||
events.PopEvent();
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_kelidan_the_breakerAI(creature);
|
||||
}
|
||||
|
||||
void CheckChannelers()
|
||||
{
|
||||
if (addYell)
|
||||
{
|
||||
if (!SelectTargetFromPlayerList(100.0f))
|
||||
EnterEvadeMode();
|
||||
return;
|
||||
}
|
||||
|
||||
SummonChannelers();
|
||||
for (uint8 i = 0; i < 5; ++i)
|
||||
{
|
||||
Creature* channeler = ObjectAccessor::GetCreature(*me, channelers[i]);
|
||||
if (channeler && !channeler->HasUnitState(UNIT_STATE_CASTING) && !channeler->IsInCombat())
|
||||
{
|
||||
Creature* target = ObjectAccessor::GetCreature(*me, channelers[(i + 2) % 5]);
|
||||
if (target)
|
||||
channeler->CastSpell(target, SPELL_CHANNELING, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SummonChannelers()
|
||||
{
|
||||
for (uint8 i = 0; i < 5; ++i)
|
||||
{
|
||||
Creature* channeler = ObjectAccessor::GetCreature(*me, channelers[i]);
|
||||
if (channeler && channeler->isDead())
|
||||
{
|
||||
channeler->DespawnOrUnsummon(1);
|
||||
channeler = nullptr;
|
||||
}
|
||||
if (!channeler)
|
||||
channeler = me->SummonCreature(NPC_CHANNELER, ShadowmoonChannelers[i][0], ShadowmoonChannelers[i][1], ShadowmoonChannelers[i][2], ShadowmoonChannelers[i][3], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000);
|
||||
|
||||
channelers[i] = channeler ? channeler->GetGUID() : 0;
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
Talk(SAY_DIE);
|
||||
if (instance)
|
||||
{
|
||||
// Xinef: load grid with start doors
|
||||
me->GetMap()->LoadGrid(0, -111.0f);
|
||||
instance->SetData(DATA_KELIDAN, DONE);
|
||||
instance->HandleGameObject(instance->GetData64(DATA_DOOR1), true);
|
||||
instance->HandleGameObject(instance->GetData64(DATA_DOOR6), true);
|
||||
}
|
||||
}
|
||||
|
||||
void ApplyImmunities(bool apply)
|
||||
{
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_CHARM, apply);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DISORIENTED, apply);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DISTRACT, apply);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FEAR, apply);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_ROOT, apply);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SILENCE, apply);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SLEEP, apply);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SNARE, apply);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_STUN, apply);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FREEZE, apply);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_KNOCKOUT, apply);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, apply);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_BANISH, apply);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SHACKLE, apply);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_TURN, apply);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_HORROR, apply);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DAZE, apply);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SAPPED, apply);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
{
|
||||
checkTimer += diff;
|
||||
if (checkTimer >= 5000)
|
||||
{
|
||||
checkTimer = 0;
|
||||
CheckChannelers();
|
||||
if (!me->HasUnitState(UNIT_STATE_CASTING))
|
||||
me->CastSpell(me, SPELL_EVOCATION, false);
|
||||
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.GetEvent())
|
||||
{
|
||||
case EVENT_SPELL_VOLLEY:
|
||||
me->CastSpell(me, SPELL_SHADOW_BOLT_VOLLEY, false);
|
||||
events.RepeatEvent(urand(8000, 13000));
|
||||
break;
|
||||
case EVENT_SPELL_CORRUPTION:
|
||||
me->CastSpell(me, SPELL_CORRUPTION, false);
|
||||
events.RepeatEvent(urand(30000, 50000));
|
||||
break;
|
||||
case EVENT_SPELL_BURNING_NOVA:
|
||||
Talk(SAY_NOVA);
|
||||
|
||||
ApplyImmunities(false);
|
||||
me->AddAura(SPELL_BURNING_NOVA, me);
|
||||
ApplyImmunities(true);
|
||||
|
||||
if (IsHeroic())
|
||||
DoTeleportAll(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
|
||||
|
||||
events.DelayEvents(6000, 0);
|
||||
events.RepeatEvent(urand(25000, 32000));
|
||||
events.ScheduleEvent(EVENT_SPELL_FIRE_NOVA, 5000);
|
||||
break;
|
||||
case EVENT_SPELL_FIRE_NOVA:
|
||||
me->CastSpell(me, SPELL_FIRE_NOVA, true);
|
||||
events.PopEvent();
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_kelidan_the_breakerAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
class npc_shadowmoon_channeler : public CreatureScript
|
||||
{
|
||||
public:
|
||||
public:
|
||||
|
||||
npc_shadowmoon_channeler() : CreatureScript("npc_shadowmoon_channeler") {}
|
||||
npc_shadowmoon_channeler() : CreatureScript("npc_shadowmoon_channeler") {}
|
||||
|
||||
struct npc_shadowmoon_channelerAI : public ScriptedAI
|
||||
struct npc_shadowmoon_channelerAI : public ScriptedAI
|
||||
{
|
||||
npc_shadowmoon_channelerAI(Creature* creature) : ScriptedAI(creature) {}
|
||||
|
||||
EventMap events;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
npc_shadowmoon_channelerAI(Creature* creature) : ScriptedAI(creature){}
|
||||
|
||||
EventMap events;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
}
|
||||
|
||||
Creature* GetKelidan()
|
||||
{
|
||||
if (me->GetInstanceScript())
|
||||
return ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetData64(DATA_KELIDAN));
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
if (Creature* kelidan = GetKelidan())
|
||||
kelidan->AI()->DoAction(ACTION_CHANNELER_ENGAGED);
|
||||
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
events.ScheduleEvent(EVENT_SPELL_SHADOW_BOLT, urand(1500, 3500));
|
||||
events.ScheduleEvent(EVENT_SPELL_MARK, urand(5000, 6500));
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
if (Creature* kelidan = GetKelidan())
|
||||
kelidan->AI()->DoAction(ACTION_CHANNELER_DIED);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.GetEvent())
|
||||
{
|
||||
case EVENT_SPELL_SHADOW_BOLT:
|
||||
me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_SHADOW_BOLT_H : SPELL_SHADOW_BOLT, false);
|
||||
events.RepeatEvent(urand(6000, 7500));
|
||||
break;
|
||||
case EVENT_SPELL_MARK:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
me->CastSpell(target, SPELL_MARK_OF_SHADOW, false);
|
||||
events.RepeatEvent(urand(16000, 17500));
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new npc_shadowmoon_channelerAI(creature);
|
||||
events.Reset();
|
||||
}
|
||||
|
||||
Creature* GetKelidan()
|
||||
{
|
||||
if (me->GetInstanceScript())
|
||||
return ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetData64(DATA_KELIDAN));
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
if (Creature* kelidan = GetKelidan())
|
||||
kelidan->AI()->DoAction(ACTION_CHANNELER_ENGAGED);
|
||||
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
events.ScheduleEvent(EVENT_SPELL_SHADOW_BOLT, urand(1500, 3500));
|
||||
events.ScheduleEvent(EVENT_SPELL_MARK, urand(5000, 6500));
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
if (Creature* kelidan = GetKelidan())
|
||||
kelidan->AI()->DoAction(ACTION_CHANNELER_DIED);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.GetEvent())
|
||||
{
|
||||
case EVENT_SPELL_SHADOW_BOLT:
|
||||
me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_SHADOW_BOLT_H : SPELL_SHADOW_BOLT, false);
|
||||
events.RepeatEvent(urand(6000, 7500));
|
||||
break;
|
||||
case EVENT_SPELL_MARK:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
me->CastSpell(target, SPELL_MARK_OF_SHADOW, false);
|
||||
events.RepeatEvent(urand(16000, 17500));
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new npc_shadowmoon_channelerAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_kelidan_the_breaker()
|
||||
|
||||
@@ -25,105 +25,105 @@ enum eEnums
|
||||
|
||||
class boss_the_maker : public CreatureScript
|
||||
{
|
||||
public:
|
||||
public:
|
||||
|
||||
boss_the_maker() : CreatureScript("boss_the_maker")
|
||||
boss_the_maker() : CreatureScript("boss_the_maker")
|
||||
{
|
||||
}
|
||||
|
||||
struct boss_the_makerAI : public ScriptedAI
|
||||
{
|
||||
boss_the_makerAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
struct boss_the_makerAI : public ScriptedAI
|
||||
InstanceScript* instance;
|
||||
EventMap events;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
boss_the_makerAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
events.Reset();
|
||||
if (!instance)
|
||||
return;
|
||||
|
||||
InstanceScript* instance;
|
||||
EventMap events;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
if (!instance)
|
||||
return;
|
||||
|
||||
instance->SetData(DATA_THE_MAKER, NOT_STARTED);
|
||||
instance->HandleGameObject(instance->GetData64(DATA_DOOR2), true);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
events.ScheduleEvent(EVENT_SPELL_ACID, 15000);
|
||||
events.ScheduleEvent(EVENT_SPELL_EXPLODING, 6000);
|
||||
events.ScheduleEvent(EVENT_SPELL_DOMINATION, 120000);
|
||||
events.ScheduleEvent(EVENT_SPELL_KNOCKDOWN, 10000);
|
||||
|
||||
if (!instance)
|
||||
return;
|
||||
|
||||
instance->SetData(DATA_THE_MAKER, IN_PROGRESS);
|
||||
instance->HandleGameObject(instance->GetData64(DATA_DOOR2), false);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER && urand(0,1))
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
Talk(SAY_DIE);
|
||||
|
||||
if (!instance)
|
||||
return;
|
||||
|
||||
instance->SetData(DATA_THE_MAKER, DONE);
|
||||
instance->HandleGameObject(instance->GetData64(DATA_DOOR2), true);
|
||||
instance->HandleGameObject(instance->GetData64(DATA_DOOR3), true);
|
||||
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.GetEvent())
|
||||
{
|
||||
case EVENT_SPELL_ACID:
|
||||
me->CastSpell(me->GetVictim(), SPELL_ACID_SPRAY, false);
|
||||
events.RepeatEvent(urand(15000, 23000));
|
||||
break;
|
||||
case EVENT_SPELL_EXPLODING:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
me->CastSpell(target, SPELL_EXPLODING_BREAKER, false);
|
||||
events.RepeatEvent(urand(7000, 11000));
|
||||
break;
|
||||
case EVENT_SPELL_DOMINATION:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
me->CastSpell(target, SPELL_DOMINATION, false);
|
||||
events.RepeatEvent(120000);
|
||||
break;
|
||||
case EVENT_SPELL_KNOCKDOWN:
|
||||
me->CastSpell(me->GetVictim(), SPELL_KNOCKDOWN, false);
|
||||
events.RepeatEvent(urand(4000, 12000));
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_the_makerAI(creature);
|
||||
instance->SetData(DATA_THE_MAKER, NOT_STARTED);
|
||||
instance->HandleGameObject(instance->GetData64(DATA_DOOR2), true);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
events.ScheduleEvent(EVENT_SPELL_ACID, 15000);
|
||||
events.ScheduleEvent(EVENT_SPELL_EXPLODING, 6000);
|
||||
events.ScheduleEvent(EVENT_SPELL_DOMINATION, 120000);
|
||||
events.ScheduleEvent(EVENT_SPELL_KNOCKDOWN, 10000);
|
||||
|
||||
if (!instance)
|
||||
return;
|
||||
|
||||
instance->SetData(DATA_THE_MAKER, IN_PROGRESS);
|
||||
instance->HandleGameObject(instance->GetData64(DATA_DOOR2), false);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER && urand(0, 1))
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
Talk(SAY_DIE);
|
||||
|
||||
if (!instance)
|
||||
return;
|
||||
|
||||
instance->SetData(DATA_THE_MAKER, DONE);
|
||||
instance->HandleGameObject(instance->GetData64(DATA_DOOR2), true);
|
||||
instance->HandleGameObject(instance->GetData64(DATA_DOOR3), true);
|
||||
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.GetEvent())
|
||||
{
|
||||
case EVENT_SPELL_ACID:
|
||||
me->CastSpell(me->GetVictim(), SPELL_ACID_SPRAY, false);
|
||||
events.RepeatEvent(urand(15000, 23000));
|
||||
break;
|
||||
case EVENT_SPELL_EXPLODING:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
me->CastSpell(target, SPELL_EXPLODING_BREAKER, false);
|
||||
events.RepeatEvent(urand(7000, 11000));
|
||||
break;
|
||||
case EVENT_SPELL_DOMINATION:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
me->CastSpell(target, SPELL_DOMINATION, false);
|
||||
events.RepeatEvent(120000);
|
||||
break;
|
||||
case EVENT_SPELL_KNOCKDOWN:
|
||||
me->CastSpell(me->GetVictim(), SPELL_KNOCKDOWN, false);
|
||||
events.RepeatEvent(urand(4000, 12000));
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_the_makerAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_the_maker()
|
||||
|
||||
@@ -9,317 +9,317 @@
|
||||
|
||||
class instance_blood_furnace : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
instance_blood_furnace() : InstanceMapScript("instance_blood_furnace", 542) {}
|
||||
public:
|
||||
instance_blood_furnace() : InstanceMapScript("instance_blood_furnace", 542) {}
|
||||
|
||||
struct instance_blood_furnace_InstanceMapScript : public InstanceScript
|
||||
struct instance_blood_furnace_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_blood_furnace_InstanceMapScript(Map* map) : InstanceScript(map) {}
|
||||
|
||||
uint32 _auiEncounter[MAX_ENCOUNTER];
|
||||
uint64 _bossGUIDs[3];
|
||||
uint64 _doorGUIDs[6];
|
||||
uint64 _prisonGUIDs[4];
|
||||
|
||||
std::set<uint64> _prisonersCell[4];
|
||||
|
||||
uint8 _prisonerCounter[4];
|
||||
|
||||
uint64 _broggokLeverGUID;
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
instance_blood_furnace_InstanceMapScript(Map* map) : InstanceScript(map) {}
|
||||
memset(&_auiEncounter, 0, sizeof(_auiEncounter));
|
||||
memset(&_bossGUIDs, 0, sizeof(_bossGUIDs));
|
||||
memset(&_doorGUIDs, 0, sizeof(_doorGUIDs));
|
||||
memset(&_prisonGUIDs, 0, sizeof(_prisonGUIDs));
|
||||
memset(&_prisonerCounter, 0, sizeof(_prisonerCounter));
|
||||
|
||||
uint32 _auiEncounter[MAX_ENCOUNTER];
|
||||
uint64 _bossGUIDs[3];
|
||||
uint64 _doorGUIDs[6];
|
||||
uint64 _prisonGUIDs[4];
|
||||
for (uint8 i = 0; i < 4; ++i)
|
||||
_prisonersCell[i].clear();
|
||||
|
||||
std::set<uint64> _prisonersCell[4];
|
||||
|
||||
uint8 _prisonerCounter[4];
|
||||
|
||||
uint64 _broggokLeverGUID;
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
memset(&_auiEncounter, 0, sizeof(_auiEncounter));
|
||||
memset(&_bossGUIDs, 0, sizeof(_bossGUIDs));
|
||||
memset(&_doorGUIDs, 0, sizeof(_doorGUIDs));
|
||||
memset(&_prisonGUIDs, 0, sizeof(_prisonGUIDs));
|
||||
memset(&_prisonerCounter, 0, sizeof(_prisonerCounter));
|
||||
|
||||
for (uint8 i = 0; i < 4; ++i)
|
||||
_prisonersCell[i].clear();
|
||||
|
||||
_broggokLeverGUID = 0;
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case NPC_THE_MAKER:
|
||||
_bossGUIDs[DATA_THE_MAKER] = creature->GetGUID();
|
||||
break;
|
||||
case NPC_BROGGOK:
|
||||
_bossGUIDs[DATA_BROGGOK] = creature->GetGUID();
|
||||
break;
|
||||
case NPC_KELIDAN:
|
||||
_bossGUIDs[DATA_KELIDAN] = creature->GetGUID();
|
||||
break;
|
||||
case NPC_NASCENT_FEL_ORC:
|
||||
StorePrisoner(creature);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnUnitDeath(Unit* unit)
|
||||
{
|
||||
if (unit && unit->GetTypeId() == TYPEID_UNIT && unit->GetEntry() == NPC_NASCENT_FEL_ORC)
|
||||
PrisonerDied(unit->GetGUID());
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* go)
|
||||
{
|
||||
if (go->GetEntry() == 181766) //Final exit door
|
||||
_doorGUIDs[0] = go->GetGUID();
|
||||
if (go->GetEntry() == 181811) //The Maker Front door
|
||||
_doorGUIDs[1] = go->GetGUID();
|
||||
if (go->GetEntry() == 181812) //The Maker Rear door
|
||||
{
|
||||
_doorGUIDs[2] = go->GetGUID();
|
||||
if (GetData(DATA_THE_MAKER) == DONE)
|
||||
HandleGameObject(go->GetGUID(), true);
|
||||
}
|
||||
if (go->GetEntry() == 181822) //Broggok Front door
|
||||
_doorGUIDs[3] = go->GetGUID();
|
||||
if (go->GetEntry() == 181819) //Broggok Rear door
|
||||
{
|
||||
_doorGUIDs[4] = go->GetGUID();
|
||||
if (GetData(DATA_BROGGOK) == DONE)
|
||||
HandleGameObject(go->GetGUID(), true);
|
||||
}
|
||||
if (go->GetEntry() == 181823) //Kelidan exit door
|
||||
_doorGUIDs[5] = go->GetGUID();
|
||||
|
||||
if (go->GetEntry() == 181821) //Broggok prison cell front right
|
||||
_prisonGUIDs[0] = go->GetGUID();
|
||||
if (go->GetEntry() == 181818) //Broggok prison cell back right
|
||||
_prisonGUIDs[1] = go->GetGUID();
|
||||
if (go->GetEntry() == 181820) //Broggok prison cell front left
|
||||
_prisonGUIDs[2] = go->GetGUID();
|
||||
if (go->GetEntry() == 181817) //Broggok prison cell back left
|
||||
_prisonGUIDs[3] = go->GetGUID();
|
||||
|
||||
if (go->GetEntry() == 181982)
|
||||
_broggokLeverGUID = go->GetGUID(); //Broggok lever
|
||||
}
|
||||
|
||||
uint64 GetData64(uint32 data) const
|
||||
{
|
||||
switch (data)
|
||||
{
|
||||
case DATA_THE_MAKER:
|
||||
case DATA_BROGGOK:
|
||||
case DATA_KELIDAN:
|
||||
return _bossGUIDs[data];
|
||||
|
||||
case DATA_DOOR1:
|
||||
case DATA_DOOR2:
|
||||
case DATA_DOOR3:
|
||||
case DATA_DOOR4:
|
||||
case DATA_DOOR5:
|
||||
case DATA_DOOR6:
|
||||
return _doorGUIDs[data-DATA_DOOR1];
|
||||
|
||||
case DATA_PRISON_CELL1:
|
||||
case DATA_PRISON_CELL2:
|
||||
case DATA_PRISON_CELL3:
|
||||
case DATA_PRISON_CELL4:
|
||||
return _prisonGUIDs[data-DATA_PRISON_CELL1];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 data)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case DATA_THE_MAKER:
|
||||
case DATA_BROGGOK:
|
||||
case DATA_KELIDAN:
|
||||
_auiEncounter[type] = data;
|
||||
if (type == DATA_BROGGOK)
|
||||
UpdateBroggokEvent(data);
|
||||
break;
|
||||
}
|
||||
|
||||
if (data == DONE)
|
||||
SaveToDB();
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "B F " << _auiEncounter[0] << ' ' << _auiEncounter[1] << ' ' << _auiEncounter[2];
|
||||
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 type) const
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case DATA_THE_MAKER:
|
||||
case DATA_BROGGOK:
|
||||
case DATA_KELIDAN:
|
||||
return _auiEncounter[type];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void Load(const char* strIn)
|
||||
{
|
||||
if (!strIn)
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA(strIn);
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
|
||||
std::istringstream loadStream(strIn);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
|
||||
if (dataHead1 == 'B' && dataHead2 == 'F')
|
||||
{
|
||||
loadStream >> _auiEncounter[0] >> _auiEncounter[1] >> _auiEncounter[2];
|
||||
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
if (_auiEncounter[i] == IN_PROGRESS || _auiEncounter[i] == FAIL)
|
||||
_auiEncounter[i] = NOT_STARTED;
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
}
|
||||
|
||||
void UpdateBroggokEvent(uint32 data)
|
||||
{
|
||||
switch (data)
|
||||
{
|
||||
case IN_PROGRESS:
|
||||
ActivateCell(DATA_PRISON_CELL1);
|
||||
HandleGameObject(_doorGUIDs[3], false);
|
||||
break;
|
||||
case NOT_STARTED:
|
||||
ResetPrisons();
|
||||
HandleGameObject(_doorGUIDs[4], false);
|
||||
HandleGameObject(_doorGUIDs[3], true);
|
||||
if (GameObject* lever = instance->GetGameObject(_broggokLeverGUID))
|
||||
lever->Respawn();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void ResetPrisons()
|
||||
{
|
||||
for (uint8 i = 0; i < 4; ++i)
|
||||
{
|
||||
_prisonerCounter[i] = _prisonersCell[i].size();
|
||||
ResetPrisoners(_prisonersCell[i]);
|
||||
HandleGameObject(_prisonGUIDs[i], false);
|
||||
}
|
||||
}
|
||||
|
||||
void ResetPrisoners(std::set<uint64> prisoners)
|
||||
{
|
||||
for (std::set<uint64>::iterator i = prisoners.begin(); i != prisoners.end(); ++i)
|
||||
if (Creature* prisoner = instance->GetCreature(*i))
|
||||
ResetPrisoner(prisoner);
|
||||
}
|
||||
|
||||
void ResetPrisoner(Creature* prisoner)
|
||||
{
|
||||
if (!prisoner->IsAlive())
|
||||
prisoner->Respawn(true);
|
||||
prisoner->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NON_ATTACKABLE);
|
||||
}
|
||||
|
||||
void StorePrisoner(Creature* creature)
|
||||
{
|
||||
float posX = creature->GetPositionX();
|
||||
float posY = creature->GetPositionY();
|
||||
|
||||
if (posX >= 405.0f && posX <= 423.0f)
|
||||
{
|
||||
if (posY >= 106.0f && posY <= 123.0f)
|
||||
{
|
||||
_prisonersCell[0].insert(creature->GetGUID());
|
||||
++_prisonerCounter[0];
|
||||
ResetPrisoner(creature);
|
||||
}
|
||||
else if (posY >= 76.0f && posY <= 91.0f)
|
||||
{
|
||||
_prisonersCell[1].insert(creature->GetGUID());
|
||||
++_prisonerCounter[1];
|
||||
ResetPrisoner(creature);
|
||||
}
|
||||
}
|
||||
else if (posX >= 490.0f && posX <= 506.0f)
|
||||
{
|
||||
if (posY >= 106.0f && posY <= 123.0f)
|
||||
{
|
||||
_prisonersCell[2].insert(creature->GetGUID());
|
||||
++_prisonerCounter[2];
|
||||
ResetPrisoner(creature);
|
||||
}
|
||||
else if (posY >= 76.0f && posY <= 91.0f)
|
||||
{
|
||||
_prisonersCell[3].insert(creature->GetGUID());
|
||||
++_prisonerCounter[3];
|
||||
ResetPrisoner(creature);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PrisonerDied(uint64 guid)
|
||||
{
|
||||
if (_prisonersCell[0].find(guid) != _prisonersCell[0].end() && --_prisonerCounter[0] <= 0)
|
||||
ActivateCell(DATA_PRISON_CELL2);
|
||||
else if (_prisonersCell[1].find(guid) != _prisonersCell[1].end() && --_prisonerCounter[1] <= 0)
|
||||
ActivateCell(DATA_PRISON_CELL3);
|
||||
else if (_prisonersCell[2].find(guid) != _prisonersCell[2].end() && --_prisonerCounter[2] <= 0)
|
||||
ActivateCell(DATA_PRISON_CELL4);
|
||||
else if (_prisonersCell[3].find(guid) != _prisonersCell[3].end() && --_prisonerCounter[3] <= 0)
|
||||
ActivateCell(DATA_DOOR5);
|
||||
}
|
||||
|
||||
void ActivateCell(uint8 id)
|
||||
{
|
||||
switch (id)
|
||||
{
|
||||
case DATA_PRISON_CELL1:
|
||||
case DATA_PRISON_CELL2:
|
||||
case DATA_PRISON_CELL3:
|
||||
case DATA_PRISON_CELL4:
|
||||
HandleGameObject(_prisonGUIDs[id-DATA_PRISON_CELL1], true);
|
||||
ActivatePrisoners(_prisonersCell[id-DATA_PRISON_CELL1]);
|
||||
break;
|
||||
case DATA_DOOR5:
|
||||
HandleGameObject(_doorGUIDs[4], true);
|
||||
if (Creature* broggok = instance->GetCreature(GetData64(DATA_BROGGOK)))
|
||||
broggok->AI()->DoAction(ACTION_ACTIVATE_BROGGOK);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void ActivatePrisoners(std::set<uint64> prisoners)
|
||||
{
|
||||
for (std::set<uint64>::iterator i = prisoners.begin(); i != prisoners.end(); ++i)
|
||||
if (Creature* prisoner = instance->GetCreature(*i))
|
||||
{
|
||||
prisoner->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NON_ATTACKABLE);
|
||||
prisoner->SetInCombatWithZone();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_blood_furnace_InstanceMapScript(map);
|
||||
_broggokLeverGUID = 0;
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case NPC_THE_MAKER:
|
||||
_bossGUIDs[DATA_THE_MAKER] = creature->GetGUID();
|
||||
break;
|
||||
case NPC_BROGGOK:
|
||||
_bossGUIDs[DATA_BROGGOK] = creature->GetGUID();
|
||||
break;
|
||||
case NPC_KELIDAN:
|
||||
_bossGUIDs[DATA_KELIDAN] = creature->GetGUID();
|
||||
break;
|
||||
case NPC_NASCENT_FEL_ORC:
|
||||
StorePrisoner(creature);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnUnitDeath(Unit* unit)
|
||||
{
|
||||
if (unit && unit->GetTypeId() == TYPEID_UNIT && unit->GetEntry() == NPC_NASCENT_FEL_ORC)
|
||||
PrisonerDied(unit->GetGUID());
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* go)
|
||||
{
|
||||
if (go->GetEntry() == 181766) //Final exit door
|
||||
_doorGUIDs[0] = go->GetGUID();
|
||||
if (go->GetEntry() == 181811) //The Maker Front door
|
||||
_doorGUIDs[1] = go->GetGUID();
|
||||
if (go->GetEntry() == 181812) //The Maker Rear door
|
||||
{
|
||||
_doorGUIDs[2] = go->GetGUID();
|
||||
if (GetData(DATA_THE_MAKER) == DONE)
|
||||
HandleGameObject(go->GetGUID(), true);
|
||||
}
|
||||
if (go->GetEntry() == 181822) //Broggok Front door
|
||||
_doorGUIDs[3] = go->GetGUID();
|
||||
if (go->GetEntry() == 181819) //Broggok Rear door
|
||||
{
|
||||
_doorGUIDs[4] = go->GetGUID();
|
||||
if (GetData(DATA_BROGGOK) == DONE)
|
||||
HandleGameObject(go->GetGUID(), true);
|
||||
}
|
||||
if (go->GetEntry() == 181823) //Kelidan exit door
|
||||
_doorGUIDs[5] = go->GetGUID();
|
||||
|
||||
if (go->GetEntry() == 181821) //Broggok prison cell front right
|
||||
_prisonGUIDs[0] = go->GetGUID();
|
||||
if (go->GetEntry() == 181818) //Broggok prison cell back right
|
||||
_prisonGUIDs[1] = go->GetGUID();
|
||||
if (go->GetEntry() == 181820) //Broggok prison cell front left
|
||||
_prisonGUIDs[2] = go->GetGUID();
|
||||
if (go->GetEntry() == 181817) //Broggok prison cell back left
|
||||
_prisonGUIDs[3] = go->GetGUID();
|
||||
|
||||
if (go->GetEntry() == 181982)
|
||||
_broggokLeverGUID = go->GetGUID(); //Broggok lever
|
||||
}
|
||||
|
||||
uint64 GetData64(uint32 data) const
|
||||
{
|
||||
switch (data)
|
||||
{
|
||||
case DATA_THE_MAKER:
|
||||
case DATA_BROGGOK:
|
||||
case DATA_KELIDAN:
|
||||
return _bossGUIDs[data];
|
||||
|
||||
case DATA_DOOR1:
|
||||
case DATA_DOOR2:
|
||||
case DATA_DOOR3:
|
||||
case DATA_DOOR4:
|
||||
case DATA_DOOR5:
|
||||
case DATA_DOOR6:
|
||||
return _doorGUIDs[data - DATA_DOOR1];
|
||||
|
||||
case DATA_PRISON_CELL1:
|
||||
case DATA_PRISON_CELL2:
|
||||
case DATA_PRISON_CELL3:
|
||||
case DATA_PRISON_CELL4:
|
||||
return _prisonGUIDs[data - DATA_PRISON_CELL1];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 data)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case DATA_THE_MAKER:
|
||||
case DATA_BROGGOK:
|
||||
case DATA_KELIDAN:
|
||||
_auiEncounter[type] = data;
|
||||
if (type == DATA_BROGGOK)
|
||||
UpdateBroggokEvent(data);
|
||||
break;
|
||||
}
|
||||
|
||||
if (data == DONE)
|
||||
SaveToDB();
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "B F " << _auiEncounter[0] << ' ' << _auiEncounter[1] << ' ' << _auiEncounter[2];
|
||||
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 type) const
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case DATA_THE_MAKER:
|
||||
case DATA_BROGGOK:
|
||||
case DATA_KELIDAN:
|
||||
return _auiEncounter[type];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void Load(const char* strIn)
|
||||
{
|
||||
if (!strIn)
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA(strIn);
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
|
||||
std::istringstream loadStream(strIn);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
|
||||
if (dataHead1 == 'B' && dataHead2 == 'F')
|
||||
{
|
||||
loadStream >> _auiEncounter[0] >> _auiEncounter[1] >> _auiEncounter[2];
|
||||
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
if (_auiEncounter[i] == IN_PROGRESS || _auiEncounter[i] == FAIL)
|
||||
_auiEncounter[i] = NOT_STARTED;
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
}
|
||||
|
||||
void UpdateBroggokEvent(uint32 data)
|
||||
{
|
||||
switch (data)
|
||||
{
|
||||
case IN_PROGRESS:
|
||||
ActivateCell(DATA_PRISON_CELL1);
|
||||
HandleGameObject(_doorGUIDs[3], false);
|
||||
break;
|
||||
case NOT_STARTED:
|
||||
ResetPrisons();
|
||||
HandleGameObject(_doorGUIDs[4], false);
|
||||
HandleGameObject(_doorGUIDs[3], true);
|
||||
if (GameObject* lever = instance->GetGameObject(_broggokLeverGUID))
|
||||
lever->Respawn();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void ResetPrisons()
|
||||
{
|
||||
for (uint8 i = 0; i < 4; ++i)
|
||||
{
|
||||
_prisonerCounter[i] = _prisonersCell[i].size();
|
||||
ResetPrisoners(_prisonersCell[i]);
|
||||
HandleGameObject(_prisonGUIDs[i], false);
|
||||
}
|
||||
}
|
||||
|
||||
void ResetPrisoners(std::set<uint64> prisoners)
|
||||
{
|
||||
for (std::set<uint64>::iterator i = prisoners.begin(); i != prisoners.end(); ++i)
|
||||
if (Creature* prisoner = instance->GetCreature(*i))
|
||||
ResetPrisoner(prisoner);
|
||||
}
|
||||
|
||||
void ResetPrisoner(Creature* prisoner)
|
||||
{
|
||||
if (!prisoner->IsAlive())
|
||||
prisoner->Respawn(true);
|
||||
prisoner->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NON_ATTACKABLE);
|
||||
}
|
||||
|
||||
void StorePrisoner(Creature* creature)
|
||||
{
|
||||
float posX = creature->GetPositionX();
|
||||
float posY = creature->GetPositionY();
|
||||
|
||||
if (posX >= 405.0f && posX <= 423.0f)
|
||||
{
|
||||
if (posY >= 106.0f && posY <= 123.0f)
|
||||
{
|
||||
_prisonersCell[0].insert(creature->GetGUID());
|
||||
++_prisonerCounter[0];
|
||||
ResetPrisoner(creature);
|
||||
}
|
||||
else if (posY >= 76.0f && posY <= 91.0f)
|
||||
{
|
||||
_prisonersCell[1].insert(creature->GetGUID());
|
||||
++_prisonerCounter[1];
|
||||
ResetPrisoner(creature);
|
||||
}
|
||||
}
|
||||
else if (posX >= 490.0f && posX <= 506.0f)
|
||||
{
|
||||
if (posY >= 106.0f && posY <= 123.0f)
|
||||
{
|
||||
_prisonersCell[2].insert(creature->GetGUID());
|
||||
++_prisonerCounter[2];
|
||||
ResetPrisoner(creature);
|
||||
}
|
||||
else if (posY >= 76.0f && posY <= 91.0f)
|
||||
{
|
||||
_prisonersCell[3].insert(creature->GetGUID());
|
||||
++_prisonerCounter[3];
|
||||
ResetPrisoner(creature);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PrisonerDied(uint64 guid)
|
||||
{
|
||||
if (_prisonersCell[0].find(guid) != _prisonersCell[0].end() && --_prisonerCounter[0] <= 0)
|
||||
ActivateCell(DATA_PRISON_CELL2);
|
||||
else if (_prisonersCell[1].find(guid) != _prisonersCell[1].end() && --_prisonerCounter[1] <= 0)
|
||||
ActivateCell(DATA_PRISON_CELL3);
|
||||
else if (_prisonersCell[2].find(guid) != _prisonersCell[2].end() && --_prisonerCounter[2] <= 0)
|
||||
ActivateCell(DATA_PRISON_CELL4);
|
||||
else if (_prisonersCell[3].find(guid) != _prisonersCell[3].end() && --_prisonerCounter[3] <= 0)
|
||||
ActivateCell(DATA_DOOR5);
|
||||
}
|
||||
|
||||
void ActivateCell(uint8 id)
|
||||
{
|
||||
switch (id)
|
||||
{
|
||||
case DATA_PRISON_CELL1:
|
||||
case DATA_PRISON_CELL2:
|
||||
case DATA_PRISON_CELL3:
|
||||
case DATA_PRISON_CELL4:
|
||||
HandleGameObject(_prisonGUIDs[id - DATA_PRISON_CELL1], true);
|
||||
ActivatePrisoners(_prisonersCell[id - DATA_PRISON_CELL1]);
|
||||
break;
|
||||
case DATA_DOOR5:
|
||||
HandleGameObject(_doorGUIDs[4], true);
|
||||
if (Creature* broggok = instance->GetCreature(GetData64(DATA_BROGGOK)))
|
||||
broggok->AI()->DoAction(ACTION_ACTIVATE_BROGGOK);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void ActivatePrisoners(std::set<uint64> prisoners)
|
||||
{
|
||||
for (std::set<uint64>::iterator i = prisoners.begin(); i != prisoners.end(); ++i)
|
||||
if (Creature* prisoner = instance->GetCreature(*i))
|
||||
{
|
||||
prisoner->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NON_ATTACKABLE);
|
||||
prisoner->SetInCombatWithZone();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_blood_furnace_InstanceMapScript(map);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_instance_blood_furnace()
|
||||
|
||||
@@ -39,134 +39,134 @@ enum Misc
|
||||
|
||||
class boss_omor_the_unscarred : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_omor_the_unscarred() : CreatureScript("boss_omor_the_unscarred") { }
|
||||
public:
|
||||
boss_omor_the_unscarred() : CreatureScript("boss_omor_the_unscarred") { }
|
||||
|
||||
struct boss_omor_the_unscarredAI : public BossAI
|
||||
struct boss_omor_the_unscarredAI : public BossAI
|
||||
{
|
||||
boss_omor_the_unscarredAI(Creature* creature) : BossAI(creature, DATA_OMOR_THE_UNSCARRED)
|
||||
{
|
||||
boss_omor_the_unscarredAI(Creature* creature) : BossAI(creature, DATA_OMOR_THE_UNSCARRED)
|
||||
{
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
Talk(SAY_WIPE);
|
||||
BossAI::Reset();
|
||||
_targetGUID = 0;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
BossAI::EnterCombat(who);
|
||||
|
||||
events.ScheduleEvent(EVENT_SUMMON1, 10000);
|
||||
events.ScheduleEvent(EVENT_SUMMON2, 25000);
|
||||
events.ScheduleEvent(EVENT_TREACHEROUS_AURA, 6000);
|
||||
events.ScheduleEvent(EVENT_DEMONIC_SHIELD, 1000);
|
||||
events.ScheduleEvent(EVENT_ORBITAL_STRIKE, 20000);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit*)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
}
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
Talk(SAY_SUMMON);
|
||||
summons.Summon(summon);
|
||||
summon->SetInCombatWithZone();
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
Talk(SAY_DIE);
|
||||
BossAI::JustDied(killer);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SUMMON1:
|
||||
Talk(SAY_SUMMON);
|
||||
me->CastSpell(me, SPELL_SUMMON_FIENDISH_HOUND, false);
|
||||
break;
|
||||
case EVENT_SUMMON2:
|
||||
me->CastSpell(me, SPELL_SUMMON_FIENDISH_HOUND, false);
|
||||
events.ScheduleEvent(EVENT_SUMMON2, 15000);
|
||||
break;
|
||||
case EVENT_TREACHEROUS_AURA:
|
||||
if (roll_chance_i(33))
|
||||
Talk(SAY_CURSE);
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
me->CastSpell(target, SPELL_TREACHEROUS_AURA, false);
|
||||
events.ScheduleEvent(EVENT_TREACHEROUS_AURA, urand(12000, 18000));
|
||||
break;
|
||||
case EVENT_DEMONIC_SHIELD:
|
||||
if (me->HealthBelowPct(21))
|
||||
{
|
||||
me->CastSpell(me, SPELL_DEMONIC_SHIELD, false);
|
||||
events.ScheduleEvent(EVENT_DEMONIC_SHIELD, 15000);
|
||||
}
|
||||
else
|
||||
events.ScheduleEvent(EVENT_DEMONIC_SHIELD, 1000);
|
||||
break;
|
||||
case EVENT_ORBITAL_STRIKE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 15.0f, true))
|
||||
{
|
||||
_targetGUID = target->GetGUID();
|
||||
me->CastSpell(target, SPELL_ORBITAL_STRIKE, false);
|
||||
events.DelayEvents(5000);
|
||||
events.ScheduleEvent(EVENT_SHADOW_WHIP, 4000);
|
||||
me->GetMotionMaster()->Clear();
|
||||
}
|
||||
events.ScheduleEvent(EVENT_ORBITAL_STRIKE, 20000);
|
||||
break;
|
||||
case EVENT_SHADOW_WHIP:
|
||||
me->GetMotionMaster()->MoveChase(me->GetVictim());
|
||||
if (Unit* target = ObjectAccessor::GetUnit(*me, _targetGUID))
|
||||
me->CastSpell(target, SPELL_SHADOW_WHIP, false);
|
||||
_targetGUID = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!me->GetVictim() || !me->isAttackReady())
|
||||
return;
|
||||
|
||||
if (me->IsWithinMeleeRange(me->GetVictim()))
|
||||
{
|
||||
me->GetMotionMaster()->MoveChase(me->GetVictim());
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
else
|
||||
{
|
||||
me->GetMotionMaster()->Clear();
|
||||
me->CastSpell(me->GetVictim(), SPELL_SHADOW_BOLT, false);
|
||||
me->resetAttackTimer();
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
uint64 _targetGUID;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_omor_the_unscarredAI>(creature);
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
Talk(SAY_WIPE);
|
||||
BossAI::Reset();
|
||||
_targetGUID = 0;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
BossAI::EnterCombat(who);
|
||||
|
||||
events.ScheduleEvent(EVENT_SUMMON1, 10000);
|
||||
events.ScheduleEvent(EVENT_SUMMON2, 25000);
|
||||
events.ScheduleEvent(EVENT_TREACHEROUS_AURA, 6000);
|
||||
events.ScheduleEvent(EVENT_DEMONIC_SHIELD, 1000);
|
||||
events.ScheduleEvent(EVENT_ORBITAL_STRIKE, 20000);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit*)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
}
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
Talk(SAY_SUMMON);
|
||||
summons.Summon(summon);
|
||||
summon->SetInCombatWithZone();
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
Talk(SAY_DIE);
|
||||
BossAI::JustDied(killer);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SUMMON1:
|
||||
Talk(SAY_SUMMON);
|
||||
me->CastSpell(me, SPELL_SUMMON_FIENDISH_HOUND, false);
|
||||
break;
|
||||
case EVENT_SUMMON2:
|
||||
me->CastSpell(me, SPELL_SUMMON_FIENDISH_HOUND, false);
|
||||
events.ScheduleEvent(EVENT_SUMMON2, 15000);
|
||||
break;
|
||||
case EVENT_TREACHEROUS_AURA:
|
||||
if (roll_chance_i(33))
|
||||
Talk(SAY_CURSE);
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
me->CastSpell(target, SPELL_TREACHEROUS_AURA, false);
|
||||
events.ScheduleEvent(EVENT_TREACHEROUS_AURA, urand(12000, 18000));
|
||||
break;
|
||||
case EVENT_DEMONIC_SHIELD:
|
||||
if (me->HealthBelowPct(21))
|
||||
{
|
||||
me->CastSpell(me, SPELL_DEMONIC_SHIELD, false);
|
||||
events.ScheduleEvent(EVENT_DEMONIC_SHIELD, 15000);
|
||||
}
|
||||
else
|
||||
events.ScheduleEvent(EVENT_DEMONIC_SHIELD, 1000);
|
||||
break;
|
||||
case EVENT_ORBITAL_STRIKE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 15.0f, true))
|
||||
{
|
||||
_targetGUID = target->GetGUID();
|
||||
me->CastSpell(target, SPELL_ORBITAL_STRIKE, false);
|
||||
events.DelayEvents(5000);
|
||||
events.ScheduleEvent(EVENT_SHADOW_WHIP, 4000);
|
||||
me->GetMotionMaster()->Clear();
|
||||
}
|
||||
events.ScheduleEvent(EVENT_ORBITAL_STRIKE, 20000);
|
||||
break;
|
||||
case EVENT_SHADOW_WHIP:
|
||||
me->GetMotionMaster()->MoveChase(me->GetVictim());
|
||||
if (Unit* target = ObjectAccessor::GetUnit(*me, _targetGUID))
|
||||
me->CastSpell(target, SPELL_SHADOW_WHIP, false);
|
||||
_targetGUID = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!me->GetVictim() || !me->isAttackReady())
|
||||
return;
|
||||
|
||||
if (me->IsWithinMeleeRange(me->GetVictim()))
|
||||
{
|
||||
me->GetMotionMaster()->MoveChase(me->GetVictim());
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
else
|
||||
{
|
||||
me->GetMotionMaster()->Clear();
|
||||
me->CastSpell(me->GetVictim(), SPELL_SHADOW_BOLT, false);
|
||||
me->resetAttackTimer();
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
uint64 _targetGUID;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_omor_the_unscarredAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_omor_the_unscarred()
|
||||
|
||||
@@ -53,316 +53,316 @@ const Position NazanPos[3] =
|
||||
|
||||
class boss_vazruden_the_herald : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_vazruden_the_herald() : CreatureScript("boss_vazruden_the_herald") { }
|
||||
public:
|
||||
boss_vazruden_the_herald() : CreatureScript("boss_vazruden_the_herald") { }
|
||||
|
||||
struct boss_vazruden_the_heraldAI : public BossAI
|
||||
struct boss_vazruden_the_heraldAI : public BossAI
|
||||
{
|
||||
boss_vazruden_the_heraldAI(Creature* creature) : BossAI(creature, DATA_VAZRUDEN)
|
||||
{
|
||||
boss_vazruden_the_heraldAI(Creature* creature) : BossAI(creature, DATA_VAZRUDEN)
|
||||
{
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
me->SetVisible(true);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->SummonCreature(NPC_HELLFIRE_SENTRY, -1372.56f, 1724.31f, 82.967f, 5.3058f);
|
||||
me->SummonCreature(NPC_HELLFIRE_SENTRY, -1383.39f, 1711.82f, 82.7961f, 5.67232f);
|
||||
}
|
||||
|
||||
void AttackStart(Unit*)
|
||||
{
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
if (summon->GetEntry() != NPC_HELLFIRE_SENTRY)
|
||||
summon->SetInCombatWithZone();
|
||||
}
|
||||
|
||||
void JustDied(Unit*)
|
||||
{
|
||||
instance->SetBossState(DATA_VAZRUDEN, DONE);
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 id)
|
||||
{
|
||||
if (type == POINT_MOTION_TYPE && id == POINT_MIDDLE)
|
||||
{
|
||||
me->SetVisible(false);
|
||||
me->SummonCreature(NPC_VAZRUDEN, me->GetPositionX(), me->GetPositionY(), 81.2f, 5.46f);
|
||||
me->SummonCreature(NPC_NAZAN, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 5.46f);
|
||||
}
|
||||
}
|
||||
|
||||
void SummonedCreatureDies(Creature* summon, Unit*)
|
||||
{
|
||||
summons.Despawn(summon);
|
||||
if (summon->GetEntry() == NPC_HELLFIRE_SENTRY && summons.size() == 0)
|
||||
{
|
||||
Talk(SAY_INTRO);
|
||||
me->GetMotionMaster()->MovePoint(POINT_MIDDLE, -1406.5f, 1746.5f, 85.0f, false);
|
||||
me->setActive(true);
|
||||
}
|
||||
else if (summons.size() == 0)
|
||||
{
|
||||
Unit::Kill(me, me);
|
||||
}
|
||||
}
|
||||
|
||||
void SummonedCreatureDespawn(Creature* summon)
|
||||
{
|
||||
summons.Despawn(summon);
|
||||
if (summon->GetEntry() != NPC_HELLFIRE_SENTRY)
|
||||
BossAI::EnterEvadeMode();
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 /*diff*/)
|
||||
{
|
||||
if (!me->IsVisible() && summons.size() == 0)
|
||||
BossAI::EnterEvadeMode();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_vazruden_the_heraldAI(creature);
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
me->SetVisible(true);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->SummonCreature(NPC_HELLFIRE_SENTRY, -1372.56f, 1724.31f, 82.967f, 5.3058f);
|
||||
me->SummonCreature(NPC_HELLFIRE_SENTRY, -1383.39f, 1711.82f, 82.7961f, 5.67232f);
|
||||
}
|
||||
|
||||
void AttackStart(Unit*)
|
||||
{
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
if (summon->GetEntry() != NPC_HELLFIRE_SENTRY)
|
||||
summon->SetInCombatWithZone();
|
||||
}
|
||||
|
||||
void JustDied(Unit*)
|
||||
{
|
||||
instance->SetBossState(DATA_VAZRUDEN, DONE);
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 id)
|
||||
{
|
||||
if (type == POINT_MOTION_TYPE && id == POINT_MIDDLE)
|
||||
{
|
||||
me->SetVisible(false);
|
||||
me->SummonCreature(NPC_VAZRUDEN, me->GetPositionX(), me->GetPositionY(), 81.2f, 5.46f);
|
||||
me->SummonCreature(NPC_NAZAN, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 5.46f);
|
||||
}
|
||||
}
|
||||
|
||||
void SummonedCreatureDies(Creature* summon, Unit*)
|
||||
{
|
||||
summons.Despawn(summon);
|
||||
if (summon->GetEntry() == NPC_HELLFIRE_SENTRY && summons.size() == 0)
|
||||
{
|
||||
Talk(SAY_INTRO);
|
||||
me->GetMotionMaster()->MovePoint(POINT_MIDDLE, -1406.5f, 1746.5f, 85.0f, false);
|
||||
me->setActive(true);
|
||||
}
|
||||
else if (summons.size() == 0)
|
||||
{
|
||||
Unit::Kill(me, me);
|
||||
}
|
||||
}
|
||||
|
||||
void SummonedCreatureDespawn(Creature* summon)
|
||||
{
|
||||
summons.Despawn(summon);
|
||||
if (summon->GetEntry() != NPC_HELLFIRE_SENTRY)
|
||||
BossAI::EnterEvadeMode();
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 /*diff*/)
|
||||
{
|
||||
if (!me->IsVisible() && summons.size() == 0)
|
||||
BossAI::EnterEvadeMode();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_vazruden_the_heraldAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
class boss_nazan : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_nazan() : CreatureScript("boss_nazan") { }
|
||||
public:
|
||||
boss_nazan() : CreatureScript("boss_nazan") { }
|
||||
|
||||
struct boss_nazanAI : public ScriptedAI
|
||||
struct boss_nazanAI : public ScriptedAI
|
||||
{
|
||||
boss_nazanAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
boss_nazanAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
me->SetCanFly(true);
|
||||
me->SetDisableGravity(true);
|
||||
events.Reset();
|
||||
}
|
||||
|
||||
void EnterEvadeMode()
|
||||
{
|
||||
me->DespawnOrUnsummon(1);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit*)
|
||||
{
|
||||
events.ScheduleEvent(EVENT_CHANGE_POS, 0);
|
||||
events.ScheduleEvent(EVENT_SPELL_FIREBALL, 5000);
|
||||
}
|
||||
|
||||
void AttackStart(Unit* who)
|
||||
{
|
||||
if (me->IsLevitating())
|
||||
me->Attack(who, true);
|
||||
else
|
||||
ScriptedAI::AttackStart(who);
|
||||
}
|
||||
|
||||
void DoAction(int32 param)
|
||||
{
|
||||
if (param == ACTION_FLY_DOWN)
|
||||
{
|
||||
Talk(EMOTE_NAZAN);
|
||||
events.Reset();
|
||||
me->GetMotionMaster()->MovePoint(POINT_MIDDLE, -1406.5f, 1746.5f, 81.2f, false);
|
||||
}
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 id)
|
||||
{
|
||||
if (type == POINT_MOTION_TYPE && id == POINT_MIDDLE)
|
||||
{
|
||||
me->SetDisableGravity(false);
|
||||
me->SetCanFly(false);
|
||||
events.ScheduleEvent(EVENT_RESTORE_COMBAT, 0);
|
||||
events.ScheduleEvent(EVENT_SPELL_CONE_OF_FIRE, 5000);
|
||||
if (IsHeroic())
|
||||
events.ScheduleEvent(EVENT_SPELL_BELLOWING_ROAR, 10000);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPELL_FIREBALL:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
me->CastSpell(target, SPELL_FIREBALL, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_FIREBALL, urand(4000, 6000));
|
||||
break;
|
||||
case EVENT_CHANGE_POS:
|
||||
me->GetMotionMaster()->MovePoint(POINT_FLIGHT, NazanPos[urand(0,2)], false);
|
||||
events.DelayEvents(7000);
|
||||
events.ScheduleEvent(EVENT_CHANGE_POS, 30000);
|
||||
break;
|
||||
case EVENT_RESTORE_COMBAT:
|
||||
me->GetMotionMaster()->MoveChase(me->GetVictim());
|
||||
break;
|
||||
case EVENT_SPELL_CONE_OF_FIRE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_CONE_OF_FIRE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_CONE_OF_FIRE, 12000);
|
||||
break;
|
||||
case EVENT_SPELL_BELLOWING_ROAR:
|
||||
me->CastSpell(me, SPELL_BELLOWING_ROAR, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_BELLOWING_ROAR, 30000);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!me->IsLevitating())
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap events;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_nazanAI(creature);
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
me->SetCanFly(true);
|
||||
me->SetDisableGravity(true);
|
||||
events.Reset();
|
||||
}
|
||||
|
||||
void EnterEvadeMode()
|
||||
{
|
||||
me->DespawnOrUnsummon(1);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit*)
|
||||
{
|
||||
events.ScheduleEvent(EVENT_CHANGE_POS, 0);
|
||||
events.ScheduleEvent(EVENT_SPELL_FIREBALL, 5000);
|
||||
}
|
||||
|
||||
void AttackStart(Unit* who)
|
||||
{
|
||||
if (me->IsLevitating())
|
||||
me->Attack(who, true);
|
||||
else
|
||||
ScriptedAI::AttackStart(who);
|
||||
}
|
||||
|
||||
void DoAction(int32 param)
|
||||
{
|
||||
if (param == ACTION_FLY_DOWN)
|
||||
{
|
||||
Talk(EMOTE_NAZAN);
|
||||
events.Reset();
|
||||
me->GetMotionMaster()->MovePoint(POINT_MIDDLE, -1406.5f, 1746.5f, 81.2f, false);
|
||||
}
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 id)
|
||||
{
|
||||
if (type == POINT_MOTION_TYPE && id == POINT_MIDDLE)
|
||||
{
|
||||
me->SetDisableGravity(false);
|
||||
me->SetCanFly(false);
|
||||
events.ScheduleEvent(EVENT_RESTORE_COMBAT, 0);
|
||||
events.ScheduleEvent(EVENT_SPELL_CONE_OF_FIRE, 5000);
|
||||
if (IsHeroic())
|
||||
events.ScheduleEvent(EVENT_SPELL_BELLOWING_ROAR, 10000);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPELL_FIREBALL:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
me->CastSpell(target, SPELL_FIREBALL, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_FIREBALL, urand(4000, 6000));
|
||||
break;
|
||||
case EVENT_CHANGE_POS:
|
||||
me->GetMotionMaster()->MovePoint(POINT_FLIGHT, NazanPos[urand(0, 2)], false);
|
||||
events.DelayEvents(7000);
|
||||
events.ScheduleEvent(EVENT_CHANGE_POS, 30000);
|
||||
break;
|
||||
case EVENT_RESTORE_COMBAT:
|
||||
me->GetMotionMaster()->MoveChase(me->GetVictim());
|
||||
break;
|
||||
case EVENT_SPELL_CONE_OF_FIRE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_CONE_OF_FIRE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_CONE_OF_FIRE, 12000);
|
||||
break;
|
||||
case EVENT_SPELL_BELLOWING_ROAR:
|
||||
me->CastSpell(me, SPELL_BELLOWING_ROAR, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_BELLOWING_ROAR, 30000);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!me->IsLevitating())
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap events;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_nazanAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
class boss_vazruden : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_vazruden() : CreatureScript("boss_vazruden") { }
|
||||
public:
|
||||
boss_vazruden() : CreatureScript("boss_vazruden") { }
|
||||
|
||||
struct boss_vazrudenAI : public ScriptedAI
|
||||
struct boss_vazrudenAI : public ScriptedAI
|
||||
{
|
||||
boss_vazrudenAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
void Reset()
|
||||
{
|
||||
boss_vazrudenAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
}
|
||||
|
||||
void EnterEvadeMode()
|
||||
{
|
||||
Talk(SAY_WIPE);
|
||||
me->DespawnOrUnsummon(1);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit*)
|
||||
{
|
||||
events.ScheduleEvent(EVENT_AGGRO_TALK, 5000);
|
||||
events.ScheduleEvent(EVENT_SPELL_REVENGE, 4000);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit*)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit*)
|
||||
{
|
||||
me->CastSpell(me, SPELL_CALL_NAZAN, true);
|
||||
Talk(SAY_DIE);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_AGGRO_TALK:
|
||||
Talk(SAY_AGGRO);
|
||||
break;
|
||||
case EVENT_SPELL_REVENGE:
|
||||
me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_REVENGE, SPELL_REVENGE_H), false);
|
||||
events.ScheduleEvent(EVENT_SPELL_REVENGE, 6000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap events;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_vazrudenAI(creature);
|
||||
events.Reset();
|
||||
}
|
||||
|
||||
void EnterEvadeMode()
|
||||
{
|
||||
Talk(SAY_WIPE);
|
||||
me->DespawnOrUnsummon(1);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit*)
|
||||
{
|
||||
events.ScheduleEvent(EVENT_AGGRO_TALK, 5000);
|
||||
events.ScheduleEvent(EVENT_SPELL_REVENGE, 4000);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit*)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit*)
|
||||
{
|
||||
me->CastSpell(me, SPELL_CALL_NAZAN, true);
|
||||
Talk(SAY_DIE);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_AGGRO_TALK:
|
||||
Talk(SAY_AGGRO);
|
||||
break;
|
||||
case EVENT_SPELL_REVENGE:
|
||||
me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_REVENGE, SPELL_REVENGE_H), false);
|
||||
events.ScheduleEvent(EVENT_SPELL_REVENGE, 6000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap events;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_vazrudenAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
class spell_vazruden_fireball : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_vazruden_fireball() : SpellScriptLoader("spell_vazruden_fireball") { }
|
||||
public:
|
||||
spell_vazruden_fireball() : SpellScriptLoader("spell_vazruden_fireball") { }
|
||||
|
||||
class spell_vazruden_fireball_SpellScript : public SpellScript
|
||||
class spell_vazruden_fireball_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_vazruden_fireball_SpellScript);
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
PrepareSpellScript(spell_vazruden_fireball_SpellScript);
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (Unit* target = GetHitUnit())
|
||||
target->CastSpell(target, SPELL_SUMMON_LIQUID_FIRE, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_vazruden_fireball_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_vazruden_fireball_SpellScript();
|
||||
if (Unit* target = GetHitUnit())
|
||||
target->CastSpell(target, SPELL_SUMMON_LIQUID_FIRE, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_vazruden_fireball_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_vazruden_fireball_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_vazruden_call_nazan : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_vazruden_call_nazan() : SpellScriptLoader("spell_vazruden_call_nazan") { }
|
||||
public:
|
||||
spell_vazruden_call_nazan() : SpellScriptLoader("spell_vazruden_call_nazan") { }
|
||||
|
||||
class spell_vazruden_call_nazan_SpellScript : public SpellScript
|
||||
class spell_vazruden_call_nazan_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_vazruden_call_nazan_SpellScript);
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
PrepareSpellScript(spell_vazruden_call_nazan_SpellScript);
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (Unit* target = GetHitUnit())
|
||||
target->GetAI()->DoAction(ACTION_FLY_DOWN);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_vazruden_call_nazan_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_vazruden_call_nazan_SpellScript();
|
||||
if (Unit* target = GetHitUnit())
|
||||
target->GetAI()->DoAction(ACTION_FLY_DOWN);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_vazruden_call_nazan_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_vazruden_call_nazan_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_vazruden_the_herald()
|
||||
|
||||
@@ -36,115 +36,115 @@ enum Misc
|
||||
|
||||
class boss_watchkeeper_gargolmar : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_watchkeeper_gargolmar() : CreatureScript("boss_watchkeeper_gargolmar") { }
|
||||
public:
|
||||
boss_watchkeeper_gargolmar() : CreatureScript("boss_watchkeeper_gargolmar") { }
|
||||
|
||||
struct boss_watchkeeper_gargolmarAI : public BossAI
|
||||
struct boss_watchkeeper_gargolmarAI : public BossAI
|
||||
{
|
||||
boss_watchkeeper_gargolmarAI(Creature* creature) : BossAI(creature, DATA_WATCHKEEPER_GARGOLMAR)
|
||||
{
|
||||
boss_watchkeeper_gargolmarAI(Creature* creature) : BossAI(creature, DATA_WATCHKEEPER_GARGOLMAR)
|
||||
{
|
||||
_taunted = false;
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
BossAI::EnterCombat(who);
|
||||
events.ScheduleEvent(EVENT_MORTAL_WOUND, 5000);
|
||||
events.ScheduleEvent(EVENT_SURGE, 3000);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
|
||||
events.ScheduleEvent(EVENT_RETALIATION, 1000);
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who)
|
||||
{
|
||||
if (!_taunted)
|
||||
{
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
{
|
||||
_taunted = true;
|
||||
Talk(SAY_TAUNT);
|
||||
}
|
||||
}
|
||||
|
||||
BossAI::MoveInLineOfSight(who);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit*)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
Talk(SAY_DIE);
|
||||
BossAI::JustDied(killer);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_MORTAL_WOUND:
|
||||
me->CastSpell(me->GetVictim(), SPELL_MORTAL_WOUND, false);
|
||||
events.ScheduleEvent(EVENT_MORTAL_WOUND, 8000);
|
||||
break;
|
||||
case EVENT_SURGE:
|
||||
Talk(SAY_SURGE);
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_FARTHEST, 0))
|
||||
me->CastSpell(target, SPELL_SURGE, false);
|
||||
events.ScheduleEvent(EVENT_SURGE, 11000);
|
||||
break;
|
||||
case EVENT_RETALIATION:
|
||||
if (me->HealthBelowPct(20))
|
||||
{
|
||||
me->CastSpell(me, SPELL_RETALIATION, false);
|
||||
events.ScheduleEvent(EVENT_RETALIATION, 30000);
|
||||
}
|
||||
else
|
||||
events.ScheduleEvent(EVENT_RETALIATION, 500);
|
||||
break;
|
||||
case EVENT_CHECK_HEALTH:
|
||||
if (me->HealthBelowPct(50))
|
||||
{
|
||||
Talk(SAY_HEAL);
|
||||
std::list<Creature*> clist;
|
||||
me->GetCreaturesWithEntryInRange(clist, 100.0f, NPC_HELLFIRE_WATCHER);
|
||||
for (std::list<Creature*>::const_iterator itr = clist.begin(); itr != clist.end(); ++itr)
|
||||
(*itr)->AI()->SetData(NPC_HELLFIRE_WATCHER, 0);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 500);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
bool _taunted;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_watchkeeper_gargolmarAI(creature);
|
||||
_taunted = false;
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
BossAI::EnterCombat(who);
|
||||
events.ScheduleEvent(EVENT_MORTAL_WOUND, 5000);
|
||||
events.ScheduleEvent(EVENT_SURGE, 3000);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
|
||||
events.ScheduleEvent(EVENT_RETALIATION, 1000);
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who)
|
||||
{
|
||||
if (!_taunted)
|
||||
{
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
{
|
||||
_taunted = true;
|
||||
Talk(SAY_TAUNT);
|
||||
}
|
||||
}
|
||||
|
||||
BossAI::MoveInLineOfSight(who);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit*)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
Talk(SAY_DIE);
|
||||
BossAI::JustDied(killer);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_MORTAL_WOUND:
|
||||
me->CastSpell(me->GetVictim(), SPELL_MORTAL_WOUND, false);
|
||||
events.ScheduleEvent(EVENT_MORTAL_WOUND, 8000);
|
||||
break;
|
||||
case EVENT_SURGE:
|
||||
Talk(SAY_SURGE);
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_FARTHEST, 0))
|
||||
me->CastSpell(target, SPELL_SURGE, false);
|
||||
events.ScheduleEvent(EVENT_SURGE, 11000);
|
||||
break;
|
||||
case EVENT_RETALIATION:
|
||||
if (me->HealthBelowPct(20))
|
||||
{
|
||||
me->CastSpell(me, SPELL_RETALIATION, false);
|
||||
events.ScheduleEvent(EVENT_RETALIATION, 30000);
|
||||
}
|
||||
else
|
||||
events.ScheduleEvent(EVENT_RETALIATION, 500);
|
||||
break;
|
||||
case EVENT_CHECK_HEALTH:
|
||||
if (me->HealthBelowPct(50))
|
||||
{
|
||||
Talk(SAY_HEAL);
|
||||
std::list<Creature*> clist;
|
||||
me->GetCreaturesWithEntryInRange(clist, 100.0f, NPC_HELLFIRE_WATCHER);
|
||||
for (std::list<Creature*>::const_iterator itr = clist.begin(); itr != clist.end(); ++itr)
|
||||
(*itr)->AI()->SetData(NPC_HELLFIRE_WATCHER, 0);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 500);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
bool _taunted;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_watchkeeper_gargolmarAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_watchkeeper_gargolmar()
|
||||
|
||||
@@ -8,79 +8,79 @@
|
||||
|
||||
class instance_ramparts : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
instance_ramparts() : InstanceMapScript("instance_ramparts", 543) { }
|
||||
public:
|
||||
instance_ramparts() : InstanceMapScript("instance_ramparts", 543) { }
|
||||
|
||||
struct instance_ramparts_InstanceMapScript : public InstanceScript
|
||||
struct instance_ramparts_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_ramparts_InstanceMapScript(Map* map) : InstanceScript(map) { }
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
instance_ramparts_InstanceMapScript(Map* map) : InstanceScript(map) { }
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
SetBossNumber(MAX_ENCOUNTERS);
|
||||
felIronChestGUID = 0;
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* go)
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_FEL_IRON_CHEST_NORMAL:
|
||||
case GO_FEL_IRON_CHECT_HEROIC:
|
||||
felIronChestGUID = go->GetGUID();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool SetBossState(uint32 type, EncounterState state)
|
||||
{
|
||||
if (!InstanceScript::SetBossState(type, state))
|
||||
return false;
|
||||
|
||||
if (type == DATA_VAZRUDEN && state == DONE)
|
||||
if (GameObject* chest = instance->GetGameObject(felIronChestGUID))
|
||||
chest->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
return true;
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "H R " << GetBossSaveData();
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void Load(const char* strIn)
|
||||
{
|
||||
if (!strIn)
|
||||
return;
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
std::istringstream loadStream(strIn);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
|
||||
if (dataHead1 == 'H' && dataHead2 == 'R')
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
|
||||
{
|
||||
uint32 tmpState;
|
||||
loadStream >> tmpState;
|
||||
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
|
||||
tmpState = NOT_STARTED;
|
||||
|
||||
SetBossState(i, EncounterState(tmpState));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
uint64 felIronChestGUID;
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_ramparts_InstanceMapScript(map);
|
||||
SetBossNumber(MAX_ENCOUNTERS);
|
||||
felIronChestGUID = 0;
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* go)
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_FEL_IRON_CHEST_NORMAL:
|
||||
case GO_FEL_IRON_CHECT_HEROIC:
|
||||
felIronChestGUID = go->GetGUID();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool SetBossState(uint32 type, EncounterState state)
|
||||
{
|
||||
if (!InstanceScript::SetBossState(type, state))
|
||||
return false;
|
||||
|
||||
if (type == DATA_VAZRUDEN && state == DONE)
|
||||
if (GameObject* chest = instance->GetGameObject(felIronChestGUID))
|
||||
chest->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
return true;
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "H R " << GetBossSaveData();
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void Load(const char* strIn)
|
||||
{
|
||||
if (!strIn)
|
||||
return;
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
std::istringstream loadStream(strIn);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
|
||||
if (dataHead1 == 'H' && dataHead2 == 'R')
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
|
||||
{
|
||||
uint32 tmpState;
|
||||
loadStream >> tmpState;
|
||||
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
|
||||
tmpState = NOT_STARTED;
|
||||
|
||||
SetBossState(i, EncounterState(tmpState));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
uint64 felIronChestGUID;
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_ramparts_InstanceMapScript(map);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_instance_ramparts()
|
||||
|
||||
@@ -85,200 +85,200 @@ private:
|
||||
|
||||
class boss_magtheridon : public CreatureScript
|
||||
{
|
||||
public:
|
||||
public:
|
||||
|
||||
boss_magtheridon() : CreatureScript("boss_magtheridon") { }
|
||||
boss_magtheridon() : CreatureScript("boss_magtheridon") { }
|
||||
|
||||
struct boss_magtheridonAI : public BossAI
|
||||
struct boss_magtheridonAI : public BossAI
|
||||
{
|
||||
boss_magtheridonAI(Creature* creature) : BossAI(creature, TYPE_MAGTHERIDON) { }
|
||||
|
||||
EventMap events2;
|
||||
|
||||
|
||||
void Reset()
|
||||
{
|
||||
boss_magtheridonAI(Creature* creature) : BossAI(creature, TYPE_MAGTHERIDON) { }
|
||||
|
||||
EventMap events2;
|
||||
|
||||
|
||||
void Reset()
|
||||
{
|
||||
events2.Reset();
|
||||
events2.ScheduleEvent(EVENT_RANDOM_TAUNT, 90000);
|
||||
_Reset();
|
||||
me->CastSpell(me, SPELL_SHADOW_CAGE, true);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_IMMUNE_TO_PC);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_RECENTLY_SPOKEN) == 0)
|
||||
{
|
||||
events.ScheduleEvent(EVENT_RECENTLY_SPOKEN, 5000);
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* /*who*/) { }
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
events2.Reset();
|
||||
_EnterCombat();
|
||||
events.ScheduleEvent(EVENT_EMOTE1, 0);
|
||||
events.ScheduleEvent(EVENT_EMOTE2, 60000);
|
||||
events.ScheduleEvent(EVENT_EMOTE3, 120000);
|
||||
events.ScheduleEvent(EVENT_ENTER_COMBAT, 123000);
|
||||
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
events2.Update(diff);
|
||||
switch (events2.ExecuteEvent())
|
||||
{
|
||||
case EVENT_RANDOM_TAUNT:
|
||||
Talk(SAY_TAUNT);
|
||||
events2.ScheduleEvent(EVENT_RANDOM_TAUNT, 90000);
|
||||
break;
|
||||
case EVENT_CHECK_GRASP:
|
||||
if (me->GetAuraCount(SPELL_SHADOW_GRASP_VISUAL) == 5)
|
||||
{
|
||||
Talk(SAY_BANISH);
|
||||
me->InterruptNonMeleeSpells(true);
|
||||
break;
|
||||
}
|
||||
events2.ScheduleEvent(EVENT_CHECK_GRASP, 0);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
if (!UpdateVictim() || !CheckInRoom())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_EMOTE1:
|
||||
Talk(SAY_EMOTE_BEGIN);
|
||||
break;
|
||||
case EVENT_EMOTE2:
|
||||
Talk(SAY_EMOTE_NEARLY);
|
||||
break;
|
||||
case EVENT_EMOTE3:
|
||||
Talk(SAY_EMOTE_FREE);
|
||||
Talk(SAY_FREE);
|
||||
break;
|
||||
case EVENT_ENTER_COMBAT:
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_IMMUNE_TO_PC);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 9000);
|
||||
events.ScheduleEvent(EVENT_BLAST_NOVA, 60000);
|
||||
events.ScheduleEvent(EVENT_BLAZE, 10000);
|
||||
events.ScheduleEvent(EVENT_QUAKE, 40000);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 500);
|
||||
events.ScheduleEvent(EVENT_ENRAGE, 22*MINUTE*IN_MILLISECONDS);
|
||||
|
||||
instance->SetData(DATA_ACTIVATE_CUBES, 1);
|
||||
me->RemoveAurasDueToSpell(SPELL_SHADOW_CAGE);
|
||||
break;
|
||||
case EVENT_CLEAVE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 10000);
|
||||
break;
|
||||
case EVENT_BLAST_NOVA:
|
||||
me->CastSpell(me, SPELL_BLAST_NOVA, false);
|
||||
events.ScheduleEvent(EVENT_BLAST_NOVA, 60000);
|
||||
events.ScheduleEvent(EVENT_CANCEL_GRASP_CHECK, 12000);
|
||||
events2.ScheduleEvent(EVENT_CHECK_GRASP, 0);
|
||||
break;
|
||||
case EVENT_BLAZE:
|
||||
me->CastCustomSpell(SPELL_BLAZE, SPELLVALUE_MAX_TARGETS, 1);
|
||||
events.ScheduleEvent(EVENT_BLAZE, 30000);
|
||||
break;
|
||||
case EVENT_ENRAGE:
|
||||
me->CastSpell(me, SPELL_BERSERK, true);
|
||||
break;
|
||||
case EVENT_CANCEL_GRASP_CHECK:
|
||||
events2.Reset();
|
||||
break;
|
||||
case EVENT_QUAKE:
|
||||
me->CastSpell(me, SPELL_QUAKE, false);
|
||||
events.ScheduleEvent(EVENT_QUAKE, 50000);
|
||||
break;
|
||||
case EVENT_CHECK_HEALTH:
|
||||
if (me->HealthBelowPct(30))
|
||||
{
|
||||
Talk(SAY_PHASE3);
|
||||
events.SetPhase(1);
|
||||
events.DelayEvents(18000);
|
||||
events.ScheduleEvent(EVENT_COLLAPSE_CEIL, 8000);
|
||||
events.ScheduleEvent(EVENT_COLLAPSE_DAMAGE, 15000);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 500);
|
||||
break;
|
||||
case EVENT_COLLAPSE_CEIL:
|
||||
me->CastSpell(me, SPELL_CAMERA_SHAKE, true);
|
||||
instance->SetData(DATA_COLLAPSE, GO_STATE_ACTIVE);
|
||||
break;
|
||||
case EVENT_COLLAPSE_DAMAGE:
|
||||
me->CastSpell(me, SPELL_COLLAPSE_DAMAGE, true);
|
||||
me->resetAttackTimer();
|
||||
events.SetPhase(0);
|
||||
events.ScheduleEvent(EVENT_DEBRIS, 20000);
|
||||
break;
|
||||
case EVENT_DEBRIS:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
|
||||
{
|
||||
target->CastSpell(target, SPELL_DEBRIS_VISUAL, true, nullptr, nullptr, me->GetGUID());
|
||||
me->m_Events.AddEvent(new DealDebrisDamage(*me, target->GetGUID()), me->m_Events.CalculateTime(5000));
|
||||
}
|
||||
events.ScheduleEvent(EVENT_DEBRIS, 20000);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!events.IsInPhase(1))
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_magtheridonAI>(creature);
|
||||
events2.Reset();
|
||||
events2.ScheduleEvent(EVENT_RANDOM_TAUNT, 90000);
|
||||
_Reset();
|
||||
me->CastSpell(me, SPELL_SHADOW_CAGE, true);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_PC);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_RECENTLY_SPOKEN) == 0)
|
||||
{
|
||||
events.ScheduleEvent(EVENT_RECENTLY_SPOKEN, 5000);
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* /*who*/) { }
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
events2.Reset();
|
||||
_EnterCombat();
|
||||
events.ScheduleEvent(EVENT_EMOTE1, 0);
|
||||
events.ScheduleEvent(EVENT_EMOTE2, 60000);
|
||||
events.ScheduleEvent(EVENT_EMOTE3, 120000);
|
||||
events.ScheduleEvent(EVENT_ENTER_COMBAT, 123000);
|
||||
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
events2.Update(diff);
|
||||
switch (events2.ExecuteEvent())
|
||||
{
|
||||
case EVENT_RANDOM_TAUNT:
|
||||
Talk(SAY_TAUNT);
|
||||
events2.ScheduleEvent(EVENT_RANDOM_TAUNT, 90000);
|
||||
break;
|
||||
case EVENT_CHECK_GRASP:
|
||||
if (me->GetAuraCount(SPELL_SHADOW_GRASP_VISUAL) == 5)
|
||||
{
|
||||
Talk(SAY_BANISH);
|
||||
me->InterruptNonMeleeSpells(true);
|
||||
break;
|
||||
}
|
||||
events2.ScheduleEvent(EVENT_CHECK_GRASP, 0);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
if (!UpdateVictim() || !CheckInRoom())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_EMOTE1:
|
||||
Talk(SAY_EMOTE_BEGIN);
|
||||
break;
|
||||
case EVENT_EMOTE2:
|
||||
Talk(SAY_EMOTE_NEARLY);
|
||||
break;
|
||||
case EVENT_EMOTE3:
|
||||
Talk(SAY_EMOTE_FREE);
|
||||
Talk(SAY_FREE);
|
||||
break;
|
||||
case EVENT_ENTER_COMBAT:
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_PC);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 9000);
|
||||
events.ScheduleEvent(EVENT_BLAST_NOVA, 60000);
|
||||
events.ScheduleEvent(EVENT_BLAZE, 10000);
|
||||
events.ScheduleEvent(EVENT_QUAKE, 40000);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 500);
|
||||
events.ScheduleEvent(EVENT_ENRAGE, 22 * MINUTE * IN_MILLISECONDS);
|
||||
|
||||
instance->SetData(DATA_ACTIVATE_CUBES, 1);
|
||||
me->RemoveAurasDueToSpell(SPELL_SHADOW_CAGE);
|
||||
break;
|
||||
case EVENT_CLEAVE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 10000);
|
||||
break;
|
||||
case EVENT_BLAST_NOVA:
|
||||
me->CastSpell(me, SPELL_BLAST_NOVA, false);
|
||||
events.ScheduleEvent(EVENT_BLAST_NOVA, 60000);
|
||||
events.ScheduleEvent(EVENT_CANCEL_GRASP_CHECK, 12000);
|
||||
events2.ScheduleEvent(EVENT_CHECK_GRASP, 0);
|
||||
break;
|
||||
case EVENT_BLAZE:
|
||||
me->CastCustomSpell(SPELL_BLAZE, SPELLVALUE_MAX_TARGETS, 1);
|
||||
events.ScheduleEvent(EVENT_BLAZE, 30000);
|
||||
break;
|
||||
case EVENT_ENRAGE:
|
||||
me->CastSpell(me, SPELL_BERSERK, true);
|
||||
break;
|
||||
case EVENT_CANCEL_GRASP_CHECK:
|
||||
events2.Reset();
|
||||
break;
|
||||
case EVENT_QUAKE:
|
||||
me->CastSpell(me, SPELL_QUAKE, false);
|
||||
events.ScheduleEvent(EVENT_QUAKE, 50000);
|
||||
break;
|
||||
case EVENT_CHECK_HEALTH:
|
||||
if (me->HealthBelowPct(30))
|
||||
{
|
||||
Talk(SAY_PHASE3);
|
||||
events.SetPhase(1);
|
||||
events.DelayEvents(18000);
|
||||
events.ScheduleEvent(EVENT_COLLAPSE_CEIL, 8000);
|
||||
events.ScheduleEvent(EVENT_COLLAPSE_DAMAGE, 15000);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 500);
|
||||
break;
|
||||
case EVENT_COLLAPSE_CEIL:
|
||||
me->CastSpell(me, SPELL_CAMERA_SHAKE, true);
|
||||
instance->SetData(DATA_COLLAPSE, GO_STATE_ACTIVE);
|
||||
break;
|
||||
case EVENT_COLLAPSE_DAMAGE:
|
||||
me->CastSpell(me, SPELL_COLLAPSE_DAMAGE, true);
|
||||
me->resetAttackTimer();
|
||||
events.SetPhase(0);
|
||||
events.ScheduleEvent(EVENT_DEBRIS, 20000);
|
||||
break;
|
||||
case EVENT_DEBRIS:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
|
||||
{
|
||||
target->CastSpell(target, SPELL_DEBRIS_VISUAL, true, nullptr, nullptr, me->GetGUID());
|
||||
me->m_Events.AddEvent(new DealDebrisDamage(*me, target->GetGUID()), me->m_Events.CalculateTime(5000));
|
||||
}
|
||||
events.ScheduleEvent(EVENT_DEBRIS, 20000);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!events.IsInPhase(1))
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_magtheridonAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
class spell_magtheridon_blaze : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_magtheridon_blaze() : SpellScriptLoader("spell_magtheridon_blaze") { }
|
||||
public:
|
||||
spell_magtheridon_blaze() : SpellScriptLoader("spell_magtheridon_blaze") { }
|
||||
|
||||
class spell_magtheridon_blaze_SpellScript : public SpellScript
|
||||
class spell_magtheridon_blaze_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_magtheridon_blaze_SpellScript);
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
PrepareSpellScript(spell_magtheridon_blaze_SpellScript);
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (Unit* target = GetHitUnit())
|
||||
target->CastSpell(target, SPELL_BLAZE_SUMMON, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_magtheridon_blaze_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_magtheridon_blaze_SpellScript();
|
||||
if (Unit* target = GetHitUnit())
|
||||
target->CastSpell(target, SPELL_BLAZE_SUMMON, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_magtheridon_blaze_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_magtheridon_blaze_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_magtheridon_shadow_grasp : public SpellScriptLoader
|
||||
@@ -289,12 +289,12 @@ public:
|
||||
class spell_magtheridon_shadow_grasp_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_magtheridon_shadow_grasp_AuraScript)
|
||||
|
||||
|
||||
void HandleDummyApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
GetUnitOwner()->CastSpell((Unit*)NULL, SPELL_SHADOW_GRASP_VISUAL, false);
|
||||
}
|
||||
|
||||
|
||||
void HandleDummyRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
GetUnitOwner()->InterruptNonMeleeSpells(true);
|
||||
|
||||
@@ -21,203 +21,203 @@ MinionData const minionData[] =
|
||||
|
||||
class instance_magtheridons_lair : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
instance_magtheridons_lair() : InstanceMapScript("instance_magtheridons_lair", 544) { }
|
||||
public:
|
||||
instance_magtheridons_lair() : InstanceMapScript("instance_magtheridons_lair", 544) { }
|
||||
|
||||
struct instance_magtheridons_lair_InstanceMapScript : public InstanceScript
|
||||
struct instance_magtheridons_lair_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_magtheridons_lair_InstanceMapScript(Map* map) : InstanceScript(map)
|
||||
{
|
||||
instance_magtheridons_lair_InstanceMapScript(Map* map) : InstanceScript(map)
|
||||
{
|
||||
SetBossNumber(MAX_ENCOUNTER);
|
||||
LoadDoorData(doorData);
|
||||
LoadMinionData(minionData);
|
||||
}
|
||||
SetBossNumber(MAX_ENCOUNTER);
|
||||
LoadDoorData(doorData);
|
||||
LoadMinionData(minionData);
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
_wardersSet.clear();
|
||||
_cubesSet.clear();
|
||||
_columnSet.clear();
|
||||
_magtheridonGUID = 0;
|
||||
}
|
||||
void Initialize()
|
||||
{
|
||||
_wardersSet.clear();
|
||||
_cubesSet.clear();
|
||||
_columnSet.clear();
|
||||
_magtheridonGUID = 0;
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
case NPC_MAGTHERIDON:
|
||||
_magtheridonGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_HELLFIRE_CHANNELER:
|
||||
AddMinion(creature, true);
|
||||
break;
|
||||
case NPC_HELLFIRE_WARDER:
|
||||
_wardersSet.insert(creature->GetGUID());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnCreatureRemove(Creature* creature)
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case NPC_HELLFIRE_CHANNELER:
|
||||
AddMinion(creature, false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* go)
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_MAGTHERIDON_DOORS:
|
||||
AddDoor(go, true);
|
||||
break;
|
||||
case GO_MANTICRON_CUBE:
|
||||
_cubesSet.insert(go->GetGUID());
|
||||
break;
|
||||
case GO_MAGTHERIDON_HALL:
|
||||
case GO_MAGTHERIDON_COLUMN0:
|
||||
case GO_MAGTHERIDON_COLUMN1:
|
||||
case GO_MAGTHERIDON_COLUMN2:
|
||||
case GO_MAGTHERIDON_COLUMN3:
|
||||
case GO_MAGTHERIDON_COLUMN4:
|
||||
case GO_MAGTHERIDON_COLUMN5:
|
||||
_columnSet.insert(go->GetGUID());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectRemove(GameObject* go)
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_MAGTHERIDON_DOORS:
|
||||
AddDoor(go, false);
|
||||
break;
|
||||
case GO_MANTICRON_CUBE:
|
||||
_cubesSet.erase(go->GetGUID());
|
||||
break;
|
||||
case GO_MAGTHERIDON_HALL:
|
||||
case GO_MAGTHERIDON_COLUMN0:
|
||||
case GO_MAGTHERIDON_COLUMN1:
|
||||
case GO_MAGTHERIDON_COLUMN2:
|
||||
case GO_MAGTHERIDON_COLUMN3:
|
||||
case GO_MAGTHERIDON_COLUMN4:
|
||||
case GO_MAGTHERIDON_COLUMN5:
|
||||
_columnSet.erase(go->GetGUID());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool SetBossState(uint32 id, EncounterState state)
|
||||
{
|
||||
if (!InstanceScript::SetBossState(id, state))
|
||||
return false;
|
||||
|
||||
if (id == TYPE_MAGTHERIDON)
|
||||
{
|
||||
if (state == IN_PROGRESS)
|
||||
{
|
||||
case NPC_MAGTHERIDON:
|
||||
_magtheridonGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_HELLFIRE_CHANNELER:
|
||||
AddMinion(creature, true);
|
||||
break;
|
||||
case NPC_HELLFIRE_WARDER:
|
||||
_wardersSet.insert(creature->GetGUID());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnCreatureRemove(Creature* creature)
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case NPC_HELLFIRE_CHANNELER:
|
||||
AddMinion(creature, false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* go)
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_MAGTHERIDON_DOORS:
|
||||
AddDoor(go, true);
|
||||
break;
|
||||
case GO_MANTICRON_CUBE:
|
||||
_cubesSet.insert(go->GetGUID());
|
||||
break;
|
||||
case GO_MAGTHERIDON_HALL:
|
||||
case GO_MAGTHERIDON_COLUMN0:
|
||||
case GO_MAGTHERIDON_COLUMN1:
|
||||
case GO_MAGTHERIDON_COLUMN2:
|
||||
case GO_MAGTHERIDON_COLUMN3:
|
||||
case GO_MAGTHERIDON_COLUMN4:
|
||||
case GO_MAGTHERIDON_COLUMN5:
|
||||
_columnSet.insert(go->GetGUID());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectRemove(GameObject* go)
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_MAGTHERIDON_DOORS:
|
||||
AddDoor(go, false);
|
||||
break;
|
||||
case GO_MANTICRON_CUBE:
|
||||
_cubesSet.erase(go->GetGUID());
|
||||
break;
|
||||
case GO_MAGTHERIDON_HALL:
|
||||
case GO_MAGTHERIDON_COLUMN0:
|
||||
case GO_MAGTHERIDON_COLUMN1:
|
||||
case GO_MAGTHERIDON_COLUMN2:
|
||||
case GO_MAGTHERIDON_COLUMN3:
|
||||
case GO_MAGTHERIDON_COLUMN4:
|
||||
case GO_MAGTHERIDON_COLUMN5:
|
||||
_columnSet.erase(go->GetGUID());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool SetBossState(uint32 id, EncounterState state)
|
||||
{
|
||||
if (!InstanceScript::SetBossState(id, state))
|
||||
return false;
|
||||
|
||||
if (id == TYPE_MAGTHERIDON)
|
||||
{
|
||||
if (state == IN_PROGRESS)
|
||||
{
|
||||
for (std::set<uint64>::const_iterator itr = _wardersSet.begin(); itr != _wardersSet.end(); ++itr)
|
||||
if (Creature* warder = instance->GetCreature(*itr))
|
||||
if (warder->IsAlive())
|
||||
{
|
||||
warder->InterruptNonMeleeSpells(true);
|
||||
warder->SetInCombatWithZone();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (std::set<uint64>::const_iterator itr = _cubesSet.begin(); itr != _cubesSet.end(); ++itr)
|
||||
if (GameObject* cube = instance->GetGameObject(*itr))
|
||||
cube->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
|
||||
if (state == NOT_STARTED)
|
||||
SetData(DATA_COLLAPSE, GO_READY);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 data)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case DATA_CHANNELER_COMBAT:
|
||||
if (GetBossState(TYPE_MAGTHERIDON) != IN_PROGRESS)
|
||||
if (Creature* magtheridon = instance->GetCreature(_magtheridonGUID))
|
||||
magtheridon->SetInCombatWithZone();
|
||||
break;
|
||||
case DATA_ACTIVATE_CUBES:
|
||||
for (std::set<uint64>::const_iterator itr = _cubesSet.begin(); itr != _cubesSet.end(); ++itr)
|
||||
if (GameObject* cube = instance->GetGameObject(*itr))
|
||||
cube->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
break;
|
||||
case DATA_COLLAPSE:
|
||||
for (std::set<uint64>::const_iterator itr = _columnSet.begin(); itr != _columnSet.end(); ++itr)
|
||||
if (GameObject* column = instance->GetGameObject(*itr))
|
||||
column->SetGoState(GOState(data));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "M L " << GetBossSaveData();
|
||||
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void Load(char const* str)
|
||||
{
|
||||
if (!str)
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA(str);
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
|
||||
std::istringstream loadStream(str);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
|
||||
if (dataHead1 == 'M' && dataHead2 == 'L')
|
||||
{
|
||||
for (uint32 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
{
|
||||
uint32 tmpState;
|
||||
loadStream >> tmpState;
|
||||
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
|
||||
tmpState = NOT_STARTED;
|
||||
SetBossState(i, EncounterState(tmpState));
|
||||
}
|
||||
for (std::set<uint64>::const_iterator itr = _wardersSet.begin(); itr != _wardersSet.end(); ++itr)
|
||||
if (Creature* warder = instance->GetCreature(*itr))
|
||||
if (warder->IsAlive())
|
||||
{
|
||||
warder->InterruptNonMeleeSpells(true);
|
||||
warder->SetInCombatWithZone();
|
||||
}
|
||||
}
|
||||
else
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
{
|
||||
for (std::set<uint64>::const_iterator itr = _cubesSet.begin(); itr != _cubesSet.end(); ++itr)
|
||||
if (GameObject* cube = instance->GetGameObject(*itr))
|
||||
cube->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
if (state == NOT_STARTED)
|
||||
SetData(DATA_COLLAPSE, GO_READY);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 data)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case DATA_CHANNELER_COMBAT:
|
||||
if (GetBossState(TYPE_MAGTHERIDON) != IN_PROGRESS)
|
||||
if (Creature* magtheridon = instance->GetCreature(_magtheridonGUID))
|
||||
magtheridon->SetInCombatWithZone();
|
||||
break;
|
||||
case DATA_ACTIVATE_CUBES:
|
||||
for (std::set<uint64>::const_iterator itr = _cubesSet.begin(); itr != _cubesSet.end(); ++itr)
|
||||
if (GameObject* cube = instance->GetGameObject(*itr))
|
||||
cube->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
break;
|
||||
case DATA_COLLAPSE:
|
||||
for (std::set<uint64>::const_iterator itr = _columnSet.begin(); itr != _columnSet.end(); ++itr)
|
||||
if (GameObject* column = instance->GetGameObject(*itr))
|
||||
column->SetGoState(GOState(data));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "M L " << GetBossSaveData();
|
||||
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void Load(char const* str)
|
||||
{
|
||||
if (!str)
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
}
|
||||
|
||||
private:
|
||||
uint64 _magtheridonGUID;
|
||||
std::set<uint64> _wardersSet;
|
||||
std::set<uint64> _cubesSet;
|
||||
std::set<uint64> _columnSet;
|
||||
OUT_LOAD_INST_DATA(str);
|
||||
|
||||
};
|
||||
char dataHead1, dataHead2;
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_magtheridons_lair_InstanceMapScript(map);
|
||||
std::istringstream loadStream(str);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
|
||||
if (dataHead1 == 'M' && dataHead2 == 'L')
|
||||
{
|
||||
for (uint32 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
{
|
||||
uint32 tmpState;
|
||||
loadStream >> tmpState;
|
||||
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
|
||||
tmpState = NOT_STARTED;
|
||||
SetBossState(i, EncounterState(tmpState));
|
||||
}
|
||||
}
|
||||
else
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
}
|
||||
|
||||
private:
|
||||
uint64 _magtheridonGUID;
|
||||
std::set<uint64> _wardersSet;
|
||||
std::set<uint64> _cubesSet;
|
||||
std::set<uint64> _columnSet;
|
||||
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_magtheridons_lair_InstanceMapScript(map);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_instance_magtheridons_lair()
|
||||
|
||||
@@ -48,263 +48,263 @@ enum eGrandWarlockNethekurse
|
||||
|
||||
class boss_grand_warlock_nethekurse : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_grand_warlock_nethekurse() : CreatureScript("boss_grand_warlock_nethekurse") { }
|
||||
public:
|
||||
boss_grand_warlock_nethekurse() : CreatureScript("boss_grand_warlock_nethekurse") { }
|
||||
|
||||
struct boss_grand_warlock_nethekurseAI : public BossAI
|
||||
struct boss_grand_warlock_nethekurseAI : public BossAI
|
||||
{
|
||||
boss_grand_warlock_nethekurseAI(Creature* creature) : BossAI(creature, DATA_NETHEKURSE) { }
|
||||
|
||||
EventMap events2;
|
||||
void Reset()
|
||||
{
|
||||
boss_grand_warlock_nethekurseAI(Creature* creature) : BossAI(creature, DATA_NETHEKURSE) { }
|
||||
|
||||
EventMap events2;
|
||||
void Reset()
|
||||
{
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
EventStage = EVENT_STAGE_NONE;
|
||||
PeonEngagedCount = 0;
|
||||
PeonKilledCount = 0;
|
||||
_Reset();
|
||||
SummonMinions();
|
||||
events2.Reset();
|
||||
}
|
||||
|
||||
void SummonMinions()
|
||||
{
|
||||
me->SummonCreature(NPC_FEL_ORC_CONVERT, 172.556f, 258.227f, -13.191f, 1.41189f);
|
||||
me->SummonCreature(NPC_FEL_ORC_CONVERT, 165.181f, 261.511f, -13.1926f, 0.942743f);
|
||||
me->SummonCreature(NPC_FEL_ORC_CONVERT, 182.482f, 258.635f, -13.1788f, 1.70929f);
|
||||
me->SummonCreature(NPC_FEL_ORC_CONVERT, 189.616f, 259.866f, -13.1966f, 1.95748f);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
Talk(SAY_DIE);
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void SetData(uint32 data, uint32 value)
|
||||
{
|
||||
if (data != SETDATA_DATA)
|
||||
return;
|
||||
|
||||
switch (value)
|
||||
{
|
||||
case SETDATA_PEON_AGGRO:
|
||||
if (PeonEngagedCount >= 4)
|
||||
return;
|
||||
|
||||
if (EventStage < EVENT_STAGE_TAUNT)
|
||||
Talk(SAY_PEON_ATTACKED);
|
||||
break;
|
||||
case SETDATA_PEON_DEATH:
|
||||
if (PeonKilledCount >= 4)
|
||||
return;
|
||||
|
||||
if (EventStage < EVENT_STAGE_TAUNT)
|
||||
Talk(SAY_PEON_DIES);
|
||||
|
||||
if (++PeonKilledCount == 4)
|
||||
events2.ScheduleEvent(EVENT_START_ATTACK, 5000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void AttackStart(Unit* who)
|
||||
{
|
||||
if (EventStage < EVENT_STAGE_MAIN)
|
||||
return;
|
||||
|
||||
if (me->Attack(who, true))
|
||||
{
|
||||
DoStartMovement(who);
|
||||
}
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
summon->SetReactState(REACT_DEFENSIVE);
|
||||
summon->SetRegeneratingHealth(false);
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who)
|
||||
{
|
||||
if (me->IsWithinDistInMap(who, 30.0f))
|
||||
{
|
||||
if (who->GetTypeId() != TYPEID_PLAYER)
|
||||
return;
|
||||
|
||||
if (EventStage == EVENT_STAGE_NONE && PeonKilledCount < 4)
|
||||
{
|
||||
events2.ScheduleEvent(EVENT_INTRO, 90000);
|
||||
Talk(SAY_INTRO);
|
||||
EventStage = EVENT_STAGE_INTRO;
|
||||
instance->SetBossState(DATA_NETHEKURSE, IN_PROGRESS);
|
||||
me->SetInCombatWithZone();
|
||||
}
|
||||
else if (PeonKilledCount >= 4)
|
||||
{
|
||||
events2.ScheduleEvent(EVENT_START_ATTACK, 1000);
|
||||
instance->SetBossState(DATA_NETHEKURSE, IN_PROGRESS);
|
||||
me->SetInCombatWithZone();
|
||||
}
|
||||
}
|
||||
|
||||
if (EventStage < EVENT_STAGE_MAIN)
|
||||
return;
|
||||
|
||||
ScriptedAI::MoveInLineOfSight(who);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
events2.Update(diff);
|
||||
uint32 eventId = events2.ExecuteEvent();
|
||||
|
||||
if (EventStage < EVENT_STAGE_MAIN && instance->GetBossState(DATA_NETHEKURSE) == IN_PROGRESS)
|
||||
{
|
||||
if (eventId == EVENT_INTRO)
|
||||
{
|
||||
Talk(SAY_TAUNT);
|
||||
EventStage = EVENT_STAGE_TAUNT;
|
||||
me->CastSpell(me, SPELL_SHADOW_SEAR, false);
|
||||
}
|
||||
else if (eventId == EVENT_START_ATTACK)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
EventStage = EVENT_STAGE_MAIN;
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
if (Unit* target = me->SelectNearestPlayer(50.0f))
|
||||
AttackStart(target);
|
||||
|
||||
events.ScheduleEvent(EVENT_SPELL_DEATH_COIL, 20000);
|
||||
events.ScheduleEvent(EVENT_SPELL_SHADOW_FISSURE, 8000);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (EventStage < EVENT_STAGE_MAIN || me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPELL_SHADOW_FISSURE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
me->CastSpell(target, SPELL_SHADOW_FISSURE, false);
|
||||
events.RescheduleEvent(EVENT_SPELL_SHADOW_FISSURE, urand(7500, 10000));
|
||||
break;
|
||||
case EVENT_SPELL_DEATH_COIL:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
me->CastSpell(target, DUNGEON_MODE(SPELL_DEATH_COIL_N, SPELL_DEATH_COIL_H), false);
|
||||
events.RescheduleEvent(EVENT_SPELL_DEATH_COIL, urand(15000, 20000));
|
||||
break;
|
||||
case EVENT_SPELL_CLEAVE:
|
||||
me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_SHADOW_CLEAVE_N, SPELL_SHADOW_SLAM_H), false);
|
||||
events.RescheduleEvent(EVENT_SPELL_CLEAVE, urand(6000, 8000));
|
||||
break;
|
||||
case EVENT_CHECK_HEALTH:
|
||||
if (me->HealthBelowPct(21))
|
||||
{
|
||||
events.Reset();
|
||||
me->CastSpell(me, SPELL_DARK_SPIN, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
events.RescheduleEvent(EVENT_CHECK_HEALTH, 1000);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (!me->HealthBelowPct(21))
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
uint32 PeonEngagedCount;
|
||||
uint32 PeonKilledCount;
|
||||
uint32 EventStage;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_grand_warlock_nethekurseAI>(creature);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
EventStage = EVENT_STAGE_NONE;
|
||||
PeonEngagedCount = 0;
|
||||
PeonKilledCount = 0;
|
||||
_Reset();
|
||||
SummonMinions();
|
||||
events2.Reset();
|
||||
}
|
||||
|
||||
void SummonMinions()
|
||||
{
|
||||
me->SummonCreature(NPC_FEL_ORC_CONVERT, 172.556f, 258.227f, -13.191f, 1.41189f);
|
||||
me->SummonCreature(NPC_FEL_ORC_CONVERT, 165.181f, 261.511f, -13.1926f, 0.942743f);
|
||||
me->SummonCreature(NPC_FEL_ORC_CONVERT, 182.482f, 258.635f, -13.1788f, 1.70929f);
|
||||
me->SummonCreature(NPC_FEL_ORC_CONVERT, 189.616f, 259.866f, -13.1966f, 1.95748f);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
Talk(SAY_DIE);
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void SetData(uint32 data, uint32 value)
|
||||
{
|
||||
if (data != SETDATA_DATA)
|
||||
return;
|
||||
|
||||
switch (value)
|
||||
{
|
||||
case SETDATA_PEON_AGGRO:
|
||||
if (PeonEngagedCount >= 4)
|
||||
return;
|
||||
|
||||
if (EventStage < EVENT_STAGE_TAUNT)
|
||||
Talk(SAY_PEON_ATTACKED);
|
||||
break;
|
||||
case SETDATA_PEON_DEATH:
|
||||
if (PeonKilledCount >= 4)
|
||||
return;
|
||||
|
||||
if (EventStage < EVENT_STAGE_TAUNT)
|
||||
Talk(SAY_PEON_DIES);
|
||||
|
||||
if (++PeonKilledCount == 4)
|
||||
events2.ScheduleEvent(EVENT_START_ATTACK, 5000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void AttackStart(Unit* who)
|
||||
{
|
||||
if (EventStage < EVENT_STAGE_MAIN)
|
||||
return;
|
||||
|
||||
if (me->Attack(who, true))
|
||||
{
|
||||
DoStartMovement(who);
|
||||
}
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
summon->SetReactState(REACT_DEFENSIVE);
|
||||
summon->SetRegeneratingHealth(false);
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who)
|
||||
{
|
||||
if (me->IsWithinDistInMap(who, 30.0f))
|
||||
{
|
||||
if (who->GetTypeId() != TYPEID_PLAYER)
|
||||
return;
|
||||
|
||||
if (EventStage == EVENT_STAGE_NONE && PeonKilledCount < 4)
|
||||
{
|
||||
events2.ScheduleEvent(EVENT_INTRO, 90000);
|
||||
Talk(SAY_INTRO);
|
||||
EventStage = EVENT_STAGE_INTRO;
|
||||
instance->SetBossState(DATA_NETHEKURSE, IN_PROGRESS);
|
||||
me->SetInCombatWithZone();
|
||||
}
|
||||
else if (PeonKilledCount >= 4)
|
||||
{
|
||||
events2.ScheduleEvent(EVENT_START_ATTACK, 1000);
|
||||
instance->SetBossState(DATA_NETHEKURSE, IN_PROGRESS);
|
||||
me->SetInCombatWithZone();
|
||||
}
|
||||
}
|
||||
|
||||
if (EventStage < EVENT_STAGE_MAIN)
|
||||
return;
|
||||
|
||||
ScriptedAI::MoveInLineOfSight(who);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
events2.Update(diff);
|
||||
uint32 eventId = events2.ExecuteEvent();
|
||||
|
||||
if (EventStage < EVENT_STAGE_MAIN && instance->GetBossState(DATA_NETHEKURSE) == IN_PROGRESS)
|
||||
{
|
||||
if (eventId == EVENT_INTRO)
|
||||
{
|
||||
Talk(SAY_TAUNT);
|
||||
EventStage = EVENT_STAGE_TAUNT;
|
||||
me->CastSpell(me, SPELL_SHADOW_SEAR, false);
|
||||
}
|
||||
else if (eventId == EVENT_START_ATTACK)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
EventStage = EVENT_STAGE_MAIN;
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
if (Unit* target = me->SelectNearestPlayer(50.0f))
|
||||
AttackStart(target);
|
||||
|
||||
events.ScheduleEvent(EVENT_SPELL_DEATH_COIL, 20000);
|
||||
events.ScheduleEvent(EVENT_SPELL_SHADOW_FISSURE, 8000);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (EventStage < EVENT_STAGE_MAIN || me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPELL_SHADOW_FISSURE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
me->CastSpell(target, SPELL_SHADOW_FISSURE, false);
|
||||
events.RescheduleEvent(EVENT_SPELL_SHADOW_FISSURE, urand(7500, 10000));
|
||||
break;
|
||||
case EVENT_SPELL_DEATH_COIL:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
me->CastSpell(target, DUNGEON_MODE(SPELL_DEATH_COIL_N, SPELL_DEATH_COIL_H), false);
|
||||
events.RescheduleEvent(EVENT_SPELL_DEATH_COIL, urand(15000, 20000));
|
||||
break;
|
||||
case EVENT_SPELL_CLEAVE:
|
||||
me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_SHADOW_CLEAVE_N, SPELL_SHADOW_SLAM_H), false);
|
||||
events.RescheduleEvent(EVENT_SPELL_CLEAVE, urand(6000, 8000));
|
||||
break;
|
||||
case EVENT_CHECK_HEALTH:
|
||||
if (me->HealthBelowPct(21))
|
||||
{
|
||||
events.Reset();
|
||||
me->CastSpell(me, SPELL_DARK_SPIN, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
events.RescheduleEvent(EVENT_CHECK_HEALTH, 1000);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (!me->HealthBelowPct(21))
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
uint32 PeonEngagedCount;
|
||||
uint32 PeonKilledCount;
|
||||
uint32 EventStage;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_grand_warlock_nethekurseAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
class spell_tsh_shadow_sear : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_tsh_shadow_sear() : SpellScriptLoader("spell_tsh_shadow_sear") { }
|
||||
public:
|
||||
spell_tsh_shadow_sear() : SpellScriptLoader("spell_tsh_shadow_sear") { }
|
||||
|
||||
class spell_tsh_shadow_sear_AuraScript : public AuraScript
|
||||
class spell_tsh_shadow_sear_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_tsh_shadow_sear_AuraScript);
|
||||
|
||||
void CalculateDamageAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
|
||||
{
|
||||
PrepareAuraScript(spell_tsh_shadow_sear_AuraScript);
|
||||
|
||||
void CalculateDamageAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
|
||||
{
|
||||
amount = 1000;
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_tsh_shadow_sear_AuraScript::CalculateDamageAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_tsh_shadow_sear_AuraScript();
|
||||
amount = 1000;
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_tsh_shadow_sear_AuraScript::CalculateDamageAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_tsh_shadow_sear_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_tsh_shadow_bolt : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_tsh_shadow_bolt() : SpellScriptLoader("spell_tsh_shadow_bolt") { }
|
||||
public:
|
||||
spell_tsh_shadow_bolt() : SpellScriptLoader("spell_tsh_shadow_bolt") { }
|
||||
|
||||
class spell_tsh_shadow_bolt_SpellScript : public SpellScript
|
||||
class spell_tsh_shadow_bolt_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_tsh_shadow_bolt_SpellScript);
|
||||
|
||||
void SelectRandomPlayer(WorldObject*& target)
|
||||
{
|
||||
PrepareSpellScript(spell_tsh_shadow_bolt_SpellScript);
|
||||
|
||||
void SelectRandomPlayer(WorldObject*& target)
|
||||
if (Creature* caster = GetCaster()->ToCreature())
|
||||
{
|
||||
if (Creature* caster = GetCaster()->ToCreature())
|
||||
{
|
||||
std::list<Player*> playerList;
|
||||
Map::PlayerList const &players = caster->GetMap()->GetPlayers();
|
||||
for (auto itr = players.begin(); itr != players.end(); ++itr)
|
||||
if (Player* player = itr->GetSource()->ToPlayer())
|
||||
if (player->IsWithinDist(caster, 100.0f) && player->IsAlive())
|
||||
playerList.push_back(player);
|
||||
std::list<Player*> playerList;
|
||||
Map::PlayerList const& players = caster->GetMap()->GetPlayers();
|
||||
for (auto itr = players.begin(); itr != players.end(); ++itr)
|
||||
if (Player* player = itr->GetSource()->ToPlayer())
|
||||
if (player->IsWithinDist(caster, 100.0f) && player->IsAlive())
|
||||
playerList.push_back(player);
|
||||
|
||||
if (!playerList.empty())
|
||||
target = acore::Containers::SelectRandomContainerElement(playerList);
|
||||
}
|
||||
if (!playerList.empty())
|
||||
target = acore::Containers::SelectRandomContainerElement(playerList);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_tsh_shadow_bolt_SpellScript::SelectRandomPlayer, EFFECT_0, TARGET_UNIT_TARGET_ENEMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_tsh_shadow_bolt_SpellScript();
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_tsh_shadow_bolt_SpellScript::SelectRandomPlayer, EFFECT_0, TARGET_UNIT_TARGET_ENEMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_tsh_shadow_bolt_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_grand_warlock_nethekurse()
|
||||
|
||||
@@ -40,7 +40,7 @@ enum Events
|
||||
EVENT_THREAT_YELL_L_3 = 6,
|
||||
|
||||
EVENT_THREAT_YELL_R_1 = 7,
|
||||
|
||||
|
||||
EVENT_KILL_YELL_LEFT = 8,
|
||||
EVENT_KILL_YELL_RIGHT = 9,
|
||||
EVENT_DEATH_YELL = 10,
|
||||
@@ -58,198 +58,198 @@ enum Events
|
||||
|
||||
class boss_warbringer_omrogg : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_warbringer_omrogg() : CreatureScript("boss_warbringer_omrogg") { }
|
||||
public:
|
||||
boss_warbringer_omrogg() : CreatureScript("boss_warbringer_omrogg") { }
|
||||
|
||||
struct boss_warbringer_omroggAI : public BossAI
|
||||
struct boss_warbringer_omroggAI : public BossAI
|
||||
{
|
||||
boss_warbringer_omroggAI(Creature* creature) : BossAI(creature, DATA_OMROGG)
|
||||
{
|
||||
boss_warbringer_omroggAI(Creature* creature) : BossAI(creature, DATA_OMROGG)
|
||||
{
|
||||
}
|
||||
|
||||
EventMap events2;
|
||||
|
||||
Creature* GetLeftHead()
|
||||
{
|
||||
return summons.GetCreatureWithEntry(NPC_LEFT_HEAD);
|
||||
}
|
||||
|
||||
Creature* GetRightHead()
|
||||
{
|
||||
return summons.GetCreatureWithEntry(NPC_RIGHT_HEAD);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
me->SummonCreature(NPC_LEFT_HEAD, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_DEAD_DESPAWN, 0);
|
||||
me->SummonCreature(NPC_RIGHT_HEAD, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_DEAD_DESPAWN, 0);
|
||||
|
||||
if (Creature* LeftHead = GetLeftHead())
|
||||
{
|
||||
uint8 aggroYell = urand(EVENT_AGGRO_YELL_1, EVENT_AGGRO_YELL_3);
|
||||
LeftHead->AI()->Talk(aggroYell-1);
|
||||
events2.ScheduleEvent(aggroYell, 3000);
|
||||
}
|
||||
|
||||
_EnterCombat();
|
||||
|
||||
events.ScheduleEvent(EVENT_SPELL_FEAR, 8000);
|
||||
events.ScheduleEvent(EVENT_SPELL_BURNING_MAUL, 25000);
|
||||
events.ScheduleEvent(EVENT_SPELL_THUNDER_CLAP, 15000);
|
||||
events.ScheduleEvent(EVENT_RESET_THREAT, 30000);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summoned)
|
||||
{
|
||||
summons.Summon(summoned);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
Creature* head = nullptr;
|
||||
uint32 eventId = EVENT_KILL_YELL_LEFT;
|
||||
if (urand(0, 1))
|
||||
{
|
||||
head = GetLeftHead();
|
||||
eventId = EVENT_KILL_YELL_LEFT;
|
||||
}
|
||||
else
|
||||
{
|
||||
head = GetRightHead();
|
||||
eventId = EVENT_KILL_YELL_RIGHT;
|
||||
}
|
||||
|
||||
if (head)
|
||||
head->AI()->Talk(eventId-1);
|
||||
|
||||
events2.ScheduleEvent(eventId, 3000);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
Creature* LeftHead = GetLeftHead();
|
||||
Creature* RightHead = GetRightHead();
|
||||
if (!LeftHead || !RightHead)
|
||||
return;
|
||||
|
||||
LeftHead->DespawnOrUnsummon(5000);
|
||||
RightHead->DespawnOrUnsummon(5000);
|
||||
|
||||
LeftHead->AI()->Talk(EVENT_DEATH_YELL-1);
|
||||
RightHead->AI()->SetData(SETDATA_DATA, SETDATA_YELL);
|
||||
|
||||
instance->SetBossState(DATA_OMROGG, DONE);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
events2.Update(diff);
|
||||
switch (uint32 eventId = events2.ExecuteEvent())
|
||||
{
|
||||
case EVENT_AGGRO_YELL_1:
|
||||
case EVENT_AGGRO_YELL_2:
|
||||
case EVENT_AGGRO_YELL_3:
|
||||
case EVENT_KILL_YELL_LEFT:
|
||||
case EVENT_THREAT_YELL_L_1:
|
||||
case EVENT_THREAT_YELL_L_2:
|
||||
case EVENT_THREAT_YELL_L_3:
|
||||
if (Creature* RightHead = GetRightHead())
|
||||
RightHead->AI()->Talk(eventId-1);
|
||||
break;
|
||||
case EVENT_KILL_YELL_RIGHT:
|
||||
case EVENT_THREAT_YELL_R_1:
|
||||
if (Creature* LeftHead = GetLeftHead())
|
||||
LeftHead->AI()->Talk(eventId-1);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPELL_FEAR:
|
||||
me->CastSpell(me, SPELL_FEAR, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_FEAR, 22000);
|
||||
break;
|
||||
case EVENT_SPELL_THUNDER_CLAP:
|
||||
me->CastSpell(me, SPELL_THUNDERCLAP, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_THUNDER_CLAP, 25000);
|
||||
break;
|
||||
case EVENT_RESET_THREAT:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
{
|
||||
uint8 threatYell = urand(EVENT_THREAT_YELL_L_1, EVENT_THREAT_YELL_R_1);
|
||||
if (Creature* head = threatYell == EVENT_THREAT_YELL_R_1 ? GetRightHead() : GetLeftHead())
|
||||
head->AI()->Talk(threatYell-1);
|
||||
events.ScheduleEvent(threatYell, 3000);
|
||||
|
||||
DoResetThreat();
|
||||
me->AddThreat(target, 10.0f);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_RESET_THREAT, 30000);
|
||||
break;
|
||||
case EVENT_SPELL_BURNING_MAUL:
|
||||
Talk(EMOTE_ENRAGE);
|
||||
me->CastSpell(me, DUNGEON_MODE(SPELL_BURNING_MAUL_N, SPELL_BURNING_MAUL_H), false);
|
||||
events.ScheduleEvent(EVENT_SPELL_BURNING_MAUL, 40000);
|
||||
events.ScheduleEvent(EVENT_SPELL_BLAST_WAVE, 15000);
|
||||
events.ScheduleEvent(EVENT_SPELL_BLAST_WAVE, 20000);
|
||||
break;
|
||||
case EVENT_SPELL_BLAST_WAVE:
|
||||
me->CastSpell(me, SPELL_BLAST_WAVE, false);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_warbringer_omroggAI>(creature);
|
||||
}
|
||||
|
||||
EventMap events2;
|
||||
|
||||
Creature* GetLeftHead()
|
||||
{
|
||||
return summons.GetCreatureWithEntry(NPC_LEFT_HEAD);
|
||||
}
|
||||
|
||||
Creature* GetRightHead()
|
||||
{
|
||||
return summons.GetCreatureWithEntry(NPC_RIGHT_HEAD);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
me->SummonCreature(NPC_LEFT_HEAD, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_DEAD_DESPAWN, 0);
|
||||
me->SummonCreature(NPC_RIGHT_HEAD, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_DEAD_DESPAWN, 0);
|
||||
|
||||
if (Creature* LeftHead = GetLeftHead())
|
||||
{
|
||||
uint8 aggroYell = urand(EVENT_AGGRO_YELL_1, EVENT_AGGRO_YELL_3);
|
||||
LeftHead->AI()->Talk(aggroYell - 1);
|
||||
events2.ScheduleEvent(aggroYell, 3000);
|
||||
}
|
||||
|
||||
_EnterCombat();
|
||||
|
||||
events.ScheduleEvent(EVENT_SPELL_FEAR, 8000);
|
||||
events.ScheduleEvent(EVENT_SPELL_BURNING_MAUL, 25000);
|
||||
events.ScheduleEvent(EVENT_SPELL_THUNDER_CLAP, 15000);
|
||||
events.ScheduleEvent(EVENT_RESET_THREAT, 30000);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summoned)
|
||||
{
|
||||
summons.Summon(summoned);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
Creature* head = nullptr;
|
||||
uint32 eventId = EVENT_KILL_YELL_LEFT;
|
||||
if (urand(0, 1))
|
||||
{
|
||||
head = GetLeftHead();
|
||||
eventId = EVENT_KILL_YELL_LEFT;
|
||||
}
|
||||
else
|
||||
{
|
||||
head = GetRightHead();
|
||||
eventId = EVENT_KILL_YELL_RIGHT;
|
||||
}
|
||||
|
||||
if (head)
|
||||
head->AI()->Talk(eventId - 1);
|
||||
|
||||
events2.ScheduleEvent(eventId, 3000);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
Creature* LeftHead = GetLeftHead();
|
||||
Creature* RightHead = GetRightHead();
|
||||
if (!LeftHead || !RightHead)
|
||||
return;
|
||||
|
||||
LeftHead->DespawnOrUnsummon(5000);
|
||||
RightHead->DespawnOrUnsummon(5000);
|
||||
|
||||
LeftHead->AI()->Talk(EVENT_DEATH_YELL - 1);
|
||||
RightHead->AI()->SetData(SETDATA_DATA, SETDATA_YELL);
|
||||
|
||||
instance->SetBossState(DATA_OMROGG, DONE);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
events2.Update(diff);
|
||||
switch (uint32 eventId = events2.ExecuteEvent())
|
||||
{
|
||||
case EVENT_AGGRO_YELL_1:
|
||||
case EVENT_AGGRO_YELL_2:
|
||||
case EVENT_AGGRO_YELL_3:
|
||||
case EVENT_KILL_YELL_LEFT:
|
||||
case EVENT_THREAT_YELL_L_1:
|
||||
case EVENT_THREAT_YELL_L_2:
|
||||
case EVENT_THREAT_YELL_L_3:
|
||||
if (Creature* RightHead = GetRightHead())
|
||||
RightHead->AI()->Talk(eventId - 1);
|
||||
break;
|
||||
case EVENT_KILL_YELL_RIGHT:
|
||||
case EVENT_THREAT_YELL_R_1:
|
||||
if (Creature* LeftHead = GetLeftHead())
|
||||
LeftHead->AI()->Talk(eventId - 1);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPELL_FEAR:
|
||||
me->CastSpell(me, SPELL_FEAR, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_FEAR, 22000);
|
||||
break;
|
||||
case EVENT_SPELL_THUNDER_CLAP:
|
||||
me->CastSpell(me, SPELL_THUNDERCLAP, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_THUNDER_CLAP, 25000);
|
||||
break;
|
||||
case EVENT_RESET_THREAT:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
{
|
||||
uint8 threatYell = urand(EVENT_THREAT_YELL_L_1, EVENT_THREAT_YELL_R_1);
|
||||
if (Creature* head = threatYell == EVENT_THREAT_YELL_R_1 ? GetRightHead() : GetLeftHead())
|
||||
head->AI()->Talk(threatYell - 1);
|
||||
events.ScheduleEvent(threatYell, 3000);
|
||||
|
||||
DoResetThreat();
|
||||
me->AddThreat(target, 10.0f);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_RESET_THREAT, 30000);
|
||||
break;
|
||||
case EVENT_SPELL_BURNING_MAUL:
|
||||
Talk(EMOTE_ENRAGE);
|
||||
me->CastSpell(me, DUNGEON_MODE(SPELL_BURNING_MAUL_N, SPELL_BURNING_MAUL_H), false);
|
||||
events.ScheduleEvent(EVENT_SPELL_BURNING_MAUL, 40000);
|
||||
events.ScheduleEvent(EVENT_SPELL_BLAST_WAVE, 15000);
|
||||
events.ScheduleEvent(EVENT_SPELL_BLAST_WAVE, 20000);
|
||||
break;
|
||||
case EVENT_SPELL_BLAST_WAVE:
|
||||
me->CastSpell(me, SPELL_BLAST_WAVE, false);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_warbringer_omroggAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
class npc_omrogg_heads : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_omrogg_heads() : CreatureScript("npc_omrogg_heads") { }
|
||||
public:
|
||||
npc_omrogg_heads() : CreatureScript("npc_omrogg_heads") { }
|
||||
|
||||
struct npc_omrogg_headsAI : public NullCreatureAI
|
||||
struct npc_omrogg_headsAI : public NullCreatureAI
|
||||
{
|
||||
npc_omrogg_headsAI(Creature* creature) : NullCreatureAI(creature) { timer = 0; }
|
||||
|
||||
void SetData(uint32 data, uint32 value)
|
||||
{
|
||||
npc_omrogg_headsAI(Creature* creature) : NullCreatureAI(creature) { timer = 0; }
|
||||
if (data == SETDATA_DATA && value == SETDATA_YELL)
|
||||
timer = 1;
|
||||
}
|
||||
|
||||
void SetData(uint32 data, uint32 value)
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (timer)
|
||||
{
|
||||
if (data == SETDATA_DATA && value == SETDATA_YELL)
|
||||
timer = 1;
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (timer)
|
||||
timer += diff;
|
||||
if (timer >= 3000)
|
||||
{
|
||||
timer += diff;
|
||||
if (timer >= 3000)
|
||||
{
|
||||
timer = 0;
|
||||
Talk(EVENT_DEATH_YELL-1);
|
||||
}
|
||||
timer = 0;
|
||||
Talk(EVENT_DEATH_YELL - 1);
|
||||
}
|
||||
}
|
||||
|
||||
uint32 timer;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<npc_omrogg_headsAI>(creature);
|
||||
}
|
||||
|
||||
uint32 timer;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<npc_omrogg_headsAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_warbringer_omrogg()
|
||||
|
||||
@@ -15,9 +15,9 @@ enum Says
|
||||
|
||||
enum Spells
|
||||
{
|
||||
SPELL_BLADE_DANCE = 30739,
|
||||
SPELL_CHARGE = 25821,
|
||||
SPELL_SPRINT = 32720,
|
||||
SPELL_BLADE_DANCE = 30739,
|
||||
SPELL_CHARGE = 25821,
|
||||
SPELL_SPRINT = 32720,
|
||||
};
|
||||
|
||||
enum Creatures
|
||||
@@ -45,130 +45,130 @@ enum Misc
|
||||
|
||||
class boss_warchief_kargath_bladefist : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_warchief_kargath_bladefist() : CreatureScript("boss_warchief_kargath_bladefist") { }
|
||||
public:
|
||||
boss_warchief_kargath_bladefist() : CreatureScript("boss_warchief_kargath_bladefist") { }
|
||||
|
||||
struct boss_warchief_kargath_bladefistAI : public BossAI
|
||||
struct boss_warchief_kargath_bladefistAI : public BossAI
|
||||
{
|
||||
boss_warchief_kargath_bladefistAI(Creature* creature) : BossAI(creature, DATA_KARGATH) { }
|
||||
|
||||
void InitializeAI()
|
||||
{
|
||||
boss_warchief_kargath_bladefistAI(Creature* creature) : BossAI(creature, DATA_KARGATH) { }
|
||||
BossAI::InitializeAI();
|
||||
if (instance)
|
||||
if (Creature* executioner = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_EXECUTIONER)))
|
||||
executioner->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
}
|
||||
|
||||
void InitializeAI()
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
_JustDied();
|
||||
|
||||
if (instance)
|
||||
if (Creature* executioner = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_EXECUTIONER)))
|
||||
executioner->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
_EnterCombat();
|
||||
|
||||
events.ScheduleEvent(EVENT_CHECK_ROOM, 5000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ADDS, 30000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 5000);
|
||||
events.ScheduleEvent(EVENT_BLADE_DANCE, 30000);
|
||||
events.ScheduleEvent(EVENT_SPELL_CHARGE, 0);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
if (summon->GetEntry() != NPC_SHATTERED_ASSASSIN)
|
||||
summon->AI()->AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0));
|
||||
|
||||
summons.Summon(summon);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 id)
|
||||
{
|
||||
if (type != POINT_MOTION_TYPE || id != 1)
|
||||
return;
|
||||
|
||||
me->CastSpell(me, SPELL_BLADE_DANCE, true);
|
||||
events.ScheduleEvent(EVENT_MOVE_TO_NEXT_POINT, 0);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
BossAI::InitializeAI();
|
||||
if (instance)
|
||||
if (Creature* executioner = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_EXECUTIONER)))
|
||||
executioner->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
}
|
||||
case EVENT_CHECK_ROOM:
|
||||
if (me->GetPositionX() > 255 || me->GetPositionX() < 205)
|
||||
{
|
||||
EnterEvadeMode();
|
||||
return;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CHECK_ROOM, 5000);
|
||||
break;
|
||||
case EVENT_SUMMON_ASSASSINS:
|
||||
me->SummonCreature(NPC_SHATTERED_ASSASSIN, AssassEntrance[0], AssassEntrance[1] + 8, AssassEntrance[2], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
|
||||
me->SummonCreature(NPC_SHATTERED_ASSASSIN, AssassEntrance[0], AssassEntrance[1] - 8, AssassEntrance[2], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
|
||||
me->SummonCreature(NPC_SHATTERED_ASSASSIN, AssassExit[0], AssassExit[1] + 8, AssassExit[2], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
|
||||
me->SummonCreature(NPC_SHATTERED_ASSASSIN, AssassExit[0], AssassExit[1] - 8, AssassExit[2], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
|
||||
break;
|
||||
case EVENT_SUMMON_ADDS:
|
||||
for (uint8 i = 0; i < 2; ++i)
|
||||
me->SummonCreature(NPC_HEARTHEN_GUARD + urand(0, 2), AddsEntrance[0], AddsEntrance[1], AddsEntrance[2], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
_JustDied();
|
||||
|
||||
if (instance)
|
||||
if (Creature* executioner = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_EXECUTIONER)))
|
||||
executioner->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
_EnterCombat();
|
||||
|
||||
events.ScheduleEvent(EVENT_CHECK_ROOM, 5000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ADDS, 30000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 5000);
|
||||
events.ScheduleEvent(EVENT_BLADE_DANCE, 30000);
|
||||
events.ScheduleEvent(EVENT_SPELL_CHARGE, 0);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
if (summon->GetEntry() != NPC_SHATTERED_ASSASSIN)
|
||||
summon->AI()->AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0));
|
||||
|
||||
summons.Summon(summon);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 id)
|
||||
{
|
||||
if (type != POINT_MOTION_TYPE || id != 1)
|
||||
return;
|
||||
|
||||
me->CastSpell(me, SPELL_BLADE_DANCE, true);
|
||||
events.ScheduleEvent(EVENT_MOVE_TO_NEXT_POINT, 0);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_CHECK_ROOM:
|
||||
if (me->GetPositionX() > 255 || me->GetPositionX() < 205)
|
||||
{
|
||||
EnterEvadeMode();
|
||||
return;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CHECK_ROOM, 5000);
|
||||
break;
|
||||
case EVENT_SUMMON_ASSASSINS:
|
||||
me->SummonCreature(NPC_SHATTERED_ASSASSIN, AssassEntrance[0], AssassEntrance[1]+8, AssassEntrance[2], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
|
||||
me->SummonCreature(NPC_SHATTERED_ASSASSIN, AssassEntrance[0], AssassEntrance[1]-8, AssassEntrance[2], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
|
||||
me->SummonCreature(NPC_SHATTERED_ASSASSIN, AssassExit[0], AssassExit[1]+8, AssassExit[2], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
|
||||
me->SummonCreature(NPC_SHATTERED_ASSASSIN, AssassExit[0], AssassExit[1]-8, AssassExit[2], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
|
||||
break;
|
||||
case EVENT_SUMMON_ADDS:
|
||||
for (uint8 i = 0; i < 2; ++i)
|
||||
me->SummonCreature(NPC_HEARTHEN_GUARD+urand(0,2), AddsEntrance[0], AddsEntrance[1], AddsEntrance[2], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
|
||||
|
||||
events.ScheduleEvent(EVENT_SUMMON_ADDS, 30000);
|
||||
break;
|
||||
case EVENT_BLADE_DANCE:
|
||||
events.DelayEvents(10001);
|
||||
events.ScheduleEvent(EVENT_BLADE_DANCE, 40000);
|
||||
events.ScheduleEvent(EVENT_MOVE_TO_NEXT_POINT, 0);
|
||||
events.ScheduleEvent(EVENT_FINISH_BLADE_DANCE, 10000);
|
||||
events.SetPhase(1);
|
||||
me->CastSpell(me, SPELL_SPRINT, true);
|
||||
break;
|
||||
case EVENT_MOVE_TO_NEXT_POINT:
|
||||
events.ScheduleEvent(EVENT_SUMMON_ADDS, 30000);
|
||||
break;
|
||||
case EVENT_BLADE_DANCE:
|
||||
events.DelayEvents(10001);
|
||||
events.ScheduleEvent(EVENT_BLADE_DANCE, 40000);
|
||||
events.ScheduleEvent(EVENT_MOVE_TO_NEXT_POINT, 0);
|
||||
events.ScheduleEvent(EVENT_FINISH_BLADE_DANCE, 10000);
|
||||
events.SetPhase(1);
|
||||
me->CastSpell(me, SPELL_SPRINT, true);
|
||||
break;
|
||||
case EVENT_MOVE_TO_NEXT_POINT:
|
||||
{
|
||||
float x = 210 + frand(0.0f, 35.0f);
|
||||
float y = -65.0f - frand(0.0f, 35.0f);
|
||||
me->GetMotionMaster()->MovePoint(1, x, y, me->GetPositionZ());
|
||||
break;
|
||||
}
|
||||
case EVENT_FINISH_BLADE_DANCE:
|
||||
events.SetPhase(0);
|
||||
me->GetMotionMaster()->Clear();
|
||||
me->GetMotionMaster()->MoveChase(me->GetVictim());
|
||||
if (IsHeroic())
|
||||
events.ScheduleEvent(EVENT_SPELL_CHARGE, 3000);
|
||||
break;
|
||||
case EVENT_SPELL_CHARGE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_CHARGE, false);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!events.IsInPhase(1))
|
||||
DoMeleeAttackIfReady();
|
||||
case EVENT_FINISH_BLADE_DANCE:
|
||||
events.SetPhase(0);
|
||||
me->GetMotionMaster()->Clear();
|
||||
me->GetMotionMaster()->MoveChase(me->GetVictim());
|
||||
if (IsHeroic())
|
||||
events.ScheduleEvent(EVENT_SPELL_CHARGE, 3000);
|
||||
break;
|
||||
case EVENT_SPELL_CHARGE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_CHARGE, false);
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_warchief_kargath_bladefistAI>(creature);
|
||||
if (!events.IsInPhase(1))
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_warchief_kargath_bladefistAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_warchief_kargath_bladefist()
|
||||
|
||||
@@ -9,277 +9,277 @@
|
||||
|
||||
class instance_shattered_halls : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
instance_shattered_halls() : InstanceMapScript("instance_shattered_halls", 540) { }
|
||||
public:
|
||||
instance_shattered_halls() : InstanceMapScript("instance_shattered_halls", 540) { }
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_shattered_halls_InstanceMapScript(map);
|
||||
}
|
||||
|
||||
struct instance_shattered_halls_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_shattered_halls_InstanceMapScript(Map* map) : InstanceScript(map) { }
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
return new instance_shattered_halls_InstanceMapScript(map);
|
||||
SetBossNumber(ENCOUNTER_COUNT);
|
||||
nethekurseDoor1GUID = 0;
|
||||
nethekurseDoor2GUID = 0;
|
||||
warchiefKargathGUID = 0;
|
||||
|
||||
executionerGUID = 0;
|
||||
memset(&prisonerGUID, 0, sizeof(prisonerGUID));
|
||||
TeamIdInInstance = TEAM_NEUTRAL;
|
||||
RescueTimer = 100 * MINUTE * IN_MILLISECONDS;
|
||||
}
|
||||
|
||||
struct instance_shattered_halls_InstanceMapScript : public InstanceScript
|
||||
void OnPlayerEnter(Player* player)
|
||||
{
|
||||
instance_shattered_halls_InstanceMapScript(Map* map) : InstanceScript(map) { }
|
||||
if (TeamIdInInstance == TEAM_NEUTRAL)
|
||||
TeamIdInInstance = player->GetTeamId();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
void OnGameObjectCreate(GameObject* go)
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
SetBossNumber(ENCOUNTER_COUNT);
|
||||
nethekurseDoor1GUID = 0;
|
||||
nethekurseDoor2GUID = 0;
|
||||
warchiefKargathGUID = 0;
|
||||
case GO_GRAND_WARLOCK_CHAMBER_DOOR_1:
|
||||
nethekurseDoor1GUID = go->GetGUID();
|
||||
if (GetBossState(DATA_NETHEKURSE) == DONE)
|
||||
HandleGameObject(0, true, go);
|
||||
break;
|
||||
case GO_GRAND_WARLOCK_CHAMBER_DOOR_2:
|
||||
nethekurseDoor2GUID = go->GetGUID();
|
||||
if (GetBossState(DATA_NETHEKURSE) == DONE)
|
||||
HandleGameObject(0, true, go);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
executionerGUID = 0;
|
||||
memset(&prisonerGUID, 0, sizeof(prisonerGUID));
|
||||
TeamIdInInstance = TEAM_NEUTRAL;
|
||||
RescueTimer = 100*MINUTE*IN_MILLISECONDS;
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
{
|
||||
if (TeamIdInInstance == TEAM_NEUTRAL)
|
||||
{
|
||||
Map::PlayerList const& players = instance->GetPlayers();
|
||||
if (!players.isEmpty())
|
||||
if (Player* player = players.begin()->GetSource())
|
||||
TeamIdInInstance = player->GetTeamId();
|
||||
}
|
||||
|
||||
void OnPlayerEnter(Player* player)
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
if (TeamIdInInstance == TEAM_NEUTRAL)
|
||||
TeamIdInInstance = player->GetTeamId();
|
||||
case NPC_WARCHIEF_KARGATH:
|
||||
warchiefKargathGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_SHATTERED_EXECUTIONER:
|
||||
if (RescueTimer > 25 * MINUTE * IN_MILLISECONDS)
|
||||
creature->AddLootMode(2);
|
||||
executionerGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_RIFLEMAN_BROWNBEARD:
|
||||
if (TeamIdInInstance == TEAM_HORDE)
|
||||
creature->UpdateEntry(NPC_KORAG_PROUDMANE);
|
||||
prisonerGUID[0] = creature->GetGUID();
|
||||
break;
|
||||
case NPC_CAPTAIN_ALINA:
|
||||
if (TeamIdInInstance == TEAM_HORDE)
|
||||
creature->UpdateEntry(NPC_CAPTAIN_BONESHATTER);
|
||||
prisonerGUID[1] = creature->GetGUID();
|
||||
break;
|
||||
case NPC_PRIVATE_JACINT:
|
||||
if (TeamIdInInstance == TEAM_HORDE)
|
||||
creature->UpdateEntry(NPC_SCOUT_ORGARR);
|
||||
prisonerGUID[2] = creature->GetGUID();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* go)
|
||||
bool SetBossState(uint32 type, EncounterState state)
|
||||
{
|
||||
if (!InstanceScript::SetBossState(type, state))
|
||||
return false;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_GRAND_WARLOCK_CHAMBER_DOOR_1:
|
||||
nethekurseDoor1GUID = go->GetGUID();
|
||||
if (GetBossState(DATA_NETHEKURSE) == DONE)
|
||||
HandleGameObject(0, true, go);
|
||||
break;
|
||||
case GO_GRAND_WARLOCK_CHAMBER_DOOR_2:
|
||||
nethekurseDoor2GUID = go->GetGUID();
|
||||
if (GetBossState(DATA_NETHEKURSE) == DONE)
|
||||
HandleGameObject(0, true, go);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
{
|
||||
if (TeamIdInInstance == TEAM_NEUTRAL)
|
||||
{
|
||||
Map::PlayerList const &players = instance->GetPlayers();
|
||||
if (!players.isEmpty())
|
||||
if (Player* player = players.begin()->GetSource())
|
||||
TeamIdInInstance = player->GetTeamId();
|
||||
}
|
||||
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case NPC_WARCHIEF_KARGATH:
|
||||
warchiefKargathGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_SHATTERED_EXECUTIONER:
|
||||
if (RescueTimer > 25*MINUTE*IN_MILLISECONDS)
|
||||
creature->AddLootMode(2);
|
||||
executionerGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_RIFLEMAN_BROWNBEARD:
|
||||
if (TeamIdInInstance == TEAM_HORDE)
|
||||
creature->UpdateEntry(NPC_KORAG_PROUDMANE);
|
||||
prisonerGUID[0] = creature->GetGUID();
|
||||
break;
|
||||
case NPC_CAPTAIN_ALINA:
|
||||
if (TeamIdInInstance == TEAM_HORDE)
|
||||
creature->UpdateEntry(NPC_CAPTAIN_BONESHATTER);
|
||||
prisonerGUID[1] = creature->GetGUID();
|
||||
break;
|
||||
case NPC_PRIVATE_JACINT:
|
||||
if (TeamIdInInstance == TEAM_HORDE)
|
||||
creature->UpdateEntry(NPC_SCOUT_ORGARR);
|
||||
prisonerGUID[2] = creature->GetGUID();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool SetBossState(uint32 type, EncounterState state)
|
||||
{
|
||||
if (!InstanceScript::SetBossState(type, state))
|
||||
return false;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case DATA_NETHEKURSE:
|
||||
if (state == IN_PROGRESS)
|
||||
{
|
||||
HandleGameObject(nethekurseDoor1GUID, false);
|
||||
HandleGameObject(nethekurseDoor2GUID, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
HandleGameObject(nethekurseDoor1GUID, true);
|
||||
HandleGameObject(nethekurseDoor2GUID, true);
|
||||
}
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 data)
|
||||
{
|
||||
if (type == DATA_ENTERED_ROOM && data == DATA_ENTERED_ROOM && RescueTimer == 100*MINUTE*IN_MILLISECONDS)
|
||||
{
|
||||
DoCastSpellOnPlayers(SPELL_KARGATHS_EXECUTIONER_1);
|
||||
instance->LoadGrid(230, -80);
|
||||
|
||||
if (Creature* kargath = instance->GetCreature(warchiefKargathGUID))
|
||||
sCreatureTextMgr->SendChat(kargath, TeamIdInInstance == TEAM_ALLIANCE ? 3 : 4, NULL, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_MAP);
|
||||
|
||||
RescueTimer = 80*MINUTE*IN_MILLISECONDS;
|
||||
}
|
||||
}
|
||||
|
||||
uint64 GetData64(uint32 data) const
|
||||
{
|
||||
switch (data)
|
||||
{
|
||||
case DATA_PRISONER_1:
|
||||
case DATA_PRISONER_2:
|
||||
case DATA_PRISONER_3:
|
||||
return prisonerGUID[data-DATA_PRISONER_1];
|
||||
case DATA_EXECUTIONER:
|
||||
return executionerGUID;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void Update(uint32 diff)
|
||||
{
|
||||
if (RescueTimer && RescueTimer < 100*MINUTE*IN_MILLISECONDS)
|
||||
{
|
||||
RescueTimer -= std::min(RescueTimer, diff);
|
||||
|
||||
if ((RescueTimer / IN_MILLISECONDS) == 25*MINUTE)
|
||||
case DATA_NETHEKURSE:
|
||||
if (state == IN_PROGRESS)
|
||||
{
|
||||
DoRemoveAurasDueToSpellOnPlayers(SPELL_KARGATHS_EXECUTIONER_1);
|
||||
DoCastSpellOnPlayers(SPELL_KARGATHS_EXECUTIONER_2);
|
||||
if (Creature* prisoner = instance->GetCreature(prisonerGUID[0]))
|
||||
Unit::Kill(prisoner, prisoner);
|
||||
if (Creature* executioner = instance->GetCreature(executionerGUID))
|
||||
executioner->RemoveLootMode(2);
|
||||
HandleGameObject(nethekurseDoor1GUID, false);
|
||||
HandleGameObject(nethekurseDoor2GUID, false);
|
||||
}
|
||||
else if ((RescueTimer / IN_MILLISECONDS) == 15*MINUTE)
|
||||
else
|
||||
{
|
||||
DoRemoveAurasDueToSpellOnPlayers(SPELL_KARGATHS_EXECUTIONER_2);
|
||||
DoCastSpellOnPlayers(SPELL_KARGATHS_EXECUTIONER_3);
|
||||
if (Creature* prisoner = instance->GetCreature(prisonerGUID[1]))
|
||||
Unit::Kill(prisoner, prisoner);
|
||||
HandleGameObject(nethekurseDoor1GUID, true);
|
||||
HandleGameObject(nethekurseDoor2GUID, true);
|
||||
}
|
||||
else if ((RescueTimer / IN_MILLISECONDS) == 0)
|
||||
{
|
||||
DoRemoveAurasDueToSpellOnPlayers(SPELL_KARGATHS_EXECUTIONER_3);
|
||||
if (Creature* prisoner = instance->GetCreature(prisonerGUID[2]))
|
||||
Unit::Kill(prisoner, prisoner);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
void SetData(uint32 type, uint32 data)
|
||||
{
|
||||
if (type == DATA_ENTERED_ROOM && data == DATA_ENTERED_ROOM && RescueTimer == 100 * MINUTE * IN_MILLISECONDS)
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
DoCastSpellOnPlayers(SPELL_KARGATHS_EXECUTIONER_1);
|
||||
instance->LoadGrid(230, -80);
|
||||
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "S H " << GetBossSaveData() << ' ' << RescueTimer;
|
||||
if (Creature* kargath = instance->GetCreature(warchiefKargathGUID))
|
||||
sCreatureTextMgr->SendChat(kargath, TeamIdInInstance == TEAM_ALLIANCE ? 3 : 4, NULL, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_MAP);
|
||||
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return saveStream.str();
|
||||
RescueTimer = 80 * MINUTE * IN_MILLISECONDS;
|
||||
}
|
||||
}
|
||||
|
||||
void Load(const char* strIn)
|
||||
uint64 GetData64(uint32 data) const
|
||||
{
|
||||
switch (data)
|
||||
{
|
||||
if (!strIn)
|
||||
case DATA_PRISONER_1:
|
||||
case DATA_PRISONER_2:
|
||||
case DATA_PRISONER_3:
|
||||
return prisonerGUID[data - DATA_PRISONER_1];
|
||||
case DATA_EXECUTIONER:
|
||||
return executionerGUID;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void Update(uint32 diff)
|
||||
{
|
||||
if (RescueTimer && RescueTimer < 100 * MINUTE * IN_MILLISECONDS)
|
||||
{
|
||||
RescueTimer -= std::min(RescueTimer, diff);
|
||||
|
||||
if ((RescueTimer / IN_MILLISECONDS) == 25 * MINUTE)
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
DoRemoveAurasDueToSpellOnPlayers(SPELL_KARGATHS_EXECUTIONER_1);
|
||||
DoCastSpellOnPlayers(SPELL_KARGATHS_EXECUTIONER_2);
|
||||
if (Creature* prisoner = instance->GetCreature(prisonerGUID[0]))
|
||||
Unit::Kill(prisoner, prisoner);
|
||||
if (Creature* executioner = instance->GetCreature(executionerGUID))
|
||||
executioner->RemoveLootMode(2);
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA(strIn);
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
|
||||
std::istringstream loadStream(strIn);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
|
||||
if (dataHead1 == 'S' && dataHead2 == 'H')
|
||||
else if ((RescueTimer / IN_MILLISECONDS) == 15 * MINUTE)
|
||||
{
|
||||
for (uint8 i = 0; i < ENCOUNTER_COUNT; ++i)
|
||||
{
|
||||
uint32 tmpState;
|
||||
loadStream >> tmpState;
|
||||
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
|
||||
tmpState = NOT_STARTED;
|
||||
SetBossState(i, EncounterState(tmpState));
|
||||
}
|
||||
|
||||
loadStream >> RescueTimer;
|
||||
DoRemoveAurasDueToSpellOnPlayers(SPELL_KARGATHS_EXECUTIONER_2);
|
||||
DoCastSpellOnPlayers(SPELL_KARGATHS_EXECUTIONER_3);
|
||||
if (Creature* prisoner = instance->GetCreature(prisonerGUID[1]))
|
||||
Unit::Kill(prisoner, prisoner);
|
||||
}
|
||||
else
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
else if ((RescueTimer / IN_MILLISECONDS) == 0)
|
||||
{
|
||||
DoRemoveAurasDueToSpellOnPlayers(SPELL_KARGATHS_EXECUTIONER_3);
|
||||
if (Creature* prisoner = instance->GetCreature(prisonerGUID[2]))
|
||||
Unit::Kill(prisoner, prisoner);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
std::string GetSaveData()
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "S H " << GetBossSaveData() << ' ' << RescueTimer;
|
||||
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void Load(const char* strIn)
|
||||
{
|
||||
if (!strIn)
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
}
|
||||
|
||||
protected:
|
||||
uint64 warchiefKargathGUID;
|
||||
uint64 nethekurseDoor1GUID;
|
||||
uint64 nethekurseDoor2GUID;
|
||||
OUT_LOAD_INST_DATA(strIn);
|
||||
|
||||
uint64 executionerGUID;
|
||||
uint64 prisonerGUID[3];
|
||||
uint32 RescueTimer;
|
||||
TeamId TeamIdInInstance;
|
||||
};
|
||||
char dataHead1, dataHead2;
|
||||
|
||||
std::istringstream loadStream(strIn);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
|
||||
if (dataHead1 == 'S' && dataHead2 == 'H')
|
||||
{
|
||||
for (uint8 i = 0; i < ENCOUNTER_COUNT; ++i)
|
||||
{
|
||||
uint32 tmpState;
|
||||
loadStream >> tmpState;
|
||||
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
|
||||
tmpState = NOT_STARTED;
|
||||
SetBossState(i, EncounterState(tmpState));
|
||||
}
|
||||
|
||||
loadStream >> RescueTimer;
|
||||
}
|
||||
else
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
}
|
||||
|
||||
protected:
|
||||
uint64 warchiefKargathGUID;
|
||||
uint64 nethekurseDoor1GUID;
|
||||
uint64 nethekurseDoor2GUID;
|
||||
|
||||
uint64 executionerGUID;
|
||||
uint64 prisonerGUID[3];
|
||||
uint32 RescueTimer;
|
||||
TeamId TeamIdInInstance;
|
||||
};
|
||||
};
|
||||
|
||||
class spell_tsh_shoot_flame_arrow : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_tsh_shoot_flame_arrow() : SpellScriptLoader("spell_tsh_shoot_flame_arrow") { }
|
||||
public:
|
||||
spell_tsh_shoot_flame_arrow() : SpellScriptLoader("spell_tsh_shoot_flame_arrow") { }
|
||||
|
||||
class spell_tsh_shoot_flame_arrow_SpellScript : public SpellScript
|
||||
class spell_tsh_shoot_flame_arrow_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_tsh_shoot_flame_arrow_SpellScript);
|
||||
|
||||
void FilterTargets(std::list<WorldObject*>& unitList)
|
||||
{
|
||||
PrepareSpellScript(spell_tsh_shoot_flame_arrow_SpellScript);
|
||||
|
||||
void FilterTargets(std::list<WorldObject*>& unitList)
|
||||
{
|
||||
acore::Containers::RandomResizeList(unitList, 1);
|
||||
}
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex effIndex)
|
||||
{
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
if (Unit* target = GetHitUnit())
|
||||
target->CastSpell(target, 30953, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_tsh_shoot_flame_arrow_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY);
|
||||
OnEffectHitTarget += SpellEffectFn(spell_tsh_shoot_flame_arrow_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_tsh_shoot_flame_arrow_SpellScript();
|
||||
acore::Containers::RandomResizeList(unitList, 1);
|
||||
}
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex effIndex)
|
||||
{
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
if (Unit* target = GetHitUnit())
|
||||
target->CastSpell(target, 30953, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_tsh_shoot_flame_arrow_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY);
|
||||
OnEffectHitTarget += SpellEffectFn(spell_tsh_shoot_flame_arrow_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_tsh_shoot_flame_arrow_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class at_shattered_halls_execution : public AreaTriggerScript
|
||||
{
|
||||
public:
|
||||
at_shattered_halls_execution() : AreaTriggerScript("at_shattered_halls_execution") { }
|
||||
public:
|
||||
at_shattered_halls_execution() : AreaTriggerScript("at_shattered_halls_execution") { }
|
||||
|
||||
bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/)
|
||||
{
|
||||
if (InstanceScript* instanceScript = player->GetInstanceScript())
|
||||
instanceScript->SetData(DATA_ENTERED_ROOM, DATA_ENTERED_ROOM);
|
||||
bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/)
|
||||
{
|
||||
if (InstanceScript* instanceScript = player->GetInstanceScript())
|
||||
instanceScript->SetData(DATA_ENTERED_ROOM, DATA_ENTERED_ROOM);
|
||||
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_instance_shattered_halls()
|
||||
|
||||
@@ -40,7 +40,7 @@ enum Misc
|
||||
DISPLAYID_INVISIBLE = 23377,
|
||||
NPC_EMBER_OF_ALAR = 19551,
|
||||
NPC_FLAME_PATCH = 20602,
|
||||
|
||||
|
||||
POINT_PLATFORM = 0,
|
||||
POINT_QUILL = 4,
|
||||
POINT_MIDDLE = 5,
|
||||
@@ -74,411 +74,411 @@ enum qruseoftheAshtongue
|
||||
|
||||
class boss_alar : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_alar() : CreatureScript("boss_alar") { }
|
||||
public:
|
||||
boss_alar() : CreatureScript("boss_alar") { }
|
||||
|
||||
struct boss_alarAI : public BossAI
|
||||
struct boss_alarAI : public BossAI
|
||||
{
|
||||
boss_alarAI(Creature* creature) : BossAI(creature, DATA_ALAR)
|
||||
{
|
||||
boss_alarAI(Creature* creature) : BossAI(creature, DATA_ALAR)
|
||||
startPath = true;
|
||||
SetCombatMovement(false);
|
||||
}
|
||||
|
||||
uint8 platform;
|
||||
uint8 noQuillTimes;
|
||||
bool startPath;
|
||||
|
||||
void JustReachedHome()
|
||||
{
|
||||
BossAI::JustReachedHome();
|
||||
startPath = true;
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
platform = 0;
|
||||
noQuillTimes = 0;
|
||||
me->SetModelVisible(true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_FIRE, true);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
events.ScheduleEvent(EVENT_SWITCH_PLATFORM, 0);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
me->SetModelVisible(true);
|
||||
BossAI::JustDied(killer);
|
||||
|
||||
// Xinef: Ruse of the Ashtongue (10946)
|
||||
Map::PlayerList const& pl = me->GetMap()->GetPlayers();
|
||||
for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr)
|
||||
{
|
||||
startPath = true;
|
||||
SetCombatMovement(false);
|
||||
Player* player = itr->GetSource();
|
||||
if (player->GetQuestStatus(QUEST_RUSE_OF_THE_ASHTONGUE) == QUEST_STATUS_INCOMPLETE)
|
||||
if (player->HasAura(SPELL_ASHTONGUE_RUSE))
|
||||
player->AreaExploredOrEventHappens(QUEST_RUSE_OF_THE_ASHTONGUE);
|
||||
}
|
||||
}
|
||||
|
||||
uint8 platform;
|
||||
uint8 noQuillTimes;
|
||||
bool startPath;
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
if (summon->GetEntry() == NPC_EMBER_OF_ALAR)
|
||||
summon->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_FIRE, true);
|
||||
}
|
||||
|
||||
void JustReachedHome()
|
||||
void MoveInLineOfSight(Unit* /*who*/) { }
|
||||
|
||||
void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask)
|
||||
{
|
||||
if (damage >= me->GetHealth() && platform < POINT_MIDDLE)
|
||||
{
|
||||
BossAI::JustReachedHome();
|
||||
startPath = true;
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
platform = 0;
|
||||
noQuillTimes = 0;
|
||||
me->SetModelVisible(true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_FIRE, true);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
events.ScheduleEvent(EVENT_SWITCH_PLATFORM, 0);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
me->SetModelVisible(true);
|
||||
BossAI::JustDied(killer);
|
||||
|
||||
// Xinef: Ruse of the Ashtongue (10946)
|
||||
Map::PlayerList const& pl = me->GetMap()->GetPlayers();
|
||||
for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr)
|
||||
damage = 0;
|
||||
if (events.GetNextEventTime(EVENT_REBIRTH) == 0)
|
||||
{
|
||||
Player* player = itr->GetSource();
|
||||
if (player->GetQuestStatus(QUEST_RUSE_OF_THE_ASHTONGUE) == QUEST_STATUS_INCOMPLETE)
|
||||
if (player->HasAura(SPELL_ASHTONGUE_RUSE))
|
||||
player->AreaExploredOrEventHappens(QUEST_RUSE_OF_THE_ASHTONGUE);
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
me->SetHealth(me->GetMaxHealth());
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->CastSpell(me, SPELL_EMBER_BLAST, true);
|
||||
|
||||
me->setAttackTimer(BASE_ATTACK, 16000);
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_RELOCATE_MIDDLE, 8000);
|
||||
events.ScheduleEvent(EVENT_MOVE_TO_PHASE_2, 12000);
|
||||
events.ScheduleEvent(EVENT_REBIRTH, 16001);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
void MovementInform(uint32 type, uint32 id)
|
||||
{
|
||||
if (type != POINT_MOTION_TYPE)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
if (summon->GetEntry() == NPC_EMBER_OF_ALAR)
|
||||
summon->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_FIRE, true);
|
||||
if (type == ESCORT_MOTION_TYPE && me->movespline->Finalized() && !me->IsInCombat())
|
||||
startPath = true;
|
||||
return;
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* /*who*/) { }
|
||||
|
||||
void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask)
|
||||
if (id == POINT_PLATFORM)
|
||||
me->setAttackTimer(BASE_ATTACK, 1000);
|
||||
else if (id == POINT_QUILL)
|
||||
events.ScheduleEvent(EVENT_START_QUILLS, 1000);
|
||||
else if (id == POINT_DIVE)
|
||||
{
|
||||
if (damage >= me->GetHealth() && platform < POINT_MIDDLE)
|
||||
events.ScheduleEvent(EVENT_START_DIVE, 1000);
|
||||
events.ScheduleEvent(EVENT_CAST_DIVE_BOMB, 5000);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (startPath)
|
||||
{
|
||||
me->StopMoving();
|
||||
startPath = false;
|
||||
if (WaypointPath const* i_path = sWaypointMgr->GetPath(me->GetWaypointPath()))
|
||||
{
|
||||
damage = 0;
|
||||
if (events.GetNextEventTime(EVENT_REBIRTH) == 0)
|
||||
Movement::PointsArray pathPoints;
|
||||
pathPoints.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()));
|
||||
for (uint8 i = 0; i < i_path->size(); ++i)
|
||||
{
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
me->SetHealth(me->GetMaxHealth());
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->CastSpell(me, SPELL_EMBER_BLAST, true);
|
||||
|
||||
me->setAttackTimer(BASE_ATTACK, 16000);
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_RELOCATE_MIDDLE, 8000);
|
||||
events.ScheduleEvent(EVENT_MOVE_TO_PHASE_2, 12000);
|
||||
events.ScheduleEvent(EVENT_REBIRTH, 16001);
|
||||
WaypointData const* node = i_path->at(i);
|
||||
pathPoints.push_back(G3D::Vector3(node->x, node->y, node->z));
|
||||
}
|
||||
me->GetMotionMaster()->MoveSplinePath(&pathPoints);
|
||||
}
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 id)
|
||||
{
|
||||
if (type != POINT_MOTION_TYPE)
|
||||
{
|
||||
if (type == ESCORT_MOTION_TYPE && me->movespline->Finalized() && !me->IsInCombat())
|
||||
startPath = true;
|
||||
return;
|
||||
}
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (id == POINT_PLATFORM)
|
||||
me->setAttackTimer(BASE_ATTACK, 1000);
|
||||
else if (id == POINT_QUILL)
|
||||
events.ScheduleEvent(EVENT_START_QUILLS, 1000);
|
||||
else if (id == POINT_DIVE)
|
||||
{
|
||||
events.ScheduleEvent(EVENT_START_DIVE, 1000);
|
||||
events.ScheduleEvent(EVENT_CAST_DIVE_BOMB, 5000);
|
||||
}
|
||||
}
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
if (startPath)
|
||||
{
|
||||
me->StopMoving();
|
||||
startPath = false;
|
||||
if (WaypointPath const* i_path = sWaypointMgr->GetPath(me->GetWaypointPath()))
|
||||
case EVENT_SWITCH_PLATFORM:
|
||||
if (roll_chance_i(20 * noQuillTimes))
|
||||
{
|
||||
Movement::PointsArray pathPoints;
|
||||
pathPoints.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()));
|
||||
for (uint8 i = 0; i < i_path->size(); ++i)
|
||||
{
|
||||
WaypointData const* node = i_path->at(i);
|
||||
pathPoints.push_back(G3D::Vector3(node->x, node->y, node->z));
|
||||
}
|
||||
me->GetMotionMaster()->MoveSplinePath(&pathPoints);
|
||||
noQuillTimes = 0;
|
||||
platform = RAND(0, 3);
|
||||
me->GetMotionMaster()->MovePoint(POINT_QUILL, alarPoints[POINT_QUILL], false, true);
|
||||
events.ScheduleEvent(EVENT_SWITCH_PLATFORM, 16000);
|
||||
}
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SWITCH_PLATFORM:
|
||||
if (roll_chance_i(20*noQuillTimes))
|
||||
else
|
||||
{
|
||||
if (noQuillTimes++ > 0)
|
||||
{
|
||||
noQuillTimes = 0;
|
||||
platform = RAND(0, 3);
|
||||
me->GetMotionMaster()->MovePoint(POINT_QUILL, alarPoints[POINT_QUILL], false, true);
|
||||
events.ScheduleEvent(EVENT_SWITCH_PLATFORM, 16000);
|
||||
me->SetOrientation(alarPoints[platform].GetOrientation());
|
||||
me->SummonCreature(NPC_EMBER_OF_ALAR, *me, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 6000);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (noQuillTimes++ > 0)
|
||||
{
|
||||
me->SetOrientation(alarPoints[platform].GetOrientation());
|
||||
me->SummonCreature(NPC_EMBER_OF_ALAR, *me, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 6000);
|
||||
}
|
||||
me->GetMotionMaster()->MovePoint(POINT_PLATFORM, alarPoints[platform], false, true);
|
||||
platform = (platform+1)%4;
|
||||
events.ScheduleEvent(EVENT_SWITCH_PLATFORM, 30000);
|
||||
}
|
||||
me->setAttackTimer(BASE_ATTACK, 20000);
|
||||
break;
|
||||
case EVENT_START_QUILLS:
|
||||
me->CastSpell(me, SPELL_FLAME_QUILLS, false);
|
||||
break;
|
||||
case EVENT_RELOCATE_MIDDLE:
|
||||
me->SetPosition(alarPoints[POINT_MIDDLE]);
|
||||
break;
|
||||
case EVENT_MOVE_TO_PHASE_2:
|
||||
me->RemoveAurasDueToSpell(SPELL_EMBER_BLAST);
|
||||
me->CastSpell(me, SPELL_REBIRTH_PHASE2, false);
|
||||
break;
|
||||
case EVENT_REBIRTH:
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
platform = POINT_MIDDLE;
|
||||
me->GetMotionMaster()->MoveChase(me->GetVictim());
|
||||
me->GetMotionMaster()->MovePoint(POINT_PLATFORM, alarPoints[platform], false, true);
|
||||
platform = (platform + 1) % 4;
|
||||
events.ScheduleEvent(EVENT_SWITCH_PLATFORM, 30000);
|
||||
}
|
||||
me->setAttackTimer(BASE_ATTACK, 20000);
|
||||
break;
|
||||
case EVENT_START_QUILLS:
|
||||
me->CastSpell(me, SPELL_FLAME_QUILLS, false);
|
||||
break;
|
||||
case EVENT_RELOCATE_MIDDLE:
|
||||
me->SetPosition(alarPoints[POINT_MIDDLE]);
|
||||
break;
|
||||
case EVENT_MOVE_TO_PHASE_2:
|
||||
me->RemoveAurasDueToSpell(SPELL_EMBER_BLAST);
|
||||
me->CastSpell(me, SPELL_REBIRTH_PHASE2, false);
|
||||
break;
|
||||
case EVENT_REBIRTH:
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
platform = POINT_MIDDLE;
|
||||
me->GetMotionMaster()->MoveChase(me->GetVictim());
|
||||
|
||||
events.ScheduleEvent(EVENT_SPELL_MELT_ARMOR, 67000);
|
||||
events.ScheduleEvent(EVENT_SPELL_CHARGE, 10000);
|
||||
events.ScheduleEvent(EVENT_SPELL_FLAME_PATCH, 20000);
|
||||
events.ScheduleEvent(EVENT_SPELL_DIVE_BOMB, 30000);
|
||||
break;
|
||||
case EVENT_SPELL_MELT_ARMOR:
|
||||
me->CastSpell(me->GetVictim(), SPELL_MELT_ARMOR, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_MELT_ARMOR, 60000);
|
||||
break;
|
||||
case EVENT_SPELL_CHARGE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
|
||||
me->CastSpell(target, SPELL_CHARGE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_CHARGE, 30000);
|
||||
break;
|
||||
case EVENT_SPELL_FLAME_PATCH:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
|
||||
me->SummonCreature(NPC_FLAME_PATCH, *target, TEMPSUMMON_TIMED_DESPAWN, 2*MINUTE*IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_SPELL_FLAME_PATCH, 30000);
|
||||
break;
|
||||
case EVENT_SPELL_DIVE_BOMB:
|
||||
me->GetMotionMaster()->MovePoint(POINT_DIVE, alarPoints[POINT_DIVE], false, true);
|
||||
events.ScheduleEvent(EVENT_SPELL_DIVE_BOMB, 30000);
|
||||
events.DelayEvents(15000);
|
||||
me->setAttackTimer(BASE_ATTACK, 20000);
|
||||
break;
|
||||
case EVENT_START_DIVE:
|
||||
me->CastSpell(me, SPELL_DIVE_BOMB_VISUAL, false);
|
||||
break;
|
||||
case EVENT_CAST_DIVE_BOMB:
|
||||
events.ScheduleEvent(EVENT_SUMMON_DIVE_PHOENIX, 2000);
|
||||
events.ScheduleEvent(EVENT_REBIRTH_DIVE, 6000);
|
||||
events.ScheduleEvent(EVENT_FINISH_DIVE, 10000);
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 90.0f, true))
|
||||
{
|
||||
me->CastSpell(target, SPELL_DIVE_BOMB, false);
|
||||
me->SetPosition(*target);
|
||||
me->StopMovingOnCurrentPos();
|
||||
}
|
||||
events.ScheduleEvent(EVENT_SPELL_MELT_ARMOR, 67000);
|
||||
events.ScheduleEvent(EVENT_SPELL_CHARGE, 10000);
|
||||
events.ScheduleEvent(EVENT_SPELL_FLAME_PATCH, 20000);
|
||||
events.ScheduleEvent(EVENT_SPELL_DIVE_BOMB, 30000);
|
||||
break;
|
||||
case EVENT_SPELL_MELT_ARMOR:
|
||||
me->CastSpell(me->GetVictim(), SPELL_MELT_ARMOR, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_MELT_ARMOR, 60000);
|
||||
break;
|
||||
case EVENT_SPELL_CHARGE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
|
||||
me->CastSpell(target, SPELL_CHARGE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_CHARGE, 30000);
|
||||
break;
|
||||
case EVENT_SPELL_FLAME_PATCH:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
|
||||
me->SummonCreature(NPC_FLAME_PATCH, *target, TEMPSUMMON_TIMED_DESPAWN, 2 * MINUTE * IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_SPELL_FLAME_PATCH, 30000);
|
||||
break;
|
||||
case EVENT_SPELL_DIVE_BOMB:
|
||||
me->GetMotionMaster()->MovePoint(POINT_DIVE, alarPoints[POINT_DIVE], false, true);
|
||||
events.ScheduleEvent(EVENT_SPELL_DIVE_BOMB, 30000);
|
||||
events.DelayEvents(15000);
|
||||
me->setAttackTimer(BASE_ATTACK, 20000);
|
||||
break;
|
||||
case EVENT_START_DIVE:
|
||||
me->CastSpell(me, SPELL_DIVE_BOMB_VISUAL, false);
|
||||
break;
|
||||
case EVENT_CAST_DIVE_BOMB:
|
||||
events.ScheduleEvent(EVENT_SUMMON_DIVE_PHOENIX, 2000);
|
||||
events.ScheduleEvent(EVENT_REBIRTH_DIVE, 6000);
|
||||
events.ScheduleEvent(EVENT_FINISH_DIVE, 10000);
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 90.0f, true))
|
||||
{
|
||||
me->CastSpell(target, SPELL_DIVE_BOMB, false);
|
||||
me->SetPosition(*target);
|
||||
me->StopMovingOnCurrentPos();
|
||||
}
|
||||
|
||||
me->RemoveAurasDueToSpell(SPELL_DIVE_BOMB_VISUAL);
|
||||
break;
|
||||
case EVENT_SUMMON_DIVE_PHOENIX:
|
||||
me->RemoveAurasDueToSpell(SPELL_DIVE_BOMB_VISUAL);
|
||||
break;
|
||||
case EVENT_SUMMON_DIVE_PHOENIX:
|
||||
{
|
||||
Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 10.0f, true);
|
||||
me->SummonCreature(NPC_EMBER_OF_ALAR, target ? *target : *me, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 6000);
|
||||
me->SummonCreature(NPC_EMBER_OF_ALAR, target ? *target : *me, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 6000);
|
||||
break;
|
||||
}
|
||||
case EVENT_REBIRTH_DIVE:
|
||||
me->SetModelVisible(true);
|
||||
me->CastSpell(me, SPELL_REBIRTH_DIVE, false);
|
||||
break;
|
||||
case EVENT_FINISH_DIVE:
|
||||
me->GetMotionMaster()->MoveChase(me->GetVictim());
|
||||
break;
|
||||
case EVENT_SPELL_BERSERK:
|
||||
me->CastSpell(me, SPELL_BERSERK, true);
|
||||
break;
|
||||
}
|
||||
case EVENT_REBIRTH_DIVE:
|
||||
me->SetModelVisible(true);
|
||||
me->CastSpell(me, SPELL_REBIRTH_DIVE, false);
|
||||
break;
|
||||
case EVENT_FINISH_DIVE:
|
||||
me->GetMotionMaster()->MoveChase(me->GetVictim());
|
||||
break;
|
||||
case EVENT_SPELL_BERSERK:
|
||||
me->CastSpell(me, SPELL_BERSERK, true);
|
||||
break;
|
||||
}
|
||||
|
||||
if (me->isAttackReady())
|
||||
if (me->isAttackReady())
|
||||
{
|
||||
if (me->IsWithinMeleeRange(me->GetVictim()))
|
||||
{
|
||||
if (me->IsWithinMeleeRange(me->GetVictim()))
|
||||
{
|
||||
me->AttackerStateUpdate(me->GetVictim());
|
||||
me->resetAttackTimer();
|
||||
}
|
||||
else
|
||||
{
|
||||
me->resetAttackTimer();
|
||||
ThreatContainer::StorageType const &threatList = me->getThreatManager().getThreatList();
|
||||
for (ThreatContainer::StorageType::const_iterator itr = threatList.begin(); itr != threatList.end(); ++itr)
|
||||
if (Unit* unit = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid()))
|
||||
if (me->IsWithinMeleeRange(unit))
|
||||
{
|
||||
me->AttackerStateUpdate(unit);
|
||||
return;
|
||||
}
|
||||
me->AttackerStateUpdate(me->GetVictim());
|
||||
me->resetAttackTimer();
|
||||
}
|
||||
else
|
||||
{
|
||||
me->resetAttackTimer();
|
||||
ThreatContainer::StorageType const& threatList = me->getThreatManager().getThreatList();
|
||||
for (ThreatContainer::StorageType::const_iterator itr = threatList.begin(); itr != threatList.end(); ++itr)
|
||||
if (Unit* unit = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid()))
|
||||
if (me->IsWithinMeleeRange(unit))
|
||||
{
|
||||
me->AttackerStateUpdate(unit);
|
||||
return;
|
||||
}
|
||||
|
||||
me->CastSpell(me, SPELL_FLAME_BUFFET, false);
|
||||
}
|
||||
me->CastSpell(me, SPELL_FLAME_BUFFET, false);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_alarAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_alarAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
class CastQuill : public BasicEvent
|
||||
{
|
||||
public:
|
||||
CastQuill(Unit* caster, uint32 spellId) : _caster(caster), _spellId(spellId)
|
||||
{
|
||||
}
|
||||
public:
|
||||
CastQuill(Unit* caster, uint32 spellId) : _caster(caster), _spellId(spellId)
|
||||
{
|
||||
}
|
||||
|
||||
bool Execute(uint64 /*execTime*/, uint32 /*diff*/)
|
||||
{
|
||||
_caster->CastSpell(_caster, _spellId, true);
|
||||
return true;
|
||||
}
|
||||
bool Execute(uint64 /*execTime*/, uint32 /*diff*/)
|
||||
{
|
||||
_caster->CastSpell(_caster, _spellId, true);
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
Unit* _caster;
|
||||
uint32 _spellId;
|
||||
private:
|
||||
Unit* _caster;
|
||||
uint32 _spellId;
|
||||
};
|
||||
|
||||
class spell_alar_flame_quills : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_alar_flame_quills() : SpellScriptLoader("spell_alar_flame_quills") { }
|
||||
public:
|
||||
spell_alar_flame_quills() : SpellScriptLoader("spell_alar_flame_quills") { }
|
||||
|
||||
class spell_alar_flame_quills_AuraScript : public AuraScript
|
||||
class spell_alar_flame_quills_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_alar_flame_quills_AuraScript);
|
||||
|
||||
void HandlePeriodic(AuraEffect const* /*aurEff*/)
|
||||
{
|
||||
PrepareAuraScript(spell_alar_flame_quills_AuraScript);
|
||||
PreventDefaultAction();
|
||||
|
||||
void HandlePeriodic(AuraEffect const* /*aurEff*/)
|
||||
{
|
||||
PreventDefaultAction();
|
||||
|
||||
// 24 spells in total
|
||||
for (uint8 i = 0; i < 21; ++i)
|
||||
GetUnitOwner()->m_Events.AddEvent(new CastQuill(GetUnitOwner(), SPELL_QUILL_MISSILE_1+i), GetUnitOwner()->m_Events.CalculateTime(i*40));
|
||||
GetUnitOwner()->m_Events.AddEvent(new CastQuill(GetUnitOwner(), SPELL_QUILL_MISSILE_2+0), GetUnitOwner()->m_Events.CalculateTime(22*40));
|
||||
GetUnitOwner()->m_Events.AddEvent(new CastQuill(GetUnitOwner(), SPELL_QUILL_MISSILE_2+1), GetUnitOwner()->m_Events.CalculateTime(23*40));
|
||||
GetUnitOwner()->m_Events.AddEvent(new CastQuill(GetUnitOwner(), SPELL_QUILL_MISSILE_2+2), GetUnitOwner()->m_Events.CalculateTime(24*40));
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_alar_flame_quills_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_alar_flame_quills_AuraScript();
|
||||
// 24 spells in total
|
||||
for (uint8 i = 0; i < 21; ++i)
|
||||
GetUnitOwner()->m_Events.AddEvent(new CastQuill(GetUnitOwner(), SPELL_QUILL_MISSILE_1 + i), GetUnitOwner()->m_Events.CalculateTime(i * 40));
|
||||
GetUnitOwner()->m_Events.AddEvent(new CastQuill(GetUnitOwner(), SPELL_QUILL_MISSILE_2 + 0), GetUnitOwner()->m_Events.CalculateTime(22 * 40));
|
||||
GetUnitOwner()->m_Events.AddEvent(new CastQuill(GetUnitOwner(), SPELL_QUILL_MISSILE_2 + 1), GetUnitOwner()->m_Events.CalculateTime(23 * 40));
|
||||
GetUnitOwner()->m_Events.AddEvent(new CastQuill(GetUnitOwner(), SPELL_QUILL_MISSILE_2 + 2), GetUnitOwner()->m_Events.CalculateTime(24 * 40));
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_alar_flame_quills_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_alar_flame_quills_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_alar_ember_blast : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_alar_ember_blast() : SpellScriptLoader("spell_alar_ember_blast") { }
|
||||
public:
|
||||
spell_alar_ember_blast() : SpellScriptLoader("spell_alar_ember_blast") { }
|
||||
|
||||
class spell_alar_ember_blast_SpellScript : public SpellScript
|
||||
class spell_alar_ember_blast_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_alar_ember_blast_SpellScript);
|
||||
|
||||
void HandleForceCast(SpellEffIndex effIndex)
|
||||
{
|
||||
PrepareSpellScript(spell_alar_ember_blast_SpellScript);
|
||||
|
||||
void HandleForceCast(SpellEffIndex effIndex)
|
||||
{
|
||||
PreventHitEffect(effIndex);
|
||||
if (InstanceScript* instance = GetCaster()->GetInstanceScript())
|
||||
if (Creature* alar = ObjectAccessor::GetCreature(*GetCaster(), instance->GetData64(NPC_ALAR)))
|
||||
Unit::DealDamage(GetCaster(), alar, alar->CountPctFromMaxHealth(2));
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_alar_ember_blast_SpellScript::HandleForceCast, EFFECT_2, SPELL_EFFECT_FORCE_CAST);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_alar_ember_blast_SpellScript();
|
||||
PreventHitEffect(effIndex);
|
||||
if (InstanceScript* instance = GetCaster()->GetInstanceScript())
|
||||
if (Creature* alar = ObjectAccessor::GetCreature(*GetCaster(), instance->GetData64(NPC_ALAR)))
|
||||
Unit::DealDamage(GetCaster(), alar, alar->CountPctFromMaxHealth(2));
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_alar_ember_blast_SpellScript::HandleForceCast, EFFECT_2, SPELL_EFFECT_FORCE_CAST);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_alar_ember_blast_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_alar_ember_blast_death : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_alar_ember_blast_death() : SpellScriptLoader("spell_alar_ember_blast_death") { }
|
||||
public:
|
||||
spell_alar_ember_blast_death() : SpellScriptLoader("spell_alar_ember_blast_death") { }
|
||||
|
||||
class spell_alar_ember_blast_death_AuraScript : public AuraScript
|
||||
class spell_alar_ember_blast_death_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_alar_ember_blast_death_AuraScript);
|
||||
|
||||
void OnApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
PrepareAuraScript(spell_alar_ember_blast_death_AuraScript);
|
||||
PreventDefaultAction(); // xinef: prevent default action after change that invisibility in instances is executed instantly even for creatures
|
||||
Unit* target = GetTarget();
|
||||
InvisibilityType type = InvisibilityType(aurEff->GetMiscValue());
|
||||
target->m_invisibility.AddFlag(type);
|
||||
target->m_invisibility.AddValue(type, aurEff->GetAmount());
|
||||
|
||||
void OnApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
PreventDefaultAction(); // xinef: prevent default action after change that invisibility in instances is executed instantly even for creatures
|
||||
Unit* target = GetTarget();
|
||||
InvisibilityType type = InvisibilityType(aurEff->GetMiscValue());
|
||||
target->m_invisibility.AddFlag(type);
|
||||
target->m_invisibility.AddValue(type, aurEff->GetAmount());
|
||||
|
||||
GetUnitOwner()->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
GetUnitOwner()->SetStandState(UNIT_STAND_STATE_DEAD);
|
||||
GetUnitOwner()->m_last_notify_position.Relocate(0.0f, 0.0f, 0.0f);
|
||||
GetUnitOwner()->m_delayed_unit_relocation_timer = 1000;
|
||||
}
|
||||
|
||||
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
GetUnitOwner()->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
GetUnitOwner()->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectApply += AuraEffectApplyFn(spell_alar_ember_blast_death_AuraScript::OnApply, EFFECT_2, SPELL_AURA_MOD_INVISIBILITY, AURA_EFFECT_HANDLE_REAL);
|
||||
OnEffectRemove += AuraEffectRemoveFn(spell_alar_ember_blast_death_AuraScript::OnRemove, EFFECT_2, SPELL_AURA_MOD_INVISIBILITY, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_alar_ember_blast_death_AuraScript();
|
||||
GetUnitOwner()->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
GetUnitOwner()->SetStandState(UNIT_STAND_STATE_DEAD);
|
||||
GetUnitOwner()->m_last_notify_position.Relocate(0.0f, 0.0f, 0.0f);
|
||||
GetUnitOwner()->m_delayed_unit_relocation_timer = 1000;
|
||||
}
|
||||
|
||||
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
GetUnitOwner()->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
GetUnitOwner()->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectApply += AuraEffectApplyFn(spell_alar_ember_blast_death_AuraScript::OnApply, EFFECT_2, SPELL_AURA_MOD_INVISIBILITY, AURA_EFFECT_HANDLE_REAL);
|
||||
OnEffectRemove += AuraEffectRemoveFn(spell_alar_ember_blast_death_AuraScript::OnRemove, EFFECT_2, SPELL_AURA_MOD_INVISIBILITY, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_alar_ember_blast_death_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_alar_dive_bomb : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_alar_dive_bomb() : SpellScriptLoader("spell_alar_dive_bomb") { }
|
||||
public:
|
||||
spell_alar_dive_bomb() : SpellScriptLoader("spell_alar_dive_bomb") { }
|
||||
|
||||
class spell_alar_dive_bomb_AuraScript : public AuraScript
|
||||
class spell_alar_dive_bomb_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_alar_dive_bomb_AuraScript);
|
||||
|
||||
void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
PrepareAuraScript(spell_alar_dive_bomb_AuraScript);
|
||||
|
||||
void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
GetUnitOwner()->SetModelVisible(false);
|
||||
GetUnitOwner()->SetDisplayId(DISPLAYID_INVISIBLE);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectApply += AuraEffectApplyFn(spell_alar_dive_bomb_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_alar_dive_bomb_AuraScript();
|
||||
GetUnitOwner()->SetModelVisible(false);
|
||||
GetUnitOwner()->SetDisplayId(DISPLAYID_INVISIBLE);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectApply += AuraEffectApplyFn(spell_alar_dive_bomb_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_alar_dive_bomb_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_alar()
|
||||
|
||||
@@ -57,242 +57,242 @@ enum Misc
|
||||
|
||||
class boss_high_astromancer_solarian : public CreatureScript
|
||||
{
|
||||
public:
|
||||
public:
|
||||
|
||||
boss_high_astromancer_solarian() : CreatureScript("boss_high_astromancer_solarian") { }
|
||||
boss_high_astromancer_solarian() : CreatureScript("boss_high_astromancer_solarian") { }
|
||||
|
||||
struct boss_high_astromancer_solarianAI : public BossAI
|
||||
struct boss_high_astromancer_solarianAI : public BossAI
|
||||
{
|
||||
boss_high_astromancer_solarianAI(Creature* creature) : BossAI(creature, DATA_ASTROMANCER)
|
||||
{
|
||||
boss_high_astromancer_solarianAI(Creature* creature) : BossAI(creature, DATA_ASTROMANCER)
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
me->SetModelVisible(true);
|
||||
}
|
||||
|
||||
void AttackStart(Unit* who)
|
||||
{
|
||||
if (who && me->Attack(who, true))
|
||||
me->GetMotionMaster()->MoveChase(who, (events.GetNextEventTime(EVENT_SPELL_VOID_BOLT) == 0 ? 30.0f : 0.0f));
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER && roll_chance_i(50))
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
me->SetModelVisible(true);
|
||||
Talk(SAY_DEATH);
|
||||
BossAI::JustDied(killer);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
BossAI::EnterCombat(who);
|
||||
me->CallForHelp(105.0f);
|
||||
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
|
||||
events.ScheduleEvent(EVENT_SPELL_ARCANE_MISSILES, 3000);
|
||||
events.ScheduleEvent(EVENT_SPELL_WRATH_OF_ASTROMANCER, 1000);
|
||||
events.ScheduleEvent(EVENT_SPELL_BLINDING_LIGHT, 40000);
|
||||
events.ScheduleEvent(EVENT_SPAWN_PORTALS, 50000);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
if (!summon->IsTrigger())
|
||||
summon->SetInCombatWithZone();
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
me->SetModelVisible(true);
|
||||
}
|
||||
|
||||
void AttackStart(Unit* who)
|
||||
{
|
||||
if (who && me->Attack(who, true))
|
||||
me->GetMotionMaster()->MoveChase(who, (events.GetNextEventTime(EVENT_SPELL_VOID_BOLT) == 0 ? 30.0f : 0.0f));
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER && roll_chance_i(50))
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
me->SetModelVisible(true);
|
||||
Talk(SAY_DEATH);
|
||||
BossAI::JustDied(killer);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
BossAI::EnterCombat(who);
|
||||
me->CallForHelp(105.0f);
|
||||
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
|
||||
events.ScheduleEvent(EVENT_SPELL_ARCANE_MISSILES, 3000);
|
||||
events.ScheduleEvent(EVENT_SPELL_WRATH_OF_ASTROMANCER, 1000);
|
||||
events.ScheduleEvent(EVENT_SPELL_BLINDING_LIGHT, 40000);
|
||||
events.ScheduleEvent(EVENT_SPAWN_PORTALS, 50000);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
if (!summon->IsTrigger())
|
||||
summon->SetInCombatWithZone();
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_CHECK_HEALTH:
|
||||
if (me->HealthBelowPct(21))
|
||||
{
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_SPELL_VOID_BOLT, 3000);
|
||||
events.ScheduleEvent(EVENT_SPELL_PSYCHIC_SCREAM, 7000);
|
||||
me->CastSpell(me, SPELL_SOLARIAN_TRANSFORM, true);
|
||||
me->GetMotionMaster()->MoveChase(me->GetVictim());
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
|
||||
case EVENT_CHECK_HEALTH:
|
||||
if (me->HealthBelowPct(21))
|
||||
{
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_SPELL_VOID_BOLT, 3000);
|
||||
events.ScheduleEvent(EVENT_SPELL_PSYCHIC_SCREAM, 7000);
|
||||
me->CastSpell(me, SPELL_SOLARIAN_TRANSFORM, true);
|
||||
me->GetMotionMaster()->MoveChase(me->GetVictim());
|
||||
break;
|
||||
case EVENT_SPELL_ARCANE_MISSILES:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true))
|
||||
me->CastSpell(target, SPELL_ARCANE_MISSILES, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_ARCANE_MISSILES, 3000);
|
||||
break;
|
||||
case EVENT_SPELL_WRATH_OF_ASTROMANCER:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
|
||||
me->CastSpell(target, SPELL_WRATH_OF_THE_ASTROMANCER, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_WRATH_OF_ASTROMANCER, 22000);
|
||||
break;
|
||||
case EVENT_SPELL_BLINDING_LIGHT:
|
||||
me->CastSpell(me, SPELL_BLINDING_LIGHT, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_BLINDING_LIGHT, 40000);
|
||||
break;
|
||||
case EVENT_SPAWN_PORTALS:
|
||||
me->setAttackTimer(BASE_ATTACK, 21000);
|
||||
me->SetModelVisible(false);
|
||||
events.ScheduleEvent(EVENT_SPAWN_PORTALS, 50000);
|
||||
events.DelayEvents(21000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ADDS, 6000);
|
||||
events.ScheduleEvent(EVENT_REAPPEAR, 20000);
|
||||
for (uint8 i = 0; i < 3; ++i)
|
||||
{
|
||||
float o = rand_norm()*2*M_PI;
|
||||
if (i == 0)
|
||||
me->SummonCreature(NPC_ASTROMANCER_SOLARIAN_SPOTLIGHT, CENTER_X + cos(o)*INNER_PORTAL_RADIUS, CENTER_Y + sin(o)*INNER_PORTAL_RADIUS, CENTER_Z, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 26000);
|
||||
else
|
||||
me->SummonCreature(NPC_ASTROMANCER_SOLARIAN_SPOTLIGHT, CENTER_X + cos(o)*OUTER_PORTAL_RADIUS, CENTER_Y + sin(o)*OUTER_PORTAL_RADIUS, PORTAL_Z, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 26000);
|
||||
}
|
||||
break;
|
||||
case EVENT_SUMMON_ADDS:
|
||||
Talk(SAY_SUMMON1);
|
||||
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
|
||||
{
|
||||
if (Creature* light = ObjectAccessor::GetCreature(*me, *itr))
|
||||
if (light->GetEntry() == NPC_ASTROMANCER_SOLARIAN_SPOTLIGHT)
|
||||
{
|
||||
if (light->GetDistance2d(CENTER_X, CENTER_Y) < 20.0f)
|
||||
{
|
||||
me->SetPosition(*light);
|
||||
me->StopMovingOnCurrentPos();
|
||||
}
|
||||
for (uint8 j = 0; j < 4; ++j)
|
||||
me->SummonCreature(NPC_SOLARIUM_AGENT, light->GetPositionX()+frand(-3.0f, 3.0f), light->GetPositionY()+frand(-3.0f, 3.0f), light->GetPositionZ(), 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case EVENT_REAPPEAR:
|
||||
Talk(SAY_SUMMON2);
|
||||
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
|
||||
{
|
||||
if (Creature* light = ObjectAccessor::GetCreature(*me, *itr))
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
|
||||
break;
|
||||
case EVENT_SPELL_ARCANE_MISSILES:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true))
|
||||
me->CastSpell(target, SPELL_ARCANE_MISSILES, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_ARCANE_MISSILES, 3000);
|
||||
break;
|
||||
case EVENT_SPELL_WRATH_OF_ASTROMANCER:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
|
||||
me->CastSpell(target, SPELL_WRATH_OF_THE_ASTROMANCER, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_WRATH_OF_ASTROMANCER, 22000);
|
||||
break;
|
||||
case EVENT_SPELL_BLINDING_LIGHT:
|
||||
me->CastSpell(me, SPELL_BLINDING_LIGHT, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_BLINDING_LIGHT, 40000);
|
||||
break;
|
||||
case EVENT_SPAWN_PORTALS:
|
||||
me->setAttackTimer(BASE_ATTACK, 21000);
|
||||
me->SetModelVisible(false);
|
||||
events.ScheduleEvent(EVENT_SPAWN_PORTALS, 50000);
|
||||
events.DelayEvents(21000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ADDS, 6000);
|
||||
events.ScheduleEvent(EVENT_REAPPEAR, 20000);
|
||||
for (uint8 i = 0; i < 3; ++i)
|
||||
{
|
||||
float o = rand_norm() * 2 * M_PI;
|
||||
if (i == 0)
|
||||
me->SummonCreature(NPC_ASTROMANCER_SOLARIAN_SPOTLIGHT, CENTER_X + cos(o)*INNER_PORTAL_RADIUS, CENTER_Y + sin(o)*INNER_PORTAL_RADIUS, CENTER_Z, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 26000);
|
||||
else
|
||||
me->SummonCreature(NPC_ASTROMANCER_SOLARIAN_SPOTLIGHT, CENTER_X + cos(o)*OUTER_PORTAL_RADIUS, CENTER_Y + sin(o)*OUTER_PORTAL_RADIUS, PORTAL_Z, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 26000);
|
||||
}
|
||||
break;
|
||||
case EVENT_SUMMON_ADDS:
|
||||
Talk(SAY_SUMMON1);
|
||||
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
|
||||
{
|
||||
if (Creature* light = ObjectAccessor::GetCreature(*me, *itr))
|
||||
if (light->GetEntry() == NPC_ASTROMANCER_SOLARIAN_SPOTLIGHT)
|
||||
{
|
||||
if (light->GetEntry() == NPC_ASTROMANCER_SOLARIAN_SPOTLIGHT)
|
||||
if (light->GetDistance2d(CENTER_X, CENTER_Y) < 20.0f)
|
||||
{
|
||||
light->RemoveAllAuras();
|
||||
if (light->GetDistance2d(CENTER_X, CENTER_Y) < 20.0f)
|
||||
me->SetModelVisible(true);
|
||||
else
|
||||
me->SummonCreature(NPC_SOLARIUM_PRIEST, light->GetPositionX()+frand(-3.0f, 3.0f), light->GetPositionY()+frand(-3.0f, 3.0f), light->GetPositionZ(), 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000);
|
||||
me->SetPosition(*light);
|
||||
me->StopMovingOnCurrentPos();
|
||||
}
|
||||
for (uint8 j = 0; j < 4; ++j)
|
||||
me->SummonCreature(NPC_SOLARIUM_AGENT, light->GetPositionX() + frand(-3.0f, 3.0f), light->GetPositionY() + frand(-3.0f, 3.0f), light->GetPositionZ(), 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case EVENT_REAPPEAR:
|
||||
Talk(SAY_SUMMON2);
|
||||
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
|
||||
{
|
||||
if (Creature* light = ObjectAccessor::GetCreature(*me, *itr))
|
||||
{
|
||||
if (light->GetEntry() == NPC_ASTROMANCER_SOLARIAN_SPOTLIGHT)
|
||||
{
|
||||
light->RemoveAllAuras();
|
||||
if (light->GetDistance2d(CENTER_X, CENTER_Y) < 20.0f)
|
||||
me->SetModelVisible(true);
|
||||
else
|
||||
me->SummonCreature(NPC_SOLARIUM_PRIEST, light->GetPositionX() + frand(-3.0f, 3.0f), light->GetPositionY() + frand(-3.0f, 3.0f), light->GetPositionZ(), 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000);
|
||||
}
|
||||
}
|
||||
// protection
|
||||
if (me->GetDisplayId() != me->GetNativeDisplayId())
|
||||
{
|
||||
me->SetModelVisible(true);
|
||||
me->SummonCreature(NPC_SOLARIUM_PRIEST, me->GetPositionX()+frand(-3.0f, 3.0f), me->GetPositionY()+frand(-3.0f, 3.0f), me->GetPositionZ(), 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000);
|
||||
me->SummonCreature(NPC_SOLARIUM_PRIEST, me->GetPositionX()+frand(-3.0f, 3.0f), me->GetPositionY()+frand(-3.0f, 3.0f), me->GetPositionZ(), 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000);
|
||||
}
|
||||
break;
|
||||
case EVENT_SPELL_VOID_BOLT:
|
||||
me->CastSpell(me->GetVictim(), SPELL_VOID_BOLT, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_VOID_BOLT, 7000);
|
||||
break;
|
||||
case EVENT_SPELL_PSYCHIC_SCREAM:
|
||||
me->CastSpell(me, SPELL_PSYCHIC_SCREAM, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_PSYCHIC_SCREAM, 12000);
|
||||
break;
|
||||
}
|
||||
// protection
|
||||
if (me->GetDisplayId() != me->GetNativeDisplayId())
|
||||
{
|
||||
me->SetModelVisible(true);
|
||||
me->SummonCreature(NPC_SOLARIUM_PRIEST, me->GetPositionX() + frand(-3.0f, 3.0f), me->GetPositionY() + frand(-3.0f, 3.0f), me->GetPositionZ(), 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000);
|
||||
me->SummonCreature(NPC_SOLARIUM_PRIEST, me->GetPositionX() + frand(-3.0f, 3.0f), me->GetPositionY() + frand(-3.0f, 3.0f), me->GetPositionZ(), 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000);
|
||||
}
|
||||
break;
|
||||
case EVENT_SPELL_VOID_BOLT:
|
||||
me->CastSpell(me->GetVictim(), SPELL_VOID_BOLT, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_VOID_BOLT, 7000);
|
||||
break;
|
||||
case EVENT_SPELL_PSYCHIC_SCREAM:
|
||||
me->CastSpell(me, SPELL_PSYCHIC_SCREAM, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_PSYCHIC_SCREAM, 12000);
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
EnterEvadeIfOutOfCombatArea();
|
||||
}
|
||||
|
||||
bool CheckEvadeIfOutOfCombatArea() const
|
||||
{
|
||||
return me->GetDistance2d(432.59f, -371.93f) > 105.0f;
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_high_astromancer_solarianAI>(creature);
|
||||
DoMeleeAttackIfReady();
|
||||
EnterEvadeIfOutOfCombatArea();
|
||||
}
|
||||
|
||||
bool CheckEvadeIfOutOfCombatArea() const
|
||||
{
|
||||
return me->GetDistance2d(432.59f, -371.93f) > 105.0f;
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_high_astromancer_solarianAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
class spell_astromancer_wrath_of_the_astromancer : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_astromancer_wrath_of_the_astromancer() : SpellScriptLoader("spell_astromancer_wrath_of_the_astromancer") { }
|
||||
public:
|
||||
spell_astromancer_wrath_of_the_astromancer() : SpellScriptLoader("spell_astromancer_wrath_of_the_astromancer") { }
|
||||
|
||||
class spell_astromancer_wrath_of_the_astromancer_AuraScript : public AuraScript
|
||||
class spell_astromancer_wrath_of_the_astromancer_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_astromancer_wrath_of_the_astromancer_AuraScript);
|
||||
|
||||
void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
PrepareAuraScript(spell_astromancer_wrath_of_the_astromancer_AuraScript);
|
||||
if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
|
||||
return;
|
||||
|
||||
void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
|
||||
return;
|
||||
|
||||
Unit* target = GetUnitOwner();
|
||||
target->CastSpell(target, GetSpellInfo()->Effects[EFFECT_1].CalcValue(), false);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
AfterEffectRemove += AuraEffectRemoveFn(spell_astromancer_wrath_of_the_astromancer_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_astromancer_wrath_of_the_astromancer_AuraScript();
|
||||
Unit* target = GetUnitOwner();
|
||||
target->CastSpell(target, GetSpellInfo()->Effects[EFFECT_1].CalcValue(), false);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
AfterEffectRemove += AuraEffectRemoveFn(spell_astromancer_wrath_of_the_astromancer_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_astromancer_wrath_of_the_astromancer_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_astromancer_solarian_transform : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_astromancer_solarian_transform() : SpellScriptLoader("spell_astromancer_solarian_transform") { }
|
||||
public:
|
||||
spell_astromancer_solarian_transform() : SpellScriptLoader("spell_astromancer_solarian_transform") { }
|
||||
|
||||
class spell_astromancer_solarian_transform_AuraScript : public AuraScript
|
||||
class spell_astromancer_solarian_transform_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_astromancer_solarian_transform_AuraScript);
|
||||
|
||||
void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
PrepareAuraScript(spell_astromancer_solarian_transform_AuraScript);
|
||||
|
||||
void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
GetUnitOwner()->HandleStatModifier(UnitMods(UNIT_MOD_ARMOR), TOTAL_PCT, 400.0f, true);
|
||||
}
|
||||
|
||||
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
GetUnitOwner()->HandleStatModifier(UnitMods(UNIT_MOD_ARMOR), TOTAL_PCT, 400.0f, false);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectApply += AuraEffectApplyFn(spell_astromancer_solarian_transform_AuraScript::OnApply, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL);
|
||||
OnEffectRemove += AuraEffectRemoveFn(spell_astromancer_solarian_transform_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_astromancer_solarian_transform_AuraScript();
|
||||
GetUnitOwner()->HandleStatModifier(UnitMods(UNIT_MOD_ARMOR), TOTAL_PCT, 400.0f, true);
|
||||
}
|
||||
|
||||
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
GetUnitOwner()->HandleStatModifier(UnitMods(UNIT_MOD_ARMOR), TOTAL_PCT, 400.0f, false);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectApply += AuraEffectApplyFn(spell_astromancer_solarian_transform_AuraScript::OnApply, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL);
|
||||
OnEffectRemove += AuraEffectRemoveFn(spell_astromancer_solarian_transform_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_astromancer_solarian_transform_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_high_astromancer_solarian()
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -26,96 +26,96 @@ enum voidReaver
|
||||
|
||||
class boss_void_reaver : public CreatureScript
|
||||
{
|
||||
public:
|
||||
public:
|
||||
|
||||
boss_void_reaver() : CreatureScript("boss_void_reaver") { }
|
||||
boss_void_reaver() : CreatureScript("boss_void_reaver") { }
|
||||
|
||||
struct boss_void_reaverAI : public BossAI
|
||||
struct boss_void_reaverAI : public BossAI
|
||||
{
|
||||
boss_void_reaverAI(Creature* creature) : BossAI(creature, DATA_REAVER)
|
||||
{
|
||||
boss_void_reaverAI(Creature* creature) : BossAI(creature, DATA_REAVER)
|
||||
{
|
||||
me->ApplySpellImmune(0, IMMUNITY_DISPEL, DISPEL_POISON, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_HEALTH_LEECH, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_POWER_DRAIN, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_PERIODIC_LEECH, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_PERIODIC_MANA_LEECH, true);
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER && roll_chance_i(50))
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
BossAI::JustDied(killer);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
BossAI::EnterCombat(who);
|
||||
|
||||
events.ScheduleEvent(EVENT_SPELL_POUNDING, 15000);
|
||||
events.ScheduleEvent(EVENT_SPELL_ARCANEORB, 3000);
|
||||
events.ScheduleEvent(EVENT_SPELL_KNOCK_AWAY, 30000);
|
||||
events.ScheduleEvent(EVENT_SPELL_BERSERK, 600000);
|
||||
me->CallForHelp(105.0f);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
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_POUNDING:
|
||||
Talk(SAY_POUNDING);
|
||||
me->CastSpell(me, SPELL_POUNDING, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_POUNDING, 15000);
|
||||
break;
|
||||
case EVENT_SPELL_ARCANEORB:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, -18.0f, true))
|
||||
me->CastSpell(target, SPELL_ARCANE_ORB, false);
|
||||
else if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 20.0f, true))
|
||||
me->CastSpell(target, SPELL_ARCANE_ORB, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_ARCANEORB, 4000);
|
||||
break;
|
||||
case EVENT_SPELL_KNOCK_AWAY:
|
||||
me->CastSpell(me->GetVictim(), SPELL_KNOCK_AWAY, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_POUNDING, 25000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
EnterEvadeIfOutOfCombatArea();
|
||||
}
|
||||
|
||||
bool CheckEvadeIfOutOfCombatArea() const
|
||||
{
|
||||
return me->GetDistance2d(432.59f, 371.93f) > 105.0f;
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_void_reaverAI>(creature);
|
||||
me->ApplySpellImmune(0, IMMUNITY_DISPEL, DISPEL_POISON, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_HEALTH_LEECH, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_POWER_DRAIN, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_PERIODIC_LEECH, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_PERIODIC_MANA_LEECH, true);
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER && roll_chance_i(50))
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
BossAI::JustDied(killer);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
BossAI::EnterCombat(who);
|
||||
|
||||
events.ScheduleEvent(EVENT_SPELL_POUNDING, 15000);
|
||||
events.ScheduleEvent(EVENT_SPELL_ARCANEORB, 3000);
|
||||
events.ScheduleEvent(EVENT_SPELL_KNOCK_AWAY, 30000);
|
||||
events.ScheduleEvent(EVENT_SPELL_BERSERK, 600000);
|
||||
me->CallForHelp(105.0f);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
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_POUNDING:
|
||||
Talk(SAY_POUNDING);
|
||||
me->CastSpell(me, SPELL_POUNDING, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_POUNDING, 15000);
|
||||
break;
|
||||
case EVENT_SPELL_ARCANEORB:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, -18.0f, true))
|
||||
me->CastSpell(target, SPELL_ARCANE_ORB, false);
|
||||
else if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 20.0f, true))
|
||||
me->CastSpell(target, SPELL_ARCANE_ORB, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_ARCANEORB, 4000);
|
||||
break;
|
||||
case EVENT_SPELL_KNOCK_AWAY:
|
||||
me->CastSpell(me->GetVictim(), SPELL_KNOCK_AWAY, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_POUNDING, 25000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
EnterEvadeIfOutOfCombatArea();
|
||||
}
|
||||
|
||||
bool CheckEvadeIfOutOfCombatArea() const
|
||||
{
|
||||
return me->GetDistance2d(432.59f, 371.93f) > 105.0f;
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_void_reaverAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_void_reaver()
|
||||
|
||||
@@ -8,171 +8,180 @@
|
||||
|
||||
class instance_the_eye : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
instance_the_eye() : InstanceMapScript("instance_the_eye", 550) { }
|
||||
public:
|
||||
instance_the_eye() : InstanceMapScript("instance_the_eye", 550) { }
|
||||
|
||||
struct instance_the_eye_InstanceMapScript : public InstanceScript
|
||||
struct instance_the_eye_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_the_eye_InstanceMapScript(Map* map) : InstanceScript(map) {}
|
||||
|
||||
uint64 ThaladredTheDarkenerGUID;
|
||||
uint64 LordSanguinarGUID;
|
||||
uint64 GrandAstromancerCapernianGUID;
|
||||
uint64 MasterEngineerTelonicusGUID;
|
||||
uint64 AlarGUID;
|
||||
uint64 KaelthasGUID;
|
||||
uint64 BridgeWindowGUID;
|
||||
uint64 KaelStateRightGUID;
|
||||
uint64 KaelStateLeftGUID;
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
instance_the_eye_InstanceMapScript(Map* map) : InstanceScript(map) {}
|
||||
|
||||
uint64 ThaladredTheDarkenerGUID;
|
||||
uint64 LordSanguinarGUID;
|
||||
uint64 GrandAstromancerCapernianGUID;
|
||||
uint64 MasterEngineerTelonicusGUID;
|
||||
uint64 AlarGUID;
|
||||
uint64 KaelthasGUID;
|
||||
uint64 BridgeWindowGUID;
|
||||
uint64 KaelStateRightGUID;
|
||||
uint64 KaelStateLeftGUID;
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
SetBossNumber(MAX_ENCOUNTER);
|
||||
AlarGUID = 0;
|
||||
KaelthasGUID = 0;
|
||||
ThaladredTheDarkenerGUID = 0;
|
||||
LordSanguinarGUID = 0;
|
||||
GrandAstromancerCapernianGUID = 0;
|
||||
MasterEngineerTelonicusGUID = 0;
|
||||
BridgeWindowGUID = 0;
|
||||
KaelStateRightGUID = 0;
|
||||
KaelStateLeftGUID = 0;
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case NPC_ALAR:
|
||||
AlarGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_KAELTHAS:
|
||||
KaelthasGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_THALADRED:
|
||||
ThaladredTheDarkenerGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_TELONICUS:
|
||||
MasterEngineerTelonicusGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_CAPERNIAN:
|
||||
GrandAstromancerCapernianGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_LORD_SANGUINAR:
|
||||
LordSanguinarGUID = creature->GetGUID();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* gobject)
|
||||
{
|
||||
switch (gobject->GetEntry())
|
||||
{
|
||||
case GO_BRIDGE_WINDOW:
|
||||
BridgeWindowGUID = gobject->GetGUID();
|
||||
break;
|
||||
case GO_KAEL_STATUE_RIGHT:
|
||||
KaelStateRightGUID = gobject->GetGUID();
|
||||
break;
|
||||
case GO_KAEL_STATUE_LEFT:
|
||||
KaelStateLeftGUID = gobject->GetGUID();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
uint64 GetData64(uint32 identifier) const
|
||||
{
|
||||
switch (identifier)
|
||||
{
|
||||
case GO_BRIDGE_WINDOW: return BridgeWindowGUID;
|
||||
case GO_KAEL_STATUE_RIGHT: return KaelStateRightGUID;
|
||||
case GO_KAEL_STATUE_LEFT: return KaelStateLeftGUID;
|
||||
case NPC_ALAR: return AlarGUID;
|
||||
case NPC_KAELTHAS: return KaelthasGUID;
|
||||
case DATA_KAEL_ADVISOR1: return ThaladredTheDarkenerGUID;
|
||||
case DATA_KAEL_ADVISOR2: return LordSanguinarGUID;
|
||||
case DATA_KAEL_ADVISOR3: return GrandAstromancerCapernianGUID;
|
||||
case DATA_KAEL_ADVISOR4: return MasterEngineerTelonicusGUID;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "E Y " << GetBossSaveData();
|
||||
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void Load(char const* str)
|
||||
{
|
||||
if (!str)
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA(str);
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
|
||||
std::istringstream loadStream(str);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
|
||||
if (dataHead1 == 'E' && dataHead2 == 'Y')
|
||||
{
|
||||
for (uint32 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
{
|
||||
uint32 tmpState;
|
||||
loadStream >> tmpState;
|
||||
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
|
||||
tmpState = NOT_STARTED;
|
||||
SetBossState(i, EncounterState(tmpState));
|
||||
}
|
||||
}
|
||||
else
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
}
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_the_eye_InstanceMapScript(map);
|
||||
SetBossNumber(MAX_ENCOUNTER);
|
||||
AlarGUID = 0;
|
||||
KaelthasGUID = 0;
|
||||
ThaladredTheDarkenerGUID = 0;
|
||||
LordSanguinarGUID = 0;
|
||||
GrandAstromancerCapernianGUID = 0;
|
||||
MasterEngineerTelonicusGUID = 0;
|
||||
BridgeWindowGUID = 0;
|
||||
KaelStateRightGUID = 0;
|
||||
KaelStateLeftGUID = 0;
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case NPC_ALAR:
|
||||
AlarGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_KAELTHAS:
|
||||
KaelthasGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_THALADRED:
|
||||
ThaladredTheDarkenerGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_TELONICUS:
|
||||
MasterEngineerTelonicusGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_CAPERNIAN:
|
||||
GrandAstromancerCapernianGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_LORD_SANGUINAR:
|
||||
LordSanguinarGUID = creature->GetGUID();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* gobject)
|
||||
{
|
||||
switch (gobject->GetEntry())
|
||||
{
|
||||
case GO_BRIDGE_WINDOW:
|
||||
BridgeWindowGUID = gobject->GetGUID();
|
||||
break;
|
||||
case GO_KAEL_STATUE_RIGHT:
|
||||
KaelStateRightGUID = gobject->GetGUID();
|
||||
break;
|
||||
case GO_KAEL_STATUE_LEFT:
|
||||
KaelStateLeftGUID = gobject->GetGUID();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
uint64 GetData64(uint32 identifier) const
|
||||
{
|
||||
switch (identifier)
|
||||
{
|
||||
case GO_BRIDGE_WINDOW:
|
||||
return BridgeWindowGUID;
|
||||
case GO_KAEL_STATUE_RIGHT:
|
||||
return KaelStateRightGUID;
|
||||
case GO_KAEL_STATUE_LEFT:
|
||||
return KaelStateLeftGUID;
|
||||
case NPC_ALAR:
|
||||
return AlarGUID;
|
||||
case NPC_KAELTHAS:
|
||||
return KaelthasGUID;
|
||||
case DATA_KAEL_ADVISOR1:
|
||||
return ThaladredTheDarkenerGUID;
|
||||
case DATA_KAEL_ADVISOR2:
|
||||
return LordSanguinarGUID;
|
||||
case DATA_KAEL_ADVISOR3:
|
||||
return GrandAstromancerCapernianGUID;
|
||||
case DATA_KAEL_ADVISOR4:
|
||||
return MasterEngineerTelonicusGUID;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "E Y " << GetBossSaveData();
|
||||
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void Load(char const* str)
|
||||
{
|
||||
if (!str)
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA(str);
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
|
||||
std::istringstream loadStream(str);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
|
||||
if (dataHead1 == 'E' && dataHead2 == 'Y')
|
||||
{
|
||||
for (uint32 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
{
|
||||
uint32 tmpState;
|
||||
loadStream >> tmpState;
|
||||
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
|
||||
tmpState = NOT_STARTED;
|
||||
SetBossState(i, EncounterState(tmpState));
|
||||
}
|
||||
}
|
||||
else
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
}
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_the_eye_InstanceMapScript(map);
|
||||
}
|
||||
};
|
||||
|
||||
class spell_the_eye_countercharge : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_the_eye_countercharge() : SpellScriptLoader("spell_the_eye_countercharge") { }
|
||||
public:
|
||||
spell_the_eye_countercharge() : SpellScriptLoader("spell_the_eye_countercharge") { }
|
||||
|
||||
class spell_the_eye_counterchargeScript : public AuraScript
|
||||
class spell_the_eye_counterchargeScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_the_eye_counterchargeScript);
|
||||
|
||||
bool PrepareProc(ProcEventInfo& /*eventInfo*/)
|
||||
{
|
||||
PrepareAuraScript(spell_the_eye_counterchargeScript);
|
||||
|
||||
bool PrepareProc(ProcEventInfo& /*eventInfo*/)
|
||||
{
|
||||
// xinef: prevent charge drop
|
||||
PreventDefaultAction();
|
||||
return true;
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
DoCheckProc += AuraCheckProcFn(spell_the_eye_counterchargeScript::PrepareProc);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_the_eye_counterchargeScript();
|
||||
// xinef: prevent charge drop
|
||||
PreventDefaultAction();
|
||||
return true;
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
DoCheckProc += AuraCheckProcFn(spell_the_eye_counterchargeScript::PrepareProc);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_the_eye_counterchargeScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_instance_the_eye()
|
||||
|
||||
@@ -30,69 +30,69 @@ enum Events
|
||||
|
||||
class boss_gatewatcher_gyrokill : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_gatewatcher_gyrokill() : CreatureScript("boss_gatewatcher_gyrokill") { }
|
||||
public:
|
||||
boss_gatewatcher_gyrokill() : CreatureScript("boss_gatewatcher_gyrokill") { }
|
||||
|
||||
struct boss_gatewatcher_gyrokillAI : public BossAI
|
||||
struct boss_gatewatcher_gyrokillAI : public BossAI
|
||||
{
|
||||
boss_gatewatcher_gyrokillAI(Creature* creature) : BossAI(creature, DATA_GATEWATCHER_GYROKILL) { }
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
boss_gatewatcher_gyrokillAI(Creature* creature) : BossAI(creature, DATA_GATEWATCHER_GYROKILL) { }
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
events.ScheduleEvent(EVENT_STREAM_OF_MACHINE_FLUID, 10000);
|
||||
events.ScheduleEvent(EVENT_SAW_BLADE, 20000);
|
||||
events.ScheduleEvent(EVENT_SHADOW_POWER, 30000);
|
||||
Talk(SAY_AGGRO);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_STREAM_OF_MACHINE_FLUID:
|
||||
me->CastSpell(me->GetVictim(), SPELL_STREAM_OF_MACHINE_FLUID, false);
|
||||
events.ScheduleEvent(EVENT_STREAM_OF_MACHINE_FLUID, urand(12000, 14000));
|
||||
break;
|
||||
case EVENT_SAW_BLADE:
|
||||
if (Unit* target= SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f))
|
||||
me->CastSpell(target, SPELL_SAW_BLADE, false);
|
||||
Talk(SAY_SAW_BLADE);
|
||||
events.ScheduleEvent(EVENT_SAW_BLADE, 25000);
|
||||
break;
|
||||
case EVENT_SHADOW_POWER:
|
||||
me->CastSpell(me, SPELL_SHADOW_POWER, false);
|
||||
events.ScheduleEvent(EVENT_SAW_BLADE, 25000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_gatewatcher_gyrokillAI(creature);
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
events.ScheduleEvent(EVENT_STREAM_OF_MACHINE_FLUID, 10000);
|
||||
events.ScheduleEvent(EVENT_SAW_BLADE, 20000);
|
||||
events.ScheduleEvent(EVENT_SHADOW_POWER, 30000);
|
||||
Talk(SAY_AGGRO);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_STREAM_OF_MACHINE_FLUID:
|
||||
me->CastSpell(me->GetVictim(), SPELL_STREAM_OF_MACHINE_FLUID, false);
|
||||
events.ScheduleEvent(EVENT_STREAM_OF_MACHINE_FLUID, urand(12000, 14000));
|
||||
break;
|
||||
case EVENT_SAW_BLADE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f))
|
||||
me->CastSpell(target, SPELL_SAW_BLADE, false);
|
||||
Talk(SAY_SAW_BLADE);
|
||||
events.ScheduleEvent(EVENT_SAW_BLADE, 25000);
|
||||
break;
|
||||
case EVENT_SHADOW_POWER:
|
||||
me->CastSpell(me, SPELL_SHADOW_POWER, false);
|
||||
events.ScheduleEvent(EVENT_SAW_BLADE, 25000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_gatewatcher_gyrokillAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_gatewatcher_gyrokill()
|
||||
|
||||
@@ -31,71 +31,71 @@ enum Events
|
||||
|
||||
class boss_gatewatcher_iron_hand : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_gatewatcher_iron_hand(): CreatureScript("boss_gatewatcher_iron_hand") { }
|
||||
public:
|
||||
boss_gatewatcher_iron_hand(): CreatureScript("boss_gatewatcher_iron_hand") { }
|
||||
|
||||
struct boss_gatewatcher_iron_handAI : public BossAI
|
||||
struct boss_gatewatcher_iron_handAI : public BossAI
|
||||
{
|
||||
boss_gatewatcher_iron_handAI(Creature* creature) : BossAI(creature, DATA_GATEWATCHER_IRON_HAND) { }
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
boss_gatewatcher_iron_handAI(Creature* creature) : BossAI(creature, DATA_GATEWATCHER_IRON_HAND) { }
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
events.ScheduleEvent(EVENT_STREAM_OF_MACHINE_FLUID, 15000);
|
||||
events.ScheduleEvent(EVENT_JACKHAMMER, 35000);
|
||||
events.ScheduleEvent(EVENT_SHADOW_POWER, 25000);
|
||||
Talk(SAY_AGGRO);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_STREAM_OF_MACHINE_FLUID:
|
||||
me->CastSpell(me->GetVictim(), SPELL_STREAM_OF_MACHINE_FLUID, false);
|
||||
events.ScheduleEvent(EVENT_STREAM_OF_MACHINE_FLUID, 20000);
|
||||
break;
|
||||
case EVENT_JACKHAMMER:
|
||||
Talk(EMOTE_HAMMER);
|
||||
Talk(SAY_HAMMER);
|
||||
me->CastSpell(me, SPELL_JACKHAMMER, false);
|
||||
events.ScheduleEvent(EVENT_JACKHAMMER, 40000);
|
||||
break;
|
||||
case EVENT_SHADOW_POWER:
|
||||
me->CastSpell(me, SPELL_SHADOW_POWER, false);
|
||||
events.ScheduleEvent(EVENT_SHADOW_POWER, 25000);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_gatewatcher_iron_handAI(creature);
|
||||
_EnterCombat();
|
||||
events.ScheduleEvent(EVENT_STREAM_OF_MACHINE_FLUID, 15000);
|
||||
events.ScheduleEvent(EVENT_JACKHAMMER, 35000);
|
||||
events.ScheduleEvent(EVENT_SHADOW_POWER, 25000);
|
||||
Talk(SAY_AGGRO);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_STREAM_OF_MACHINE_FLUID:
|
||||
me->CastSpell(me->GetVictim(), SPELL_STREAM_OF_MACHINE_FLUID, false);
|
||||
events.ScheduleEvent(EVENT_STREAM_OF_MACHINE_FLUID, 20000);
|
||||
break;
|
||||
case EVENT_JACKHAMMER:
|
||||
Talk(EMOTE_HAMMER);
|
||||
Talk(SAY_HAMMER);
|
||||
me->CastSpell(me, SPELL_JACKHAMMER, false);
|
||||
events.ScheduleEvent(EVENT_JACKHAMMER, 40000);
|
||||
break;
|
||||
case EVENT_SHADOW_POWER:
|
||||
me->CastSpell(me, SPELL_SHADOW_POWER, false);
|
||||
events.ScheduleEvent(EVENT_SHADOW_POWER, 25000);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_gatewatcher_iron_handAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_gatewatcher_iron_hand()
|
||||
|
||||
@@ -43,67 +43,67 @@ enum Events
|
||||
|
||||
class boss_mechano_lord_capacitus : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_mechano_lord_capacitus() : CreatureScript("boss_mechano_lord_capacitus") { }
|
||||
public:
|
||||
boss_mechano_lord_capacitus() : CreatureScript("boss_mechano_lord_capacitus") { }
|
||||
|
||||
struct boss_mechano_lord_capacitusAI : public BossAI
|
||||
struct boss_mechano_lord_capacitusAI : public BossAI
|
||||
{
|
||||
boss_mechano_lord_capacitusAI(Creature* creature) : BossAI(creature, DATA_MECHANOLORD_CAPACITUS) { }
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
boss_mechano_lord_capacitusAI(Creature* creature) : BossAI(creature, DATA_MECHANOLORD_CAPACITUS) { }
|
||||
_EnterCombat();
|
||||
Talk(YELL_AGGRO);
|
||||
events.ScheduleEvent(EVENT_HEADCRACK, 6000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_NETHER_CHARGE, 10000);
|
||||
events.ScheduleEvent(EVENT_BERSERK, 180000);
|
||||
events.ScheduleEvent(IsHeroic() ? EVENT_POSITIVE_SHIFT : EVENT_REFLECTIVE_DAMAGE_SHIELD, 15000);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(YELL_KILL);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*victim*/)
|
||||
{
|
||||
_JustDied();
|
||||
Talk(YELL_DEATH);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
summon->GetMotionMaster()->MoveRandom(30.0f);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
_EnterCombat();
|
||||
Talk(YELL_AGGRO);
|
||||
events.ScheduleEvent(EVENT_HEADCRACK, 6000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_NETHER_CHARGE, 10000);
|
||||
events.ScheduleEvent(EVENT_BERSERK, 180000);
|
||||
events.ScheduleEvent(IsHeroic() ? EVENT_POSITIVE_SHIFT : EVENT_REFLECTIVE_DAMAGE_SHIELD, 15000);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(YELL_KILL);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*victim*/)
|
||||
{
|
||||
_JustDied();
|
||||
Talk(YELL_DEATH);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
summon->GetMotionMaster()->MoveRandom(30.0f);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_HEADCRACK:
|
||||
me->CastSpell(me->GetVictim(), SPELL_HEADCRACK, false);
|
||||
events.ScheduleEvent(EVENT_HEADCRACK, 20000);
|
||||
break;
|
||||
case EVENT_REFLECTIVE_DAMAGE_SHIELD:
|
||||
Talk(YELL_REFLECTIVE_DAMAGE_SHIELD);
|
||||
me->CastSpell(me, SPELL_REFLECTIVE_DAMAGE_SHIELD, false);
|
||||
events.ScheduleEvent(EVENT_REFLECTIVE_MAGIE_SHIELD, 20000);
|
||||
break;
|
||||
case EVENT_REFLECTIVE_MAGIE_SHIELD:
|
||||
Talk(YELL_REFLECTIVE_MAGIC_SHIELD);
|
||||
me->CastSpell(me, SPELL_REFLECTIVE_MAGIC_SHIELD, false);
|
||||
events.ScheduleEvent(EVENT_REFLECTIVE_DAMAGE_SHIELD, 20000);
|
||||
break;
|
||||
case EVENT_SUMMON_NETHER_CHARGE:
|
||||
case EVENT_HEADCRACK:
|
||||
me->CastSpell(me->GetVictim(), SPELL_HEADCRACK, false);
|
||||
events.ScheduleEvent(EVENT_HEADCRACK, 20000);
|
||||
break;
|
||||
case EVENT_REFLECTIVE_DAMAGE_SHIELD:
|
||||
Talk(YELL_REFLECTIVE_DAMAGE_SHIELD);
|
||||
me->CastSpell(me, SPELL_REFLECTIVE_DAMAGE_SHIELD, false);
|
||||
events.ScheduleEvent(EVENT_REFLECTIVE_MAGIE_SHIELD, 20000);
|
||||
break;
|
||||
case EVENT_REFLECTIVE_MAGIE_SHIELD:
|
||||
Talk(YELL_REFLECTIVE_MAGIC_SHIELD);
|
||||
me->CastSpell(me, SPELL_REFLECTIVE_MAGIC_SHIELD, false);
|
||||
events.ScheduleEvent(EVENT_REFLECTIVE_DAMAGE_SHIELD, 20000);
|
||||
break;
|
||||
case EVENT_SUMMON_NETHER_CHARGE:
|
||||
{
|
||||
Position pos;
|
||||
me->GetRandomNearPosition(pos, 8.0f);
|
||||
@@ -111,23 +111,23 @@ class boss_mechano_lord_capacitus : public CreatureScript
|
||||
events.ScheduleEvent(EVENT_SUMMON_NETHER_CHARGE, 5000);
|
||||
break;
|
||||
}
|
||||
case EVENT_POSITIVE_SHIFT:
|
||||
me->CastSpell(me, SPELL_POLARITY_SHIFT, true);
|
||||
events.ScheduleEvent(EVENT_POSITIVE_SHIFT, 30000);
|
||||
break;
|
||||
case EVENT_BERSERK:
|
||||
me->CastSpell(me, SPELL_BERSERK, true);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
case EVENT_POSITIVE_SHIFT:
|
||||
me->CastSpell(me, SPELL_POLARITY_SHIFT, true);
|
||||
events.ScheduleEvent(EVENT_POSITIVE_SHIFT, 30000);
|
||||
break;
|
||||
case EVENT_BERSERK:
|
||||
me->CastSpell(me, SPELL_BERSERK, true);
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_mechano_lord_capacitusAI(creature);
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_mechano_lord_capacitusAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
enum polarityShift
|
||||
@@ -143,77 +143,77 @@ enum polarityShift
|
||||
|
||||
class spell_capacitus_polarity_charge : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_capacitus_polarity_charge() : SpellScriptLoader("spell_capacitus_polarity_charge") { }
|
||||
public:
|
||||
spell_capacitus_polarity_charge() : SpellScriptLoader("spell_capacitus_polarity_charge") { }
|
||||
|
||||
class spell_capacitus_polarity_charge_SpellScript : public SpellScript
|
||||
class spell_capacitus_polarity_charge_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_capacitus_polarity_charge_SpellScript);
|
||||
|
||||
void HandleTargets(std::list<WorldObject*>& targetList)
|
||||
{
|
||||
PrepareSpellScript(spell_capacitus_polarity_charge_SpellScript);
|
||||
uint8 count = 0;
|
||||
for (std::list<WorldObject*>::iterator ihit = targetList.begin(); ihit != targetList.end(); ++ihit)
|
||||
if ((*ihit)->GetGUID() != GetCaster()->GetGUID())
|
||||
if (Player* target = (*ihit)->ToPlayer())
|
||||
if (target->HasAura(GetTriggeringSpell()->Id))
|
||||
++count;
|
||||
|
||||
void HandleTargets(std::list<WorldObject*>& targetList)
|
||||
if (count)
|
||||
{
|
||||
uint8 count = 0;
|
||||
for (std::list<WorldObject*>::iterator ihit = targetList.begin(); ihit != targetList.end(); ++ihit)
|
||||
if ((*ihit)->GetGUID() != GetCaster()->GetGUID())
|
||||
if (Player* target = (*ihit)->ToPlayer())
|
||||
if (target->HasAura(GetTriggeringSpell()->Id))
|
||||
++count;
|
||||
|
||||
if (count)
|
||||
{
|
||||
uint32 spellId = GetSpellInfo()->Id == SPELL_POSITIVE_CHARGE ? SPELL_POSITIVE_CHARGE_STACK : SPELL_NEGATIVE_CHARGE_STACK;
|
||||
GetCaster()->SetAuraStack(spellId, GetCaster(), count);
|
||||
}
|
||||
uint32 spellId = GetSpellInfo()->Id == SPELL_POSITIVE_CHARGE ? SPELL_POSITIVE_CHARGE_STACK : SPELL_NEGATIVE_CHARGE_STACK;
|
||||
GetCaster()->SetAuraStack(spellId, GetCaster(), count);
|
||||
}
|
||||
|
||||
void HandleDamage(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (!GetTriggeringSpell())
|
||||
return;
|
||||
|
||||
Unit* target = GetHitUnit();
|
||||
if (target->HasAura(GetTriggeringSpell()->Id))
|
||||
SetHitDamage(0);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_capacitus_polarity_charge_SpellScript::HandleDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
|
||||
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_capacitus_polarity_charge_SpellScript::HandleTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_capacitus_polarity_charge_SpellScript();
|
||||
}
|
||||
|
||||
void HandleDamage(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (!GetTriggeringSpell())
|
||||
return;
|
||||
|
||||
Unit* target = GetHitUnit();
|
||||
if (target->HasAura(GetTriggeringSpell()->Id))
|
||||
SetHitDamage(0);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_capacitus_polarity_charge_SpellScript::HandleDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
|
||||
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_capacitus_polarity_charge_SpellScript::HandleTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_capacitus_polarity_charge_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_capacitus_polarity_shift : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_capacitus_polarity_shift() : SpellScriptLoader("spell_capacitus_polarity_shift") { }
|
||||
public:
|
||||
spell_capacitus_polarity_shift() : SpellScriptLoader("spell_capacitus_polarity_shift") { }
|
||||
|
||||
class spell_capacitus_polarity_shift_SpellScript : public SpellScript
|
||||
class spell_capacitus_polarity_shift_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_capacitus_polarity_shift_SpellScript);
|
||||
|
||||
void HandleDummy(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
PrepareSpellScript(spell_capacitus_polarity_shift_SpellScript);
|
||||
|
||||
void HandleDummy(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (Unit* target = GetHitUnit())
|
||||
target->CastSpell(target, roll_chance_i(50) ? SPELL_POSITIVE_POLARITY : SPELL_NEGATIVE_POLARITY, true, nullptr, nullptr, GetCaster()->GetGUID());
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_capacitus_polarity_shift_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_capacitus_polarity_shift_SpellScript();
|
||||
if (Unit* target = GetHitUnit())
|
||||
target->CastSpell(target, roll_chance_i(50) ? SPELL_POSITIVE_POLARITY : SPELL_NEGATIVE_POLARITY, true, nullptr, nullptr, GetCaster()->GetGUID());
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_capacitus_polarity_shift_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_capacitus_polarity_shift_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_mechano_lord_capacitus()
|
||||
|
||||
@@ -32,90 +32,91 @@ enum Events
|
||||
|
||||
class boss_nethermancer_sepethrea : public CreatureScript
|
||||
{
|
||||
public: boss_nethermancer_sepethrea(): CreatureScript("boss_nethermancer_sepethrea") { }
|
||||
public:
|
||||
boss_nethermancer_sepethrea(): CreatureScript("boss_nethermancer_sepethrea") { }
|
||||
|
||||
struct boss_nethermancer_sepethreaAI : public BossAI
|
||||
struct boss_nethermancer_sepethreaAI : public BossAI
|
||||
{
|
||||
boss_nethermancer_sepethreaAI(Creature* creature) : BossAI(creature, DATA_NETHERMANCER_SEPRETHREA) { }
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
boss_nethermancer_sepethreaAI(Creature* creature) : BossAI(creature, DATA_NETHERMANCER_SEPRETHREA) { }
|
||||
_EnterCombat();
|
||||
events.ScheduleEvent(EVENT_FROST_ATTACK, 6000);
|
||||
events.ScheduleEvent(EVENT_ARCANE_BLAST, 14000);
|
||||
events.ScheduleEvent(EVENT_DRAGONS_BREATH, 18000);
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
events.ScheduleEvent(EVENT_FROST_ATTACK, 6000);
|
||||
events.ScheduleEvent(EVENT_ARCANE_BLAST, 14000);
|
||||
events.ScheduleEvent(EVENT_DRAGONS_BREATH, 18000);
|
||||
|
||||
Talk(SAY_AGGRO);
|
||||
me->CastSpell(me, SPELL_SUMMON_RAGIN_FLAMES, true);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
if (Unit* victim = me->GetVictim())
|
||||
{
|
||||
summon->AI()->AttackStart(victim);
|
||||
summon->AddThreat(victim, 1000.0f);
|
||||
summon->SetInCombatWithZone();
|
||||
}
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
events.Reset();
|
||||
if (instance)
|
||||
{
|
||||
instance->SetBossState(DATA_NETHERMANCER_SEPRETHREA, DONE);
|
||||
instance->SaveToDB();
|
||||
}
|
||||
Talk(SAY_DEATH);
|
||||
|
||||
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
|
||||
if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr))
|
||||
Unit::Kill(summon, summon);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_FROST_ATTACK:
|
||||
me->CastSpell(me->GetVictim(), SPELL_FROST_ATTACK, false);
|
||||
events.ScheduleEvent(EVENT_FROST_ATTACK, 8000);
|
||||
break;
|
||||
case EVENT_ARCANE_BLAST:
|
||||
me->CastSpell(me->GetVictim(), SPELL_ARCANE_BLAST, false);
|
||||
events.ScheduleEvent(EVENT_ARCANE_BLAST, 12000);
|
||||
break;
|
||||
case EVENT_DRAGONS_BREATH:
|
||||
me->CastSpell(me->GetVictim(), SPELL_DRAGONS_BREATH, true);
|
||||
events.ScheduleEvent(EVENT_DRAGONS_BREATH, 16000);
|
||||
if (roll_chance_i(50))
|
||||
Talk(SAY_DRAGONS_BREATH);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_nethermancer_sepethreaAI(creature);
|
||||
Talk(SAY_AGGRO);
|
||||
me->CastSpell(me, SPELL_SUMMON_RAGIN_FLAMES, true);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
if (Unit* victim = me->GetVictim())
|
||||
{
|
||||
summon->AI()->AttackStart(victim);
|
||||
summon->AddThreat(victim, 1000.0f);
|
||||
summon->SetInCombatWithZone();
|
||||
}
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
events.Reset();
|
||||
if (instance)
|
||||
{
|
||||
instance->SetBossState(DATA_NETHERMANCER_SEPRETHREA, DONE);
|
||||
instance->SaveToDB();
|
||||
}
|
||||
Talk(SAY_DEATH);
|
||||
|
||||
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
|
||||
if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr))
|
||||
Unit::Kill(summon, summon);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_FROST_ATTACK:
|
||||
me->CastSpell(me->GetVictim(), SPELL_FROST_ATTACK, false);
|
||||
events.ScheduleEvent(EVENT_FROST_ATTACK, 8000);
|
||||
break;
|
||||
case EVENT_ARCANE_BLAST:
|
||||
me->CastSpell(me->GetVictim(), SPELL_ARCANE_BLAST, false);
|
||||
events.ScheduleEvent(EVENT_ARCANE_BLAST, 12000);
|
||||
break;
|
||||
case EVENT_DRAGONS_BREATH:
|
||||
me->CastSpell(me->GetVictim(), SPELL_DRAGONS_BREATH, true);
|
||||
events.ScheduleEvent(EVENT_DRAGONS_BREATH, 16000);
|
||||
if (roll_chance_i(50))
|
||||
Talk(SAY_DRAGONS_BREATH);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_nethermancer_sepethreaAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
enum raginFlames
|
||||
@@ -130,83 +131,83 @@ enum raginFlames
|
||||
|
||||
class npc_ragin_flames : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_ragin_flames() : CreatureScript("npc_ragin_flames") { }
|
||||
public:
|
||||
npc_ragin_flames() : CreatureScript("npc_ragin_flames") { }
|
||||
|
||||
struct npc_ragin_flamesAI : public ScriptedAI
|
||||
struct npc_ragin_flamesAI : public ScriptedAI
|
||||
{
|
||||
npc_ragin_flamesAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
EventMap events;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_ALL, true);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit*)
|
||||
{
|
||||
events.ScheduleEvent(EVENT_SPELL_FIRE_TAIL, 500);
|
||||
events.ScheduleEvent(EVENT_SPELL_INFERNO, urand(10000, 20000));
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
npc_ragin_flamesAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
EventMap events;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_ALL, true);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit*)
|
||||
{
|
||||
events.ScheduleEvent(EVENT_SPELL_FIRE_TAIL, 500);
|
||||
events.ScheduleEvent(EVENT_SPELL_INFERNO, urand(10000, 20000));
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
switch (events.ExecuteEvent())
|
||||
case EVENT_SPELL_INFERNO:
|
||||
if (me->IsWithinCombatRange(me->GetVictim(), 5.0f))
|
||||
{
|
||||
case EVENT_SPELL_INFERNO:
|
||||
if (me->IsWithinCombatRange(me->GetVictim(), 5.0f))
|
||||
{
|
||||
me->CastSpell(me, SPELL_INFERNO, true);
|
||||
events.ScheduleEvent(EVENT_SPELL_INFERNO, 20000);
|
||||
}
|
||||
else
|
||||
events.ScheduleEvent(EVENT_SPELL_INFERNO, 1000);
|
||||
break;
|
||||
case EVENT_SPELL_FIRE_TAIL:
|
||||
me->CastSpell(me, SPELL_FIRE_TAIL, true);
|
||||
events.ScheduleEvent(EVENT_SPELL_FIRE_TAIL, 500);
|
||||
break;
|
||||
me->CastSpell(me, SPELL_INFERNO, true);
|
||||
events.ScheduleEvent(EVENT_SPELL_INFERNO, 20000);
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
};
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new npc_ragin_flamesAI(creature);
|
||||
else
|
||||
events.ScheduleEvent(EVENT_SPELL_INFERNO, 1000);
|
||||
break;
|
||||
case EVENT_SPELL_FIRE_TAIL:
|
||||
me->CastSpell(me, SPELL_FIRE_TAIL, true);
|
||||
events.ScheduleEvent(EVENT_SPELL_FIRE_TAIL, 500);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
};
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new npc_ragin_flamesAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
class spell_ragin_flames_inferno : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_ragin_flames_inferno() : SpellScriptLoader("spell_ragin_flames_inferno") { }
|
||||
public:
|
||||
spell_ragin_flames_inferno() : SpellScriptLoader("spell_ragin_flames_inferno") { }
|
||||
|
||||
class spell_ragin_flames_inferno_AuraScript : public AuraScript
|
||||
class spell_ragin_flames_inferno_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_ragin_flames_inferno_AuraScript);
|
||||
|
||||
void HandlePeriodic(AuraEffect const* aurEff)
|
||||
{
|
||||
PrepareAuraScript(spell_ragin_flames_inferno_AuraScript);
|
||||
|
||||
void HandlePeriodic(AuraEffect const* aurEff)
|
||||
{
|
||||
GetUnitOwner()->CastCustomSpell(SPELL_INFERNO_DAMAGE, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetUnitOwner(), TRIGGERED_FULL_MASK);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_ragin_flames_inferno_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_ragin_flames_inferno_AuraScript();
|
||||
GetUnitOwner()->CastCustomSpell(SPELL_INFERNO_DAMAGE, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetUnitOwner(), TRIGGERED_FULL_MASK);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_ragin_flames_inferno_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_ragin_flames_inferno_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_nethermancer_sepethrea()
|
||||
|
||||
@@ -42,112 +42,112 @@ enum Events
|
||||
|
||||
class boss_pathaleon_the_calculator : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_pathaleon_the_calculator(): CreatureScript("boss_pathaleon_the_calculator") { }
|
||||
public:
|
||||
boss_pathaleon_the_calculator(): CreatureScript("boss_pathaleon_the_calculator") { }
|
||||
|
||||
struct boss_pathaleon_the_calculatorAI : public BossAI
|
||||
struct boss_pathaleon_the_calculatorAI : public BossAI
|
||||
{
|
||||
boss_pathaleon_the_calculatorAI(Creature* creature) : BossAI(creature, DATA_PATHALEON_THE_CALCULATOR) { }
|
||||
|
||||
void InitializeAI()
|
||||
{
|
||||
boss_pathaleon_the_calculatorAI(Creature* creature) : BossAI(creature, DATA_PATHALEON_THE_CALCULATOR) { }
|
||||
|
||||
void InitializeAI()
|
||||
{
|
||||
BossAI::InitializeAI();
|
||||
me->SetVisible(false);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
}
|
||||
|
||||
void DoAction(int32 /*param*/)
|
||||
{
|
||||
me->SetVisible(true);
|
||||
me->CastSpell(me, SPELL_TELEPORT_VISUAL, true);
|
||||
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY1H);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
Talk(SAY_APPEAR);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
events.ScheduleEvent(EVENT_SUMMON, 30000);
|
||||
events.ScheduleEvent(EVENT_MANA_TAP, 12000);
|
||||
events.ScheduleEvent(EVENT_ARCANE_TORRENT, 16000);
|
||||
events.ScheduleEvent(EVENT_DOMINATION, 25000);
|
||||
events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, 8000);
|
||||
events.ScheduleEvent(EVENT_FRENZY, 1000);
|
||||
Talk(SAY_AGGRO);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_ARCANE_EXPLOSION:
|
||||
me->CastSpell(me, SPELL_ARCANE_EXPLOSION, false);
|
||||
events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, 12000);
|
||||
break;
|
||||
case EVENT_ARCANE_TORRENT:
|
||||
me->RemoveAurasDueToSpell(SPELL_MANA_TAP);
|
||||
me->ModifyPower(POWER_MANA, 5000);
|
||||
me->CastSpell(me, SPELL_ARCANE_TORRENT, false);
|
||||
events.ScheduleEvent(EVENT_ARCANE_TORRENT, 15000);
|
||||
break;
|
||||
case EVENT_MANA_TAP:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, PowerUsersSelector(me, POWER_MANA, 40.0f, false)))
|
||||
me->CastSpell(target, SPELL_MANA_TAP, false);
|
||||
events.ScheduleEvent(EVENT_MANA_TAP, 18000);
|
||||
break;
|
||||
case EVENT_DOMINATION:
|
||||
Talk(SAY_DOMINATION);
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 50.0f))
|
||||
me->CastSpell(target, SPELL_DOMINATION, false);
|
||||
events.ScheduleEvent(EVENT_DOMINATION, 30000);
|
||||
break;
|
||||
case EVENT_FRENZY:
|
||||
if (me->HealthBelowPct(20))
|
||||
{
|
||||
summons.DespawnAll();
|
||||
me->CastSpell(me, SPELL_DISGRUNTLED_ANGER, true);
|
||||
Talk(SAY_ENRAGE);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_FRENZY, 1000);
|
||||
break;
|
||||
case EVENT_SUMMON:
|
||||
for (uint8 i = 0; i < DUNGEON_MODE(3, 4); ++i)
|
||||
me->CastSpell(me, SPELL_SUMMON_NETHER_WRAITH_1+i, true);
|
||||
|
||||
Talk(SAY_SUMMON);
|
||||
events.ScheduleEvent(EVENT_SUMMON, urand(30000, 45000));
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_pathaleon_the_calculatorAI(creature);
|
||||
BossAI::InitializeAI();
|
||||
me->SetVisible(false);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
}
|
||||
|
||||
void DoAction(int32 /*param*/)
|
||||
{
|
||||
me->SetVisible(true);
|
||||
me->CastSpell(me, SPELL_TELEPORT_VISUAL, true);
|
||||
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY1H);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
Talk(SAY_APPEAR);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
events.ScheduleEvent(EVENT_SUMMON, 30000);
|
||||
events.ScheduleEvent(EVENT_MANA_TAP, 12000);
|
||||
events.ScheduleEvent(EVENT_ARCANE_TORRENT, 16000);
|
||||
events.ScheduleEvent(EVENT_DOMINATION, 25000);
|
||||
events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, 8000);
|
||||
events.ScheduleEvent(EVENT_FRENZY, 1000);
|
||||
Talk(SAY_AGGRO);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_ARCANE_EXPLOSION:
|
||||
me->CastSpell(me, SPELL_ARCANE_EXPLOSION, false);
|
||||
events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, 12000);
|
||||
break;
|
||||
case EVENT_ARCANE_TORRENT:
|
||||
me->RemoveAurasDueToSpell(SPELL_MANA_TAP);
|
||||
me->ModifyPower(POWER_MANA, 5000);
|
||||
me->CastSpell(me, SPELL_ARCANE_TORRENT, false);
|
||||
events.ScheduleEvent(EVENT_ARCANE_TORRENT, 15000);
|
||||
break;
|
||||
case EVENT_MANA_TAP:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, PowerUsersSelector(me, POWER_MANA, 40.0f, false)))
|
||||
me->CastSpell(target, SPELL_MANA_TAP, false);
|
||||
events.ScheduleEvent(EVENT_MANA_TAP, 18000);
|
||||
break;
|
||||
case EVENT_DOMINATION:
|
||||
Talk(SAY_DOMINATION);
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 50.0f))
|
||||
me->CastSpell(target, SPELL_DOMINATION, false);
|
||||
events.ScheduleEvent(EVENT_DOMINATION, 30000);
|
||||
break;
|
||||
case EVENT_FRENZY:
|
||||
if (me->HealthBelowPct(20))
|
||||
{
|
||||
summons.DespawnAll();
|
||||
me->CastSpell(me, SPELL_DISGRUNTLED_ANGER, true);
|
||||
Talk(SAY_ENRAGE);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_FRENZY, 1000);
|
||||
break;
|
||||
case EVENT_SUMMON:
|
||||
for (uint8 i = 0; i < DUNGEON_MODE(3, 4); ++i)
|
||||
me->CastSpell(me, SPELL_SUMMON_NETHER_WRAITH_1 + i, true);
|
||||
|
||||
Talk(SAY_SUMMON);
|
||||
events.ScheduleEvent(EVENT_SUMMON, urand(30000, 45000));
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_pathaleon_the_calculatorAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_pathaleon_the_calculator()
|
||||
|
||||
@@ -16,237 +16,237 @@ static DoorData const doorData[] =
|
||||
|
||||
class instance_mechanar : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
instance_mechanar(): InstanceMapScript("instance_mechanar", 554) { }
|
||||
public:
|
||||
instance_mechanar(): InstanceMapScript("instance_mechanar", 554) { }
|
||||
|
||||
struct instance_mechanar_InstanceMapScript : public InstanceScript
|
||||
struct instance_mechanar_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_mechanar_InstanceMapScript(Map* map) : InstanceScript(map)
|
||||
{
|
||||
instance_mechanar_InstanceMapScript(Map* map) : InstanceScript(map)
|
||||
{
|
||||
SetBossNumber(MAX_ENCOUNTER);
|
||||
LoadDoorData(doorData);
|
||||
SetBossNumber(MAX_ENCOUNTER);
|
||||
LoadDoorData(doorData);
|
||||
|
||||
_pathaleonGUID = 0;
|
||||
_passageEncounter = 0;
|
||||
_pathaleonGUID = 0;
|
||||
_passageEncounter = 0;
|
||||
_passageTimer = 0;
|
||||
_passageGUIDs.clear();
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* gameObject)
|
||||
{
|
||||
switch (gameObject->GetEntry())
|
||||
{
|
||||
case GO_DOOR_MOARG_1:
|
||||
case GO_DOOR_MOARG_2:
|
||||
case GO_DOOR_NETHERMANCER:
|
||||
AddDoor(gameObject, true);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectRemove(GameObject* gameObject)
|
||||
{
|
||||
switch (gameObject->GetEntry())
|
||||
{
|
||||
case GO_DOOR_MOARG_1:
|
||||
case GO_DOOR_MOARG_2:
|
||||
case GO_DOOR_NETHERMANCER:
|
||||
AddDoor(gameObject, false);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
{
|
||||
if (creature->GetEntry() == NPC_PATHALEON_THE_CALCULATOR)
|
||||
_pathaleonGUID = creature->GetGUID();
|
||||
}
|
||||
|
||||
void OnUnitDeath(Unit* unit)
|
||||
{
|
||||
if (unit->GetTypeId() == TYPEID_UNIT)
|
||||
if (_passageEncounter > ENCOUNTER_PASSAGE_NOT_STARTED && _passageEncounter < ENCOUNTER_PASSAGE_DONE)
|
||||
if (_passageGUIDs.find(unit->GetGUID()) != _passageGUIDs.end())
|
||||
_passageGUIDs.erase(unit->GetGUID());
|
||||
}
|
||||
|
||||
Player* GetPassagePlayer(float x)
|
||||
{
|
||||
Map::PlayerList const& pl = instance->GetPlayers();
|
||||
for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr)
|
||||
if (Player* player = itr->GetSource())
|
||||
if (player->GetPositionX() < x && player->GetPositionZ() > 24.0f && player->GetPositionY() > -30.0f)
|
||||
return player;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void DoSummonAction(Creature* summon, Player* player)
|
||||
{
|
||||
summon->CastSpell(summon, SPELL_TELEPORT_VISUAL, true);
|
||||
summon->AI()->AttackStart(player);
|
||||
_passageGUIDs.insert(summon->GetGUID());
|
||||
}
|
||||
|
||||
void Update(uint32 diff)
|
||||
{
|
||||
if (_passageEncounter == ENCOUNTER_PASSAGE_DONE)
|
||||
return;
|
||||
|
||||
_passageTimer += diff;
|
||||
if (_passageTimer >= 1000)
|
||||
{
|
||||
_passageTimer = 0;
|
||||
_passageGUIDs.clear();
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* gameObject)
|
||||
{
|
||||
switch (gameObject->GetEntry())
|
||||
if (_passageEncounter == ENCOUNTER_PASSAGE_NOT_STARTED)
|
||||
{
|
||||
case GO_DOOR_MOARG_1:
|
||||
case GO_DOOR_MOARG_2:
|
||||
case GO_DOOR_NETHERMANCER:
|
||||
AddDoor(gameObject, true);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
if (Player* player = GetPassagePlayer(250.0f))
|
||||
{
|
||||
_passageEncounter++;
|
||||
for (uint8 i = 0; i < 4; ++i)
|
||||
{
|
||||
Position pos = {238.0f, -27.0f + 3.0f * i, 26.328f, 0.0f};
|
||||
if (Creature* creature = instance->SummonCreature(i == 1 || i == 2 ? NPC_SUNSEEKER_ASTROMAGE : NPC_BLOODWARDER_CENTURION, pos))
|
||||
DoSummonAction(creature, player);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectRemove(GameObject* gameObject)
|
||||
{
|
||||
switch (gameObject->GetEntry())
|
||||
{
|
||||
case GO_DOOR_MOARG_1:
|
||||
case GO_DOOR_MOARG_2:
|
||||
case GO_DOOR_NETHERMANCER:
|
||||
AddDoor(gameObject, false);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
{
|
||||
if (creature->GetEntry() == NPC_PATHALEON_THE_CALCULATOR)
|
||||
_pathaleonGUID = creature->GetGUID();
|
||||
}
|
||||
|
||||
void OnUnitDeath(Unit* unit)
|
||||
{
|
||||
if (unit->GetTypeId() == TYPEID_UNIT)
|
||||
if (_passageEncounter > ENCOUNTER_PASSAGE_NOT_STARTED && _passageEncounter < ENCOUNTER_PASSAGE_DONE)
|
||||
if (_passageGUIDs.find(unit->GetGUID()) != _passageGUIDs.end())
|
||||
_passageGUIDs.erase(unit->GetGUID());
|
||||
}
|
||||
|
||||
Player* GetPassagePlayer(float x)
|
||||
{
|
||||
Map::PlayerList const& pl = instance->GetPlayers();
|
||||
for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr)
|
||||
if (Player* player = itr->GetSource())
|
||||
if (player->GetPositionX() < x && player->GetPositionZ() > 24.0f && player->GetPositionY() > -30.0f)
|
||||
return player;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void DoSummonAction(Creature* summon, Player* player)
|
||||
{
|
||||
summon->CastSpell(summon, SPELL_TELEPORT_VISUAL, true);
|
||||
summon->AI()->AttackStart(player);
|
||||
_passageGUIDs.insert(summon->GetGUID());
|
||||
}
|
||||
|
||||
void Update(uint32 diff)
|
||||
{
|
||||
if (_passageEncounter == ENCOUNTER_PASSAGE_DONE)
|
||||
if (!_passageGUIDs.empty())
|
||||
return;
|
||||
|
||||
_passageTimer += diff;
|
||||
if (_passageTimer >= 1000)
|
||||
if (_passageEncounter < ENCOUNTER_PASSAGE_PHASE3)
|
||||
{
|
||||
_passageTimer = 0;
|
||||
if (_passageEncounter == ENCOUNTER_PASSAGE_NOT_STARTED)
|
||||
if (Player* player = GetPassagePlayer(250.0f))
|
||||
{
|
||||
if (Player* player = GetPassagePlayer(250.0f))
|
||||
if (_passageEncounter == ENCOUNTER_PASSAGE_PHASE1)
|
||||
{
|
||||
_passageEncounter++;
|
||||
for (uint8 i = 0; i < 4; ++i)
|
||||
Position pos = {214.37f, -23.5f, 24.88f, 0.0f};
|
||||
if (Creature* creature = instance->SummonCreature(NPC_TEMPEST_KEEPER_DESTROYER, pos))
|
||||
DoSummonAction(creature, player);
|
||||
}
|
||||
else if (_passageEncounter == ENCOUNTER_PASSAGE_PHASE2)
|
||||
{
|
||||
for (uint8 i = 0; i < 3; ++i)
|
||||
{
|
||||
Position pos = {238.0f, -27.0f + 3.0f*i, 26.328f, 0.0f};
|
||||
if (Creature* creature = instance->SummonCreature(i==1 || i==2 ? NPC_SUNSEEKER_ASTROMAGE : NPC_BLOODWARDER_CENTURION, pos))
|
||||
Position pos = {199.76f, -26.0f + 2.5f * i, 24.88f, 0.0f};
|
||||
if (Creature* creature = instance->SummonCreature(i == 1 ? NPC_SUNSEEKER_ENGINEER : NPC_BLOODWARDER_PHYSICIAN, pos))
|
||||
DoSummonAction(creature, player);
|
||||
}
|
||||
}
|
||||
_passageEncounter++;
|
||||
SaveToDB();
|
||||
}
|
||||
|
||||
if (!_passageGUIDs.empty())
|
||||
return;
|
||||
|
||||
if (_passageEncounter < ENCOUNTER_PASSAGE_PHASE3)
|
||||
{
|
||||
if (Player* player = GetPassagePlayer(250.0f))
|
||||
{
|
||||
if (_passageEncounter == ENCOUNTER_PASSAGE_PHASE1)
|
||||
{
|
||||
Position pos = {214.37f, -23.5f, 24.88f, 0.0f};
|
||||
if (Creature* creature = instance->SummonCreature(NPC_TEMPEST_KEEPER_DESTROYER, pos))
|
||||
DoSummonAction(creature, player);
|
||||
}
|
||||
else if (_passageEncounter == ENCOUNTER_PASSAGE_PHASE2)
|
||||
{
|
||||
for (uint8 i = 0; i < 3; ++i)
|
||||
{
|
||||
Position pos = {199.76f, -26.0f + 2.5f*i, 24.88f, 0.0f};
|
||||
if (Creature* creature = instance->SummonCreature(i==1 ? NPC_SUNSEEKER_ENGINEER : NPC_BLOODWARDER_PHYSICIAN, pos))
|
||||
DoSummonAction(creature, player);
|
||||
}
|
||||
}
|
||||
_passageEncounter++;
|
||||
SaveToDB();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Player* player = GetPassagePlayer(148.0f))
|
||||
{
|
||||
if (_passageEncounter == ENCOUNTER_PASSAGE_PHASE3)
|
||||
{
|
||||
for (uint8 i = 0; i < 3; ++i)
|
||||
{
|
||||
Position pos = {135.0f + 2.5f*i, 36.76f, 24.88f, M_PI*1.5f};
|
||||
if (Creature* creature = instance->SummonCreature(i==1 ? NPC_SUNSEEKER_ASTROMAGE : NPC_BLOODWARDER_PHYSICIAN, pos))
|
||||
DoSummonAction(creature, player);
|
||||
}
|
||||
}
|
||||
else if (_passageEncounter == ENCOUNTER_PASSAGE_PHASE4)
|
||||
{
|
||||
Position pos = {137.62f, 62.23f, 24.88f, M_PI*1.5f};
|
||||
if (Creature* creature = instance->SummonCreature(NPC_TEMPEST_KEEPER_DESTROYER, pos))
|
||||
DoSummonAction(creature, player);
|
||||
}
|
||||
else if (_passageEncounter == ENCOUNTER_PASSAGE_PHASE5)
|
||||
{
|
||||
for (uint8 i = 0; i < 4; ++i)
|
||||
{
|
||||
Position pos = {133.0f + 3.5f*i, 92.88f, 26.38f, M_PI*1.5f};
|
||||
if (Creature* creature = instance->SummonCreature(i==1||i==2 ? NPC_SUNSEEKER_ASTROMAGE : NPC_SUNSEEKER_ENGINEER, pos))
|
||||
DoSummonAction(creature, player);
|
||||
}
|
||||
}
|
||||
else if (_passageEncounter == ENCOUNTER_PASSAGE_PHASE6)
|
||||
{
|
||||
if (Creature* creature = instance->GetCreature(_pathaleonGUID))
|
||||
creature->AI()->DoAction(1);
|
||||
}
|
||||
_passageEncounter++;
|
||||
SaveToDB();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool SetBossState(uint32 type, EncounterState state)
|
||||
{
|
||||
if (!InstanceScript::SetBossState(type, state))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
std::ostringstream saveStream;
|
||||
// Xinef: no space needed
|
||||
saveStream << "M E " << GetBossSaveData() << _passageEncounter;
|
||||
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void Load(const char* str)
|
||||
{
|
||||
if (!str)
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA(str);
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
|
||||
std::istringstream loadStream(str);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
|
||||
if (dataHead1 == 'M' && dataHead2 == 'E')
|
||||
{
|
||||
for (uint32 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
{
|
||||
uint32 tmpState;
|
||||
loadStream >> tmpState;
|
||||
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
|
||||
tmpState = NOT_STARTED;
|
||||
SetBossState(i, EncounterState(tmpState));
|
||||
}
|
||||
|
||||
loadStream >> _passageEncounter;
|
||||
if (_passageEncounter == ENCOUNTER_PASSAGE_DONE)
|
||||
_passageEncounter = ENCOUNTER_PASSAGE_PHASE6;
|
||||
}
|
||||
else
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
{
|
||||
if (Player* player = GetPassagePlayer(148.0f))
|
||||
{
|
||||
if (_passageEncounter == ENCOUNTER_PASSAGE_PHASE3)
|
||||
{
|
||||
for (uint8 i = 0; i < 3; ++i)
|
||||
{
|
||||
Position pos = {135.0f + 2.5f * i, 36.76f, 24.88f, M_PI * 1.5f};
|
||||
if (Creature* creature = instance->SummonCreature(i == 1 ? NPC_SUNSEEKER_ASTROMAGE : NPC_BLOODWARDER_PHYSICIAN, pos))
|
||||
DoSummonAction(creature, player);
|
||||
}
|
||||
}
|
||||
else if (_passageEncounter == ENCOUNTER_PASSAGE_PHASE4)
|
||||
{
|
||||
Position pos = {137.62f, 62.23f, 24.88f, M_PI * 1.5f};
|
||||
if (Creature* creature = instance->SummonCreature(NPC_TEMPEST_KEEPER_DESTROYER, pos))
|
||||
DoSummonAction(creature, player);
|
||||
}
|
||||
else if (_passageEncounter == ENCOUNTER_PASSAGE_PHASE5)
|
||||
{
|
||||
for (uint8 i = 0; i < 4; ++i)
|
||||
{
|
||||
Position pos = {133.0f + 3.5f * i, 92.88f, 26.38f, M_PI * 1.5f};
|
||||
if (Creature* creature = instance->SummonCreature(i == 1 || i == 2 ? NPC_SUNSEEKER_ASTROMAGE : NPC_SUNSEEKER_ENGINEER, pos))
|
||||
DoSummonAction(creature, player);
|
||||
}
|
||||
}
|
||||
else if (_passageEncounter == ENCOUNTER_PASSAGE_PHASE6)
|
||||
{
|
||||
if (Creature* creature = instance->GetCreature(_pathaleonGUID))
|
||||
creature->AI()->DoAction(1);
|
||||
}
|
||||
_passageEncounter++;
|
||||
SaveToDB();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
bool SetBossState(uint32 type, EncounterState state)
|
||||
{
|
||||
if (!InstanceScript::SetBossState(type, state))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
std::ostringstream saveStream;
|
||||
// Xinef: no space needed
|
||||
saveStream << "M E " << GetBossSaveData() << _passageEncounter;
|
||||
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void Load(const char* str)
|
||||
{
|
||||
if (!str)
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
}
|
||||
|
||||
private:
|
||||
uint64 _pathaleonGUID;
|
||||
uint32 _passageTimer;
|
||||
uint32 _passageEncounter;
|
||||
std::set<uint64> _passageGUIDs;
|
||||
};
|
||||
OUT_LOAD_INST_DATA(str);
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_mechanar_InstanceMapScript(map);
|
||||
char dataHead1, dataHead2;
|
||||
|
||||
std::istringstream loadStream(str);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
|
||||
if (dataHead1 == 'M' && dataHead2 == 'E')
|
||||
{
|
||||
for (uint32 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
{
|
||||
uint32 tmpState;
|
||||
loadStream >> tmpState;
|
||||
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
|
||||
tmpState = NOT_STARTED;
|
||||
SetBossState(i, EncounterState(tmpState));
|
||||
}
|
||||
|
||||
loadStream >> _passageEncounter;
|
||||
if (_passageEncounter == ENCOUNTER_PASSAGE_DONE)
|
||||
_passageEncounter = ENCOUNTER_PASSAGE_PHASE6;
|
||||
}
|
||||
else
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
}
|
||||
|
||||
private:
|
||||
uint64 _pathaleonGUID;
|
||||
uint32 _passageTimer;
|
||||
uint32 _passageEncounter;
|
||||
std::set<uint64> _passageGUIDs;
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_mechanar_InstanceMapScript(map);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_instance_mechanar()
|
||||
|
||||
@@ -61,181 +61,181 @@ enum MillhouseEvents
|
||||
|
||||
class npc_millhouse_manastorm : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_millhouse_manastorm() : CreatureScript("npc_millhouse_manastorm") { }
|
||||
public:
|
||||
npc_millhouse_manastorm() : CreatureScript("npc_millhouse_manastorm") { }
|
||||
|
||||
struct npc_millhouse_manastormAI : public ScriptedAI
|
||||
struct npc_millhouse_manastormAI : public ScriptedAI
|
||||
{
|
||||
npc_millhouse_manastormAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
npc_millhouse_manastormAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
EventMap events;
|
||||
EventMap events2;
|
||||
|
||||
void InitializeAI()
|
||||
{
|
||||
ScriptedAI::InitializeAI();
|
||||
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
events2.Reset();
|
||||
events2.ScheduleEvent(EVENT_TELEPORT_VISUAL, 0);
|
||||
events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO1, 3000);
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
}
|
||||
|
||||
void AttackStart(Unit* who)
|
||||
{
|
||||
if (who && me->Attack(who, true))
|
||||
me->GetMotionMaster()->MoveChase(who, 20.0f);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*who*/)
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit*)
|
||||
{
|
||||
events.ScheduleEvent(EVENT_MILL_CHECK_HEALTH, 1000);
|
||||
events.ScheduleEvent(EVENT_MILL_PYROBLAST, 30000);
|
||||
events.ScheduleEvent(EVENT_MILL_BASE_SPELL, 2000);
|
||||
events.ScheduleEvent(EVENT_MILL_ICEBLOCK, 1000);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
events2.Update(diff);
|
||||
switch (events2.ExecuteEvent())
|
||||
{
|
||||
case EVENT_TELEPORT_VISUAL:
|
||||
me->CastSpell(me, SPELL_TELEPORT_VISUAL, true);
|
||||
break;
|
||||
case EVENT_MILLHOUSE_INTRO1:
|
||||
Talk(SAY_INTRO_1);
|
||||
events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO2, 18000);
|
||||
break;
|
||||
case EVENT_MILLHOUSE_INTRO2:
|
||||
Talk(SAY_INTRO_2);
|
||||
events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO3, 8000);
|
||||
break;
|
||||
case EVENT_MILLHOUSE_INTRO3:
|
||||
Talk(SAY_INTRO_3);
|
||||
events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO4, 6000);
|
||||
break;
|
||||
case EVENT_MILLHOUSE_INTRO4:
|
||||
Talk(SAY_INTRO_4);
|
||||
events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO5, 8000);
|
||||
break;
|
||||
case EVENT_MILLHOUSE_INTRO5:
|
||||
Talk(SAY_WATER);
|
||||
me->CastSpell(me, SPELL_CONJURE_WATER, false);
|
||||
events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO6, 7000);
|
||||
break;
|
||||
case EVENT_MILLHOUSE_INTRO6:
|
||||
Talk(SAY_BUFFS);
|
||||
me->CastSpell(me, SPELL_ICE_ARMOR, false);
|
||||
events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO7, 7000);
|
||||
break;
|
||||
case EVENT_MILLHOUSE_INTRO7:
|
||||
Talk(SAY_DRINK);
|
||||
me->CastSpell(me, SPELL_ARCANE_INTELLECT, false);
|
||||
events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO8, 7000);
|
||||
break;
|
||||
case EVENT_MILLHOUSE_INTRO8:
|
||||
Talk(SAY_READY);
|
||||
me->GetMotionMaster()->MovePoint(1, 445.82f, -158.38f, 43.067f);
|
||||
events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO9, 5000);
|
||||
break;
|
||||
case EVENT_MILLHOUSE_INTRO9:
|
||||
me->SetFacingTo(M_PI*1.5f);
|
||||
me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), M_PI*1.5f);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
events2.ScheduleEvent(EVENT_SEARCH_FIGHT, 1000);
|
||||
break;
|
||||
case EVENT_SEARCH_FIGHT:
|
||||
if (!me->IsInCombat() && !me->IsInEvadeMode())
|
||||
if (Unit* target = me->SelectNearbyTarget(nullptr, 30.0f))
|
||||
AttackStart(target);
|
||||
events2.ScheduleEvent(EVENT_SEARCH_FIGHT, 1000);
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_MILL_CHECK_HEALTH:
|
||||
if (HealthBelowPct(20))
|
||||
{
|
||||
Talk(SAY_LOWHP);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_MILL_CHECK_HEALTH, 1000);
|
||||
break;
|
||||
case EVENT_MILL_PYROBLAST:
|
||||
Talk(SAY_PYRO);
|
||||
me->CastSpell(me->GetVictim(), SPELL_PYROBLAST, false);
|
||||
events.ScheduleEvent(EVENT_MILL_PYROBLAST, 30000);
|
||||
break;
|
||||
case EVENT_MILL_ICEBLOCK:
|
||||
if (me->GetDistance(me->GetVictim()) < 5.0f)
|
||||
{
|
||||
Talk(SAY_ICEBLOCK);
|
||||
me->CastSpell(me, SPELL_ICEBLOCK, true);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_MILL_ICEBLOCK, 1000);
|
||||
break;
|
||||
case EVENT_MILL_BASE_SPELL:
|
||||
switch (RAND(SPELL_FIREBALL, SPELL_ARCANE_MISSILES, SPELL_FROSTBOLT))
|
||||
{
|
||||
case SPELL_FIREBALL:
|
||||
me->CastSpell(me->GetVictim(), SPELL_FIREBALL, false);
|
||||
events.ScheduleEvent(EVENT_MILL_BASE_SPELL, 4000);
|
||||
break;
|
||||
case SPELL_ARCANE_MISSILES:
|
||||
me->CastSpell(me->GetVictim(), SPELL_ARCANE_MISSILES, false);
|
||||
events.ScheduleEvent(EVENT_MILL_BASE_SPELL, 9000);
|
||||
break;
|
||||
case SPELL_FROSTBOLT:
|
||||
me->CastSpell(me->GetVictim(), SPELL_FROSTBOLT, false);
|
||||
events.ScheduleEvent(EVENT_MILL_BASE_SPELL, 4000);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new npc_millhouse_manastormAI(creature);
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
EventMap events;
|
||||
EventMap events2;
|
||||
|
||||
void InitializeAI()
|
||||
{
|
||||
ScriptedAI::InitializeAI();
|
||||
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
events2.Reset();
|
||||
events2.ScheduleEvent(EVENT_TELEPORT_VISUAL, 0);
|
||||
events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO1, 3000);
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
}
|
||||
|
||||
void AttackStart(Unit* who)
|
||||
{
|
||||
if (who && me->Attack(who, true))
|
||||
me->GetMotionMaster()->MoveChase(who, 20.0f);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*who*/)
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit*)
|
||||
{
|
||||
events.ScheduleEvent(EVENT_MILL_CHECK_HEALTH, 1000);
|
||||
events.ScheduleEvent(EVENT_MILL_PYROBLAST, 30000);
|
||||
events.ScheduleEvent(EVENT_MILL_BASE_SPELL, 2000);
|
||||
events.ScheduleEvent(EVENT_MILL_ICEBLOCK, 1000);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
events2.Update(diff);
|
||||
switch (events2.ExecuteEvent())
|
||||
{
|
||||
case EVENT_TELEPORT_VISUAL:
|
||||
me->CastSpell(me, SPELL_TELEPORT_VISUAL, true);
|
||||
break;
|
||||
case EVENT_MILLHOUSE_INTRO1:
|
||||
Talk(SAY_INTRO_1);
|
||||
events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO2, 18000);
|
||||
break;
|
||||
case EVENT_MILLHOUSE_INTRO2:
|
||||
Talk(SAY_INTRO_2);
|
||||
events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO3, 8000);
|
||||
break;
|
||||
case EVENT_MILLHOUSE_INTRO3:
|
||||
Talk(SAY_INTRO_3);
|
||||
events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO4, 6000);
|
||||
break;
|
||||
case EVENT_MILLHOUSE_INTRO4:
|
||||
Talk(SAY_INTRO_4);
|
||||
events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO5, 8000);
|
||||
break;
|
||||
case EVENT_MILLHOUSE_INTRO5:
|
||||
Talk(SAY_WATER);
|
||||
me->CastSpell(me, SPELL_CONJURE_WATER, false);
|
||||
events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO6, 7000);
|
||||
break;
|
||||
case EVENT_MILLHOUSE_INTRO6:
|
||||
Talk(SAY_BUFFS);
|
||||
me->CastSpell(me, SPELL_ICE_ARMOR, false);
|
||||
events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO7, 7000);
|
||||
break;
|
||||
case EVENT_MILLHOUSE_INTRO7:
|
||||
Talk(SAY_DRINK);
|
||||
me->CastSpell(me, SPELL_ARCANE_INTELLECT, false);
|
||||
events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO8, 7000);
|
||||
break;
|
||||
case EVENT_MILLHOUSE_INTRO8:
|
||||
Talk(SAY_READY);
|
||||
me->GetMotionMaster()->MovePoint(1, 445.82f, -158.38f, 43.067f);
|
||||
events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO9, 5000);
|
||||
break;
|
||||
case EVENT_MILLHOUSE_INTRO9:
|
||||
me->SetFacingTo(M_PI * 1.5f);
|
||||
me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), M_PI * 1.5f);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
events2.ScheduleEvent(EVENT_SEARCH_FIGHT, 1000);
|
||||
break;
|
||||
case EVENT_SEARCH_FIGHT:
|
||||
if (!me->IsInCombat() && !me->IsInEvadeMode())
|
||||
if (Unit* target = me->SelectNearbyTarget(nullptr, 30.0f))
|
||||
AttackStart(target);
|
||||
events2.ScheduleEvent(EVENT_SEARCH_FIGHT, 1000);
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_MILL_CHECK_HEALTH:
|
||||
if (HealthBelowPct(20))
|
||||
{
|
||||
Talk(SAY_LOWHP);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_MILL_CHECK_HEALTH, 1000);
|
||||
break;
|
||||
case EVENT_MILL_PYROBLAST:
|
||||
Talk(SAY_PYRO);
|
||||
me->CastSpell(me->GetVictim(), SPELL_PYROBLAST, false);
|
||||
events.ScheduleEvent(EVENT_MILL_PYROBLAST, 30000);
|
||||
break;
|
||||
case EVENT_MILL_ICEBLOCK:
|
||||
if (me->GetDistance(me->GetVictim()) < 5.0f)
|
||||
{
|
||||
Talk(SAY_ICEBLOCK);
|
||||
me->CastSpell(me, SPELL_ICEBLOCK, true);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_MILL_ICEBLOCK, 1000);
|
||||
break;
|
||||
case EVENT_MILL_BASE_SPELL:
|
||||
switch (RAND(SPELL_FIREBALL, SPELL_ARCANE_MISSILES, SPELL_FROSTBOLT))
|
||||
{
|
||||
case SPELL_FIREBALL:
|
||||
me->CastSpell(me->GetVictim(), SPELL_FIREBALL, false);
|
||||
events.ScheduleEvent(EVENT_MILL_BASE_SPELL, 4000);
|
||||
break;
|
||||
case SPELL_ARCANE_MISSILES:
|
||||
me->CastSpell(me->GetVictim(), SPELL_ARCANE_MISSILES, false);
|
||||
events.ScheduleEvent(EVENT_MILL_BASE_SPELL, 9000);
|
||||
break;
|
||||
case SPELL_FROSTBOLT:
|
||||
me->CastSpell(me->GetVictim(), SPELL_FROSTBOLT, false);
|
||||
events.ScheduleEvent(EVENT_MILL_BASE_SPELL, 4000);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new npc_millhouse_manastormAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
enum WardenSays
|
||||
@@ -312,260 +312,260 @@ enum WardenEvents
|
||||
|
||||
class npc_warden_mellichar : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_warden_mellichar() : CreatureScript("npc_warden_mellichar") { }
|
||||
public:
|
||||
npc_warden_mellichar() : CreatureScript("npc_warden_mellichar") { }
|
||||
|
||||
struct npc_warden_mellicharAI : public BossAI
|
||||
struct npc_warden_mellicharAI : public BossAI
|
||||
{
|
||||
npc_warden_mellicharAI(Creature* creature) : BossAI(creature, DATA_WARDEN_MELLICHAR)
|
||||
{
|
||||
npc_warden_mellicharAI(Creature* creature) : BossAI(creature, DATA_WARDEN_MELLICHAR)
|
||||
{
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
}
|
||||
|
||||
void SummonedCreatureDies(Creature* summon, Unit*)
|
||||
{
|
||||
if (summon->GetEntry() == NPC_HARBINGER_SKYRISS)
|
||||
{
|
||||
Unit::Kill(me, me);
|
||||
me->setActive(false);
|
||||
instance->SetBossState(DATA_WARDEN_MELLICHAR, DONE);
|
||||
if (Creature* creature = summons.GetCreatureWithEntry(NPC_MILLHOUSE))
|
||||
{
|
||||
instance->DoCastSpellOnPlayers(SPELL_QID10886);
|
||||
creature->AI()->Talk(SAY_COMPLETE);
|
||||
creature->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit*) { }
|
||||
void AttackStart(Unit*) { }
|
||||
void EnterCombat(Unit*) { }
|
||||
|
||||
void JustDied(Unit*)
|
||||
{
|
||||
me->setActive(false);
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_Reset();
|
||||
me->setActive(false);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
|
||||
me->CastSpell((Unit*)NULL, SPELL_TARGET_OMEGA, false);
|
||||
instance->HandleGameObject(instance->GetData64(DATA_WARDENS_SHIELD), true);
|
||||
instance->SetBossState(DATA_WARDEN_MELLICHAR, NOT_STARTED);
|
||||
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType, SpellSchoolMask)
|
||||
{
|
||||
if (attacker && IS_PLAYER_GUID(attacker->GetCharmerOrOwnerOrOwnGUID()) && damage > 0 && !me->isActiveObject())
|
||||
{
|
||||
me->setActive(true);
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO1, 1500);
|
||||
events.ScheduleEvent(EVENT_WARDEN_CHECK_PLAYERS, 1000);
|
||||
instance->SetBossState(DATA_WARDEN_MELLICHAR, IN_PROGRESS);
|
||||
}
|
||||
damage = 0;
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 data)
|
||||
{
|
||||
if (data == FAIL)
|
||||
{
|
||||
CreatureAI::EnterEvadeMode();
|
||||
return;
|
||||
}
|
||||
if (data != DONE)
|
||||
return;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case DATA_WARDEN_1:
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO8, 2000);
|
||||
break;
|
||||
case DATA_WARDEN_3:
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO19, 2000);
|
||||
break;
|
||||
case DATA_WARDEN_4:
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO24, 2000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
events.Update(diff);
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_WARDEN_CHECK_PLAYERS:
|
||||
if (!SelectTargetFromPlayerList(100.0f))
|
||||
{
|
||||
CreatureAI::EnterEvadeMode();
|
||||
return;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_WARDEN_CHECK_PLAYERS, 1000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO1:
|
||||
Talk(YELL_INTRO1);
|
||||
me->SetFacingTo(M_PI/2.0f);
|
||||
me->CastSpell(me, SPELL_BUBBLE_VISUAL, false);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO2, 1400);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO2:
|
||||
instance->HandleGameObject(instance->GetData64(DATA_WARDENS_SHIELD), false);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO3, 20000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO3:
|
||||
Talk(YELL_INTRO2);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO4, 5000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO4:
|
||||
me->SetFacingTo(0.5f);
|
||||
me->CastSpell((Unit*)NULL, SPELL_TARGET_ALPHA, false);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO5, 2000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO5:
|
||||
instance->SetData(DATA_WARDEN_1, IN_PROGRESS);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO6, 3000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO6:
|
||||
me->SetFacingTo(M_PI*1.5f);
|
||||
me->CastSpell((Unit*)NULL, SPELL_TARGET_OMEGA, false);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO7, 5000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO7:
|
||||
me->SummonCreature(RAND(NPC_TRICKSTER, NPC_PH_HUNTER), 478.326f, -148.505f, 42.56f, 3.19f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
// Wait for kill
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO8:
|
||||
Talk(YELL_RELEASE1);
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
me->SetFacingTo(2.6f);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO10, 4000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO10:
|
||||
me->CastSpell((Unit*)NULL, SPELL_TARGET_BETA, false);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO11, 2000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO11:
|
||||
Talk(YELL_RELEASE2A);
|
||||
instance->SetData(DATA_WARDEN_2, IN_PROGRESS);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO12, 2000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO12:
|
||||
me->SetFacingTo(M_PI*1.5f);
|
||||
me->CastSpell((Unit*)NULL, SPELL_TARGET_OMEGA, false);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO13, 6000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO13:
|
||||
me->SummonCreature(NPC_MILLHOUSE, 413.292f, -148.378f, 42.56f, 6.27f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO14, 14000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO14:
|
||||
Talk(YELL_RELEASE2B);
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
me->SetFacingTo(3.3f);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO15, 5000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO15:
|
||||
me->CastSpell((Unit*)NULL, SPELL_TARGET_DELTA, false);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO16, 2000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO16:
|
||||
instance->SetData(DATA_WARDEN_3, IN_PROGRESS);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO17, 2000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO17:
|
||||
me->SetFacingTo(M_PI*1.5f);
|
||||
me->CastSpell((Unit*)NULL, SPELL_TARGET_OMEGA, false);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO18, 6000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO18:
|
||||
me->SummonCreature(RAND(NPC_AKKIRIS, NPC_SULFURON), 420.179f, -174.396f, 42.58f, 0.02f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
// Wait for kill
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO19:
|
||||
Talk(YELL_RELEASE3);
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
me->SetFacingTo(6.05f);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO20, 4000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO20:
|
||||
me->CastSpell((Unit*)NULL, SPELL_TARGET_GAMMA, false);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO21, 2000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO21:
|
||||
instance->SetData(DATA_WARDEN_4, IN_PROGRESS);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO22, 2000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO22:
|
||||
me->SetFacingTo(M_PI*1.5f);
|
||||
me->CastSpell((Unit*)NULL, SPELL_TARGET_OMEGA, false);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO23, 6000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO23:
|
||||
me->SummonCreature(RAND(NPC_TW_DRAK, NPC_BL_DRAK), 471.795f, -174.58f, 42.58f, 3.06f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
// Wait for kill
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO24:
|
||||
instance->SetData(DATA_WARDEN_5, IN_PROGRESS);
|
||||
Talk(YELL_RELEASE4);
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO25, 8000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO25:
|
||||
if (Creature* cr = me->SummonCreature(NPC_HARBINGER_SKYRISS, 445.763f, -191.639f, 44.64f, 1.60f, TEMPSUMMON_MANUAL_DESPAWN))
|
||||
{
|
||||
cr->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
cr->CastSpell(cr, SPELL_TELEPORT_VISUAL, true);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO26, 1000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO26:
|
||||
if (Creature* creature = summons.GetCreatureWithEntry(NPC_HARBINGER_SKYRISS))
|
||||
creature->AI()->Talk(SAY_HARBINGER_INTRO);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO27, 23000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO27:
|
||||
Talk(YELL_WELCOME);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO28, 5000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO28:
|
||||
instance->HandleGameObject(instance->GetData64(DATA_WARDENS_SHIELD), true);
|
||||
if (Creature* creature = summons.GetCreatureWithEntry(NPC_HARBINGER_SKYRISS))
|
||||
creature->CastSpell((Unit*)NULL, SPELL_MIND_REND, false);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO29, 4000);
|
||||
break;
|
||||
|
||||
case EVENT_WARDEN_INTRO29:
|
||||
events.Reset();
|
||||
me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
|
||||
if (Creature* creature = summons.GetCreatureWithEntry(NPC_HARBINGER_SKYRISS))
|
||||
{
|
||||
creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
if (Player* player = SelectTargetFromPlayerList(50.0f))
|
||||
AttackStart(player);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new npc_warden_mellicharAI(creature);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
}
|
||||
|
||||
void SummonedCreatureDies(Creature* summon, Unit*)
|
||||
{
|
||||
if (summon->GetEntry() == NPC_HARBINGER_SKYRISS)
|
||||
{
|
||||
Unit::Kill(me, me);
|
||||
me->setActive(false);
|
||||
instance->SetBossState(DATA_WARDEN_MELLICHAR, DONE);
|
||||
if (Creature* creature = summons.GetCreatureWithEntry(NPC_MILLHOUSE))
|
||||
{
|
||||
instance->DoCastSpellOnPlayers(SPELL_QID10886);
|
||||
creature->AI()->Talk(SAY_COMPLETE);
|
||||
creature->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit*) { }
|
||||
void AttackStart(Unit*) { }
|
||||
void EnterCombat(Unit*) { }
|
||||
|
||||
void JustDied(Unit*)
|
||||
{
|
||||
me->setActive(false);
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_Reset();
|
||||
me->setActive(false);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
|
||||
me->CastSpell((Unit*)NULL, SPELL_TARGET_OMEGA, false);
|
||||
instance->HandleGameObject(instance->GetData64(DATA_WARDENS_SHIELD), true);
|
||||
instance->SetBossState(DATA_WARDEN_MELLICHAR, NOT_STARTED);
|
||||
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType, SpellSchoolMask)
|
||||
{
|
||||
if (attacker && IS_PLAYER_GUID(attacker->GetCharmerOrOwnerOrOwnGUID()) && damage > 0 && !me->isActiveObject())
|
||||
{
|
||||
me->setActive(true);
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO1, 1500);
|
||||
events.ScheduleEvent(EVENT_WARDEN_CHECK_PLAYERS, 1000);
|
||||
instance->SetBossState(DATA_WARDEN_MELLICHAR, IN_PROGRESS);
|
||||
}
|
||||
damage = 0;
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 data)
|
||||
{
|
||||
if (data == FAIL)
|
||||
{
|
||||
CreatureAI::EnterEvadeMode();
|
||||
return;
|
||||
}
|
||||
if (data != DONE)
|
||||
return;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case DATA_WARDEN_1:
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO8, 2000);
|
||||
break;
|
||||
case DATA_WARDEN_3:
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO19, 2000);
|
||||
break;
|
||||
case DATA_WARDEN_4:
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO24, 2000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
events.Update(diff);
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_WARDEN_CHECK_PLAYERS:
|
||||
if (!SelectTargetFromPlayerList(100.0f))
|
||||
{
|
||||
CreatureAI::EnterEvadeMode();
|
||||
return;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_WARDEN_CHECK_PLAYERS, 1000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO1:
|
||||
Talk(YELL_INTRO1);
|
||||
me->SetFacingTo(M_PI / 2.0f);
|
||||
me->CastSpell(me, SPELL_BUBBLE_VISUAL, false);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO2, 1400);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO2:
|
||||
instance->HandleGameObject(instance->GetData64(DATA_WARDENS_SHIELD), false);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO3, 20000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO3:
|
||||
Talk(YELL_INTRO2);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO4, 5000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO4:
|
||||
me->SetFacingTo(0.5f);
|
||||
me->CastSpell((Unit*)NULL, SPELL_TARGET_ALPHA, false);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO5, 2000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO5:
|
||||
instance->SetData(DATA_WARDEN_1, IN_PROGRESS);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO6, 3000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO6:
|
||||
me->SetFacingTo(M_PI * 1.5f);
|
||||
me->CastSpell((Unit*)NULL, SPELL_TARGET_OMEGA, false);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO7, 5000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO7:
|
||||
me->SummonCreature(RAND(NPC_TRICKSTER, NPC_PH_HUNTER), 478.326f, -148.505f, 42.56f, 3.19f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
// Wait for kill
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO8:
|
||||
Talk(YELL_RELEASE1);
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
me->SetFacingTo(2.6f);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO10, 4000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO10:
|
||||
me->CastSpell((Unit*)NULL, SPELL_TARGET_BETA, false);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO11, 2000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO11:
|
||||
Talk(YELL_RELEASE2A);
|
||||
instance->SetData(DATA_WARDEN_2, IN_PROGRESS);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO12, 2000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO12:
|
||||
me->SetFacingTo(M_PI * 1.5f);
|
||||
me->CastSpell((Unit*)NULL, SPELL_TARGET_OMEGA, false);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO13, 6000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO13:
|
||||
me->SummonCreature(NPC_MILLHOUSE, 413.292f, -148.378f, 42.56f, 6.27f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO14, 14000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO14:
|
||||
Talk(YELL_RELEASE2B);
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
me->SetFacingTo(3.3f);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO15, 5000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO15:
|
||||
me->CastSpell((Unit*)NULL, SPELL_TARGET_DELTA, false);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO16, 2000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO16:
|
||||
instance->SetData(DATA_WARDEN_3, IN_PROGRESS);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO17, 2000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO17:
|
||||
me->SetFacingTo(M_PI * 1.5f);
|
||||
me->CastSpell((Unit*)NULL, SPELL_TARGET_OMEGA, false);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO18, 6000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO18:
|
||||
me->SummonCreature(RAND(NPC_AKKIRIS, NPC_SULFURON), 420.179f, -174.396f, 42.58f, 0.02f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
// Wait for kill
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO19:
|
||||
Talk(YELL_RELEASE3);
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
me->SetFacingTo(6.05f);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO20, 4000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO20:
|
||||
me->CastSpell((Unit*)NULL, SPELL_TARGET_GAMMA, false);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO21, 2000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO21:
|
||||
instance->SetData(DATA_WARDEN_4, IN_PROGRESS);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO22, 2000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO22:
|
||||
me->SetFacingTo(M_PI * 1.5f);
|
||||
me->CastSpell((Unit*)NULL, SPELL_TARGET_OMEGA, false);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO23, 6000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO23:
|
||||
me->SummonCreature(RAND(NPC_TW_DRAK, NPC_BL_DRAK), 471.795f, -174.58f, 42.58f, 3.06f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
// Wait for kill
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO24:
|
||||
instance->SetData(DATA_WARDEN_5, IN_PROGRESS);
|
||||
Talk(YELL_RELEASE4);
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO25, 8000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO25:
|
||||
if (Creature* cr = me->SummonCreature(NPC_HARBINGER_SKYRISS, 445.763f, -191.639f, 44.64f, 1.60f, TEMPSUMMON_MANUAL_DESPAWN))
|
||||
{
|
||||
cr->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
cr->CastSpell(cr, SPELL_TELEPORT_VISUAL, true);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO26, 1000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO26:
|
||||
if (Creature* creature = summons.GetCreatureWithEntry(NPC_HARBINGER_SKYRISS))
|
||||
creature->AI()->Talk(SAY_HARBINGER_INTRO);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO27, 23000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO27:
|
||||
Talk(YELL_WELCOME);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO28, 5000);
|
||||
break;
|
||||
case EVENT_WARDEN_INTRO28:
|
||||
instance->HandleGameObject(instance->GetData64(DATA_WARDENS_SHIELD), true);
|
||||
if (Creature* creature = summons.GetCreatureWithEntry(NPC_HARBINGER_SKYRISS))
|
||||
creature->CastSpell((Unit*)NULL, SPELL_MIND_REND, false);
|
||||
events.ScheduleEvent(EVENT_WARDEN_INTRO29, 4000);
|
||||
break;
|
||||
|
||||
case EVENT_WARDEN_INTRO29:
|
||||
events.Reset();
|
||||
me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
|
||||
if (Creature* creature = summons.GetCreatureWithEntry(NPC_HARBINGER_SKYRISS))
|
||||
{
|
||||
creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
if (Player* player = SelectTargetFromPlayerList(50.0f))
|
||||
AttackStart(player);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new npc_warden_mellicharAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
class spell_arcatraz_soul_steal : public SpellScriptLoader
|
||||
@@ -576,7 +576,7 @@ public:
|
||||
class spell_arcatraz_soul_steal_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_arcatraz_soul_steal_AuraScript)
|
||||
|
||||
|
||||
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
if (Unit* caster = GetCaster())
|
||||
|
||||
@@ -42,127 +42,127 @@ enum Events
|
||||
|
||||
class boss_dalliah_the_doomsayer : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_dalliah_the_doomsayer() : CreatureScript("boss_dalliah_the_doomsayer") { }
|
||||
public:
|
||||
boss_dalliah_the_doomsayer() : CreatureScript("boss_dalliah_the_doomsayer") { }
|
||||
|
||||
struct boss_dalliah_the_doomsayerAI : public BossAI
|
||||
struct boss_dalliah_the_doomsayerAI : public BossAI
|
||||
{
|
||||
boss_dalliah_the_doomsayerAI(Creature* creature) : BossAI(creature, DATA_DALLIAH) { }
|
||||
|
||||
void Reset()
|
||||
{
|
||||
boss_dalliah_the_doomsayerAI(Creature* creature) : BossAI(creature, DATA_DALLIAH) { }
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_Reset();
|
||||
events2.Reset();
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
}
|
||||
|
||||
void InitializeAI()
|
||||
{
|
||||
BossAI::InitializeAI();
|
||||
if (instance->GetBossState(DATA_SOCCOTHRATES) != DONE)
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH);
|
||||
|
||||
if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SOCCOTHRATES)))
|
||||
if (soccothrates->IsAlive() && !soccothrates->IsInCombat())
|
||||
soccothrates->AI()->SetData(1, 1);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
events.ScheduleEvent(EVENT_GIFT_OF_THE_DOOMSAYER, urand(1000, 4000));
|
||||
events.ScheduleEvent(EVENT_WHIRLWIND, urand(7000, 9000));
|
||||
events.ScheduleEvent(EVENT_ME_FIRST, 6000);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
|
||||
|
||||
if (IsHeroic())
|
||||
events.ScheduleEvent(EVENT_SHADOW_WAVE, urand(11000, 16000));
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void SetData(uint32 /*type*/, uint32 data)
|
||||
{
|
||||
if (data == 1)
|
||||
events2.ScheduleEvent(EVENT_SOCCOTHRATES_DEATH, 6000);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
events2.Update(diff);
|
||||
switch (events2.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SOCCOTHRATES_DEATH:
|
||||
Talk(SAY_SOCCOTHRATES_DEATH);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_GIFT_OF_THE_DOOMSAYER:
|
||||
me->CastSpell(me->GetVictim(), SPELL_GIFT_OF_THE_DOOMSAYER, false);
|
||||
events.ScheduleEvent(EVENT_GIFT_OF_THE_DOOMSAYER, urand(16000, 21000));
|
||||
break;
|
||||
case EVENT_WHIRLWIND:
|
||||
me->CastSpell(me, SPELL_WHIRLWIND, false);
|
||||
Talk(SAY_WHIRLWIND);
|
||||
events.ScheduleEvent(EVENT_WHIRLWIND, urand(19000, 21000));
|
||||
events.ScheduleEvent(EVENT_HEAL, 6000);
|
||||
break;
|
||||
case EVENT_HEAL:
|
||||
me->CastSpell(me, SPELL_HEAL, false);
|
||||
Talk(SAY_HEAL);
|
||||
break;
|
||||
case EVENT_SHADOW_WAVE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_SHADOW_WAVE, false);
|
||||
events.ScheduleEvent(EVENT_SHADOW_WAVE, urand(11000, 16000));
|
||||
break;
|
||||
case EVENT_ME_FIRST:
|
||||
if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SOCCOTHRATES)))
|
||||
if (soccothrates->IsAlive() && !soccothrates->IsInCombat())
|
||||
soccothrates->AI()->Talk(SAY_AGGRO_DALLIAH_FIRST);
|
||||
break;
|
||||
case EVENT_CHECK_HEALTH:
|
||||
if (HealthBelowPct(25))
|
||||
{
|
||||
if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SOCCOTHRATES)))
|
||||
soccothrates->AI()->Talk(SAY_DALLIAH_25_PERCENT);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap events2;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_dalliah_the_doomsayerAI(creature);
|
||||
_Reset();
|
||||
events2.Reset();
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
}
|
||||
|
||||
void InitializeAI()
|
||||
{
|
||||
BossAI::InitializeAI();
|
||||
if (instance->GetBossState(DATA_SOCCOTHRATES) != DONE)
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH);
|
||||
|
||||
if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SOCCOTHRATES)))
|
||||
if (soccothrates->IsAlive() && !soccothrates->IsInCombat())
|
||||
soccothrates->AI()->SetData(1, 1);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
events.ScheduleEvent(EVENT_GIFT_OF_THE_DOOMSAYER, urand(1000, 4000));
|
||||
events.ScheduleEvent(EVENT_WHIRLWIND, urand(7000, 9000));
|
||||
events.ScheduleEvent(EVENT_ME_FIRST, 6000);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
|
||||
|
||||
if (IsHeroic())
|
||||
events.ScheduleEvent(EVENT_SHADOW_WAVE, urand(11000, 16000));
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void SetData(uint32 /*type*/, uint32 data)
|
||||
{
|
||||
if (data == 1)
|
||||
events2.ScheduleEvent(EVENT_SOCCOTHRATES_DEATH, 6000);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
events2.Update(diff);
|
||||
switch (events2.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SOCCOTHRATES_DEATH:
|
||||
Talk(SAY_SOCCOTHRATES_DEATH);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_GIFT_OF_THE_DOOMSAYER:
|
||||
me->CastSpell(me->GetVictim(), SPELL_GIFT_OF_THE_DOOMSAYER, false);
|
||||
events.ScheduleEvent(EVENT_GIFT_OF_THE_DOOMSAYER, urand(16000, 21000));
|
||||
break;
|
||||
case EVENT_WHIRLWIND:
|
||||
me->CastSpell(me, SPELL_WHIRLWIND, false);
|
||||
Talk(SAY_WHIRLWIND);
|
||||
events.ScheduleEvent(EVENT_WHIRLWIND, urand(19000, 21000));
|
||||
events.ScheduleEvent(EVENT_HEAL, 6000);
|
||||
break;
|
||||
case EVENT_HEAL:
|
||||
me->CastSpell(me, SPELL_HEAL, false);
|
||||
Talk(SAY_HEAL);
|
||||
break;
|
||||
case EVENT_SHADOW_WAVE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_SHADOW_WAVE, false);
|
||||
events.ScheduleEvent(EVENT_SHADOW_WAVE, urand(11000, 16000));
|
||||
break;
|
||||
case EVENT_ME_FIRST:
|
||||
if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SOCCOTHRATES)))
|
||||
if (soccothrates->IsAlive() && !soccothrates->IsInCombat())
|
||||
soccothrates->AI()->Talk(SAY_AGGRO_DALLIAH_FIRST);
|
||||
break;
|
||||
case EVENT_CHECK_HEALTH:
|
||||
if (HealthBelowPct(25))
|
||||
{
|
||||
if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SOCCOTHRATES)))
|
||||
soccothrates->AI()->Talk(SAY_DALLIAH_25_PERCENT);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap events2;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_dalliah_the_doomsayerAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_dalliah_the_doomsayer()
|
||||
|
||||
@@ -44,127 +44,127 @@ enum Misc
|
||||
|
||||
class boss_harbinger_skyriss : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_harbinger_skyriss() : CreatureScript("boss_harbinger_skyriss") { }
|
||||
public:
|
||||
boss_harbinger_skyriss() : CreatureScript("boss_harbinger_skyriss") { }
|
||||
|
||||
struct boss_harbinger_skyrissAI : public ScriptedAI
|
||||
struct boss_harbinger_skyrissAI : public ScriptedAI
|
||||
{
|
||||
boss_harbinger_skyrissAI(Creature* creature) : ScriptedAI(creature), summons(me)
|
||||
{
|
||||
boss_harbinger_skyrissAI(Creature* creature) : ScriptedAI(creature), summons(me)
|
||||
{
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
SummonList summons;
|
||||
EventMap events;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
summons.DespawnAll();
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
me->SetInCombatWithZone();
|
||||
|
||||
events.ScheduleEvent(EVENT_SUMMON_IMAGE1, 1000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_IMAGE2, 1000);
|
||||
events.ScheduleEvent(EVENT_SPELL_MIND_REND, 10000);
|
||||
events.ScheduleEvent(EVENT_SPELL_FEAR, 15000);
|
||||
events.ScheduleEvent(EVENT_SPELL_DOMINATION, 30000);
|
||||
if (IsHeroic())
|
||||
events.ScheduleEvent(EVENT_SPELL_MANA_BURN, 25000);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
summons.DespawnAll();
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summon->SetHealth(summon->CountPctFromMaxHealth(summon->GetEntry() == NPC_HARBINGER_SKYRISS_66 ? 66 : 33));
|
||||
summons.Summon(summon);
|
||||
summon->SetInCombatWithZone();
|
||||
me->UpdatePosition(*summon, true);
|
||||
me->SendMovementFlagUpdate();
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SUMMON_IMAGE1:
|
||||
if (HealthBelowPct(67))
|
||||
{
|
||||
Talk(SAY_IMAGE);
|
||||
me->CastSpell(me, SPELL_66_ILLUSION, false);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_SUMMON_IMAGE1, 1000);
|
||||
break;
|
||||
case EVENT_SUMMON_IMAGE2:
|
||||
if (HealthBelowPct(34))
|
||||
{
|
||||
Talk(SAY_IMAGE);
|
||||
me->CastSpell(me, SPELL_33_ILLUSION, false);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_SUMMON_IMAGE2, 1000);
|
||||
break;
|
||||
case EVENT_SPELL_MIND_REND:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f))
|
||||
me->CastSpell(target, SPELL_MIND_REND, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_MIND_REND, 10000);
|
||||
break;
|
||||
case EVENT_SPELL_FEAR:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 20.0f))
|
||||
{
|
||||
Talk(SAY_FEAR);
|
||||
me->CastSpell(target, SPELL_FEAR, false);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_SPELL_FEAR, 25000);
|
||||
break;
|
||||
case EVENT_SPELL_DOMINATION:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 30.0f))
|
||||
{
|
||||
Talk(SAY_MIND);
|
||||
me->CastSpell(target, SPELL_DOMINATION, false);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_SPELL_DOMINATION, 30000);
|
||||
break;
|
||||
case EVENT_SPELL_MANA_BURN:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, PowerUsersSelector(me, POWER_MANA, 40.0f, false)))
|
||||
me->CastSpell(target, SPELL_MANA_BURN, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_MANA_BURN, 30000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_harbinger_skyrissAI(creature);
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
SummonList summons;
|
||||
EventMap events;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
summons.DespawnAll();
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
me->SetInCombatWithZone();
|
||||
|
||||
events.ScheduleEvent(EVENT_SUMMON_IMAGE1, 1000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_IMAGE2, 1000);
|
||||
events.ScheduleEvent(EVENT_SPELL_MIND_REND, 10000);
|
||||
events.ScheduleEvent(EVENT_SPELL_FEAR, 15000);
|
||||
events.ScheduleEvent(EVENT_SPELL_DOMINATION, 30000);
|
||||
if (IsHeroic())
|
||||
events.ScheduleEvent(EVENT_SPELL_MANA_BURN, 25000);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
summons.DespawnAll();
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summon->SetHealth(summon->CountPctFromMaxHealth(summon->GetEntry() == NPC_HARBINGER_SKYRISS_66 ? 66 : 33));
|
||||
summons.Summon(summon);
|
||||
summon->SetInCombatWithZone();
|
||||
me->UpdatePosition(*summon, true);
|
||||
me->SendMovementFlagUpdate();
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SUMMON_IMAGE1:
|
||||
if (HealthBelowPct(67))
|
||||
{
|
||||
Talk(SAY_IMAGE);
|
||||
me->CastSpell(me, SPELL_66_ILLUSION, false);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_SUMMON_IMAGE1, 1000);
|
||||
break;
|
||||
case EVENT_SUMMON_IMAGE2:
|
||||
if (HealthBelowPct(34))
|
||||
{
|
||||
Talk(SAY_IMAGE);
|
||||
me->CastSpell(me, SPELL_33_ILLUSION, false);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_SUMMON_IMAGE2, 1000);
|
||||
break;
|
||||
case EVENT_SPELL_MIND_REND:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f))
|
||||
me->CastSpell(target, SPELL_MIND_REND, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_MIND_REND, 10000);
|
||||
break;
|
||||
case EVENT_SPELL_FEAR:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 20.0f))
|
||||
{
|
||||
Talk(SAY_FEAR);
|
||||
me->CastSpell(target, SPELL_FEAR, false);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_SPELL_FEAR, 25000);
|
||||
break;
|
||||
case EVENT_SPELL_DOMINATION:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 30.0f))
|
||||
{
|
||||
Talk(SAY_MIND);
|
||||
me->CastSpell(target, SPELL_DOMINATION, false);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_SPELL_DOMINATION, 30000);
|
||||
break;
|
||||
case EVENT_SPELL_MANA_BURN:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, PowerUsersSelector(me, POWER_MANA, 40.0f, false)))
|
||||
me->CastSpell(target, SPELL_MANA_BURN, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_MANA_BURN, 30000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_harbinger_skyrissAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_harbinger_skyriss()
|
||||
|
||||
@@ -59,191 +59,191 @@ enum Events
|
||||
|
||||
class boss_wrath_scryer_soccothrates : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_wrath_scryer_soccothrates() : CreatureScript("boss_wrath_scryer_soccothrates") { }
|
||||
public:
|
||||
boss_wrath_scryer_soccothrates() : CreatureScript("boss_wrath_scryer_soccothrates") { }
|
||||
|
||||
struct boss_wrath_scryer_soccothratesAI : public BossAI
|
||||
struct boss_wrath_scryer_soccothratesAI : public BossAI
|
||||
{
|
||||
boss_wrath_scryer_soccothratesAI(Creature* creature) : BossAI(creature, DATA_SOCCOTHRATES)
|
||||
{
|
||||
boss_wrath_scryer_soccothratesAI(Creature* creature) : BossAI(creature, DATA_SOCCOTHRATES)
|
||||
{
|
||||
preFight = instance->GetBossState(DATA_DALLIAH) == DONE;
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_Reset();
|
||||
events2.Reset();
|
||||
me->CastSpell(me, SPELL_FEL_IMMOLATION, true);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
}
|
||||
|
||||
void InitializeAI()
|
||||
{
|
||||
BossAI::InitializeAI();
|
||||
if (!preFight)
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH);
|
||||
|
||||
if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
|
||||
if (dalliah->IsAlive() && !dalliah->IsInCombat())
|
||||
dalliah->AI()->SetData(1, 1);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
events2.Reset();
|
||||
events.ScheduleEvent(EVENT_FELFIRE_SHOCK, urand(12000, 14000));
|
||||
events.ScheduleEvent(EVENT_KNOCK_AWAY, urand(11000, 12000));
|
||||
events.ScheduleEvent(EVENT_ME_FIRST, 6000);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
|
||||
Talk(SAY_AGGRO);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who)
|
||||
{
|
||||
if (!preFight && who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 70.0f))
|
||||
{
|
||||
Talk(SAY_SOCCOTHRATES_CONVO_1);
|
||||
events2.ScheduleEvent(EVENT_PREFIGHT_1, 2000);
|
||||
preFight = true;
|
||||
}
|
||||
}
|
||||
|
||||
void SetData(uint32 /*type*/, uint32 data)
|
||||
{
|
||||
if (data == 1)
|
||||
events2.RescheduleEvent(EVENT_DALLIAH_DEATH, 6000);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
events2.Update(diff);
|
||||
switch (events2.ExecuteEvent())
|
||||
{
|
||||
case EVENT_PREFIGHT_1:
|
||||
if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
|
||||
dalliah->AI()->Talk(SAY_DALLIAH_CONVO_1);
|
||||
events2.ScheduleEvent(EVENT_PREFIGHT_2, 3000);
|
||||
break;
|
||||
case EVENT_PREFIGHT_2:
|
||||
Talk(SAY_SOCCOTHRATES_CONVO_2);
|
||||
events2.ScheduleEvent(EVENT_PREFIGHT_3, 3000);
|
||||
break;
|
||||
case EVENT_PREFIGHT_3:
|
||||
if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
|
||||
dalliah->AI()->Talk(SAY_DALLIAH_CONVO_2);
|
||||
events2.ScheduleEvent(EVENT_PREFIGHT_4, 6000);
|
||||
break;
|
||||
case EVENT_PREFIGHT_4:
|
||||
Talk(SAY_SOCCOTHRATES_CONVO_3);
|
||||
events2.ScheduleEvent(EVENT_PREFIGHT_5, 2000);
|
||||
break;
|
||||
case EVENT_PREFIGHT_5:
|
||||
if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
|
||||
dalliah->AI()->Talk(SAY_DALLIAH_CONVO_3);
|
||||
events2.ScheduleEvent(EVENT_PREFIGHT_6, 3000);
|
||||
break;
|
||||
case EVENT_PREFIGHT_6:
|
||||
Talk(SAY_SOCCOTHRATES_CONVO_4);
|
||||
events2.ScheduleEvent(EVENT_PREFIGHT_7, 2000);
|
||||
break;
|
||||
case EVENT_PREFIGHT_7:
|
||||
if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
|
||||
dalliah->GetMotionMaster()->MovePoint(0, 118.6048f, 96.84852f, 22.44115f);
|
||||
events2.ScheduleEvent(EVENT_PREFIGHT_8, 4000);
|
||||
break;
|
||||
case EVENT_PREFIGHT_8:
|
||||
me->GetMotionMaster()->MovePoint(0, 122.1035f, 192.7203f, 22.44115f);
|
||||
events2.ScheduleEvent(EVENT_PREFIGHT_9, 4000);
|
||||
break;
|
||||
case EVENT_PREFIGHT_9:
|
||||
if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
|
||||
{
|
||||
dalliah->SetFacingToObject(me);
|
||||
dalliah->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
me->SetFacingToObject(dalliah);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
dalliah->SetHomePosition(dalliah->GetPositionX(), dalliah->GetPositionY(), dalliah->GetPositionZ(), 1.51737f);
|
||||
me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 4.725722f);
|
||||
}
|
||||
break;
|
||||
case EVENT_DALLIAH_DEATH:
|
||||
Talk(SAY_DALLIAH_DEATH);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_FELFIRE_SHOCK:
|
||||
me->CastSpell(me->GetVictim(), SPELL_FELFIRE_SHOCK, false);
|
||||
events.ScheduleEvent(EVENT_FELFIRE_SHOCK, urand(12000, 14000));
|
||||
break;
|
||||
case EVENT_KNOCK_AWAY:
|
||||
me->CastSpell(me, SPELL_KNOCK_AWAY, false);
|
||||
Talk(SAY_KNOCK_AWAY);
|
||||
events.ScheduleEvent(EVENT_KNOCK_AWAY, urand(11000, 12000));
|
||||
events.ScheduleEvent(EVENT_SPELL_CHARGE, 4600);
|
||||
break;
|
||||
case EVENT_SPELL_CHARGE:
|
||||
me->CastSpell(me, SPELL_CHARGE, true);
|
||||
me->CastSpell(me, SPELL_FELFIRE, true);
|
||||
events.ScheduleEvent(EVENT_FELFIRE, 300);
|
||||
events.ScheduleEvent(EVENT_FELFIRE, 600);
|
||||
events.ScheduleEvent(EVENT_FELFIRE, 900);
|
||||
events.ScheduleEvent(EVENT_FELFIRE, 1200);
|
||||
events.ScheduleEvent(EVENT_FELFIRE, 1500);
|
||||
events.ScheduleEvent(EVENT_FELFIRE, 1800);
|
||||
break;
|
||||
case EVENT_FELFIRE:
|
||||
me->CastSpell(me, SPELL_FELFIRE, true);
|
||||
break;
|
||||
case EVENT_ME_FIRST:
|
||||
if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
|
||||
if (dalliah->IsAlive() && !dalliah->IsInCombat())
|
||||
dalliah->AI()->Talk(SAY_AGGRO_SOCCOTHRATES_FIRST);
|
||||
break;
|
||||
case EVENT_CHECK_HEALTH:
|
||||
if (HealthBelowPct(25))
|
||||
{
|
||||
if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
|
||||
dalliah->AI()->Talk(SAY_SOCCOTHRATES_25_PERCENT);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
bool preFight;
|
||||
EventMap events2;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_wrath_scryer_soccothratesAI(creature);
|
||||
preFight = instance->GetBossState(DATA_DALLIAH) == DONE;
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_Reset();
|
||||
events2.Reset();
|
||||
me->CastSpell(me, SPELL_FEL_IMMOLATION, true);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
}
|
||||
|
||||
void InitializeAI()
|
||||
{
|
||||
BossAI::InitializeAI();
|
||||
if (!preFight)
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH);
|
||||
|
||||
if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
|
||||
if (dalliah->IsAlive() && !dalliah->IsInCombat())
|
||||
dalliah->AI()->SetData(1, 1);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
events2.Reset();
|
||||
events.ScheduleEvent(EVENT_FELFIRE_SHOCK, urand(12000, 14000));
|
||||
events.ScheduleEvent(EVENT_KNOCK_AWAY, urand(11000, 12000));
|
||||
events.ScheduleEvent(EVENT_ME_FIRST, 6000);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
|
||||
Talk(SAY_AGGRO);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who)
|
||||
{
|
||||
if (!preFight && who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 70.0f))
|
||||
{
|
||||
Talk(SAY_SOCCOTHRATES_CONVO_1);
|
||||
events2.ScheduleEvent(EVENT_PREFIGHT_1, 2000);
|
||||
preFight = true;
|
||||
}
|
||||
}
|
||||
|
||||
void SetData(uint32 /*type*/, uint32 data)
|
||||
{
|
||||
if (data == 1)
|
||||
events2.RescheduleEvent(EVENT_DALLIAH_DEATH, 6000);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
events2.Update(diff);
|
||||
switch (events2.ExecuteEvent())
|
||||
{
|
||||
case EVENT_PREFIGHT_1:
|
||||
if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
|
||||
dalliah->AI()->Talk(SAY_DALLIAH_CONVO_1);
|
||||
events2.ScheduleEvent(EVENT_PREFIGHT_2, 3000);
|
||||
break;
|
||||
case EVENT_PREFIGHT_2:
|
||||
Talk(SAY_SOCCOTHRATES_CONVO_2);
|
||||
events2.ScheduleEvent(EVENT_PREFIGHT_3, 3000);
|
||||
break;
|
||||
case EVENT_PREFIGHT_3:
|
||||
if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
|
||||
dalliah->AI()->Talk(SAY_DALLIAH_CONVO_2);
|
||||
events2.ScheduleEvent(EVENT_PREFIGHT_4, 6000);
|
||||
break;
|
||||
case EVENT_PREFIGHT_4:
|
||||
Talk(SAY_SOCCOTHRATES_CONVO_3);
|
||||
events2.ScheduleEvent(EVENT_PREFIGHT_5, 2000);
|
||||
break;
|
||||
case EVENT_PREFIGHT_5:
|
||||
if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
|
||||
dalliah->AI()->Talk(SAY_DALLIAH_CONVO_3);
|
||||
events2.ScheduleEvent(EVENT_PREFIGHT_6, 3000);
|
||||
break;
|
||||
case EVENT_PREFIGHT_6:
|
||||
Talk(SAY_SOCCOTHRATES_CONVO_4);
|
||||
events2.ScheduleEvent(EVENT_PREFIGHT_7, 2000);
|
||||
break;
|
||||
case EVENT_PREFIGHT_7:
|
||||
if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
|
||||
dalliah->GetMotionMaster()->MovePoint(0, 118.6048f, 96.84852f, 22.44115f);
|
||||
events2.ScheduleEvent(EVENT_PREFIGHT_8, 4000);
|
||||
break;
|
||||
case EVENT_PREFIGHT_8:
|
||||
me->GetMotionMaster()->MovePoint(0, 122.1035f, 192.7203f, 22.44115f);
|
||||
events2.ScheduleEvent(EVENT_PREFIGHT_9, 4000);
|
||||
break;
|
||||
case EVENT_PREFIGHT_9:
|
||||
if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
|
||||
{
|
||||
dalliah->SetFacingToObject(me);
|
||||
dalliah->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
me->SetFacingToObject(dalliah);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
dalliah->SetHomePosition(dalliah->GetPositionX(), dalliah->GetPositionY(), dalliah->GetPositionZ(), 1.51737f);
|
||||
me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 4.725722f);
|
||||
}
|
||||
break;
|
||||
case EVENT_DALLIAH_DEATH:
|
||||
Talk(SAY_DALLIAH_DEATH);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_FELFIRE_SHOCK:
|
||||
me->CastSpell(me->GetVictim(), SPELL_FELFIRE_SHOCK, false);
|
||||
events.ScheduleEvent(EVENT_FELFIRE_SHOCK, urand(12000, 14000));
|
||||
break;
|
||||
case EVENT_KNOCK_AWAY:
|
||||
me->CastSpell(me, SPELL_KNOCK_AWAY, false);
|
||||
Talk(SAY_KNOCK_AWAY);
|
||||
events.ScheduleEvent(EVENT_KNOCK_AWAY, urand(11000, 12000));
|
||||
events.ScheduleEvent(EVENT_SPELL_CHARGE, 4600);
|
||||
break;
|
||||
case EVENT_SPELL_CHARGE:
|
||||
me->CastSpell(me, SPELL_CHARGE, true);
|
||||
me->CastSpell(me, SPELL_FELFIRE, true);
|
||||
events.ScheduleEvent(EVENT_FELFIRE, 300);
|
||||
events.ScheduleEvent(EVENT_FELFIRE, 600);
|
||||
events.ScheduleEvent(EVENT_FELFIRE, 900);
|
||||
events.ScheduleEvent(EVENT_FELFIRE, 1200);
|
||||
events.ScheduleEvent(EVENT_FELFIRE, 1500);
|
||||
events.ScheduleEvent(EVENT_FELFIRE, 1800);
|
||||
break;
|
||||
case EVENT_FELFIRE:
|
||||
me->CastSpell(me, SPELL_FELFIRE, true);
|
||||
break;
|
||||
case EVENT_ME_FIRST:
|
||||
if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
|
||||
if (dalliah->IsAlive() && !dalliah->IsInCombat())
|
||||
dalliah->AI()->Talk(SAY_AGGRO_SOCCOTHRATES_FIRST);
|
||||
break;
|
||||
case EVENT_CHECK_HEALTH:
|
||||
if (HealthBelowPct(25))
|
||||
{
|
||||
if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
|
||||
dalliah->AI()->Talk(SAY_SOCCOTHRATES_25_PERCENT);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
bool preFight;
|
||||
EventMap events2;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_wrath_scryer_soccothratesAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_wrath_scryer_soccothrates()
|
||||
|
||||
@@ -30,72 +30,72 @@ enum Events
|
||||
|
||||
class boss_zereketh_the_unbound : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_zereketh_the_unbound() : CreatureScript("boss_zereketh_the_unbound") { }
|
||||
public:
|
||||
boss_zereketh_the_unbound() : CreatureScript("boss_zereketh_the_unbound") { }
|
||||
|
||||
struct boss_zereketh_the_unboundAI : public BossAI
|
||||
struct boss_zereketh_the_unboundAI : public BossAI
|
||||
{
|
||||
boss_zereketh_the_unboundAI(Creature* creature) : BossAI(creature, DATA_ZEREKETH) { }
|
||||
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
boss_zereketh_the_unboundAI(Creature* creature) : BossAI(creature, DATA_ZEREKETH) { }
|
||||
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
events.ScheduleEvent(EVENT_VOID_ZONE, 6000);
|
||||
events.ScheduleEvent(EVENT_SHADOW_NOVA, 10000);
|
||||
events.ScheduleEvent(EVENT_SEED_OF_CORRUPTION, 16000);
|
||||
Talk(SAY_AGGRO);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_VOID_ZONE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 60.0f, true))
|
||||
me->CastSpell(target, SPELL_VOID_ZONE, false);
|
||||
events.ScheduleEvent(EVENT_VOID_ZONE, 15000);
|
||||
break;
|
||||
case EVENT_SHADOW_NOVA:
|
||||
me->CastSpell(me, SPELL_SHADOW_NOVA, false);
|
||||
if (roll_chance_i(50))
|
||||
Talk(SAY_SHADOW_NOVA);
|
||||
events.ScheduleEvent(EVENT_SHADOW_NOVA, 12000);
|
||||
break;
|
||||
case EVENT_SEED_OF_CORRUPTION:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true))
|
||||
me->CastSpell(target, SPELL_SEED_OF_CORRUPTION, false);
|
||||
events.ScheduleEvent(EVENT_SEED_OF_CORRUPTION, 16000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_zereketh_the_unboundAI(creature);
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
events.ScheduleEvent(EVENT_VOID_ZONE, 6000);
|
||||
events.ScheduleEvent(EVENT_SHADOW_NOVA, 10000);
|
||||
events.ScheduleEvent(EVENT_SEED_OF_CORRUPTION, 16000);
|
||||
Talk(SAY_AGGRO);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_VOID_ZONE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 60.0f, true))
|
||||
me->CastSpell(target, SPELL_VOID_ZONE, false);
|
||||
events.ScheduleEvent(EVENT_VOID_ZONE, 15000);
|
||||
break;
|
||||
case EVENT_SHADOW_NOVA:
|
||||
me->CastSpell(me, SPELL_SHADOW_NOVA, false);
|
||||
if (roll_chance_i(50))
|
||||
Talk(SAY_SHADOW_NOVA);
|
||||
events.ScheduleEvent(EVENT_SHADOW_NOVA, 12000);
|
||||
break;
|
||||
case EVENT_SEED_OF_CORRUPTION:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true))
|
||||
me->CastSpell(target, SPELL_SEED_OF_CORRUPTION, false);
|
||||
events.ScheduleEvent(EVENT_SEED_OF_CORRUPTION, 16000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_zereketh_the_unboundAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_zereketh_the_unbound()
|
||||
|
||||
@@ -15,193 +15,193 @@ DoorData const doorData[] =
|
||||
|
||||
class instance_arcatraz : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
instance_arcatraz() : InstanceMapScript("instance_arcatraz", 552) { }
|
||||
public:
|
||||
instance_arcatraz() : InstanceMapScript("instance_arcatraz", 552) { }
|
||||
|
||||
struct instance_arcatraz_InstanceMapScript : public InstanceScript
|
||||
struct instance_arcatraz_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_arcatraz_InstanceMapScript(Map* map) : InstanceScript(map)
|
||||
{
|
||||
instance_arcatraz_InstanceMapScript(Map* map) : InstanceScript(map)
|
||||
{
|
||||
SetBossNumber(MAX_ENCOUTER);
|
||||
LoadDoorData(doorData);
|
||||
SetBossNumber(MAX_ENCOUTER);
|
||||
LoadDoorData(doorData);
|
||||
|
||||
DalliahGUID = 0;
|
||||
SoccothratesGUID = 0;
|
||||
MellicharGUID = 0;
|
||||
WardensShieldGUID = 0;
|
||||
DalliahGUID = 0;
|
||||
SoccothratesGUID = 0;
|
||||
MellicharGUID = 0;
|
||||
WardensShieldGUID = 0;
|
||||
|
||||
memset(StasisPodGUIDs, 0, 5 * sizeof(uint64));
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case NPC_DALLIAH:
|
||||
DalliahGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_SOCCOTHRATES:
|
||||
SoccothratesGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_MELLICHAR:
|
||||
MellicharGUID = creature->GetGUID();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* go)
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_CONTAINMENT_CORE_SECURITY_FIELD_ALPHA:
|
||||
case GO_CONTAINMENT_CORE_SECURITY_FIELD_BETA:
|
||||
AddDoor(go, true);
|
||||
break;
|
||||
case GO_STASIS_POD_ALPHA:
|
||||
StasisPodGUIDs[0] = go->GetGUID();
|
||||
break;
|
||||
case GO_STASIS_POD_BETA:
|
||||
StasisPodGUIDs[1] = go->GetGUID();
|
||||
break;
|
||||
case GO_STASIS_POD_DELTA:
|
||||
StasisPodGUIDs[2] = go->GetGUID();
|
||||
break;
|
||||
case GO_STASIS_POD_GAMMA:
|
||||
StasisPodGUIDs[3] = go->GetGUID();
|
||||
break;
|
||||
case GO_STASIS_POD_OMEGA:
|
||||
StasisPodGUIDs[4] = go->GetGUID();
|
||||
break;
|
||||
case GO_WARDENS_SHIELD:
|
||||
WardensShieldGUID = go->GetGUID();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectRemove(GameObject* go)
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_CONTAINMENT_CORE_SECURITY_FIELD_ALPHA:
|
||||
case GO_CONTAINMENT_CORE_SECURITY_FIELD_BETA:
|
||||
AddDoor(go, false);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 data)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case DATA_WARDEN_1:
|
||||
case DATA_WARDEN_2:
|
||||
case DATA_WARDEN_3:
|
||||
case DATA_WARDEN_4:
|
||||
case DATA_WARDEN_5:
|
||||
if (data < FAIL)
|
||||
HandleGameObject(StasisPodGUIDs[type - DATA_WARDEN_1], data == IN_PROGRESS);
|
||||
if (Creature* warden = instance->GetCreature(MellicharGUID))
|
||||
warden->AI()->SetData(type, data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 /*type*/) const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint64 GetData64(uint32 data) const
|
||||
{
|
||||
switch (data)
|
||||
{
|
||||
case DATA_DALLIAH:
|
||||
return DalliahGUID;
|
||||
case DATA_SOCCOTHRATES:
|
||||
return SoccothratesGUID;
|
||||
case DATA_WARDENS_SHIELD:
|
||||
return WardensShieldGUID;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool SetBossState(uint32 type, EncounterState state)
|
||||
{
|
||||
if (!InstanceScript::SetBossState(type, state))
|
||||
return false;
|
||||
|
||||
if (type == DATA_WARDEN_MELLICHAR && state == NOT_STARTED)
|
||||
{
|
||||
SetData(DATA_WARDEN_1, NOT_STARTED);
|
||||
SetData(DATA_WARDEN_2, NOT_STARTED);
|
||||
SetData(DATA_WARDEN_3, NOT_STARTED);
|
||||
SetData(DATA_WARDEN_4, NOT_STARTED);
|
||||
SetData(DATA_WARDEN_5, NOT_STARTED);
|
||||
HandleGameObject(WardensShieldGUID, true);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "A Z " << GetBossSaveData();
|
||||
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void Load(char const* str)
|
||||
{
|
||||
if (!str)
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA(str);
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
|
||||
std::istringstream loadStream(str);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
|
||||
if (dataHead1 == 'A' && dataHead2 == 'Z')
|
||||
{
|
||||
for (uint32 i = 0; i < MAX_ENCOUTER; ++i)
|
||||
{
|
||||
uint32 tmpState;
|
||||
loadStream >> tmpState;
|
||||
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
|
||||
tmpState = NOT_STARTED;
|
||||
SetBossState(i, EncounterState(tmpState));
|
||||
}
|
||||
}
|
||||
else
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
}
|
||||
|
||||
protected:
|
||||
uint64 DalliahGUID;
|
||||
uint64 SoccothratesGUID;
|
||||
uint64 StasisPodGUIDs[5];
|
||||
uint64 MellicharGUID;
|
||||
uint64 WardensShieldGUID;
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_arcatraz_InstanceMapScript(map);
|
||||
memset(StasisPodGUIDs, 0, 5 * sizeof(uint64));
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case NPC_DALLIAH:
|
||||
DalliahGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_SOCCOTHRATES:
|
||||
SoccothratesGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_MELLICHAR:
|
||||
MellicharGUID = creature->GetGUID();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* go)
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_CONTAINMENT_CORE_SECURITY_FIELD_ALPHA:
|
||||
case GO_CONTAINMENT_CORE_SECURITY_FIELD_BETA:
|
||||
AddDoor(go, true);
|
||||
break;
|
||||
case GO_STASIS_POD_ALPHA:
|
||||
StasisPodGUIDs[0] = go->GetGUID();
|
||||
break;
|
||||
case GO_STASIS_POD_BETA:
|
||||
StasisPodGUIDs[1] = go->GetGUID();
|
||||
break;
|
||||
case GO_STASIS_POD_DELTA:
|
||||
StasisPodGUIDs[2] = go->GetGUID();
|
||||
break;
|
||||
case GO_STASIS_POD_GAMMA:
|
||||
StasisPodGUIDs[3] = go->GetGUID();
|
||||
break;
|
||||
case GO_STASIS_POD_OMEGA:
|
||||
StasisPodGUIDs[4] = go->GetGUID();
|
||||
break;
|
||||
case GO_WARDENS_SHIELD:
|
||||
WardensShieldGUID = go->GetGUID();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectRemove(GameObject* go)
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_CONTAINMENT_CORE_SECURITY_FIELD_ALPHA:
|
||||
case GO_CONTAINMENT_CORE_SECURITY_FIELD_BETA:
|
||||
AddDoor(go, false);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 data)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case DATA_WARDEN_1:
|
||||
case DATA_WARDEN_2:
|
||||
case DATA_WARDEN_3:
|
||||
case DATA_WARDEN_4:
|
||||
case DATA_WARDEN_5:
|
||||
if (data < FAIL)
|
||||
HandleGameObject(StasisPodGUIDs[type - DATA_WARDEN_1], data == IN_PROGRESS);
|
||||
if (Creature* warden = instance->GetCreature(MellicharGUID))
|
||||
warden->AI()->SetData(type, data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 /*type*/) const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint64 GetData64(uint32 data) const
|
||||
{
|
||||
switch (data)
|
||||
{
|
||||
case DATA_DALLIAH:
|
||||
return DalliahGUID;
|
||||
case DATA_SOCCOTHRATES:
|
||||
return SoccothratesGUID;
|
||||
case DATA_WARDENS_SHIELD:
|
||||
return WardensShieldGUID;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool SetBossState(uint32 type, EncounterState state)
|
||||
{
|
||||
if (!InstanceScript::SetBossState(type, state))
|
||||
return false;
|
||||
|
||||
if (type == DATA_WARDEN_MELLICHAR && state == NOT_STARTED)
|
||||
{
|
||||
SetData(DATA_WARDEN_1, NOT_STARTED);
|
||||
SetData(DATA_WARDEN_2, NOT_STARTED);
|
||||
SetData(DATA_WARDEN_3, NOT_STARTED);
|
||||
SetData(DATA_WARDEN_4, NOT_STARTED);
|
||||
SetData(DATA_WARDEN_5, NOT_STARTED);
|
||||
HandleGameObject(WardensShieldGUID, true);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "A Z " << GetBossSaveData();
|
||||
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void Load(char const* str)
|
||||
{
|
||||
if (!str)
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA(str);
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
|
||||
std::istringstream loadStream(str);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
|
||||
if (dataHead1 == 'A' && dataHead2 == 'Z')
|
||||
{
|
||||
for (uint32 i = 0; i < MAX_ENCOUTER; ++i)
|
||||
{
|
||||
uint32 tmpState;
|
||||
loadStream >> tmpState;
|
||||
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
|
||||
tmpState = NOT_STARTED;
|
||||
SetBossState(i, EncounterState(tmpState));
|
||||
}
|
||||
}
|
||||
else
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
}
|
||||
|
||||
protected:
|
||||
uint64 DalliahGUID;
|
||||
uint64 SoccothratesGUID;
|
||||
uint64 StasisPodGUIDs[5];
|
||||
uint64 MellicharGUID;
|
||||
uint64 WardensShieldGUID;
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_arcatraz_InstanceMapScript(map);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_instance_arcatraz()
|
||||
|
||||
@@ -34,81 +34,82 @@ enum Events
|
||||
|
||||
class boss_commander_sarannis : public CreatureScript
|
||||
{
|
||||
public: boss_commander_sarannis() : CreatureScript("boss_commander_sarannis") { }
|
||||
public:
|
||||
boss_commander_sarannis() : CreatureScript("boss_commander_sarannis") { }
|
||||
|
||||
struct boss_commander_sarannisAI : public BossAI
|
||||
struct boss_commander_sarannisAI : public BossAI
|
||||
{
|
||||
boss_commander_sarannisAI(Creature* creature) : BossAI(creature, DATA_COMMANDER_SARANNIS) { }
|
||||
|
||||
void Reset()
|
||||
{
|
||||
boss_commander_sarannisAI(Creature* creature) : BossAI(creature, DATA_COMMANDER_SARANNIS) { }
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_Reset();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
Talk(SAY_AGGRO);
|
||||
events.ScheduleEvent(EVENT_ARCANE_RESONANCE, 20000);
|
||||
events.ScheduleEvent(EVENT_ARCANE_DEVASTATION, 10000);
|
||||
events.ScheduleEvent(EVENT_HEALTH_CHECK, 500);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_ARCANE_RESONANCE:
|
||||
if (roll_chance_i(50))
|
||||
Talk(SAY_ARCANE_RESONANCE);
|
||||
me->CastSpell(me->GetVictim(), SPELL_ARCANE_RESONANCE, false);
|
||||
events.ScheduleEvent(EVENT_ARCANE_RESONANCE, 27000);
|
||||
break;
|
||||
case EVENT_ARCANE_DEVASTATION:
|
||||
if (roll_chance_i(50))
|
||||
Talk(SAY_ARCANE_DEVASTATION);
|
||||
me->CastSpell(me->GetVictim(), SPELL_ARCANE_DEVASTATION, false);
|
||||
events.ScheduleEvent(EVENT_ARCANE_DEVASTATION, 17000);
|
||||
break;
|
||||
case EVENT_HEALTH_CHECK:
|
||||
if (me->HealthBelowPct(50))
|
||||
{
|
||||
Talk(EMOTE_SUMMON);
|
||||
Talk(SAY_SUMMON);
|
||||
me->CastSpell(me, SPELL_SUMMON_REINFORCEMENTS, true);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_HEALTH_CHECK, 500);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_commander_sarannisAI(creature);
|
||||
_Reset();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
Talk(SAY_AGGRO);
|
||||
events.ScheduleEvent(EVENT_ARCANE_RESONANCE, 20000);
|
||||
events.ScheduleEvent(EVENT_ARCANE_DEVASTATION, 10000);
|
||||
events.ScheduleEvent(EVENT_HEALTH_CHECK, 500);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_ARCANE_RESONANCE:
|
||||
if (roll_chance_i(50))
|
||||
Talk(SAY_ARCANE_RESONANCE);
|
||||
me->CastSpell(me->GetVictim(), SPELL_ARCANE_RESONANCE, false);
|
||||
events.ScheduleEvent(EVENT_ARCANE_RESONANCE, 27000);
|
||||
break;
|
||||
case EVENT_ARCANE_DEVASTATION:
|
||||
if (roll_chance_i(50))
|
||||
Talk(SAY_ARCANE_DEVASTATION);
|
||||
me->CastSpell(me->GetVictim(), SPELL_ARCANE_DEVASTATION, false);
|
||||
events.ScheduleEvent(EVENT_ARCANE_DEVASTATION, 17000);
|
||||
break;
|
||||
case EVENT_HEALTH_CHECK:
|
||||
if (me->HealthBelowPct(50))
|
||||
{
|
||||
Talk(EMOTE_SUMMON);
|
||||
Talk(SAY_SUMMON);
|
||||
me->CastSpell(me, SPELL_SUMMON_REINFORCEMENTS, true);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_HEALTH_CHECK, 500);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_commander_sarannisAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
Position const PosSummonReinforcements[4] =
|
||||
@@ -127,32 +128,32 @@ enum Creatures
|
||||
|
||||
class spell_commander_sarannis_summon_reinforcements : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_commander_sarannis_summon_reinforcements() : SpellScriptLoader("spell_commander_sarannis_summon_reinforcements") { }
|
||||
public:
|
||||
spell_commander_sarannis_summon_reinforcements() : SpellScriptLoader("spell_commander_sarannis_summon_reinforcements") { }
|
||||
|
||||
class spell_commander_sarannis_summon_reinforcements_SpellScript : public SpellScript
|
||||
class spell_commander_sarannis_summon_reinforcements_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_commander_sarannis_summon_reinforcements_SpellScript);
|
||||
|
||||
void HandleCast(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
PrepareSpellScript(spell_commander_sarannis_summon_reinforcements_SpellScript);
|
||||
|
||||
void HandleCast(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
GetCaster()->SummonCreature(NPC_SUMMONED_BLOODWARDER_MENDER, PosSummonReinforcements[0], TEMPSUMMON_CORPSE_DESPAWN);
|
||||
GetCaster()->SummonCreature(NPC_SUMMONED_BLOODWARDER_RESERVIST, PosSummonReinforcements[1], TEMPSUMMON_CORPSE_DESPAWN);
|
||||
GetCaster()->SummonCreature(NPC_SUMMONED_BLOODWARDER_RESERVIST, PosSummonReinforcements[2], TEMPSUMMON_CORPSE_DESPAWN);
|
||||
if (GetCaster()->GetMap()->IsHeroic())
|
||||
GetCaster()->SummonCreature(NPC_SUMMONED_BLOODWARDER_RESERVIST, PosSummonReinforcements[3], TEMPSUMMON_CORPSE_DESPAWN);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_commander_sarannis_summon_reinforcements_SpellScript::HandleCast, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_commander_sarannis_summon_reinforcements_SpellScript();
|
||||
GetCaster()->SummonCreature(NPC_SUMMONED_BLOODWARDER_MENDER, PosSummonReinforcements[0], TEMPSUMMON_CORPSE_DESPAWN);
|
||||
GetCaster()->SummonCreature(NPC_SUMMONED_BLOODWARDER_RESERVIST, PosSummonReinforcements[1], TEMPSUMMON_CORPSE_DESPAWN);
|
||||
GetCaster()->SummonCreature(NPC_SUMMONED_BLOODWARDER_RESERVIST, PosSummonReinforcements[2], TEMPSUMMON_CORPSE_DESPAWN);
|
||||
if (GetCaster()->GetMap()->IsHeroic())
|
||||
GetCaster()->SummonCreature(NPC_SUMMONED_BLOODWARDER_RESERVIST, PosSummonReinforcements[3], TEMPSUMMON_CORPSE_DESPAWN);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_commander_sarannis_summon_reinforcements_SpellScript::HandleCast, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_commander_sarannis_summon_reinforcements_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_commander_sarannis()
|
||||
|
||||
@@ -39,107 +39,107 @@ enum Misc
|
||||
|
||||
class boss_high_botanist_freywinn : public CreatureScript
|
||||
{
|
||||
public:
|
||||
public:
|
||||
|
||||
boss_high_botanist_freywinn() : CreatureScript("boss_high_botanist_freywinn")
|
||||
boss_high_botanist_freywinn() : CreatureScript("boss_high_botanist_freywinn")
|
||||
{
|
||||
}
|
||||
|
||||
struct boss_high_botanist_freywinnAI : public BossAI
|
||||
{
|
||||
boss_high_botanist_freywinnAI(Creature* creature) : BossAI(creature, DATA_HIGH_BOTANIST_FREYWINN) { }
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_Reset();
|
||||
}
|
||||
|
||||
struct boss_high_botanist_freywinnAI : public BossAI
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
boss_high_botanist_freywinnAI(Creature* creature) : BossAI(creature, DATA_HIGH_BOTANIST_FREYWINN) { }
|
||||
_EnterCombat();
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
void Reset()
|
||||
events.ScheduleEvent(EVENT_SUMMON_SEEDLING, 6000);
|
||||
events.ScheduleEvent(EVENT_TREE_FORM, 30000);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void SummonedCreatureDies(Creature* summon, Unit*)
|
||||
{
|
||||
summons.Despawn(summon);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (!events.IsInPhase(1) && me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
_Reset();
|
||||
}
|
||||
case EVENT_SUMMON_SEEDLING:
|
||||
if (roll_chance_i(20))
|
||||
Talk(SAY_OOC_RANDOM);
|
||||
me->CastSpell(me, RAND(SPELL_PLANT_WHITE, SPELL_PLANT_GREEN, SPELL_PLANT_BLUE, SPELL_PLANT_RED), false);
|
||||
events.ScheduleEvent(EVENT_SUMMON_SEEDLING, 6000);
|
||||
break;
|
||||
case EVENT_TREE_FORM:
|
||||
events.Reset();
|
||||
events.SetPhase(1);
|
||||
events.ScheduleEvent(EVENT_CHECK_FRAYERS, 1000);
|
||||
events.ScheduleEvent(EVENT_TREE_FORM, 75000);
|
||||
events.ScheduleEvent(EVENT_RESTORE_COMBAT, 46000);
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
Talk(SAY_AGGRO);
|
||||
Talk(SAY_TREE);
|
||||
me->RemoveAllAuras();
|
||||
me->GetMotionMaster()->MoveIdle();
|
||||
me->GetMotionMaster()->Clear(false);
|
||||
|
||||
events.ScheduleEvent(EVENT_SUMMON_SEEDLING, 6000);
|
||||
events.ScheduleEvent(EVENT_TREE_FORM, 30000);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void SummonedCreatureDies(Creature* summon, Unit*)
|
||||
{
|
||||
summons.Despawn(summon);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (!events.IsInPhase(1) && me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SUMMON_SEEDLING:
|
||||
if (roll_chance_i(20))
|
||||
Talk(SAY_OOC_RANDOM);
|
||||
me->CastSpell(me, RAND(SPELL_PLANT_WHITE, SPELL_PLANT_GREEN, SPELL_PLANT_BLUE, SPELL_PLANT_RED), false);
|
||||
events.ScheduleEvent(EVENT_SUMMON_SEEDLING, 6000);
|
||||
break;
|
||||
case EVENT_TREE_FORM:
|
||||
events.Reset();
|
||||
events.SetPhase(1);
|
||||
events.ScheduleEvent(EVENT_CHECK_FRAYERS, 1000);
|
||||
events.ScheduleEvent(EVENT_TREE_FORM, 75000);
|
||||
events.ScheduleEvent(EVENT_RESTORE_COMBAT, 46000);
|
||||
|
||||
Talk(SAY_TREE);
|
||||
me->CastSpell(me, SPELL_SUMMON_FRAYER, true);
|
||||
me->CastSpell(me, SPELL_TRANQUILITY, true);
|
||||
me->CastSpell(me, SPELL_TREE_FORM, true);
|
||||
break;
|
||||
case EVENT_RESTORE_COMBAT:
|
||||
events.SetPhase(0);
|
||||
events.ScheduleEvent(EVENT_SUMMON_SEEDLING, 6000);
|
||||
me->GetMotionMaster()->MoveChase(me->GetVictim());
|
||||
break;
|
||||
case EVENT_CHECK_FRAYERS:
|
||||
if (!summons.HasEntry(NPC_FRAYER))
|
||||
{
|
||||
me->InterruptNonMeleeSpells(true);
|
||||
me->RemoveAllAuras();
|
||||
me->GetMotionMaster()->MoveIdle();
|
||||
me->GetMotionMaster()->Clear(false);
|
||||
|
||||
me->CastSpell(me, SPELL_SUMMON_FRAYER, true);
|
||||
me->CastSpell(me, SPELL_TRANQUILITY, true);
|
||||
me->CastSpell(me, SPELL_TREE_FORM, true);
|
||||
events.RescheduleEvent(EVENT_RESTORE_COMBAT, 0);
|
||||
events.RescheduleEvent(EVENT_TREE_FORM, 30000);
|
||||
break;
|
||||
case EVENT_RESTORE_COMBAT:
|
||||
events.SetPhase(0);
|
||||
events.ScheduleEvent(EVENT_SUMMON_SEEDLING, 6000);
|
||||
me->GetMotionMaster()->MoveChase(me->GetVictim());
|
||||
break;
|
||||
case EVENT_CHECK_FRAYERS:
|
||||
if (!summons.HasEntry(NPC_FRAYER))
|
||||
{
|
||||
me->InterruptNonMeleeSpells(true);
|
||||
me->RemoveAllAuras();
|
||||
events.RescheduleEvent(EVENT_RESTORE_COMBAT, 0);
|
||||
events.RescheduleEvent(EVENT_TREE_FORM, 30000);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CHECK_FRAYERS, 500);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!events.IsInPhase(1))
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CHECK_FRAYERS, 500);
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_high_botanist_freywinnAI(creature);
|
||||
if (!events.IsInPhase(1))
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_high_botanist_freywinnAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_high_botanist_freywinn()
|
||||
|
||||
@@ -44,88 +44,98 @@ enum Misc
|
||||
|
||||
class boss_laj : public CreatureScript
|
||||
{
|
||||
public:
|
||||
public:
|
||||
|
||||
boss_laj() : CreatureScript("boss_laj") { }
|
||||
boss_laj() : CreatureScript("boss_laj") { }
|
||||
|
||||
struct boss_lajAI : public BossAI
|
||||
struct boss_lajAI : public BossAI
|
||||
{
|
||||
boss_lajAI(Creature* creature) : BossAI(creature, DATA_LAJ) { }
|
||||
|
||||
void Reset()
|
||||
{
|
||||
boss_lajAI(Creature* creature) : BossAI(creature, DATA_LAJ) { }
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_Reset();
|
||||
me->SetDisplayId(MODEL_DEFAULT);
|
||||
_lastTransform = SPELL_DAMAGE_IMMUNE_SHADOW;
|
||||
me->CastSpell(me, SPELL_DAMAGE_IMMUNE_SHADOW, true);
|
||||
}
|
||||
|
||||
void DoTransform()
|
||||
{
|
||||
me->RemoveAurasDueToSpell(_lastTransform);
|
||||
|
||||
switch (_lastTransform = RAND(SPELL_DAMAGE_IMMUNE_SHADOW, SPELL_DAMAGE_IMMUNE_FIRE, SPELL_DAMAGE_IMMUNE_FROST, SPELL_DAMAGE_IMMUNE_NATURE, SPELL_DAMAGE_IMMUNE_ARCANE))
|
||||
{
|
||||
case SPELL_DAMAGE_IMMUNE_SHADOW: me->SetDisplayId(MODEL_DEFAULT); break;
|
||||
case SPELL_DAMAGE_IMMUNE_ARCANE: me->SetDisplayId(MODEL_ARCANE); break;
|
||||
case SPELL_DAMAGE_IMMUNE_FIRE: me->SetDisplayId(MODEL_FIRE); break;
|
||||
case SPELL_DAMAGE_IMMUNE_FROST: me->SetDisplayId(MODEL_FROST); break;
|
||||
case SPELL_DAMAGE_IMMUNE_NATURE: me->SetDisplayId(MODEL_NATURE); break;
|
||||
}
|
||||
|
||||
me->CastSpell(me, _lastTransform, true);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
|
||||
events.ScheduleEvent(EVENT_ALERGIC_REACTION, 5000);
|
||||
events.ScheduleEvent(EVENT_TRANSFORM, 30000);
|
||||
events.ScheduleEvent(EVENT_TELEPORT, 20000);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_ALERGIC_REACTION:
|
||||
me->CastSpell(me->GetVictim(), SPELL_ALLERGIC_REACTION, false);
|
||||
events.ScheduleEvent(EVENT_ALERGIC_REACTION, 25000);
|
||||
break;
|
||||
case EVENT_TELEPORT:
|
||||
me->CastSpell(me, SPELL_TELEPORT_SELF, false);
|
||||
events.ScheduleEvent(EVENT_SUMMON, 2500);
|
||||
events.ScheduleEvent(EVENT_TELEPORT, 30000);
|
||||
break;
|
||||
case EVENT_SUMMON:
|
||||
Talk(EMOTE_SUMMON);
|
||||
me->CastSpell(me, SPELL_SUMMON_LASHER_1, true);
|
||||
me->CastSpell(me, SPELL_SUMMON_FLAYER_1, true);
|
||||
break;
|
||||
case EVENT_TRANSFORM:
|
||||
DoTransform();
|
||||
events.ScheduleEvent(EVENT_TRANSFORM, 35000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
private:
|
||||
uint32 _lastTransform;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_lajAI(creature);
|
||||
_Reset();
|
||||
me->SetDisplayId(MODEL_DEFAULT);
|
||||
_lastTransform = SPELL_DAMAGE_IMMUNE_SHADOW;
|
||||
me->CastSpell(me, SPELL_DAMAGE_IMMUNE_SHADOW, true);
|
||||
}
|
||||
|
||||
void DoTransform()
|
||||
{
|
||||
me->RemoveAurasDueToSpell(_lastTransform);
|
||||
|
||||
switch (_lastTransform = RAND(SPELL_DAMAGE_IMMUNE_SHADOW, SPELL_DAMAGE_IMMUNE_FIRE, SPELL_DAMAGE_IMMUNE_FROST, SPELL_DAMAGE_IMMUNE_NATURE, SPELL_DAMAGE_IMMUNE_ARCANE))
|
||||
{
|
||||
case SPELL_DAMAGE_IMMUNE_SHADOW:
|
||||
me->SetDisplayId(MODEL_DEFAULT);
|
||||
break;
|
||||
case SPELL_DAMAGE_IMMUNE_ARCANE:
|
||||
me->SetDisplayId(MODEL_ARCANE);
|
||||
break;
|
||||
case SPELL_DAMAGE_IMMUNE_FIRE:
|
||||
me->SetDisplayId(MODEL_FIRE);
|
||||
break;
|
||||
case SPELL_DAMAGE_IMMUNE_FROST:
|
||||
me->SetDisplayId(MODEL_FROST);
|
||||
break;
|
||||
case SPELL_DAMAGE_IMMUNE_NATURE:
|
||||
me->SetDisplayId(MODEL_NATURE);
|
||||
break;
|
||||
}
|
||||
|
||||
me->CastSpell(me, _lastTransform, true);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
|
||||
events.ScheduleEvent(EVENT_ALERGIC_REACTION, 5000);
|
||||
events.ScheduleEvent(EVENT_TRANSFORM, 30000);
|
||||
events.ScheduleEvent(EVENT_TELEPORT, 20000);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_ALERGIC_REACTION:
|
||||
me->CastSpell(me->GetVictim(), SPELL_ALLERGIC_REACTION, false);
|
||||
events.ScheduleEvent(EVENT_ALERGIC_REACTION, 25000);
|
||||
break;
|
||||
case EVENT_TELEPORT:
|
||||
me->CastSpell(me, SPELL_TELEPORT_SELF, false);
|
||||
events.ScheduleEvent(EVENT_SUMMON, 2500);
|
||||
events.ScheduleEvent(EVENT_TELEPORT, 30000);
|
||||
break;
|
||||
case EVENT_SUMMON:
|
||||
Talk(EMOTE_SUMMON);
|
||||
me->CastSpell(me, SPELL_SUMMON_LASHER_1, true);
|
||||
me->CastSpell(me, SPELL_SUMMON_FLAYER_1, true);
|
||||
break;
|
||||
case EVENT_TRANSFORM:
|
||||
DoTransform();
|
||||
events.ScheduleEvent(EVENT_TRANSFORM, 35000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
private:
|
||||
uint32 _lastTransform;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_lajAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_laj()
|
||||
|
||||
@@ -37,114 +37,115 @@ enum Events
|
||||
|
||||
class boss_thorngrin_the_tender : public CreatureScript
|
||||
{
|
||||
public: boss_thorngrin_the_tender() : CreatureScript("thorngrin_the_tender") { }
|
||||
public:
|
||||
boss_thorngrin_the_tender() : CreatureScript("thorngrin_the_tender") { }
|
||||
|
||||
struct boss_thorngrin_the_tenderAI : public BossAI
|
||||
struct boss_thorngrin_the_tenderAI : public BossAI
|
||||
{
|
||||
boss_thorngrin_the_tenderAI(Creature* creature) : BossAI(creature, DATA_THORNGRIN_THE_TENDER)
|
||||
{
|
||||
boss_thorngrin_the_tenderAI(Creature* creature) : BossAI(creature, DATA_THORNGRIN_THE_TENDER)
|
||||
{
|
||||
me->m_SightDistance = 100.0f;
|
||||
_intro = false;
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_Reset();
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who)
|
||||
{
|
||||
if (!_intro && who->GetTypeId() == TYPEID_PLAYER)
|
||||
{
|
||||
_intro = true;
|
||||
Talk(SAY_INTRO);
|
||||
}
|
||||
BossAI::MoveInLineOfSight(who);
|
||||
}
|
||||
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
Talk(SAY_AGGRO);
|
||||
events.ScheduleEvent(EVENT_SACRIFICE, 6000);
|
||||
events.ScheduleEvent(EVENT_HELLFIRE, 18000);
|
||||
events.ScheduleEvent(EVENT_ENRAGE, 15000);
|
||||
events.ScheduleEvent(EVENT_HEALTH_CHECK_50, 500);
|
||||
events.ScheduleEvent(EVENT_HEALTH_CHECK_20, 500);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SACRIFICE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true))
|
||||
{
|
||||
Talk(SAY_CAST_SACRIFICE);
|
||||
me->CastSpell(target, SPELL_SACRIFICE, false);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_SACRIFICE, 30000);
|
||||
break;
|
||||
case EVENT_HELLFIRE:
|
||||
if (roll_chance_i(50))
|
||||
Talk(SAY_CAST_HELLFIRE);
|
||||
me->CastSpell(me, SPELL_HELLFIRE, false);
|
||||
events.ScheduleEvent(EVENT_HELLFIRE, 22000);
|
||||
break;
|
||||
case EVENT_ENRAGE:
|
||||
Talk(EMOTE_ENRAGE);
|
||||
me->CastSpell(me, SPELL_ENRAGE, false);
|
||||
events.ScheduleEvent(EVENT_ENRAGE, 30000);
|
||||
break;
|
||||
case EVENT_HEALTH_CHECK_50:
|
||||
if (me->HealthBelowPct(50))
|
||||
{
|
||||
Talk(SAY_50_PERCENT_HP);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_HEALTH_CHECK_50, 500);
|
||||
break;
|
||||
case EVENT_HEALTH_CHECK_20:
|
||||
if (me->HealthBelowPct(20))
|
||||
{
|
||||
Talk(SAY_20_PERCENT_HP);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_HEALTH_CHECK_20, 500);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
bool _intro;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_thorngrin_the_tenderAI(creature);
|
||||
me->m_SightDistance = 100.0f;
|
||||
_intro = false;
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_Reset();
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who)
|
||||
{
|
||||
if (!_intro && who->GetTypeId() == TYPEID_PLAYER)
|
||||
{
|
||||
_intro = true;
|
||||
Talk(SAY_INTRO);
|
||||
}
|
||||
BossAI::MoveInLineOfSight(who);
|
||||
}
|
||||
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
Talk(SAY_AGGRO);
|
||||
events.ScheduleEvent(EVENT_SACRIFICE, 6000);
|
||||
events.ScheduleEvent(EVENT_HELLFIRE, 18000);
|
||||
events.ScheduleEvent(EVENT_ENRAGE, 15000);
|
||||
events.ScheduleEvent(EVENT_HEALTH_CHECK_50, 500);
|
||||
events.ScheduleEvent(EVENT_HEALTH_CHECK_20, 500);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SACRIFICE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true))
|
||||
{
|
||||
Talk(SAY_CAST_SACRIFICE);
|
||||
me->CastSpell(target, SPELL_SACRIFICE, false);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_SACRIFICE, 30000);
|
||||
break;
|
||||
case EVENT_HELLFIRE:
|
||||
if (roll_chance_i(50))
|
||||
Talk(SAY_CAST_HELLFIRE);
|
||||
me->CastSpell(me, SPELL_HELLFIRE, false);
|
||||
events.ScheduleEvent(EVENT_HELLFIRE, 22000);
|
||||
break;
|
||||
case EVENT_ENRAGE:
|
||||
Talk(EMOTE_ENRAGE);
|
||||
me->CastSpell(me, SPELL_ENRAGE, false);
|
||||
events.ScheduleEvent(EVENT_ENRAGE, 30000);
|
||||
break;
|
||||
case EVENT_HEALTH_CHECK_50:
|
||||
if (me->HealthBelowPct(50))
|
||||
{
|
||||
Talk(SAY_50_PERCENT_HP);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_HEALTH_CHECK_50, 500);
|
||||
break;
|
||||
case EVENT_HEALTH_CHECK_20:
|
||||
if (me->HealthBelowPct(20))
|
||||
{
|
||||
Talk(SAY_20_PERCENT_HP);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_HEALTH_CHECK_20, 500);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
bool _intro;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_thorngrin_the_tenderAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_thorngrin_the_tender()
|
||||
|
||||
@@ -33,76 +33,76 @@ enum Misc
|
||||
|
||||
class boss_warp_splinter : public CreatureScript
|
||||
{
|
||||
public:
|
||||
public:
|
||||
|
||||
boss_warp_splinter() : CreatureScript("boss_warp_splinter") { }
|
||||
struct boss_warp_splinterAI : public BossAI
|
||||
boss_warp_splinter() : CreatureScript("boss_warp_splinter") { }
|
||||
struct boss_warp_splinterAI : public BossAI
|
||||
{
|
||||
boss_warp_splinterAI(Creature* creature) : BossAI(creature, DATA_WARP_SPLINTER) { }
|
||||
|
||||
void Reset()
|
||||
{
|
||||
boss_warp_splinterAI(Creature* creature) : BossAI(creature, DATA_WARP_SPLINTER) { }
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_Reset();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
events.ScheduleEvent(EVENT_ARCANE_VOLLEY, 8000);
|
||||
events.ScheduleEvent(EVENT_WAR_STOMP, 15000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_TREANT, 20000);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_ARCANE_VOLLEY:
|
||||
me->CastSpell(me, SPELL_ARCANE_VOLLEY, false);
|
||||
events.ScheduleEvent(EVENT_ARCANE_VOLLEY, 20000);
|
||||
break;
|
||||
case EVENT_WAR_STOMP:
|
||||
me->CastSpell(me, SPELL_WAR_STOMP, false);
|
||||
events.ScheduleEvent(EVENT_WAR_STOMP, 30000);
|
||||
break;
|
||||
case EVENT_SUMMON_TREANT:
|
||||
Talk(SAY_SUMMON);
|
||||
me->CastSpell(me, SPELL_SUMMON_SAPLINGS_PERIODIC, true);
|
||||
for (uint8 i = 0; i < 6; ++i)
|
||||
me->CastSpell(me, SPELL_SUMMON_SAPLINGS_SUMMON+i, true);
|
||||
events.ScheduleEvent(EVENT_SUMMON_TREANT, 40000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_warp_splinterAI(creature);
|
||||
_Reset();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
events.ScheduleEvent(EVENT_ARCANE_VOLLEY, 8000);
|
||||
events.ScheduleEvent(EVENT_WAR_STOMP, 15000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_TREANT, 20000);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_ARCANE_VOLLEY:
|
||||
me->CastSpell(me, SPELL_ARCANE_VOLLEY, false);
|
||||
events.ScheduleEvent(EVENT_ARCANE_VOLLEY, 20000);
|
||||
break;
|
||||
case EVENT_WAR_STOMP:
|
||||
me->CastSpell(me, SPELL_WAR_STOMP, false);
|
||||
events.ScheduleEvent(EVENT_WAR_STOMP, 30000);
|
||||
break;
|
||||
case EVENT_SUMMON_TREANT:
|
||||
Talk(SAY_SUMMON);
|
||||
me->CastSpell(me, SPELL_SUMMON_SAPLINGS_PERIODIC, true);
|
||||
for (uint8 i = 0; i < 6; ++i)
|
||||
me->CastSpell(me, SPELL_SUMMON_SAPLINGS_SUMMON + i, true);
|
||||
events.ScheduleEvent(EVENT_SUMMON_TREANT, 40000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_warp_splinterAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_warp_splinter()
|
||||
|
||||
@@ -8,72 +8,72 @@
|
||||
|
||||
class instance_the_botanica : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
instance_the_botanica() : InstanceMapScript("instance_the_botanica", 553) { }
|
||||
public:
|
||||
instance_the_botanica() : InstanceMapScript("instance_the_botanica", 553) { }
|
||||
|
||||
struct instance_the_botanica_InstanceMapScript : public InstanceScript
|
||||
struct instance_the_botanica_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_the_botanica_InstanceMapScript(Map* map) : InstanceScript(map)
|
||||
{
|
||||
instance_the_botanica_InstanceMapScript(Map* map) : InstanceScript(map)
|
||||
{
|
||||
SetBossNumber(MAX_ENCOUNTER);
|
||||
}
|
||||
|
||||
bool SetBossState(uint32 type, EncounterState state)
|
||||
{
|
||||
if (!InstanceScript::SetBossState(type, state))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "B O " << GetBossSaveData();
|
||||
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void Load(char const* str)
|
||||
{
|
||||
if (!str)
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA(str);
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
|
||||
std::istringstream loadStream(str);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
|
||||
if (dataHead1 == 'B' && dataHead2 == 'O')
|
||||
{
|
||||
for (uint32 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
{
|
||||
uint32 tmpState;
|
||||
loadStream >> tmpState;
|
||||
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
|
||||
tmpState = NOT_STARTED;
|
||||
SetBossState(i, EncounterState(tmpState));
|
||||
}
|
||||
}
|
||||
else
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
}
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_the_botanica_InstanceMapScript(map);
|
||||
SetBossNumber(MAX_ENCOUNTER);
|
||||
}
|
||||
|
||||
bool SetBossState(uint32 type, EncounterState state)
|
||||
{
|
||||
if (!InstanceScript::SetBossState(type, state))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "B O " << GetBossSaveData();
|
||||
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void Load(char const* str)
|
||||
{
|
||||
if (!str)
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA(str);
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
|
||||
std::istringstream loadStream(str);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
|
||||
if (dataHead1 == 'B' && dataHead2 == 'O')
|
||||
{
|
||||
for (uint32 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
{
|
||||
uint32 tmpState;
|
||||
loadStream >> tmpState;
|
||||
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
|
||||
tmpState = NOT_STARTED;
|
||||
SetBossState(i, EncounterState(tmpState));
|
||||
}
|
||||
}
|
||||
else
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
}
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_the_botanica_InstanceMapScript(map);
|
||||
}
|
||||
};
|
||||
|
||||
class spell_botanica_call_of_the_falcon : public SpellScriptLoader
|
||||
@@ -90,7 +90,7 @@ public:
|
||||
_falconSet.clear();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
std::list<Creature*> creatureList;
|
||||
@@ -119,8 +119,8 @@ public:
|
||||
OnEffectRemove += AuraEffectRemoveFn(spell_botanica_call_of_the_falcon_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
|
||||
private:
|
||||
std::set<uint64> _falconSet;
|
||||
private:
|
||||
std::set<uint64> _falconSet;
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
@@ -131,67 +131,75 @@ public:
|
||||
|
||||
class spell_botanica_shift_form : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_botanica_shift_form() : SpellScriptLoader("spell_botanica_shift_form") { }
|
||||
public:
|
||||
spell_botanica_shift_form() : SpellScriptLoader("spell_botanica_shift_form") { }
|
||||
|
||||
class spell_botanica_shift_form_AuraScript : public AuraScript
|
||||
class spell_botanica_shift_form_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_botanica_shift_form_AuraScript);
|
||||
|
||||
bool Load()
|
||||
{
|
||||
PrepareAuraScript(spell_botanica_shift_form_AuraScript);
|
||||
_lastSchool = 0;
|
||||
_lastForm = 0;
|
||||
_swapTime = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Load()
|
||||
bool CheckProc(ProcEventInfo& eventInfo)
|
||||
{
|
||||
if (SpellInfo const* spellInfo = eventInfo.GetDamageInfo()->GetSpellInfo())
|
||||
{
|
||||
_lastSchool = 0;
|
||||
_lastForm = 0;
|
||||
_swapTime = 0;
|
||||
return true;
|
||||
}
|
||||
if ((spellInfo->GetSchoolMask() & _lastSchool) && _swapTime > time(nullptr))
|
||||
return false;
|
||||
|
||||
bool CheckProc(ProcEventInfo& eventInfo)
|
||||
{
|
||||
if (SpellInfo const* spellInfo = eventInfo.GetDamageInfo()->GetSpellInfo())
|
||||
uint32 form = 0;
|
||||
switch (GetFirstSchoolInMask(spellInfo->GetSchoolMask()))
|
||||
{
|
||||
if ((spellInfo->GetSchoolMask() & _lastSchool) && _swapTime > time(nullptr))
|
||||
return false;
|
||||
|
||||
uint32 form = 0;
|
||||
switch (GetFirstSchoolInMask(spellInfo->GetSchoolMask()))
|
||||
{
|
||||
case SPELL_SCHOOL_FIRE: form = SPELL_FIRE_FORM; break;
|
||||
case SPELL_SCHOOL_FROST: form = SPELL_FROST_FORM; break;
|
||||
case SPELL_SCHOOL_ARCANE: form = SPELL_ARCANE_FORM; break;
|
||||
case SPELL_SCHOOL_SHADOW: form = SPELL_SHADOW_FORM; break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (form)
|
||||
{
|
||||
_swapTime = time(nullptr) + 6;
|
||||
_lastSchool = spellInfo->GetSchoolMask();
|
||||
GetUnitOwner()->RemoveAurasDueToSpell(_lastForm);
|
||||
_lastForm = form;
|
||||
GetUnitOwner()->CastSpell(GetUnitOwner(), _lastForm, true);
|
||||
}
|
||||
case SPELL_SCHOOL_FIRE:
|
||||
form = SPELL_FIRE_FORM;
|
||||
break;
|
||||
case SPELL_SCHOOL_FROST:
|
||||
form = SPELL_FROST_FORM;
|
||||
break;
|
||||
case SPELL_SCHOOL_ARCANE:
|
||||
form = SPELL_ARCANE_FORM;
|
||||
break;
|
||||
case SPELL_SCHOOL_SHADOW:
|
||||
form = SPELL_SHADOW_FORM;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return false;
|
||||
if (form)
|
||||
{
|
||||
_swapTime = time(nullptr) + 6;
|
||||
_lastSchool = spellInfo->GetSchoolMask();
|
||||
GetUnitOwner()->RemoveAurasDueToSpell(_lastForm);
|
||||
_lastForm = form;
|
||||
GetUnitOwner()->CastSpell(GetUnitOwner(), _lastForm, true);
|
||||
}
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
DoCheckProc += AuraCheckProcFn(spell_botanica_shift_form_AuraScript::CheckProc);
|
||||
}
|
||||
|
||||
private:
|
||||
uint32 _lastSchool;
|
||||
uint32 _lastForm;
|
||||
uint32 _swapTime;
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_botanica_shift_form_AuraScript();
|
||||
return false;
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
DoCheckProc += AuraCheckProcFn(spell_botanica_shift_form_AuraScript::CheckProc);
|
||||
}
|
||||
|
||||
private:
|
||||
uint32 _lastSchool;
|
||||
uint32 _lastForm;
|
||||
uint32 _swapTime;
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_botanica_shift_form_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_instance_the_botanica()
|
||||
|
||||
@@ -48,166 +48,166 @@ enum Events
|
||||
|
||||
class boss_doomlord_kazzak : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_doomlord_kazzak() : CreatureScript("boss_doomlord_kazzak") { }
|
||||
public:
|
||||
boss_doomlord_kazzak() : CreatureScript("boss_doomlord_kazzak") { }
|
||||
|
||||
struct boss_doomlordkazzakAI : public ScriptedAI
|
||||
struct boss_doomlordkazzakAI : public ScriptedAI
|
||||
{
|
||||
boss_doomlordkazzakAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
boss_doomlordkazzakAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_events.Reset();
|
||||
_events.ScheduleEvent(EVENT_SHADOW_VOLLEY, urand(6000, 10000));
|
||||
_events.ScheduleEvent(EVENT_CLEAVE, 7000);
|
||||
_events.ScheduleEvent(EVENT_THUNDERCLAP, urand(14000, 18000));
|
||||
_events.ScheduleEvent(EVENT_VOID_BOLT, 30000);
|
||||
_events.ScheduleEvent(EVENT_MARK_OF_KAZZAK, 25000);
|
||||
_events.ScheduleEvent(EVENT_ENRAGE, 60000);
|
||||
_events.ScheduleEvent(EVENT_TWISTED_REFLECTION, 33000);
|
||||
_events.ScheduleEvent(EVENT_BERSERK, 180000);
|
||||
}
|
||||
|
||||
void JustRespawned()
|
||||
{
|
||||
Talk(SAY_INTRO);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
// When Kazzak kills a player (not pets/totems), he regens some health
|
||||
if (victim->GetTypeId() != TYPEID_PLAYER)
|
||||
return;
|
||||
|
||||
DoCast(me, SPELL_CAPTURE_SOUL);
|
||||
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
// Return since we have no target
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
_events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = _events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_SHADOW_VOLLEY:
|
||||
DoCastVictim(SPELL_SHADOW_VOLLEY);
|
||||
_events.ScheduleEvent(EVENT_SHADOW_VOLLEY, urand(4000, 6000));
|
||||
break;
|
||||
case EVENT_CLEAVE:
|
||||
DoCastVictim(SPELL_CLEAVE);
|
||||
_events.ScheduleEvent(EVENT_CLEAVE, urand(8000, 12000));
|
||||
break;
|
||||
case EVENT_THUNDERCLAP:
|
||||
DoCastVictim(SPELL_THUNDERCLAP);
|
||||
_events.ScheduleEvent(EVENT_THUNDERCLAP, urand(10000, 14000));
|
||||
break;
|
||||
case EVENT_VOID_BOLT:
|
||||
DoCastVictim(SPELL_VOID_BOLT);
|
||||
_events.ScheduleEvent(EVENT_VOID_BOLT, urand(15000, 18000));
|
||||
break;
|
||||
case EVENT_MARK_OF_KAZZAK:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, PowerUsersSelector(me, POWER_MANA, 100.0f, true)))
|
||||
DoCast(target, SPELL_MARK_OF_KAZZAK);
|
||||
_events.ScheduleEvent(EVENT_MARK_OF_KAZZAK, 20000);
|
||||
break;
|
||||
case EVENT_ENRAGE:
|
||||
Talk(EMOTE_FRENZY);
|
||||
DoCast(me, SPELL_ENRAGE);
|
||||
_events.ScheduleEvent(EVENT_ENRAGE, 30000);
|
||||
break;
|
||||
case EVENT_TWISTED_REFLECTION:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
|
||||
DoCast(target, SPELL_TWISTED_REFLECTION);
|
||||
_events.ScheduleEvent(EVENT_TWISTED_REFLECTION, 15000);
|
||||
break;
|
||||
case EVENT_BERSERK:
|
||||
DoCast(me, SPELL_BERSERK);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap _events;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_doomlordkazzakAI (creature);
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_events.Reset();
|
||||
_events.ScheduleEvent(EVENT_SHADOW_VOLLEY, urand(6000, 10000));
|
||||
_events.ScheduleEvent(EVENT_CLEAVE, 7000);
|
||||
_events.ScheduleEvent(EVENT_THUNDERCLAP, urand(14000, 18000));
|
||||
_events.ScheduleEvent(EVENT_VOID_BOLT, 30000);
|
||||
_events.ScheduleEvent(EVENT_MARK_OF_KAZZAK, 25000);
|
||||
_events.ScheduleEvent(EVENT_ENRAGE, 60000);
|
||||
_events.ScheduleEvent(EVENT_TWISTED_REFLECTION, 33000);
|
||||
_events.ScheduleEvent(EVENT_BERSERK, 180000);
|
||||
}
|
||||
|
||||
void JustRespawned()
|
||||
{
|
||||
Talk(SAY_INTRO);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
// When Kazzak kills a player (not pets/totems), he regens some health
|
||||
if (victim->GetTypeId() != TYPEID_PLAYER)
|
||||
return;
|
||||
|
||||
DoCast(me, SPELL_CAPTURE_SOUL);
|
||||
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
// Return since we have no target
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
_events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = _events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_SHADOW_VOLLEY:
|
||||
DoCastVictim(SPELL_SHADOW_VOLLEY);
|
||||
_events.ScheduleEvent(EVENT_SHADOW_VOLLEY, urand(4000, 6000));
|
||||
break;
|
||||
case EVENT_CLEAVE:
|
||||
DoCastVictim(SPELL_CLEAVE);
|
||||
_events.ScheduleEvent(EVENT_CLEAVE, urand(8000, 12000));
|
||||
break;
|
||||
case EVENT_THUNDERCLAP:
|
||||
DoCastVictim(SPELL_THUNDERCLAP);
|
||||
_events.ScheduleEvent(EVENT_THUNDERCLAP, urand(10000, 14000));
|
||||
break;
|
||||
case EVENT_VOID_BOLT:
|
||||
DoCastVictim(SPELL_VOID_BOLT);
|
||||
_events.ScheduleEvent(EVENT_VOID_BOLT, urand(15000, 18000));
|
||||
break;
|
||||
case EVENT_MARK_OF_KAZZAK:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, PowerUsersSelector(me, POWER_MANA, 100.0f, true)))
|
||||
DoCast(target, SPELL_MARK_OF_KAZZAK);
|
||||
_events.ScheduleEvent(EVENT_MARK_OF_KAZZAK, 20000);
|
||||
break;
|
||||
case EVENT_ENRAGE:
|
||||
Talk(EMOTE_FRENZY);
|
||||
DoCast(me, SPELL_ENRAGE);
|
||||
_events.ScheduleEvent(EVENT_ENRAGE, 30000);
|
||||
break;
|
||||
case EVENT_TWISTED_REFLECTION:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
|
||||
DoCast(target, SPELL_TWISTED_REFLECTION);
|
||||
_events.ScheduleEvent(EVENT_TWISTED_REFLECTION, 15000);
|
||||
break;
|
||||
case EVENT_BERSERK:
|
||||
DoCast(me, SPELL_BERSERK);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap _events;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_doomlordkazzakAI (creature);
|
||||
}
|
||||
};
|
||||
|
||||
class spell_mark_of_kazzak : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_mark_of_kazzak() : SpellScriptLoader("spell_mark_of_kazzak") { }
|
||||
public:
|
||||
spell_mark_of_kazzak() : SpellScriptLoader("spell_mark_of_kazzak") { }
|
||||
|
||||
class spell_mark_of_kazzak_AuraScript : public AuraScript
|
||||
class spell_mark_of_kazzak_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_mark_of_kazzak_AuraScript);
|
||||
|
||||
bool Validate(SpellInfo const* /*spell*/)
|
||||
{
|
||||
PrepareAuraScript(spell_mark_of_kazzak_AuraScript);
|
||||
|
||||
bool Validate(SpellInfo const* /*spell*/)
|
||||
{
|
||||
if (!sSpellMgr->GetSpellInfo(SPELL_MARK_OF_KAZZAK_DAMAGE))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
|
||||
{
|
||||
if (Unit* owner = GetUnitOwner())
|
||||
amount = CalculatePct(owner->GetPower(POWER_MANA), 5);
|
||||
}
|
||||
|
||||
void OnPeriodic(AuraEffect const* aurEff)
|
||||
{
|
||||
Unit* target = GetTarget();
|
||||
|
||||
if (target->GetPower(POWER_MANA) == 0)
|
||||
{
|
||||
target->CastSpell(target, SPELL_MARK_OF_KAZZAK_DAMAGE, true, NULL, aurEff);
|
||||
// Remove aura
|
||||
SetDuration(0);
|
||||
}
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mark_of_kazzak_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_MANA_LEECH);
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_mark_of_kazzak_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_MANA_LEECH);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_mark_of_kazzak_AuraScript();
|
||||
if (!sSpellMgr->GetSpellInfo(SPELL_MARK_OF_KAZZAK_DAMAGE))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
|
||||
{
|
||||
if (Unit* owner = GetUnitOwner())
|
||||
amount = CalculatePct(owner->GetPower(POWER_MANA), 5);
|
||||
}
|
||||
|
||||
void OnPeriodic(AuraEffect const* aurEff)
|
||||
{
|
||||
Unit* target = GetTarget();
|
||||
|
||||
if (target->GetPower(POWER_MANA) == 0)
|
||||
{
|
||||
target->CastSpell(target, SPELL_MARK_OF_KAZZAK_DAMAGE, true, NULL, aurEff);
|
||||
// Remove aura
|
||||
SetDuration(0);
|
||||
}
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mark_of_kazzak_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_MANA_LEECH);
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_mark_of_kazzak_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_MANA_LEECH);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_mark_of_kazzak_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_doomlordkazzak()
|
||||
|
||||
@@ -38,118 +38,118 @@ enum Events
|
||||
|
||||
class boss_doomwalker : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_doomwalker() : CreatureScript("boss_doomwalker") { }
|
||||
public:
|
||||
boss_doomwalker() : CreatureScript("boss_doomwalker") { }
|
||||
|
||||
struct boss_doomwalkerAI : public ScriptedAI
|
||||
struct boss_doomwalkerAI : public ScriptedAI
|
||||
{
|
||||
boss_doomwalkerAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
boss_doomwalkerAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_events.Reset();
|
||||
_events.ScheduleEvent(EVENT_ENRAGE, 0);
|
||||
_events.ScheduleEvent(EVENT_ARMOR, urand(5000, 13000));
|
||||
_events.ScheduleEvent(EVENT_CHAIN, urand(10000, 30000));
|
||||
_events.ScheduleEvent(EVENT_QUAKE, urand(25000, 35000));
|
||||
_events.ScheduleEvent(EVENT_OVERRUN, urand(30000, 45000));
|
||||
_inEnrage = false;
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
victim->CastSpell(victim, SPELL_MARK_DEATH, 0);
|
||||
|
||||
if (urand(0, 4))
|
||||
return;
|
||||
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who)
|
||||
{
|
||||
if (who && who->GetTypeId() == TYPEID_PLAYER && me->IsValidAttackTarget(who))
|
||||
if (who->HasAura(SPELL_MARK_DEATH,0) && !who->HasAura(27827)) // Spirit of Redemption
|
||||
who->CastSpell(who, SPELL_AURA_DEATH, 1);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
_events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = _events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_ENRAGE:
|
||||
if (!HealthAbovePct(20))
|
||||
{
|
||||
DoCast(me, SPELL_ENRAGE);
|
||||
_events.ScheduleEvent(EVENT_ENRAGE, 6000);
|
||||
_inEnrage = true;
|
||||
}
|
||||
break;
|
||||
case EVENT_OVERRUN:
|
||||
Talk(SAY_OVERRUN);
|
||||
DoCastVictim(SPELL_OVERRUN);
|
||||
_events.ScheduleEvent(EVENT_OVERRUN, urand(25000, 40000));
|
||||
break;
|
||||
case EVENT_QUAKE:
|
||||
if (urand(0, 1))
|
||||
return;
|
||||
|
||||
Talk(SAY_EARTHQUAKE);
|
||||
|
||||
//remove enrage before casting earthquake because enrage + earthquake = 16000dmg over 8sec and all dead
|
||||
if (_inEnrage)
|
||||
me->RemoveAurasDueToSpell(SPELL_ENRAGE);
|
||||
|
||||
DoCast(me, SPELL_EARTHQUAKE);
|
||||
_events.ScheduleEvent(EVENT_QUAKE, urand(30000, 55000));
|
||||
break;
|
||||
case EVENT_CHAIN:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true))
|
||||
DoCast(target, SPELL_CHAIN_LIGHTNING);
|
||||
_events.ScheduleEvent(EVENT_CHAIN, urand(7000, 27000));
|
||||
break;
|
||||
case EVENT_ARMOR:
|
||||
DoCastVictim(SPELL_SUNDER_ARMOR);
|
||||
_events.ScheduleEvent(EVENT_ARMOR, urand(10000, 25000));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap _events;
|
||||
bool _inEnrage;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_doomwalkerAI (creature);
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_events.Reset();
|
||||
_events.ScheduleEvent(EVENT_ENRAGE, 0);
|
||||
_events.ScheduleEvent(EVENT_ARMOR, urand(5000, 13000));
|
||||
_events.ScheduleEvent(EVENT_CHAIN, urand(10000, 30000));
|
||||
_events.ScheduleEvent(EVENT_QUAKE, urand(25000, 35000));
|
||||
_events.ScheduleEvent(EVENT_OVERRUN, urand(30000, 45000));
|
||||
_inEnrage = false;
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
victim->CastSpell(victim, SPELL_MARK_DEATH, 0);
|
||||
|
||||
if (urand(0, 4))
|
||||
return;
|
||||
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who)
|
||||
{
|
||||
if (who && who->GetTypeId() == TYPEID_PLAYER && me->IsValidAttackTarget(who))
|
||||
if (who->HasAura(SPELL_MARK_DEATH, 0) && !who->HasAura(27827)) // Spirit of Redemption
|
||||
who->CastSpell(who, SPELL_AURA_DEATH, 1);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
_events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = _events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_ENRAGE:
|
||||
if (!HealthAbovePct(20))
|
||||
{
|
||||
DoCast(me, SPELL_ENRAGE);
|
||||
_events.ScheduleEvent(EVENT_ENRAGE, 6000);
|
||||
_inEnrage = true;
|
||||
}
|
||||
break;
|
||||
case EVENT_OVERRUN:
|
||||
Talk(SAY_OVERRUN);
|
||||
DoCastVictim(SPELL_OVERRUN);
|
||||
_events.ScheduleEvent(EVENT_OVERRUN, urand(25000, 40000));
|
||||
break;
|
||||
case EVENT_QUAKE:
|
||||
if (urand(0, 1))
|
||||
return;
|
||||
|
||||
Talk(SAY_EARTHQUAKE);
|
||||
|
||||
//remove enrage before casting earthquake because enrage + earthquake = 16000dmg over 8sec and all dead
|
||||
if (_inEnrage)
|
||||
me->RemoveAurasDueToSpell(SPELL_ENRAGE);
|
||||
|
||||
DoCast(me, SPELL_EARTHQUAKE);
|
||||
_events.ScheduleEvent(EVENT_QUAKE, urand(30000, 55000));
|
||||
break;
|
||||
case EVENT_CHAIN:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true))
|
||||
DoCast(target, SPELL_CHAIN_LIGHTNING);
|
||||
_events.ScheduleEvent(EVENT_CHAIN, urand(7000, 27000));
|
||||
break;
|
||||
case EVENT_ARMOR:
|
||||
DoCastVictim(SPELL_SUNDER_ARMOR);
|
||||
_events.ScheduleEvent(EVENT_ARMOR, urand(10000, 25000));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap _events;
|
||||
bool _inEnrage;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_doomwalkerAI (creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_doomwalker()
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -30,36 +30,36 @@ EndContentData */
|
||||
|
||||
class spell_q10935_the_exorcism_of_colonel_jules : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_q10935_the_exorcism_of_colonel_jules() : SpellScriptLoader("spell_q10935_the_exorcism_of_colonel_jules") { }
|
||||
public:
|
||||
spell_q10935_the_exorcism_of_colonel_jules() : SpellScriptLoader("spell_q10935_the_exorcism_of_colonel_jules") { }
|
||||
|
||||
class spell_q10935_the_exorcism_of_colonel_jules_SpellScript : public SpellScript
|
||||
class spell_q10935_the_exorcism_of_colonel_jules_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_q10935_the_exorcism_of_colonel_jules_SpellScript);
|
||||
|
||||
void HandleDummy(SpellEffIndex effIndex)
|
||||
{
|
||||
PrepareSpellScript(spell_q10935_the_exorcism_of_colonel_jules_SpellScript);
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
Creature* target = GetHitCreature();
|
||||
if (!target)
|
||||
return;
|
||||
|
||||
void HandleDummy(SpellEffIndex effIndex)
|
||||
{
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
Creature* target = GetHitCreature();
|
||||
if (!target)
|
||||
return;
|
||||
|
||||
if (GetCaster()->IsHostileTo(target))
|
||||
GetCaster()->CastSpell(target, 39323 /*SPELL_HOLY_FIRE*/, true);
|
||||
else
|
||||
GetCaster()->CastSpell(target, 39322 /*SPELL_HEAL_BARADA*/, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_q10935_the_exorcism_of_colonel_jules_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_q10935_the_exorcism_of_colonel_jules_SpellScript();
|
||||
if (GetCaster()->IsHostileTo(target))
|
||||
GetCaster()->CastSpell(target, 39323 /*SPELL_HOLY_FIRE*/, true);
|
||||
else
|
||||
GetCaster()->CastSpell(target, 39322 /*SPELL_HEAL_BARADA*/, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_q10935_the_exorcism_of_colonel_jules_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_q10935_the_exorcism_of_colonel_jules_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -107,7 +107,8 @@ public:
|
||||
{
|
||||
me->setFaction(FACTION_HOSTILE);
|
||||
faction_Timer = 0;
|
||||
} else faction_Timer -= diff;
|
||||
}
|
||||
else faction_Timer -= diff;
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
@@ -128,13 +129,15 @@ public:
|
||||
{
|
||||
DoCastVictim(SPELL_SHOCK);
|
||||
shock_Timer = 10000;
|
||||
} else shock_Timer -= diff;
|
||||
}
|
||||
else shock_Timer -= diff;
|
||||
|
||||
if (envelopingWinds_Timer <= diff)
|
||||
{
|
||||
DoCastVictim(SPELL_ENVELOPING_WINDS);
|
||||
envelopingWinds_Timer = 25000;
|
||||
} else envelopingWinds_Timer -= diff;
|
||||
}
|
||||
else envelopingWinds_Timer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
@@ -49,8 +49,8 @@ enum MagharCaptive
|
||||
NPC_MURK_PUTRIFIER = 18202
|
||||
};
|
||||
|
||||
static float m_afAmbushA[]= {-1568.805786f, 8533.873047f, 1.958f};
|
||||
static float m_afAmbushB[]= {-1491.554321f, 8506.483398f, 1.248f};
|
||||
static float m_afAmbushA[] = {-1568.805786f, 8533.873047f, 1.958f};
|
||||
static float m_afAmbushB[] = {-1491.554321f, 8506.483398f, 1.248f};
|
||||
|
||||
class npc_maghar_captive : public CreatureScript
|
||||
{
|
||||
@@ -68,8 +68,8 @@ public:
|
||||
EscortAI->Start(true, false, player->GetGUID(), quest);
|
||||
creature->AI()->Talk(SAY_MAG_START);
|
||||
|
||||
creature->SummonCreature(NPC_MURK_RAIDER, m_afAmbushA[0]+2.5f, m_afAmbushA[1]-2.5f, m_afAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
creature->SummonCreature(NPC_MURK_PUTRIFIER, m_afAmbushA[0]-2.5f, m_afAmbushA[1]+2.5f, m_afAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
creature->SummonCreature(NPC_MURK_RAIDER, m_afAmbushA[0] + 2.5f, m_afAmbushA[1] - 2.5f, m_afAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
creature->SummonCreature(NPC_MURK_PUTRIFIER, m_afAmbushA[0] - 2.5f, m_afAmbushA[1] + 2.5f, m_afAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
creature->SummonCreature(NPC_MURK_BRUTE, m_afAmbushA[0], m_afAmbushA[1], m_afAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
}
|
||||
}
|
||||
@@ -123,9 +123,9 @@ public:
|
||||
if (Creature* temp = me->SummonCreature(NPC_MURK_PUTRIFIER, m_afAmbushB[0], m_afAmbushB[1], m_afAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000))
|
||||
temp->AI()->Talk(SAY_MAG_MORE_REPLY);
|
||||
|
||||
me->SummonCreature(NPC_MURK_PUTRIFIER, m_afAmbushB[0]-2.5f, m_afAmbushB[1]-2.5f, m_afAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
me->SummonCreature(NPC_MURK_SCAVENGER, m_afAmbushB[0]+2.5f, m_afAmbushB[1]+2.5f, m_afAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
me->SummonCreature(NPC_MURK_SCAVENGER, m_afAmbushB[0]+2.5f, m_afAmbushB[1]-2.5f, m_afAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
me->SummonCreature(NPC_MURK_PUTRIFIER, m_afAmbushB[0] - 2.5f, m_afAmbushB[1] - 2.5f, m_afAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
me->SummonCreature(NPC_MURK_SCAVENGER, m_afAmbushB[0] + 2.5f, m_afAmbushB[1] + 2.5f, m_afAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
me->SummonCreature(NPC_MURK_SCAVENGER, m_afAmbushB[0] + 2.5f, m_afAmbushB[1] - 2.5f, m_afAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
break;
|
||||
case 16:
|
||||
Talk(SAY_MAG_COMPLETE);
|
||||
@@ -156,7 +156,7 @@ public:
|
||||
{
|
||||
if (spell->Id == SPELL_CHAIN_LIGHTNING)
|
||||
{
|
||||
if (rand()%10)
|
||||
if (rand() % 10)
|
||||
return;
|
||||
|
||||
Talk(SAY_MAG_LIGHTNING);
|
||||
@@ -254,23 +254,23 @@ public:
|
||||
|
||||
enum CorkiData
|
||||
{
|
||||
// first quest
|
||||
QUEST_HELP = 9923,
|
||||
NPC_CORKI = 18445,
|
||||
NPC_CORKI_CREDIT_1 = 18369,
|
||||
GO_CORKIS_PRISON = 182349,
|
||||
CORKI_SAY_THANKS = 0,
|
||||
// 2nd quest
|
||||
QUEST_CORKIS_GONE_MISSING_AGAIN = 9924,
|
||||
NPC_CORKI_2 = 20812,
|
||||
GO_CORKIS_PRISON_2 = 182350,
|
||||
CORKI_SAY_PROMISE = 0,
|
||||
// 3rd quest
|
||||
QUEST_CHOWAR_THE_PILLAGER = 9955,
|
||||
NPC_CORKI_3 = 18369,
|
||||
NPC_CORKI_CREDIT_3 = 18444,
|
||||
GO_CORKIS_PRISON_3 = 182521,
|
||||
CORKI_SAY_LAST = 0
|
||||
// first quest
|
||||
QUEST_HELP = 9923,
|
||||
NPC_CORKI = 18445,
|
||||
NPC_CORKI_CREDIT_1 = 18369,
|
||||
GO_CORKIS_PRISON = 182349,
|
||||
CORKI_SAY_THANKS = 0,
|
||||
// 2nd quest
|
||||
QUEST_CORKIS_GONE_MISSING_AGAIN = 9924,
|
||||
NPC_CORKI_2 = 20812,
|
||||
GO_CORKIS_PRISON_2 = 182350,
|
||||
CORKI_SAY_PROMISE = 0,
|
||||
// 3rd quest
|
||||
QUEST_CHOWAR_THE_PILLAGER = 9955,
|
||||
NPC_CORKI_3 = 18369,
|
||||
NPC_CORKI_CREDIT_3 = 18444,
|
||||
GO_CORKIS_PRISON_3 = 182521,
|
||||
CORKI_SAY_LAST = 0
|
||||
};
|
||||
|
||||
class go_corkis_prison : public GameObjectScript
|
||||
@@ -285,7 +285,7 @@ public:
|
||||
{
|
||||
if (Creature* corki = go->FindNearestCreature(NPC_CORKI, 25, true))
|
||||
{
|
||||
corki->GetMotionMaster()->MovePoint(1, go->GetPositionX()+5, go->GetPositionY(), go->GetPositionZ());
|
||||
corki->GetMotionMaster()->MovePoint(1, go->GetPositionX() + 5, go->GetPositionY(), go->GetPositionZ());
|
||||
if (player)
|
||||
player->KilledMonsterCredit(NPC_CORKI_CREDIT_1, 0);
|
||||
}
|
||||
@@ -295,7 +295,7 @@ public:
|
||||
{
|
||||
if (Creature* corki = go->FindNearestCreature(NPC_CORKI_2, 25, true))
|
||||
{
|
||||
corki->GetMotionMaster()->MovePoint(1, go->GetPositionX()-5, go->GetPositionY(), go->GetPositionZ());
|
||||
corki->GetMotionMaster()->MovePoint(1, go->GetPositionX() - 5, go->GetPositionY(), go->GetPositionZ());
|
||||
if (player)
|
||||
player->KilledMonsterCredit(NPC_CORKI_2, 0);
|
||||
}
|
||||
@@ -305,7 +305,7 @@ public:
|
||||
{
|
||||
if (Creature* corki = go->FindNearestCreature(NPC_CORKI_3, 25, true))
|
||||
{
|
||||
corki->GetMotionMaster()->MovePoint(1, go->GetPositionX()+4, go->GetPositionY(), go->GetPositionZ());
|
||||
corki->GetMotionMaster()->MovePoint(1, go->GetPositionX() + 4, go->GetPositionY(), go->GetPositionZ());
|
||||
if (player)
|
||||
player->KilledMonsterCredit(NPC_CORKI_CREDIT_3, 0);
|
||||
}
|
||||
@@ -318,55 +318,55 @@ public:
|
||||
class npc_corki : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_corki() : CreatureScript("npc_corki") { }
|
||||
npc_corki() : CreatureScript("npc_corki") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new npc_corkiAI(creature);
|
||||
}
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new npc_corkiAI(creature);
|
||||
}
|
||||
|
||||
struct npc_corkiAI : public ScriptedAI
|
||||
{
|
||||
npc_corkiAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
struct npc_corkiAI : public ScriptedAI
|
||||
{
|
||||
npc_corkiAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
uint32 Say_Timer;
|
||||
bool ReleasedFromCage;
|
||||
uint32 Say_Timer;
|
||||
bool ReleasedFromCage;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
Say_Timer = 5000;
|
||||
ReleasedFromCage = false;
|
||||
}
|
||||
void Reset()
|
||||
{
|
||||
Say_Timer = 5000;
|
||||
ReleasedFromCage = false;
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (ReleasedFromCage)
|
||||
{
|
||||
if (Say_Timer <= diff)
|
||||
{
|
||||
me->DespawnOrUnsummon();
|
||||
ReleasedFromCage = false;
|
||||
}
|
||||
else
|
||||
Say_Timer -= diff;
|
||||
}
|
||||
}
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (ReleasedFromCage)
|
||||
{
|
||||
if (Say_Timer <= diff)
|
||||
{
|
||||
me->DespawnOrUnsummon();
|
||||
ReleasedFromCage = false;
|
||||
}
|
||||
else
|
||||
Say_Timer -= diff;
|
||||
}
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 id)
|
||||
{
|
||||
if (type == POINT_MOTION_TYPE && id == 1)
|
||||
{
|
||||
Say_Timer = 5000;
|
||||
ReleasedFromCage = true;
|
||||
if (me->GetEntry() == NPC_CORKI)
|
||||
Talk(CORKI_SAY_THANKS);
|
||||
if (me->GetEntry() == NPC_CORKI_2)
|
||||
Talk(CORKI_SAY_PROMISE);
|
||||
if (me->GetEntry() == NPC_CORKI_3)
|
||||
Talk(CORKI_SAY_LAST);
|
||||
}
|
||||
};
|
||||
};
|
||||
void MovementInform(uint32 type, uint32 id)
|
||||
{
|
||||
if (type == POINT_MOTION_TYPE && id == 1)
|
||||
{
|
||||
Say_Timer = 5000;
|
||||
ReleasedFromCage = true;
|
||||
if (me->GetEntry() == NPC_CORKI)
|
||||
Talk(CORKI_SAY_THANKS);
|
||||
if (me->GetEntry() == NPC_CORKI_2)
|
||||
Talk(CORKI_SAY_PROMISE);
|
||||
if (me->GetEntry() == NPC_CORKI_3)
|
||||
Talk(CORKI_SAY_LAST);
|
||||
}
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
/*#####
|
||||
@@ -396,8 +396,8 @@ enum KurenaiCaptive
|
||||
NPC_KUR_MURK_PUTRIFIER = 18202,
|
||||
};
|
||||
|
||||
static float kurenaiAmbushA[]= {-1520.6f, 8468.4f, -4.1f};
|
||||
static float kurenaiAmbushB[]= {-1491.554321f, 8506.483398f, 1.248f};
|
||||
static float kurenaiAmbushA[] = {-1520.6f, 8468.4f, -4.1f};
|
||||
static float kurenaiAmbushB[] = {-1491.554321f, 8506.483398f, 1.248f};
|
||||
|
||||
class npc_kurenai_captive : public CreatureScript
|
||||
{
|
||||
@@ -431,8 +431,8 @@ public:
|
||||
Start(true, false, guid);
|
||||
Talk(SAY_KUR_START);
|
||||
|
||||
me->SummonCreature(NPC_KUR_MURK_RAIDER, kurenaiAmbushA[0]+2.5f, kurenaiAmbushA[1]-2.5f, kurenaiAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 50000);
|
||||
me->SummonCreature(NPC_KUR_MURK_BRUTE, kurenaiAmbushA[0]-2.5f, kurenaiAmbushA[1]+2.5f, kurenaiAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 50000);
|
||||
me->SummonCreature(NPC_KUR_MURK_RAIDER, kurenaiAmbushA[0] + 2.5f, kurenaiAmbushA[1] - 2.5f, kurenaiAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 50000);
|
||||
me->SummonCreature(NPC_KUR_MURK_BRUTE, kurenaiAmbushA[0] - 2.5f, kurenaiAmbushA[1] + 2.5f, kurenaiAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 50000);
|
||||
me->SummonCreature(NPC_KUR_MURK_SCAVENGER, kurenaiAmbushA[0], kurenaiAmbushA[1], kurenaiAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 50000);
|
||||
}
|
||||
|
||||
@@ -465,27 +465,27 @@ public:
|
||||
switch (waypointId)
|
||||
{
|
||||
case 3:
|
||||
{
|
||||
Talk(SAY_KUR_MORE);
|
||||
{
|
||||
Talk(SAY_KUR_MORE);
|
||||
|
||||
if (Creature* cr = me->SummonCreature(NPC_KUR_MURK_PUTRIFIER, kurenaiAmbushB[0], kurenaiAmbushB[1], kurenaiAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000))
|
||||
cr->AI()->Talk(SAY_KUR_MORE_TWO);
|
||||
if (Creature* cr = me->SummonCreature(NPC_KUR_MURK_PUTRIFIER, kurenaiAmbushB[0], kurenaiAmbushB[1], kurenaiAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000))
|
||||
cr->AI()->Talk(SAY_KUR_MORE_TWO);
|
||||
|
||||
me->SummonCreature(NPC_KUR_MURK_PUTRIFIER, kurenaiAmbushB[0]-2.5f, kurenaiAmbushB[1]-2.5f, kurenaiAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
me->SummonCreature(NPC_KUR_MURK_SCAVENGER, kurenaiAmbushB[0]+2.5f, kurenaiAmbushB[1]+2.5f, kurenaiAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
me->SummonCreature(NPC_KUR_MURK_SCAVENGER, kurenaiAmbushB[0]+2.5f, kurenaiAmbushB[1]-2.5f, kurenaiAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
break;
|
||||
}
|
||||
me->SummonCreature(NPC_KUR_MURK_PUTRIFIER, kurenaiAmbushB[0] - 2.5f, kurenaiAmbushB[1] - 2.5f, kurenaiAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
me->SummonCreature(NPC_KUR_MURK_SCAVENGER, kurenaiAmbushB[0] + 2.5f, kurenaiAmbushB[1] + 2.5f, kurenaiAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
me->SummonCreature(NPC_KUR_MURK_SCAVENGER, kurenaiAmbushB[0] + 2.5f, kurenaiAmbushB[1] - 2.5f, kurenaiAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
break;
|
||||
}
|
||||
case 7:
|
||||
{
|
||||
Talk(SAY_KUR_COMPLETE);
|
||||
{
|
||||
Talk(SAY_KUR_COMPLETE);
|
||||
|
||||
if (Player* player = GetPlayerForEscort())
|
||||
player->GroupEventHappens(QUEST_TOTEM_KARDASH_A, me);
|
||||
if (Player* player = GetPlayerForEscort())
|
||||
player->GroupEventHappens(QUEST_TOTEM_KARDASH_A, me);
|
||||
|
||||
SetRun();
|
||||
break;
|
||||
}
|
||||
SetRun();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -505,7 +505,7 @@ public:
|
||||
{
|
||||
if (spell->Id == SPELL_KUR_CHAIN_LIGHTNING)
|
||||
{
|
||||
if (rand()%30)
|
||||
if (rand() % 30)
|
||||
return;
|
||||
|
||||
Talk(SAY_KUR_LIGHTNING);
|
||||
@@ -513,7 +513,7 @@ public:
|
||||
|
||||
if (spell->Id == SPELL_KUR_FROST_SHOCK)
|
||||
{
|
||||
if (rand()%30)
|
||||
if (rand() % 30)
|
||||
return;
|
||||
|
||||
Talk(SAY_KUR_SHOCK);
|
||||
@@ -532,7 +532,8 @@ public:
|
||||
{
|
||||
DoCastVictim(SPELL_KUR_CHAIN_LIGHTNING);
|
||||
ChainLightningTimer = urand(7000, 14000);
|
||||
} else ChainLightningTimer -= diff;
|
||||
}
|
||||
else ChainLightningTimer -= diff;
|
||||
|
||||
if (HealthBelowPct(30))
|
||||
{
|
||||
@@ -540,14 +541,16 @@ public:
|
||||
{
|
||||
DoCast(me, SPELL_KUR_HEALING_WAVE);
|
||||
HealTimer = 5000;
|
||||
} else HealTimer -= diff;
|
||||
}
|
||||
else HealTimer -= diff;
|
||||
}
|
||||
|
||||
if (FrostShockTimer <= diff)
|
||||
{
|
||||
DoCastVictim(SPELL_KUR_FROST_SHOCK);
|
||||
FrostShockTimer = urand(7500, 15000);
|
||||
} else FrostShockTimer -= diff;
|
||||
}
|
||||
else FrostShockTimer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
@@ -574,7 +577,7 @@ public:
|
||||
bool OnGossipHello(Player* player, GameObject* go) override
|
||||
{
|
||||
go->UseDoorOrButton();
|
||||
|
||||
|
||||
if (player->GetQuestStatus(QUEST_FINDING_THE_SURVIVORS) != QUEST_STATUS_INCOMPLETE)
|
||||
return false;
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -38,52 +38,52 @@ EndContentData */
|
||||
// Ours
|
||||
class spell_q10612_10613_the_fel_and_the_furious : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_q10612_10613_the_fel_and_the_furious() : SpellScriptLoader("spell_q10612_10613_the_fel_and_the_furious") { }
|
||||
public:
|
||||
spell_q10612_10613_the_fel_and_the_furious() : SpellScriptLoader("spell_q10612_10613_the_fel_and_the_furious") { }
|
||||
|
||||
class spell_q10612_10613_the_fel_and_the_furious_SpellScript : public SpellScript
|
||||
class spell_q10612_10613_the_fel_and_the_furious_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_q10612_10613_the_fel_and_the_furious_SpellScript);
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
PrepareSpellScript(spell_q10612_10613_the_fel_and_the_furious_SpellScript);
|
||||
Player* charmer = GetCaster()->GetCharmerOrOwnerPlayerOrPlayerItself();
|
||||
if (!charmer)
|
||||
return;
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
|
||||
std::list<GameObject*> gList;
|
||||
GetCaster()->GetGameObjectListWithEntryInGrid(gList, 184979, 30.0f);
|
||||
uint8 counter = 0;
|
||||
for (std::list<GameObject*>::const_iterator itr = gList.begin(); itr != gList.end(); ++itr, ++counter)
|
||||
{
|
||||
Player* charmer = GetCaster()->GetCharmerOrOwnerPlayerOrPlayerItself();
|
||||
if (!charmer)
|
||||
return;
|
||||
|
||||
std::list<GameObject*> gList;
|
||||
GetCaster()->GetGameObjectListWithEntryInGrid(gList, 184979, 30.0f);
|
||||
uint8 counter = 0;
|
||||
for (std::list<GameObject*>::const_iterator itr = gList.begin(); itr != gList.end(); ++itr, ++counter)
|
||||
if (counter >= 10)
|
||||
break;
|
||||
GameObject* go = *itr;
|
||||
if (!go->isSpawned())
|
||||
continue;
|
||||
Creature* cr2 = go->SummonTrigger(go->GetPositionX(), go->GetPositionY(), go->GetPositionZ() + 2.0f, 0.0f, 100);
|
||||
if (cr2)
|
||||
{
|
||||
if (counter >= 10)
|
||||
break;
|
||||
GameObject* go = *itr;
|
||||
if (!go->isSpawned())
|
||||
continue;
|
||||
Creature* cr2 = go->SummonTrigger(go->GetPositionX(), go->GetPositionY(), go->GetPositionZ()+2.0f, 0.0f, 100);
|
||||
if (cr2)
|
||||
{
|
||||
cr2->setFaction(14);
|
||||
cr2->SetUInt32Value(UNIT_FIELD_FLAGS, 0);
|
||||
GetCaster()->CastSpell(cr2, 38083, true);
|
||||
}
|
||||
|
||||
go->SetLootState(GO_JUST_DEACTIVATED);
|
||||
charmer->KilledMonsterCredit(21959, 0);
|
||||
cr2->setFaction(14);
|
||||
cr2->SetUInt32Value(UNIT_FIELD_FLAGS, 0);
|
||||
GetCaster()->CastSpell(cr2, 38083, true);
|
||||
}
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_q10612_10613_the_fel_and_the_furious_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
go->SetLootState(GO_JUST_DEACTIVATED);
|
||||
charmer->KilledMonsterCredit(21959, 0);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_q10612_10613_the_fel_and_the_furious_SpellScript();
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_q10612_10613_the_fel_and_the_furious_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_q10612_10613_the_fel_and_the_furious_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_q10563_q10596_to_legion_hold : public SpellScriptLoader
|
||||
@@ -95,7 +95,7 @@ public:
|
||||
{
|
||||
PrepareAuraScript(spell_q10563_q10596_to_legion_hold_AuraScript)
|
||||
|
||||
void HandleEffectRemove(AuraEffect const * /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
if (Player* player = GetTarget()->ToPlayer())
|
||||
{
|
||||
@@ -104,7 +104,7 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
void HandleEffectApply(AuraEffect const * /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
if (Player* player = GetTarget()->ToPlayer())
|
||||
{
|
||||
@@ -182,16 +182,16 @@ public:
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_CAST_SUMMON_INFERNAL:
|
||||
{
|
||||
if (Unit* infernal = ObjectAccessor::GetUnit(*me, infernalGUID))
|
||||
if (infernal->GetDisplayId() == MODEL_INVISIBLE)
|
||||
me->CastSpell(infernal, SPELL_SUMMON_INFERNAL, true);
|
||||
events.ScheduleEvent(EVENT_CAST_SUMMON_INFERNAL, 12000);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
case EVENT_CAST_SUMMON_INFERNAL:
|
||||
{
|
||||
if (Unit* infernal = ObjectAccessor::GetUnit(*me, infernalGUID))
|
||||
if (infernal->GetDisplayId() == MODEL_INVISIBLE)
|
||||
me->CastSpell(infernal, SPELL_SUMMON_INFERNAL, true);
|
||||
events.ScheduleEvent(EVENT_CAST_SUMMON_INFERNAL, 12000);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -394,7 +394,7 @@ public:
|
||||
else
|
||||
EatTimer -= diff;
|
||||
|
||||
return;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
@@ -404,7 +404,8 @@ public:
|
||||
{
|
||||
DoCastVictim(SPELL_NETHER_BREATH);
|
||||
CastTimer = 5000;
|
||||
} else CastTimer -= diff;
|
||||
}
|
||||
else CastTimer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
@@ -540,7 +541,8 @@ public:
|
||||
me->GetMotionMaster()->MovePoint(1, pos);
|
||||
}
|
||||
}
|
||||
} else FlyTimer -= diff;
|
||||
}
|
||||
else FlyTimer -= diff;
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -651,39 +653,39 @@ public:
|
||||
{
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_WALK_TO_MUTTON:
|
||||
me->SetWalk(true);
|
||||
me->GetMotionMaster()->MovePoint(1, x, y, z, true);
|
||||
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_NONE);
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_CHEER);
|
||||
break;
|
||||
case EVENT_POISONED:
|
||||
if (GameObject* food = me->FindNearestGameObject(DELICIOUS_MUTTON, 5.0f))
|
||||
food->RemoveFromWorld();
|
||||
if (roll_chance_i(20))
|
||||
Talk(SAY_POISONED_1);
|
||||
CreditPlayer();
|
||||
me->CastSpell(me, SPELL_VOMIT);
|
||||
events.ScheduleEvent(EVENT_KILL, 5000);
|
||||
break;
|
||||
case EVENT_KILL:
|
||||
Unit::DealDamage(me, me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
|
||||
break;
|
||||
case EVENT_WALK_TO_MUTTON:
|
||||
me->SetWalk(true);
|
||||
me->GetMotionMaster()->MovePoint(1, x, y, z, true);
|
||||
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_NONE);
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_CHEER);
|
||||
break;
|
||||
case EVENT_POISONED:
|
||||
if (GameObject* food = me->FindNearestGameObject(DELICIOUS_MUTTON, 5.0f))
|
||||
food->RemoveFromWorld();
|
||||
if (roll_chance_i(20))
|
||||
Talk(SAY_POISONED_1);
|
||||
CreditPlayer();
|
||||
me->CastSpell(me, SPELL_VOMIT);
|
||||
events.ScheduleEvent(EVENT_KILL, 5000);
|
||||
break;
|
||||
case EVENT_KILL:
|
||||
Unit::DealDamage(me, me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
|
||||
break;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_KICK:
|
||||
if (me->GetVictim()->HasUnitState(SPELL_STATE_CASTING))
|
||||
DoCastVictim(SPELL_KICK);
|
||||
events.RepeatEvent(urand(5000, 10000));
|
||||
break;
|
||||
case EVENT_SUNDER:
|
||||
DoCastVictim(SPELL_SUNDER);
|
||||
events.RepeatEvent(urand(5000, 10000));
|
||||
break;
|
||||
case EVENT_KICK:
|
||||
if (me->GetVictim()->HasUnitState(SPELL_STATE_CASTING))
|
||||
DoCastVictim(SPELL_KICK);
|
||||
events.RepeatEvent(urand(5000, 10000));
|
||||
break;
|
||||
case EVENT_SUNDER:
|
||||
DoCastVictim(SPELL_SUNDER);
|
||||
events.RepeatEvent(urand(5000, 10000));
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
@@ -737,7 +739,7 @@ public:
|
||||
bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) override
|
||||
{
|
||||
ClearGossipMenuFor(player);
|
||||
if (action == GOSSIP_ACTION_INFO_DEF+1)
|
||||
if (action == GOSSIP_ACTION_INFO_DEF + 1)
|
||||
{
|
||||
ItemPosCountVec dest;
|
||||
uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, 30658, 1, nullptr);
|
||||
@@ -747,7 +749,7 @@ public:
|
||||
ClearGossipMenuFor(player);
|
||||
}
|
||||
}
|
||||
if (action == GOSSIP_ACTION_INFO_DEF+2)
|
||||
if (action == GOSSIP_ACTION_INFO_DEF + 2)
|
||||
{
|
||||
ItemPosCountVec dest;
|
||||
uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, 30659, 1, nullptr);
|
||||
@@ -763,9 +765,9 @@ public:
|
||||
bool OnGossipHello(Player* player, Creature* creature) override
|
||||
{
|
||||
if (player->GetQuestStatus(10583) == QUEST_STATUS_INCOMPLETE && !player->HasItemCount(30658, 1, true))
|
||||
AddGossipItemFor(player, 0, GOSSIP_HSK1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
|
||||
AddGossipItemFor(player, 0, GOSSIP_HSK1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
||||
if (player->GetQuestStatus(10601) == QUEST_STATUS_INCOMPLETE && !player->HasItemCount(30659, 1, true))
|
||||
AddGossipItemFor(player, 0, GOSSIP_HSK2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
|
||||
AddGossipItemFor(player, 0, GOSSIP_HSK2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
|
||||
|
||||
SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
|
||||
|
||||
@@ -789,19 +791,19 @@ enum Karynaku
|
||||
|
||||
class npc_karynaku : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_karynaku() : CreatureScript("npc_karynaku") { }
|
||||
public:
|
||||
npc_karynaku() : CreatureScript("npc_karynaku") { }
|
||||
|
||||
bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest)
|
||||
{
|
||||
if (quest->GetQuestId() == QUEST_ALLY_OF_NETHER)
|
||||
player->ActivateTaxiPathTo(TAXI_PATH_ID);
|
||||
bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest)
|
||||
{
|
||||
if (quest->GetQuestId() == QUEST_ALLY_OF_NETHER)
|
||||
player->ActivateTaxiPathTo(TAXI_PATH_ID);
|
||||
|
||||
if (quest->GetQuestId() == QUEST_ZUHULED_THE_WACK)
|
||||
creature->SummonCreature(NPC_ZUHULED_THE_WACKED, -4204.94f, 316.397f, 122.508f, 1.309f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 300000);
|
||||
if (quest->GetQuestId() == QUEST_ZUHULED_THE_WACK)
|
||||
creature->SummonCreature(NPC_ZUHULED_THE_WACKED, -4204.94f, 316.397f, 122.508f, 1.309f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 300000);
|
||||
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
/*####
|
||||
@@ -941,7 +943,7 @@ public:
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
//don't always use
|
||||
if (rand()%5)
|
||||
if (rand() % 5)
|
||||
return;
|
||||
|
||||
//only aggro text if not player
|
||||
@@ -997,7 +999,7 @@ struct TorlothCinematic
|
||||
};
|
||||
|
||||
// Creature 0 - Torloth, 1 - Illidan
|
||||
static TorlothCinematic TorlothAnim[]=
|
||||
static TorlothCinematic TorlothAnim[] =
|
||||
{
|
||||
{0, 2000},
|
||||
{1, 7000},
|
||||
@@ -1014,7 +1016,7 @@ struct Location
|
||||
};
|
||||
|
||||
//Cordinates for Spawns
|
||||
static Location SpawnLocation[]=
|
||||
static Location SpawnLocation[] =
|
||||
{
|
||||
//Cords used for:
|
||||
{-4615.8556f, 1342.2532f, 139.9f, 1.612f}, //Illidari Soldier
|
||||
@@ -1041,7 +1043,7 @@ struct WaveData
|
||||
uint32 CreatureId, SpawnTimer, YellTimer;
|
||||
};
|
||||
|
||||
static WaveData WavesInfo[]=
|
||||
static WaveData WavesInfo[] =
|
||||
{
|
||||
{9, 0, 22075, 10000, 7000}, //Illidari Soldier
|
||||
{2, 9, 22074, 10000, 7000}, //Illidari Mind Breaker
|
||||
@@ -1051,10 +1053,10 @@ static WaveData WavesInfo[]=
|
||||
|
||||
struct SpawnSpells
|
||||
{
|
||||
uint32 Timer1, Timer2, SpellId;
|
||||
uint32 Timer1, Timer2, SpellId;
|
||||
};
|
||||
|
||||
static SpawnSpells SpawnCast[]=
|
||||
static SpawnSpells SpawnCast[] =
|
||||
{
|
||||
{10000, 15000, 35871}, // Illidari Soldier Cast - Spellbreaker
|
||||
{10000, 10000, 38985}, // Illidari Mind Breake Cast - Focused Bursts
|
||||
@@ -1125,31 +1127,31 @@ public:
|
||||
|
||||
switch (AnimationCount)
|
||||
{
|
||||
case 0:
|
||||
me->SetUInt32Value(UNIT_FIELD_BYTES_1, 8);
|
||||
break;
|
||||
case 3:
|
||||
me->RemoveFlag(UNIT_FIELD_BYTES_1, 8);
|
||||
break;
|
||||
case 5:
|
||||
if (Player* AggroTarget = ObjectAccessor::GetPlayer(*me, AggroTargetGUID))
|
||||
{
|
||||
me->SetTarget(AggroTarget->GetGUID());
|
||||
me->AddThreat(AggroTarget, 1);
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_POINT);
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
if (Player* AggroTarget = ObjectAccessor::GetPlayer(*me, AggroTargetGUID))
|
||||
{
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->ClearUnitState(UNIT_STATE_ROOT);
|
||||
case 0:
|
||||
me->SetUInt32Value(UNIT_FIELD_BYTES_1, 8);
|
||||
break;
|
||||
case 3:
|
||||
me->RemoveFlag(UNIT_FIELD_BYTES_1, 8);
|
||||
break;
|
||||
case 5:
|
||||
if (Player* AggroTarget = ObjectAccessor::GetPlayer(*me, AggroTargetGUID))
|
||||
{
|
||||
me->SetTarget(AggroTarget->GetGUID());
|
||||
me->AddThreat(AggroTarget, 1);
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_POINT);
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
if (Player* AggroTarget = ObjectAccessor::GetPlayer(*me, AggroTargetGUID))
|
||||
{
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->ClearUnitState(UNIT_STATE_ROOT);
|
||||
|
||||
float x, y, z;
|
||||
AggroTarget->GetPosition(x, y, z);
|
||||
me->GetMotionMaster()->MovePoint(0, x, y, z);
|
||||
}
|
||||
break;
|
||||
float x, y, z;
|
||||
AggroTarget->GetPosition(x, y, z);
|
||||
me->GetMotionMaster()->MovePoint(0, x, y, z);
|
||||
}
|
||||
break;
|
||||
}
|
||||
++AnimationCount;
|
||||
}
|
||||
@@ -1161,13 +1163,15 @@ public:
|
||||
if (AnimationTimer <= diff)
|
||||
{
|
||||
HandleAnimation();
|
||||
} else AnimationTimer -= diff;
|
||||
}
|
||||
else AnimationTimer -= diff;
|
||||
}
|
||||
|
||||
if (AnimationCount < 6)
|
||||
{
|
||||
me->CombatStop();
|
||||
} else if (!Timers)
|
||||
}
|
||||
else if (!Timers)
|
||||
{
|
||||
SpellTimer1 = SpawnCast[6].Timer1;
|
||||
SpellTimer2 = SpawnCast[7].Timer1;
|
||||
@@ -1180,20 +1184,23 @@ public:
|
||||
if (SpellTimer1 <= diff)
|
||||
{
|
||||
DoCastVictim(SpawnCast[6].SpellId);//Cleave
|
||||
SpellTimer1 = SpawnCast[6].Timer2 + (rand()%10 * 1000);
|
||||
} else SpellTimer1 -= diff;
|
||||
SpellTimer1 = SpawnCast[6].Timer2 + (rand() % 10 * 1000);
|
||||
}
|
||||
else SpellTimer1 -= diff;
|
||||
|
||||
if (SpellTimer2 <= diff)
|
||||
{
|
||||
DoCastVictim(SpawnCast[7].SpellId);//Shadowfury
|
||||
SpellTimer2 = SpawnCast[7].Timer2 + (rand()%5 * 1000);
|
||||
} else SpellTimer2 -= diff;
|
||||
SpellTimer2 = SpawnCast[7].Timer2 + (rand() % 5 * 1000);
|
||||
}
|
||||
else SpellTimer2 -= diff;
|
||||
|
||||
if (SpellTimer3 <= diff)
|
||||
{
|
||||
DoCast(me, SpawnCast[8].SpellId);
|
||||
SpellTimer3 = SpawnCast[8].Timer2 + (rand()%7 * 1000);//Spell Reflection
|
||||
} else SpellTimer3 -= diff;
|
||||
SpellTimer3 = SpawnCast[8].Timer2 + (rand() % 7 * 1000); //Spell Reflection
|
||||
}
|
||||
else SpellTimer3 -= diff;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
@@ -1292,7 +1299,7 @@ public:
|
||||
|
||||
Group::MemberSlotList const& members = EventGroup->GetMemberSlots();
|
||||
|
||||
for (Group::member_citerator itr = members.begin(); itr!= members.end(); ++itr)
|
||||
for (Group::member_citerator itr = members.begin(); itr != members.end(); ++itr)
|
||||
{
|
||||
Player* GroupMember = ObjectAccessor::GetPlayer(*me, itr->guid);
|
||||
if (!GroupMember)
|
||||
@@ -1315,7 +1322,7 @@ public:
|
||||
|
||||
if (GroupMemberCount == DeadMemberCount)
|
||||
{
|
||||
for (Group::member_citerator itr = members.begin(); itr!= members.end(); ++itr)
|
||||
for (Group::member_citerator itr = members.begin(); itr != members.end(); ++itr)
|
||||
{
|
||||
if (Player* groupMember = ObjectAccessor::GetPlayer(*me, itr->guid))
|
||||
if (groupMember->GetQuestStatus(QUEST_BATTLE_OF_THE_CRIMSON_WATCH) == QUEST_STATUS_INCOMPLETE)
|
||||
@@ -1323,7 +1330,8 @@ public:
|
||||
}
|
||||
Failed = true;
|
||||
}
|
||||
} else if (player->isDead() || !player->IsWithinDistInMap(me, EVENT_AREA_RADIUS))
|
||||
}
|
||||
else if (player->isDead() || !player->IsWithinDistInMap(me, EVENT_AREA_RADIUS))
|
||||
{
|
||||
player->FailQuest(QUEST_BATTLE_OF_THE_CRIMSON_WATCH);
|
||||
Failed = true;
|
||||
@@ -1413,18 +1421,18 @@ public:
|
||||
{
|
||||
if (me->GetEntry() == 22075)//Illidari Soldier
|
||||
{
|
||||
SpellTimer1 = SpawnCast[0].Timer1 + (rand()%4 * 1000);
|
||||
SpellTimer1 = SpawnCast[0].Timer1 + (rand() % 4 * 1000);
|
||||
}
|
||||
if (me->GetEntry() == 22074)//Illidari Mind Breaker
|
||||
{
|
||||
SpellTimer1 = SpawnCast[1].Timer1 + (rand()%10 * 1000);
|
||||
SpellTimer2 = SpawnCast[2].Timer1 + (rand()%4 * 1000);
|
||||
SpellTimer3 = SpawnCast[3].Timer1 + (rand()%4 * 1000);
|
||||
SpellTimer1 = SpawnCast[1].Timer1 + (rand() % 10 * 1000);
|
||||
SpellTimer2 = SpawnCast[2].Timer1 + (rand() % 4 * 1000);
|
||||
SpellTimer3 = SpawnCast[3].Timer1 + (rand() % 4 * 1000);
|
||||
}
|
||||
if (me->GetEntry() == 19797)// Illidari Highlord
|
||||
{
|
||||
SpellTimer1 = SpawnCast[4].Timer1 + (rand()%4 * 1000);
|
||||
SpellTimer2 = SpawnCast[5].Timer1 + (rand()%4 * 1000);
|
||||
SpellTimer1 = SpawnCast[4].Timer1 + (rand() % 4 * 1000);
|
||||
SpellTimer2 = SpawnCast[5].Timer1 + (rand() % 4 * 1000);
|
||||
}
|
||||
Timers = true;
|
||||
}
|
||||
@@ -1434,8 +1442,9 @@ public:
|
||||
if (SpellTimer1 <= diff)
|
||||
{
|
||||
DoCastVictim(SpawnCast[0].SpellId);//Spellbreaker
|
||||
SpellTimer1 = SpawnCast[0].Timer2 + (rand()%5 * 1000);
|
||||
} else SpellTimer1 -= diff;
|
||||
SpellTimer1 = SpawnCast[0].Timer2 + (rand() % 5 * 1000);
|
||||
}
|
||||
else SpellTimer1 -= diff;
|
||||
}
|
||||
//Illidari Mind Breaker
|
||||
if (me->GetEntry() == 22074)
|
||||
@@ -1447,22 +1456,26 @@ public:
|
||||
if (target->GetTypeId() == TYPEID_PLAYER)
|
||||
{
|
||||
DoCast(target, SpawnCast[1].SpellId); //Focused Bursts
|
||||
SpellTimer1 = SpawnCast[1].Timer2 + (rand()%5 * 1000);
|
||||
} else SpellTimer1 = 2000;
|
||||
SpellTimer1 = SpawnCast[1].Timer2 + (rand() % 5 * 1000);
|
||||
}
|
||||
else SpellTimer1 = 2000;
|
||||
}
|
||||
} else SpellTimer1 -= diff;
|
||||
}
|
||||
else SpellTimer1 -= diff;
|
||||
|
||||
if (SpellTimer2 <= diff)
|
||||
{
|
||||
DoCastVictim(SpawnCast[2].SpellId);//Psychic Scream
|
||||
SpellTimer2 = SpawnCast[2].Timer2 + (rand()%13 * 1000);
|
||||
} else SpellTimer2 -= diff;
|
||||
SpellTimer2 = SpawnCast[2].Timer2 + (rand() % 13 * 1000);
|
||||
}
|
||||
else SpellTimer2 -= diff;
|
||||
|
||||
if (SpellTimer3 <= diff)
|
||||
{
|
||||
DoCastVictim(SpawnCast[3].SpellId);//Mind Blast
|
||||
SpellTimer3 = SpawnCast[3].Timer2 + (rand()%8 * 1000);
|
||||
} else SpellTimer3 -= diff;
|
||||
SpellTimer3 = SpawnCast[3].Timer2 + (rand() % 8 * 1000);
|
||||
}
|
||||
else SpellTimer3 -= diff;
|
||||
}
|
||||
//Illidari Highlord
|
||||
if (me->GetEntry() == 19797)
|
||||
@@ -1470,14 +1483,16 @@ public:
|
||||
if (SpellTimer1 <= diff)
|
||||
{
|
||||
DoCastVictim(SpawnCast[4].SpellId);//Curse Of Flames
|
||||
SpellTimer1 = SpawnCast[4].Timer2 + (rand()%10 * 1000);
|
||||
} else SpellTimer1 -= diff;
|
||||
SpellTimer1 = SpawnCast[4].Timer2 + (rand() % 10 * 1000);
|
||||
}
|
||||
else SpellTimer1 -= diff;
|
||||
|
||||
if (SpellTimer2 <= diff)
|
||||
{
|
||||
DoCastVictim(SpawnCast[5].SpellId);//Flamestrike
|
||||
SpellTimer2 = SpawnCast[5].Timer2 + (rand()%7 * 13000);
|
||||
} else SpellTimer2 -= diff;
|
||||
SpellTimer2 = SpawnCast[5].Timer2 + (rand() % 7 * 13000);
|
||||
}
|
||||
else SpellTimer2 -= diff;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
@@ -1506,7 +1521,7 @@ void npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::SummonNextWave()
|
||||
{
|
||||
if (WaveCount == 0)//1 Wave
|
||||
{
|
||||
if (rand()%3 == 1 && FelguardCount<2)
|
||||
if (rand() % 3 == 1 && FelguardCount < 2)
|
||||
{
|
||||
Spawn->SetDisplayId(18654);
|
||||
++FelguardCount;
|
||||
@@ -1516,7 +1531,7 @@ void npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::SummonNextWave()
|
||||
Spawn->SetDisplayId(19991);
|
||||
++DreadlordCount;
|
||||
}
|
||||
else if (FelguardCount<2)
|
||||
else if (FelguardCount < 2)
|
||||
{
|
||||
Spawn->SetDisplayId(18654);
|
||||
++FelguardCount;
|
||||
@@ -1569,10 +1584,10 @@ public:
|
||||
{
|
||||
CAST_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, Illidan->AI())->PlayerGUID = player->GetGUID();
|
||||
CAST_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, Illidan->AI())->LiveCount = 0;
|
||||
CAST_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, Illidan->AI())->EventStarted=true;
|
||||
CAST_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, Illidan->AI())->EventStarted = true;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1582,7 +1597,7 @@ public:
|
||||
|
||||
enum Enraged_Dpirits
|
||||
{
|
||||
// QUESTS
|
||||
// QUESTS
|
||||
QUEST_ENRAGED_SPIRITS_FIRE_EARTH = 10458,
|
||||
QUEST_ENRAGED_SPIRITS_AIR = 10481,
|
||||
QUEST_ENRAGED_SPIRITS_WATER = 10480,
|
||||
@@ -1630,7 +1645,7 @@ public:
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new npc_enraged_spiritAI(creature);
|
||||
return new npc_enraged_spiritAI(creature);
|
||||
}
|
||||
|
||||
struct npc_enraged_spiritAI : public ScriptedAI
|
||||
@@ -1651,22 +1666,22 @@ public:
|
||||
|
||||
switch (me->GetEntry())
|
||||
{
|
||||
case NPC_ENRAGED_FIRE_SPIRIT:
|
||||
case NPC_ENRAGED_FIRE_SPIRIT:
|
||||
entry = NPC_FIERY_SOUL;
|
||||
//credit = SPELL_FIERY_SOUL_CAPTURED_CREDIT;
|
||||
credit = NPC_CREDIT_FIRE;
|
||||
break;
|
||||
case NPC_ENRAGED_EARTH_SPIRIT:
|
||||
case NPC_ENRAGED_EARTH_SPIRIT:
|
||||
entry = NPC_EARTHEN_SOUL;
|
||||
//credit = SPELL_EARTHEN_SOUL_CAPTURED_CREDIT;
|
||||
credit = NPC_CREDIT_EARTH;
|
||||
break;
|
||||
case NPC_ENRAGED_AIR_SPIRIT:
|
||||
case NPC_ENRAGED_AIR_SPIRIT:
|
||||
entry = NPC_ENRAGED_AIRY_SOUL;
|
||||
//credit = SPELL_AIRY_SOUL_CAPTURED_CREDIT;
|
||||
credit = NPC_CREDIT_AIR;
|
||||
break;
|
||||
case NPC_ENRAGED_WATER_SPIRIT:
|
||||
case NPC_ENRAGED_WATER_SPIRIT:
|
||||
entry = NPC_ENRAGED_WATERY_SOUL;
|
||||
//credit = SPELL_WATERY_SOUL_CAPTURED_CREDIT;
|
||||
credit = NPC_CREDIT_WATER;
|
||||
@@ -1685,17 +1700,17 @@ public:
|
||||
// FIND TOTEM, PROCESS QUEST
|
||||
if (Summoned)
|
||||
{
|
||||
totemOspirits = me->FindNearestCreature(ENTRY_TOTEM_OF_SPIRITS, RADIUS_TOTEM_OF_SPIRITS);
|
||||
if (totemOspirits)
|
||||
{
|
||||
Summoned->setFaction(FACTION_ENRAGED_SOUL_FRIENDLY);
|
||||
Summoned->GetMotionMaster()->MovePoint(0, totemOspirits->GetPositionX(), totemOspirits->GetPositionY(), Summoned->GetPositionZ());
|
||||
totemOspirits = me->FindNearestCreature(ENTRY_TOTEM_OF_SPIRITS, RADIUS_TOTEM_OF_SPIRITS);
|
||||
if (totemOspirits)
|
||||
{
|
||||
Summoned->setFaction(FACTION_ENRAGED_SOUL_FRIENDLY);
|
||||
Summoned->GetMotionMaster()->MovePoint(0, totemOspirits->GetPositionX(), totemOspirits->GetPositionY(), Summoned->GetPositionZ());
|
||||
|
||||
if (Unit* owner = totemOspirits->GetOwner())
|
||||
if (Player* player = owner->ToPlayer())
|
||||
player->KilledMonsterCredit(credit, 0);
|
||||
DoCast(totemOspirits, SPELL_SOUL_CAPTURED);
|
||||
}
|
||||
if (Unit* owner = totemOspirits->GetOwner())
|
||||
if (Player* player = owner->ToPlayer())
|
||||
player->KilledMonsterCredit(credit, 0);
|
||||
DoCast(totemOspirits, SPELL_SOUL_CAPTURED);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -1770,7 +1785,7 @@ public:
|
||||
// Respawn the tuber
|
||||
if (tuberGUID)
|
||||
if (GameObject* tuber = ObjectAccessor::GetGameObject(*me, tuberGUID))
|
||||
// @Workaround: find how to properly respawn the GO
|
||||
// @Workaround: find how to properly respawn the GO
|
||||
tuber->SetPhaseMask(1, true);
|
||||
|
||||
Reset();
|
||||
|
||||
@@ -48,7 +48,7 @@ public:
|
||||
bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
|
||||
{
|
||||
ClearGossipMenuFor(player);
|
||||
if (action == GOSSIP_ACTION_INFO_DEF+1)
|
||||
if (action == GOSSIP_ACTION_INFO_DEF + 1)
|
||||
{
|
||||
CloseGossipMenuFor(player);
|
||||
creature->setFaction(FACTION_HOSTILE_RD);
|
||||
@@ -60,7 +60,7 @@ public:
|
||||
bool OnGossipHello(Player* player, Creature* creature) override
|
||||
{
|
||||
if (player->GetQuestStatus(QUEST_CRACK_SKULLS) == QUEST_STATUS_INCOMPLETE)
|
||||
AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_RALIQ, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
|
||||
AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_RALIQ, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
||||
|
||||
SendGossipMenuFor(player, 9440, creature->GetGUID());
|
||||
return true;
|
||||
@@ -96,7 +96,8 @@ public:
|
||||
{
|
||||
DoCastVictim(SPELL_UPPERCUT);
|
||||
Uppercut_Timer = 15000;
|
||||
} else Uppercut_Timer -= diff;
|
||||
}
|
||||
else Uppercut_Timer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
@@ -159,7 +160,7 @@ public:
|
||||
me->RestoreFaction();
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* done_by, uint32 &damage, DamageEffectType, SpellSchoolMask) override
|
||||
void DamageTaken(Unit* done_by, uint32& damage, DamageEffectType, SpellSchoolMask) override
|
||||
{
|
||||
// xinef: some corrections
|
||||
if (done_by)
|
||||
@@ -181,7 +182,8 @@ public:
|
||||
{
|
||||
DoCastVictim(SPELL_MAGNETIC_PULL);
|
||||
MagneticPull_Timer = 15000;
|
||||
} else MagneticPull_Timer -= diff;
|
||||
}
|
||||
else MagneticPull_Timer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
@@ -261,7 +263,7 @@ public:
|
||||
bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) override
|
||||
{
|
||||
ClearGossipMenuFor(player);
|
||||
if (action == GOSSIP_ACTION_INFO_DEF+1)
|
||||
if (action == GOSSIP_ACTION_INFO_DEF + 1)
|
||||
player->CastSpell(player, 37778, false);
|
||||
|
||||
return true;
|
||||
@@ -270,7 +272,7 @@ public:
|
||||
bool OnGossipHello(Player* player, Creature* creature) override
|
||||
{
|
||||
if (player->GetReputationRank(989) >= REP_REVERED)
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HZ, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HZ, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
||||
|
||||
SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
|
||||
|
||||
@@ -444,9 +446,9 @@ public:
|
||||
bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
|
||||
{
|
||||
ClearGossipMenuFor(player);
|
||||
if (action == GOSSIP_ACTION_INFO_DEF+1)
|
||||
if (action == GOSSIP_ACTION_INFO_DEF + 1)
|
||||
SendGossipMenuFor(player, 9458, creature->GetGUID());
|
||||
else if (action == GOSSIP_ACTION_INFO_DEF+2)
|
||||
else if (action == GOSSIP_ACTION_INFO_DEF + 2)
|
||||
SendGossipMenuFor(player, 9459, creature->GetGUID());
|
||||
|
||||
return true;
|
||||
@@ -457,8 +459,8 @@ public:
|
||||
if (creature->IsQuestGiver())
|
||||
player->PrepareQuestMenu(creature->GetGUID());
|
||||
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, ISANAH_GOSSIP_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, ISANAH_GOSSIP_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, ISANAH_GOSSIP_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, ISANAH_GOSSIP_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
|
||||
|
||||
SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
|
||||
|
||||
|
||||
@@ -43,91 +43,91 @@ enum fumping
|
||||
|
||||
class spell_q10930_big_bone_worm : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_q10930_big_bone_worm() : SpellScriptLoader("spell_q10930_big_bone_worm") { }
|
||||
public:
|
||||
spell_q10930_big_bone_worm() : SpellScriptLoader("spell_q10930_big_bone_worm") { }
|
||||
|
||||
class spell_q10930_big_bone_worm_SpellScript : public SpellScript
|
||||
class spell_q10930_big_bone_worm_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_q10930_big_bone_worm_SpellScript);
|
||||
|
||||
void SetDest(SpellDestination& dest)
|
||||
{
|
||||
PrepareSpellScript(spell_q10930_big_bone_worm_SpellScript);
|
||||
|
||||
void SetDest(SpellDestination& dest)
|
||||
{
|
||||
Position const offset = { 0.5f, 0.5f, 5.0f, 0.0f };
|
||||
dest.RelocateOffset(offset);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_q10930_big_bone_worm_SpellScript::SetDest, EFFECT_1, TARGET_DEST_CASTER);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_q10930_big_bone_worm_SpellScript();
|
||||
Position const offset = { 0.5f, 0.5f, 5.0f, 0.0f };
|
||||
dest.RelocateOffset(offset);
|
||||
}
|
||||
|
||||
class spell_q10930_big_bone_worm_AuraScript : public AuraScript
|
||||
void Register()
|
||||
{
|
||||
PrepareAuraScript(spell_q10930_big_bone_worm_AuraScript);
|
||||
|
||||
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
|
||||
return;
|
||||
|
||||
GetUnitOwner()->CastSpell(GetUnitOwner(), RAND(SPELL_SUMMON_HAISHULUD, SPELL_SUMMON_MATURE_BONE_SIFTER1, SPELL_SUMMON_MATURE_BONE_SIFTER3), true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectRemove += AuraEffectRemoveFn(spell_q10930_big_bone_worm_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_q10930_big_bone_worm_AuraScript();
|
||||
OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_q10930_big_bone_worm_SpellScript::SetDest, EFFECT_1, TARGET_DEST_CASTER);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_q10930_big_bone_worm_SpellScript();
|
||||
}
|
||||
|
||||
class spell_q10930_big_bone_worm_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_q10930_big_bone_worm_AuraScript);
|
||||
|
||||
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
|
||||
return;
|
||||
|
||||
GetUnitOwner()->CastSpell(GetUnitOwner(), RAND(SPELL_SUMMON_HAISHULUD, SPELL_SUMMON_MATURE_BONE_SIFTER1, SPELL_SUMMON_MATURE_BONE_SIFTER3), true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectRemove += AuraEffectRemoveFn(spell_q10930_big_bone_worm_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_q10930_big_bone_worm_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_q10929_fumping : SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_q10929_fumping() : SpellScriptLoader("spell_q10929_fumping") { }
|
||||
public:
|
||||
spell_q10929_fumping() : SpellScriptLoader("spell_q10929_fumping") { }
|
||||
|
||||
class spell_q10929_fumping_SpellScript : public SpellScript
|
||||
class spell_q10929_fumping_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_q10929_fumping_SpellScript);
|
||||
|
||||
void SetDest(SpellDestination& dest)
|
||||
{
|
||||
PrepareSpellScript(spell_q10929_fumping_SpellScript);
|
||||
|
||||
void SetDest(SpellDestination& dest)
|
||||
{
|
||||
Position const offset = { 0.5f, 0.5f, 5.0f, 0.0f };
|
||||
dest.RelocateOffset(offset);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_q10929_fumping_SpellScript::SetDest, EFFECT_1, TARGET_DEST_CASTER);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_q10929_fumping_SpellScript();
|
||||
Position const offset = { 0.5f, 0.5f, 5.0f, 0.0f };
|
||||
dest.RelocateOffset(offset);
|
||||
}
|
||||
|
||||
class spell_q10929_fumping_AuraScript : public AuraScript
|
||||
void Register()
|
||||
{
|
||||
PrepareAuraScript(spell_q10929_fumping_AuraScript);
|
||||
OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_q10929_fumping_SpellScript::SetDest, EFFECT_1, TARGET_DEST_CASTER);
|
||||
}
|
||||
};
|
||||
|
||||
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
|
||||
return;
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_q10929_fumping_SpellScript();
|
||||
}
|
||||
|
||||
GetUnitOwner()->CastSpell(GetUnitOwner(), RAND(SPELL_SUMMON_SAND_GNOME1, SPELL_SUMMON_SAND_GNOME3, SPELL_SUMMON_MATURE_BONE_SIFTER1, SPELL_SUMMON_MATURE_BONE_SIFTER3), true);
|
||||
}
|
||||
class spell_q10929_fumping_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_q10929_fumping_AuraScript);
|
||||
|
||||
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
|
||||
return;
|
||||
|
||||
GetUnitOwner()->CastSpell(GetUnitOwner(), RAND(SPELL_SUMMON_SAND_GNOME1, SPELL_SUMMON_SAND_GNOME3, SPELL_SUMMON_MATURE_BONE_SIFTER1, SPELL_SUMMON_MATURE_BONE_SIFTER3), true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
@@ -143,23 +143,23 @@ class spell_q10929_fumping : SpellScriptLoader
|
||||
|
||||
class npc_greatfather_aldrimus : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_greatfather_aldrimus() : CreatureScript("npc_greatfather_aldrimus") { }
|
||||
public:
|
||||
npc_greatfather_aldrimus() : CreatureScript("npc_greatfather_aldrimus") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new npc_greatfather_aldrimusAI(creature);
|
||||
}
|
||||
|
||||
struct npc_greatfather_aldrimusAI : public ScriptedAI
|
||||
{
|
||||
npc_greatfather_aldrimusAI(Creature* c) : ScriptedAI(c) {}
|
||||
|
||||
bool CanBeSeen(Player const* player)
|
||||
{
|
||||
return new npc_greatfather_aldrimusAI(creature);
|
||||
return player->GetQuestStatus(10253) == QUEST_STATUS_REWARDED;
|
||||
}
|
||||
|
||||
struct npc_greatfather_aldrimusAI : public ScriptedAI
|
||||
{
|
||||
npc_greatfather_aldrimusAI(Creature* c) : ScriptedAI(c) {}
|
||||
|
||||
bool CanBeSeen(Player const* player)
|
||||
{
|
||||
return player->GetQuestStatus(10253) == QUEST_STATUS_REWARDED;
|
||||
}
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
enum q10036Torgos
|
||||
@@ -169,29 +169,29 @@ enum q10036Torgos
|
||||
|
||||
class spell_q10036_torgos : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_q10036_torgos() : SpellScriptLoader("spell_q10036_torgos") { }
|
||||
public:
|
||||
spell_q10036_torgos() : SpellScriptLoader("spell_q10036_torgos") { }
|
||||
|
||||
class spell_q10036_torgos_SpellScript : public SpellScript
|
||||
class spell_q10036_torgos_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_q10036_torgos_SpellScript);
|
||||
|
||||
void HandleSendEvent(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
PrepareSpellScript(spell_q10036_torgos_SpellScript);
|
||||
|
||||
void HandleSendEvent(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (Creature* torgos = GetCaster()->FindNearestCreature(NPC_TORGOS, 100.0f, true))
|
||||
torgos->GetAI()->AttackStart(GetCaster());
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectLaunch += SpellEffectFn(spell_q10036_torgos_SpellScript::HandleSendEvent, EFFECT_0, SPELL_EFFECT_SEND_EVENT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_q10036_torgos_SpellScript();
|
||||
if (Creature* torgos = GetCaster()->FindNearestCreature(NPC_TORGOS, 100.0f, true))
|
||||
torgos->GetAI()->AttackStart(GetCaster());
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectLaunch += SpellEffectFn(spell_q10036_torgos_SpellScript::HandleSendEvent, EFFECT_0, SPELL_EFFECT_SEND_EVENT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_q10036_torgos_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
enum eQ10923EvilDrawsNear
|
||||
@@ -205,113 +205,113 @@ enum eQ10923EvilDrawsNear
|
||||
|
||||
class spell_q10923_evil_draws_near_summon : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_q10923_evil_draws_near_summon() : SpellScriptLoader("spell_q10923_evil_draws_near_summon") { }
|
||||
public:
|
||||
spell_q10923_evil_draws_near_summon() : SpellScriptLoader("spell_q10923_evil_draws_near_summon") { }
|
||||
|
||||
class spell_q10923_evil_draws_near_summon_SpellScript : public SpellScript
|
||||
class spell_q10923_evil_draws_near_summon_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_q10923_evil_draws_near_summon_SpellScript);
|
||||
|
||||
void HandleSendEvent(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
PrepareSpellScript(spell_q10923_evil_draws_near_summon_SpellScript);
|
||||
|
||||
void HandleSendEvent(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (Creature* auchenai = GetCaster()->FindNearestCreature(NPC_AUCHENAI_DEATH_SPIRIT, 10.0f, true))
|
||||
auchenai->CastSpell(auchenai, SPELL_DUSTIN_UNDEAD_DRAGON_VISUAL_AURA, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectLaunch += SpellEffectFn(spell_q10923_evil_draws_near_summon_SpellScript::HandleSendEvent, EFFECT_0, SPELL_EFFECT_SEND_EVENT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_q10923_evil_draws_near_summon_SpellScript();
|
||||
if (Creature* auchenai = GetCaster()->FindNearestCreature(NPC_AUCHENAI_DEATH_SPIRIT, 10.0f, true))
|
||||
auchenai->CastSpell(auchenai, SPELL_DUSTIN_UNDEAD_DRAGON_VISUAL_AURA, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectLaunch += SpellEffectFn(spell_q10923_evil_draws_near_summon_SpellScript::HandleSendEvent, EFFECT_0, SPELL_EFFECT_SEND_EVENT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_q10923_evil_draws_near_summon_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_q10923_evil_draws_near_periodic : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_q10923_evil_draws_near_periodic() : SpellScriptLoader("spell_q10923_evil_draws_near_periodic") { }
|
||||
public:
|
||||
spell_q10923_evil_draws_near_periodic() : SpellScriptLoader("spell_q10923_evil_draws_near_periodic") { }
|
||||
|
||||
class spell_q10923_evil_draws_near_periodic_AuraScript : public AuraScript
|
||||
class spell_q10923_evil_draws_near_periodic_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_q10923_evil_draws_near_periodic_AuraScript);
|
||||
|
||||
void HandlePeriodic(AuraEffect const* /*aurEff*/)
|
||||
{
|
||||
PrepareAuraScript(spell_q10923_evil_draws_near_periodic_AuraScript);
|
||||
|
||||
void HandlePeriodic(AuraEffect const* /*aurEff*/)
|
||||
{
|
||||
PreventDefaultAction();
|
||||
GetUnitOwner()->CastSpell(GetUnitOwner(), RAND(SPELL_DUSTIN_UNDEAD_DRAGON_VISUAL1, SPELL_DUSTIN_UNDEAD_DRAGON_VISUAL2), true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_q10923_evil_draws_near_periodic_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_q10923_evil_draws_near_periodic_AuraScript();
|
||||
PreventDefaultAction();
|
||||
GetUnitOwner()->CastSpell(GetUnitOwner(), RAND(SPELL_DUSTIN_UNDEAD_DRAGON_VISUAL1, SPELL_DUSTIN_UNDEAD_DRAGON_VISUAL2), true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_q10923_evil_draws_near_periodic_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_q10923_evil_draws_near_periodic_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_q10923_evil_draws_near_visual : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_q10923_evil_draws_near_visual() : SpellScriptLoader("spell_q10923_evil_draws_near_visual") { }
|
||||
public:
|
||||
spell_q10923_evil_draws_near_visual() : SpellScriptLoader("spell_q10923_evil_draws_near_visual") { }
|
||||
|
||||
class spell_q10923_evil_draws_near_visual_SpellScript : public SpellScript
|
||||
class spell_q10923_evil_draws_near_visual_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_q10923_evil_draws_near_visual_SpellScript);
|
||||
|
||||
void SetDest(SpellDestination& dest)
|
||||
{
|
||||
PrepareSpellScript(spell_q10923_evil_draws_near_visual_SpellScript);
|
||||
|
||||
void SetDest(SpellDestination& dest)
|
||||
{
|
||||
// Adjust effect summon position
|
||||
Position const offset = { 0.0f, 0.0f, 20.0f, 0.0f };
|
||||
dest.RelocateOffset(offset);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_q10923_evil_draws_near_visual_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER_RADIUS);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_q10923_evil_draws_near_visual_SpellScript();
|
||||
// Adjust effect summon position
|
||||
Position const offset = { 0.0f, 0.0f, 20.0f, 0.0f };
|
||||
dest.RelocateOffset(offset);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_q10923_evil_draws_near_visual_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER_RADIUS);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_q10923_evil_draws_near_visual_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_q10898_skywing : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_q10898_skywing() : SpellScriptLoader("spell_q10898_skywing") { }
|
||||
public:
|
||||
spell_q10898_skywing() : SpellScriptLoader("spell_q10898_skywing") { }
|
||||
|
||||
class spell_q10898_skywing_SpellScript : public SpellScript
|
||||
class spell_q10898_skywing_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_q10898_skywing_SpellScript);
|
||||
|
||||
void SetDest(SpellDestination& dest)
|
||||
{
|
||||
PrepareSpellScript(spell_q10898_skywing_SpellScript);
|
||||
|
||||
void SetDest(SpellDestination& dest)
|
||||
{
|
||||
// Adjust effect summon position
|
||||
Position const offset = { frand(-7.0f, 7.0f), frand(-7.0f, 7.0f), 11.0f, 0.0f };
|
||||
dest.Relocate(*GetCaster());
|
||||
dest.RelocateOffset(offset);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_q10898_skywing_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER_RANDOM);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_q10898_skywing_SpellScript();
|
||||
// Adjust effect summon position
|
||||
Position const offset = { frand(-7.0f, 7.0f), frand(-7.0f, 7.0f), 11.0f, 0.0f };
|
||||
dest.Relocate(*GetCaster());
|
||||
dest.RelocateOffset(offset);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_q10898_skywing_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER_RANDOM);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_q10898_skywing_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -371,7 +371,7 @@ public:
|
||||
UnkorUnfriendly_Timer = 60000;
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* done_by, uint32 &damage, DamageEffectType, SpellSchoolMask)
|
||||
void DamageTaken(Unit* done_by, uint32& damage, DamageEffectType, SpellSchoolMask)
|
||||
{
|
||||
if (!done_by)
|
||||
return;
|
||||
@@ -385,8 +385,8 @@ public:
|
||||
{
|
||||
Player* groupie = itr->GetSource();
|
||||
if (groupie && groupie->IsInMap(player) &&
|
||||
groupie->GetQuestStatus(QUEST_DONTKILLTHEFATONE) == QUEST_STATUS_INCOMPLETE &&
|
||||
groupie->GetReqKillOrCastCurrentCount(QUEST_DONTKILLTHEFATONE, 18260) == 10)
|
||||
groupie->GetQuestStatus(QUEST_DONTKILLTHEFATONE) == QUEST_STATUS_INCOMPLETE &&
|
||||
groupie->GetReqKillOrCastCurrentCount(QUEST_DONTKILLTHEFATONE, 18260) == 10)
|
||||
{
|
||||
groupie->AreaExploredOrEventHappens(QUEST_DONTKILLTHEFATONE);
|
||||
if (!CanDoQuest)
|
||||
@@ -395,7 +395,7 @@ public:
|
||||
}
|
||||
}
|
||||
else if (player->GetQuestStatus(QUEST_DONTKILLTHEFATONE) == QUEST_STATUS_INCOMPLETE &&
|
||||
player->GetReqKillOrCastCurrentCount(QUEST_DONTKILLTHEFATONE, 18260) == 10)
|
||||
player->GetReqKillOrCastCurrentCount(QUEST_DONTKILLTHEFATONE, 18260) == 10)
|
||||
{
|
||||
player->AreaExploredOrEventHappens(QUEST_DONTKILLTHEFATONE);
|
||||
CanDoQuest = true;
|
||||
@@ -418,7 +418,8 @@ public:
|
||||
{
|
||||
EnterEvadeMode();
|
||||
return;
|
||||
} else UnkorUnfriendly_Timer -= diff;
|
||||
}
|
||||
else UnkorUnfriendly_Timer -= diff;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -429,7 +430,8 @@ public:
|
||||
{
|
||||
DoCast(me, SPELL_PULVERIZE);
|
||||
Pulverize_Timer = 9000;
|
||||
} else Pulverize_Timer -= diff;
|
||||
}
|
||||
else Pulverize_Timer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
@@ -457,11 +459,11 @@ public:
|
||||
void Reset() { }
|
||||
void EnterCombat(Unit* /*who*/) { }
|
||||
|
||||
void DamageTaken(Unit* done_by, uint32 &damage, DamageEffectType, SpellSchoolMask)
|
||||
void DamageTaken(Unit* done_by, uint32& damage, DamageEffectType, SpellSchoolMask)
|
||||
{
|
||||
if (done_by && done_by->GetTypeId() == TYPEID_PLAYER)
|
||||
if (me->GetHealth() <= damage)
|
||||
if (rand()%100 < 75)
|
||||
if (rand() % 100 < 75)
|
||||
//Summon Wood Mites
|
||||
DoCast(me, 39130, true);
|
||||
}
|
||||
@@ -489,11 +491,11 @@ public:
|
||||
void Reset() { }
|
||||
void EnterCombat(Unit* /*who*/) { }
|
||||
|
||||
void DamageTaken(Unit* done_by, uint32 &damage, DamageEffectType, SpellSchoolMask)
|
||||
void DamageTaken(Unit* done_by, uint32& damage, DamageEffectType, SpellSchoolMask)
|
||||
{
|
||||
if (done_by && done_by->GetTypeId() == TYPEID_PLAYER)
|
||||
if (me->GetHealth() <= damage)
|
||||
if (rand()%100 < 75)
|
||||
if (rand() % 100 < 75)
|
||||
//Summon Lots of Wood Mights
|
||||
DoCast(me, 39134, true);
|
||||
}
|
||||
@@ -529,10 +531,10 @@ public:
|
||||
ClearGossipMenuFor(player);
|
||||
if (action == GOSSIP_ACTION_INFO_DEF)
|
||||
{
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FLOON2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FLOON2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
||||
SendGossipMenuFor(player, 9443, creature->GetGUID());
|
||||
}
|
||||
if (action == GOSSIP_ACTION_INFO_DEF+1)
|
||||
if (action == GOSSIP_ACTION_INFO_DEF + 1)
|
||||
{
|
||||
CloseGossipMenuFor(player);
|
||||
creature->setFaction(FACTION_HOSTILE_FL);
|
||||
@@ -588,19 +590,22 @@ public:
|
||||
{
|
||||
DoCastVictim(SPELL_SILENCE);
|
||||
Silence_Timer = 30000;
|
||||
} else Silence_Timer -= diff;
|
||||
}
|
||||
else Silence_Timer -= diff;
|
||||
|
||||
if (FrostNova_Timer <= diff)
|
||||
{
|
||||
DoCast(me, SPELL_FROST_NOVA);
|
||||
FrostNova_Timer = 20000;
|
||||
} else FrostNova_Timer -= diff;
|
||||
}
|
||||
else FrostNova_Timer -= diff;
|
||||
|
||||
if (Frostbolt_Timer <= diff)
|
||||
{
|
||||
DoCastVictim(SPELL_FROSTBOLT);
|
||||
Frostbolt_Timer = 5000;
|
||||
} else Frostbolt_Timer -= diff;
|
||||
}
|
||||
else Frostbolt_Timer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
@@ -768,7 +773,9 @@ public:
|
||||
ClearGossipMenuFor(player);
|
||||
switch (sender)
|
||||
{
|
||||
case GOSSIP_SENDER_MAIN: SendActionMenu(player, go, action); break;
|
||||
case GOSSIP_SENDER_MAIN:
|
||||
SendActionMenu(player, go, action);
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -792,16 +799,16 @@ public:
|
||||
switch (action)
|
||||
{
|
||||
case GOSSIP_ACTION_INFO_DEF + 1:
|
||||
player->CastSpell(player, 40642, false);
|
||||
player->CastSpell(player, 40642, false);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 2:
|
||||
player->CastSpell(player, 40640, false);
|
||||
player->CastSpell(player, 40640, false);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 3:
|
||||
player->CastSpell(player, 40632, false);
|
||||
player->CastSpell(player, 40632, false);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 4:
|
||||
player->CastSpell(player, 40644, false);
|
||||
player->CastSpell(player, 40644, false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -59,7 +59,7 @@ public:
|
||||
}
|
||||
else
|
||||
{
|
||||
creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
Creature* cr;
|
||||
if ((cr = creature->SummonCreature(17957, -186, -790, 43.8f, 4.2f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000)))
|
||||
cr->AI()->AttackStart(creature);
|
||||
@@ -96,13 +96,13 @@ public:
|
||||
}
|
||||
|
||||
void EnterCombat(Unit*) override
|
||||
{
|
||||
_spoken = 2;
|
||||
{
|
||||
_spoken = 2;
|
||||
}
|
||||
|
||||
uint32 GetData(uint32) const override
|
||||
{
|
||||
return _spoken == 2;
|
||||
uint32 GetData(uint32) const override
|
||||
{
|
||||
return _spoken == 2;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -149,10 +149,10 @@ public:
|
||||
if (player->GetReputationRank(942) > REP_NEUTRAL)
|
||||
{
|
||||
if (creature->GetEntry() == NPC_ASHYEN)
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BLESS_ASH, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BLESS_ASH, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
||||
|
||||
if (creature->GetEntry() == NPC_KELETH)
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BLESS_KEL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BLESS_KEL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
||||
}
|
||||
SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
|
||||
|
||||
@@ -162,7 +162,7 @@ public:
|
||||
bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
|
||||
{
|
||||
ClearGossipMenuFor(player);
|
||||
if (action == GOSSIP_ACTION_INFO_DEF+1)
|
||||
if (action == GOSSIP_ACTION_INFO_DEF + 1)
|
||||
{
|
||||
creature->setPowerType(POWER_MANA);
|
||||
creature->SetMaxPower(POWER_MANA, 200); //set a "fake" mana value, we can't depend on database doing it in this case
|
||||
@@ -172,7 +172,8 @@ public:
|
||||
{
|
||||
uint32 spell = 0;
|
||||
switch (player->GetReputationRank(942))
|
||||
{ //mark of lore
|
||||
{
|
||||
//mark of lore
|
||||
case REP_FRIENDLY:
|
||||
spell = SPELL_BLESS_ASH_FRI;
|
||||
break;
|
||||
@@ -276,7 +277,8 @@ public:
|
||||
{
|
||||
DoCastVictim(SPELL_LIGHTNING_BOLT);
|
||||
LightningBolt_Timer = 5000;
|
||||
} else LightningBolt_Timer -= diff;
|
||||
}
|
||||
else LightningBolt_Timer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
@@ -346,22 +348,22 @@ public:
|
||||
SendGossipMenuFor(player, 9229, creature->GetGUID());
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 2:
|
||||
{
|
||||
if (!player->HasItemCount(24573))
|
||||
{
|
||||
ItemPosCountVec dest;
|
||||
uint32 itemId = 24573;
|
||||
InventoryResult msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, 1, nullptr);
|
||||
if (msg == EQUIP_ERR_OK)
|
||||
if (!player->HasItemCount(24573))
|
||||
{
|
||||
player->StoreNewItem(dest, itemId, true);
|
||||
ItemPosCountVec dest;
|
||||
uint32 itemId = 24573;
|
||||
InventoryResult msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, 1, nullptr);
|
||||
if (msg == EQUIP_ERR_OK)
|
||||
{
|
||||
player->StoreNewItem(dest, itemId, true);
|
||||
}
|
||||
else
|
||||
player->SendEquipError(msg, nullptr, nullptr, itemId);
|
||||
}
|
||||
else
|
||||
player->SendEquipError(msg, nullptr, nullptr, itemId);
|
||||
SendGossipMenuFor(player, 9231, creature->GetGUID());
|
||||
break;
|
||||
}
|
||||
SendGossipMenuFor(player, 9231, creature->GetGUID());
|
||||
break;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user