converted all tabs to 4 spaces

This commit is contained in:
Yehonal
2016-06-26 19:23:57 +02:00
parent 52f305111c
commit f6eefedcd5
717 changed files with 132388 additions and 132388 deletions

View File

@@ -20,374 +20,374 @@ enum Yells
enum eSpells
{
SPELL_SOULSTORM_CHANNEL_OOC = 69008,
SPELL_SOULSTORM_CHANNEL_OOC = 69008,
SPELL_SHADOW_BOLT = 70043,
SPELL_FEAR = 68950,
SPELL_MAGICS_BANE = 68793,
SPELL_CORRUPT_SOUL = 68839,
SPELL_CONSUME_SOUL = 68861,
//SPELL_CONSUME_SOUL_HEAL = 68858,
SPELL_SHADOW_BOLT = 70043,
SPELL_FEAR = 68950,
SPELL_MAGICS_BANE = 68793,
SPELL_CORRUPT_SOUL = 68839,
SPELL_CONSUME_SOUL = 68861,
//SPELL_CONSUME_SOUL_HEAL = 68858,
SPELL_TELEPORT = 68988,
SPELL_TELEPORT_VISUAL = 52096,
SPELL_TELEPORT = 68988,
SPELL_TELEPORT_VISUAL = 52096,
SPELL_SOULSTORM_VISUAL = 68870,
SPELL_SOULSTORM = 68872,
SPELL_SOULSTORM_VISUAL = 68870,
SPELL_SOULSTORM = 68872,
};
enum eEvents
{
EVENT_SPELL_SHADOW_BOLT = 1,
EVENT_SPELL_FEAR,
EVENT_SPELL_MAGICS_BANE,
EVENT_SPELL_CORRUPT_SOUL,
EVENT_START_SOULSTORM,
EVENT_SPELL_SHADOW_BOLT = 1,
EVENT_SPELL_FEAR,
EVENT_SPELL_MAGICS_BANE,
EVENT_SPELL_CORRUPT_SOUL,
EVENT_START_SOULSTORM,
};
class boss_bronjahm : public CreatureScript
{
public:
boss_bronjahm() : CreatureScript("boss_bronjahm") { }
boss_bronjahm() : CreatureScript("boss_bronjahm") { }
struct boss_bronjahmAI : public ScriptedAI
{
boss_bronjahmAI(Creature* creature) : ScriptedAI(creature), summons(me)
{
pInstance = creature->GetInstanceScript();
}
struct boss_bronjahmAI : public ScriptedAI
{
boss_bronjahmAI(Creature* creature) : ScriptedAI(creature), summons(me)
{
pInstance = creature->GetInstanceScript();
}
InstanceScript* pInstance;
EventMap events;
SummonList summons;
InstanceScript* pInstance;
EventMap events;
SummonList summons;
void JustReachedHome()
{
me->CastSpell(me, SPELL_SOULSTORM_CHANNEL_OOC, true);
}
void JustReachedHome()
{
me->CastSpell(me, SPELL_SOULSTORM_CHANNEL_OOC, true);
}
void Reset()
{
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
me->CastSpell(me, SPELL_SOULSTORM_CHANNEL_OOC, true);
events.Reset();
summons.DespawnAll();
if (pInstance)
pInstance->SetData(DATA_BRONJAHM, NOT_STARTED);
}
void Reset()
{
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
me->CastSpell(me, SPELL_SOULSTORM_CHANNEL_OOC, true);
events.Reset();
summons.DespawnAll();
if (pInstance)
pInstance->SetData(DATA_BRONJAHM, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/)
{
Talk(SAY_AGGRO);
me->RemoveAurasDueToSpell(SPELL_SOULSTORM_CHANNEL_OOC);
void EnterCombat(Unit* /*who*/)
{
Talk(SAY_AGGRO);
me->RemoveAurasDueToSpell(SPELL_SOULSTORM_CHANNEL_OOC);
DoZoneInCombat();
events.Reset();
events.RescheduleEvent(EVENT_SPELL_SHADOW_BOLT, 2000);
events.RescheduleEvent(EVENT_SPELL_MAGICS_BANE, urand(5000, 10000));
events.RescheduleEvent(EVENT_SPELL_CORRUPT_SOUL, urand(14000, 20000));
DoZoneInCombat();
events.Reset();
events.RescheduleEvent(EVENT_SPELL_SHADOW_BOLT, 2000);
events.RescheduleEvent(EVENT_SPELL_MAGICS_BANE, urand(5000, 10000));
events.RescheduleEvent(EVENT_SPELL_CORRUPT_SOUL, urand(14000, 20000));
if (pInstance)
pInstance->SetData(DATA_BRONJAHM, IN_PROGRESS);
}
if (pInstance)
pInstance->SetData(DATA_BRONJAHM, IN_PROGRESS);
}
void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask)
{
if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE) && me->HealthBelowPctDamaged(35, damage))
{
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
me->GetMotionMaster()->Clear();
me->GetMotionMaster()->MoveIdle();
me->CastSpell(me, SPELL_TELEPORT, false);
events.CancelEvent(EVENT_SPELL_CORRUPT_SOUL);
events.DelayEvents(6000);
events.RescheduleEvent(EVENT_SPELL_FEAR, urand(8000, 14000));
}
}
void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask)
{
if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE) && me->HealthBelowPctDamaged(35, damage))
{
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
me->GetMotionMaster()->Clear();
me->GetMotionMaster()->MoveIdle();
me->CastSpell(me, SPELL_TELEPORT, false);
events.CancelEvent(EVENT_SPELL_CORRUPT_SOUL);
events.DelayEvents(6000);
events.RescheduleEvent(EVENT_SPELL_FEAR, urand(8000, 14000));
}
}
void SpellHitTarget(Unit* target, const SpellInfo* spell)
{
if (spell->Id == SPELL_TELEPORT)
{
me->CastSpell(me, SPELL_TELEPORT_VISUAL, true);
events.RescheduleEvent(EVENT_START_SOULSTORM, 1);
}
}
void SpellHitTarget(Unit* target, const SpellInfo* spell)
{
if (spell->Id == SPELL_TELEPORT)
{
me->CastSpell(me, SPELL_TELEPORT_VISUAL, true);
events.RescheduleEvent(EVENT_START_SOULSTORM, 1);
}
}
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
events.Update(diff);
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE))
if (me->isAttackReady())
me->SetFacingToObject(me->GetVictim());
if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE))
if (me->isAttackReady())
me->SetFacingToObject(me->GetVictim());
switch(events.GetEvent())
{
case 0:
break;
case EVENT_SPELL_SHADOW_BOLT:
if (!me->IsWithinMeleeRange(me->GetVictim()))
me->CastSpell(me->GetVictim(), SPELL_SHADOW_BOLT, false);
events.RepeatEvent(2000);
break;
case EVENT_SPELL_FEAR:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 10.0f, true))
me->CastCustomSpell(SPELL_FEAR, SPELLVALUE_MAX_TARGETS, 1, target, false);
events.RepeatEvent(urand(8000, 12000));
break;
case EVENT_SPELL_MAGICS_BANE:
me->CastSpell(me->GetVictim(), SPELL_MAGICS_BANE, false);
events.RepeatEvent(urand(10000, 15000));
break;
case EVENT_SPELL_CORRUPT_SOUL:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
{
Talk(SAY_CORRUPT_SOUL);
me->CastSpell(target, SPELL_CORRUPT_SOUL, false);
}
events.RepeatEvent(urand(20000, 25000));
break;
case EVENT_START_SOULSTORM:
Talk(SAY_SOUL_STORM);
me->CastSpell(me, SPELL_SOULSTORM, false);
me->CastSpell(me, SPELL_TELEPORT_VISUAL, true);
me->CastSpell(me, SPELL_SOULSTORM_VISUAL, true);
events.PopEvent();
break;
}
switch(events.GetEvent())
{
case 0:
break;
case EVENT_SPELL_SHADOW_BOLT:
if (!me->IsWithinMeleeRange(me->GetVictim()))
me->CastSpell(me->GetVictim(), SPELL_SHADOW_BOLT, false);
events.RepeatEvent(2000);
break;
case EVENT_SPELL_FEAR:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 10.0f, true))
me->CastCustomSpell(SPELL_FEAR, SPELLVALUE_MAX_TARGETS, 1, target, false);
events.RepeatEvent(urand(8000, 12000));
break;
case EVENT_SPELL_MAGICS_BANE:
me->CastSpell(me->GetVictim(), SPELL_MAGICS_BANE, false);
events.RepeatEvent(urand(10000, 15000));
break;
case EVENT_SPELL_CORRUPT_SOUL:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
{
Talk(SAY_CORRUPT_SOUL);
me->CastSpell(target, SPELL_CORRUPT_SOUL, false);
}
events.RepeatEvent(urand(20000, 25000));
break;
case EVENT_START_SOULSTORM:
Talk(SAY_SOUL_STORM);
me->CastSpell(me, SPELL_SOULSTORM, false);
me->CastSpell(me, SPELL_TELEPORT_VISUAL, true);
me->CastSpell(me, SPELL_SOULSTORM_VISUAL, true);
events.PopEvent();
break;
}
DoMeleeAttackIfReady();
}
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*killer*/)
{
Talk(SAY_DEATH);
if (pInstance)
pInstance->SetData(DATA_BRONJAHM, DONE);
}
void JustDied(Unit* /*killer*/)
{
Talk(SAY_DEATH);
if (pInstance)
pInstance->SetData(DATA_BRONJAHM, DONE);
}
void KilledUnit(Unit* who)
{
if (who->GetTypeId() == TYPEID_PLAYER)
Talk(SAY_SLAY);
}
void KilledUnit(Unit* who)
{
if (who->GetTypeId() == TYPEID_PLAYER)
Talk(SAY_SLAY);
}
void JustSummoned(Creature* summon)
{
summons.Summon(summon);
summon->SetReactState(REACT_PASSIVE);
}
void JustSummoned(Creature* summon)
{
summons.Summon(summon);
summon->SetReactState(REACT_PASSIVE);
}
void EnterEvadeMode()
{
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
ScriptedAI::EnterEvadeMode();
}
};
void EnterEvadeMode()
{
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
ScriptedAI::EnterEvadeMode();
}
};
CreatureAI *GetAI(Creature* creature) const
{
return new boss_bronjahmAI(creature);
}
CreatureAI *GetAI(Creature* creature) const
{
return new boss_bronjahmAI(creature);
}
};
class npc_fos_corrupted_soul_fragment : public CreatureScript
{
public:
npc_fos_corrupted_soul_fragment() : CreatureScript("npc_fos_corrupted_soul_fragment") { }
npc_fos_corrupted_soul_fragment() : CreatureScript("npc_fos_corrupted_soul_fragment") { }
struct npc_fos_corrupted_soul_fragmentAI : public NullCreatureAI
{
npc_fos_corrupted_soul_fragmentAI(Creature* creature) : NullCreatureAI(creature)
{
pInstance = me->GetInstanceScript();
}
struct npc_fos_corrupted_soul_fragmentAI : public NullCreatureAI
{
npc_fos_corrupted_soul_fragmentAI(Creature* creature) : NullCreatureAI(creature)
{
pInstance = me->GetInstanceScript();
}
uint32 timer;
InstanceScript* pInstance;
uint32 timer;
InstanceScript* pInstance;
void Reset()
{
timer = 0;
}
void Reset()
{
timer = 0;
}
void UpdateAI(uint32 diff)
{
if (pInstance)
if (Creature* b = pInstance->instance->GetCreature(pInstance->GetData64(DATA_BRONJAHM)))
{
if (me->GetExactDist2d(b) <= 2.0f)
{
me->GetMotionMaster()->MoveIdle();
me->CastSpell(b, SPELL_CONSUME_SOUL, true);
me->DespawnOrUnsummon(1);
return;
}
void UpdateAI(uint32 diff)
{
if (pInstance)
if (Creature* b = pInstance->instance->GetCreature(pInstance->GetData64(DATA_BRONJAHM)))
{
if (me->GetExactDist2d(b) <= 2.0f)
{
me->GetMotionMaster()->MoveIdle();
me->CastSpell(b, SPELL_CONSUME_SOUL, true);
me->DespawnOrUnsummon(1);
return;
}
if (timer <= diff)
{
if (!me->HasUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED))
me->GetMotionMaster()->MovePoint(0, *b);
timer = 1000;
}
else
timer -= diff;
}
}
};
if (timer <= diff)
{
if (!me->HasUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED))
me->GetMotionMaster()->MovePoint(0, *b);
timer = 1000;
}
else
timer -= diff;
}
}
};
CreatureAI *GetAI(Creature* creature) const
{
return new npc_fos_corrupted_soul_fragmentAI(creature);
}
CreatureAI *GetAI(Creature* creature) const
{
return new npc_fos_corrupted_soul_fragmentAI(creature);
}
};
class spell_bronjahm_magic_bane : public SpellScriptLoader
{
public:
spell_bronjahm_magic_bane() : SpellScriptLoader("spell_bronjahm_magic_bane") { }
spell_bronjahm_magic_bane() : SpellScriptLoader("spell_bronjahm_magic_bane") { }
class spell_bronjahm_magic_bane_SpellScript : public SpellScript
{
PrepareSpellScript(spell_bronjahm_magic_bane_SpellScript);
class spell_bronjahm_magic_bane_SpellScript : public SpellScript
{
PrepareSpellScript(spell_bronjahm_magic_bane_SpellScript);
void RecalculateDamage()
{
if (GetHitUnit()->getPowerType() != POWER_MANA)
return;
void RecalculateDamage()
{
if (GetHitUnit()->getPowerType() != POWER_MANA)
return;
if (Unit* caster = GetCaster())
{
const int32 maxDamage = caster->GetMap()->GetSpawnMode() == 1 ? 15000 : 10000;
int32 newDamage = GetHitDamage();
newDamage += GetHitUnit()->GetMaxPower(POWER_MANA)/2;
newDamage = std::min<int32>(maxDamage, newDamage);
if (Unit* caster = GetCaster())
{
const int32 maxDamage = caster->GetMap()->GetSpawnMode() == 1 ? 15000 : 10000;
int32 newDamage = GetHitDamage();
newDamage += GetHitUnit()->GetMaxPower(POWER_MANA)/2;
newDamage = std::min<int32>(maxDamage, newDamage);
SetHitDamage(newDamage);
}
}
SetHitDamage(newDamage);
}
}
void Register()
{
OnHit += SpellHitFn(spell_bronjahm_magic_bane_SpellScript::RecalculateDamage);
}
};
void Register()
{
OnHit += SpellHitFn(spell_bronjahm_magic_bane_SpellScript::RecalculateDamage);
}
};
SpellScript* GetSpellScript() const
{
return new spell_bronjahm_magic_bane_SpellScript();
}
SpellScript* GetSpellScript() const
{
return new spell_bronjahm_magic_bane_SpellScript();
}
};
class spell_bronjahm_soulstorm_channel_ooc : public SpellScriptLoader
{
public:
spell_bronjahm_soulstorm_channel_ooc() : SpellScriptLoader("spell_bronjahm_soulstorm_channel_ooc") { }
spell_bronjahm_soulstorm_channel_ooc() : SpellScriptLoader("spell_bronjahm_soulstorm_channel_ooc") { }
class spell_bronjahm_soulstorm_channel_ooc_AuraScript : public AuraScript
{
PrepareAuraScript(spell_bronjahm_soulstorm_channel_ooc_AuraScript);
class spell_bronjahm_soulstorm_channel_ooc_AuraScript : public AuraScript
{
PrepareAuraScript(spell_bronjahm_soulstorm_channel_ooc_AuraScript);
void HandlePeriodicTick(AuraEffect const* aurEff)
{
PreventDefaultAction();
GetTarget()->CastSpell(GetTarget(), 68904+(aurEff->GetTickNumber()%4), true);
}
void HandlePeriodicTick(AuraEffect const* aurEff)
{
PreventDefaultAction();
GetTarget()->CastSpell(GetTarget(), 68904+(aurEff->GetTickNumber()%4), true);
}
void Register()
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_bronjahm_soulstorm_channel_ooc_AuraScript::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
}
};
void Register()
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_bronjahm_soulstorm_channel_ooc_AuraScript::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
}
};
AuraScript* GetAuraScript() const
{
return new spell_bronjahm_soulstorm_channel_ooc_AuraScript();
}
AuraScript* GetAuraScript() const
{
return new spell_bronjahm_soulstorm_channel_ooc_AuraScript();
}
};
class spell_bronjahm_soulstorm_visual : public SpellScriptLoader
{
public:
spell_bronjahm_soulstorm_visual() : SpellScriptLoader("spell_bronjahm_soulstorm_visual") { }
spell_bronjahm_soulstorm_visual() : SpellScriptLoader("spell_bronjahm_soulstorm_visual") { }
class spell_bronjahm_soulstorm_visual_AuraScript : public AuraScript
{
PrepareAuraScript(spell_bronjahm_soulstorm_visual_AuraScript);
class spell_bronjahm_soulstorm_visual_AuraScript : public AuraScript
{
PrepareAuraScript(spell_bronjahm_soulstorm_visual_AuraScript);
void HandlePeriodicTick(AuraEffect const* aurEff)
{
PreventDefaultAction();
uint32 spellId = 0;
switch (aurEff->GetTickNumber()%4)
{
case 0: spellId = 68886; break;
case 1: spellId = 68896; break;
case 2: spellId = 68897; break;
case 3: spellId = 68898; break;
}
GetTarget()->CastSpell(GetTarget(), spellId, true);
}
void HandlePeriodicTick(AuraEffect const* aurEff)
{
PreventDefaultAction();
uint32 spellId = 0;
switch (aurEff->GetTickNumber()%4)
{
case 0: spellId = 68886; break;
case 1: spellId = 68896; break;
case 2: spellId = 68897; break;
case 3: spellId = 68898; break;
}
GetTarget()->CastSpell(GetTarget(), spellId, true);
}
void Register()
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_bronjahm_soulstorm_visual_AuraScript::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
}
};
void Register()
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_bronjahm_soulstorm_visual_AuraScript::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
}
};
AuraScript* GetAuraScript() const
{
return new spell_bronjahm_soulstorm_visual_AuraScript();
}
AuraScript* GetAuraScript() const
{
return new spell_bronjahm_soulstorm_visual_AuraScript();
}
};
class spell_bronjahm_soulstorm_targeting : public SpellScriptLoader
{
public:
spell_bronjahm_soulstorm_targeting() : SpellScriptLoader("spell_bronjahm_soulstorm_targeting") { }
spell_bronjahm_soulstorm_targeting() : SpellScriptLoader("spell_bronjahm_soulstorm_targeting") { }
class spell_bronjahm_soulstorm_targeting_SpellScript : public SpellScript
{
PrepareSpellScript(spell_bronjahm_soulstorm_targeting_SpellScript);
class spell_bronjahm_soulstorm_targeting_SpellScript : public SpellScript
{
PrepareSpellScript(spell_bronjahm_soulstorm_targeting_SpellScript);
void FilterTargets(std::list<WorldObject*>& targets)
{
targets.remove_if(Trinity::AllWorldObjectsInExactRange(GetCaster(), 10.0f, false));
}
void FilterTargets(std::list<WorldObject*>& targets)
{
targets.remove_if(Trinity::AllWorldObjectsInExactRange(GetCaster(), 10.0f, false));
}
void Register()
{
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_bronjahm_soulstorm_targeting_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_DEST_AREA_ENEMY);
}
};
void Register()
{
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_bronjahm_soulstorm_targeting_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_DEST_AREA_ENEMY);
}
};
SpellScript* GetSpellScript() const
{
return new spell_bronjahm_soulstorm_targeting_SpellScript();
}
SpellScript* GetSpellScript() const
{
return new spell_bronjahm_soulstorm_targeting_SpellScript();
}
};
void AddSC_boss_bronjahm()
{
new boss_bronjahm();
new npc_fos_corrupted_soul_fragment();
new boss_bronjahm();
new npc_fos_corrupted_soul_fragment();
new spell_bronjahm_magic_bane();
new spell_bronjahm_soulstorm_channel_ooc();
new spell_bronjahm_soulstorm_visual();
new spell_bronjahm_soulstorm_targeting();
new spell_bronjahm_magic_bane();
new spell_bronjahm_soulstorm_channel_ooc();
new spell_bronjahm_soulstorm_visual();
new spell_bronjahm_soulstorm_targeting();
}

View File

@@ -12,7 +12,7 @@ REWRITTEN FROM SCRATCH BY PUSSYWIZARD, IT OWNS NOW!
enum eTexts
{
SAY_FACE_AGGRO = 0,
SAY_FACE_AGGRO = 0,
SAY_FACE_ANGER_SLAY = 1,
SAY_FACE_SORROW_SLAY = 2,
SAY_FACE_DESIRE_SLAY = 3,
@@ -26,342 +26,342 @@ enum eTexts
enum eSpells
{
SPELL_PHANTOM_BLAST = 68982,
SPELL_PHANTOM_BLAST_H = 70322,
SPELL_MIRRORED_SOUL = 69051,
SPELL_WELL_OF_SOULS = 68820,
//SPELL_WELL_OF_SOULS_SUMMON = 68853,
//SPELL_WELL_OF_SOULS_PERIODIC = 68854,
SPELL_UNLEASHED_SOULS = 68939,
SPELL_PHANTOM_BLAST = 68982,
SPELL_PHANTOM_BLAST_H = 70322,
SPELL_MIRRORED_SOUL = 69051,
SPELL_WELL_OF_SOULS = 68820,
//SPELL_WELL_OF_SOULS_SUMMON = 68853,
//SPELL_WELL_OF_SOULS_PERIODIC = 68854,
SPELL_UNLEASHED_SOULS = 68939,
SPELL_WAILING_SOULS = 68899, // target 1.0,1.0, change model, triggers 68871, cast time 3 secs
SPELL_WAILING_SOULS_SCRIPT_EFFECT = 68871, // target 1.0, script effect, instant
SPELL_WAILING_SOULS_PERIODIC_DUMMY = 68875, // target 1.0, aura 226, instant
SPELL_WAILING_SOULS_PERIODIC_DUMMY_2= 68876, // target 1.0, aura 226, instant
SPELL_WAILING_SOULS_TARGETING = 68912, // target 22.15, aura dummy, 50000yd, cast instant, duration 4 secs
SPELL_WAILING_SOULS_DMG_N = 68873, // 100yd, 104.0
SPELL_WAILING_SOULS_DMG_H = 70324, // 100yd, 104.0
SPELL_WAILING_SOULS = 68899, // target 1.0,1.0, change model, triggers 68871, cast time 3 secs
SPELL_WAILING_SOULS_SCRIPT_EFFECT = 68871, // target 1.0, script effect, instant
SPELL_WAILING_SOULS_PERIODIC_DUMMY = 68875, // target 1.0, aura 226, instant
SPELL_WAILING_SOULS_PERIODIC_DUMMY_2= 68876, // target 1.0, aura 226, instant
SPELL_WAILING_SOULS_TARGETING = 68912, // target 22.15, aura dummy, 50000yd, cast instant, duration 4 secs
SPELL_WAILING_SOULS_DMG_N = 68873, // 100yd, 104.0
SPELL_WAILING_SOULS_DMG_H = 70324, // 100yd, 104.0
};
enum eEvents
{
EVENT_SPELL_PHANTOM_BLAST = 1,
EVENT_SPELL_MIRRORED_SOUL,
EVENT_SPELL_WELL_OF_SOULS,
EVENT_SPELL_UNLEASHED_SOULS,
EVENT_SPELL_WAILING_SOULS,
EVENT_SPELL_PHANTOM_BLAST = 1,
EVENT_SPELL_MIRRORED_SOUL,
EVENT_SPELL_WELL_OF_SOULS,
EVENT_SPELL_UNLEASHED_SOULS,
EVENT_SPELL_WAILING_SOULS,
};
enum eDisplayIds
{
DISPLAY_ANGER = 30148,
DISPLAY_SORROW = 30149,
DISPLAY_DESIRE = 30150,
DISPLAY_ANGER = 30148,
DISPLAY_SORROW = 30149,
DISPLAY_DESIRE = 30150,
};
enum eMisc
{
NPC_CRUCIBLE_OF_SOULS = 37094,
QUEST_TEMPERING_THE_BLADE_A = 24476,
QUEST_TEMPERING_THE_BLADE_H = 24560,
NPC_CRUCIBLE_OF_SOULS = 37094,
QUEST_TEMPERING_THE_BLADE_A = 24476,
QUEST_TEMPERING_THE_BLADE_H = 24560,
};
class boss_devourer_of_souls : public CreatureScript
{
public:
boss_devourer_of_souls() : CreatureScript("boss_devourer_of_souls") { }
boss_devourer_of_souls() : CreatureScript("boss_devourer_of_souls") { }
struct boss_devourer_of_soulsAI : public ScriptedAI
{
boss_devourer_of_soulsAI(Creature* creature) : ScriptedAI(creature), summons(me)
{
pInstance = creature->GetInstanceScript();
}
struct boss_devourer_of_soulsAI : public ScriptedAI
{
boss_devourer_of_soulsAI(Creature* creature) : ScriptedAI(creature), summons(me)
{
pInstance = creature->GetInstanceScript();
}
InstanceScript* pInstance;
EventMap events;
SummonList summons;
bool bAchiev;
InstanceScript* pInstance;
EventMap events;
SummonList summons;
bool bAchiev;
void Reset()
{
bAchiev = true;
me->SetControlled(false, UNIT_STATE_ROOT);
me->DisableRotate(false);
me->SetReactState(REACT_AGGRESSIVE);
events.Reset();
summons.DespawnAll();
if (pInstance)
pInstance->SetData(DATA_DEVOURER, NOT_STARTED);
}
void Reset()
{
bAchiev = true;
me->SetControlled(false, UNIT_STATE_ROOT);
me->DisableRotate(false);
me->SetReactState(REACT_AGGRESSIVE);
events.Reset();
summons.DespawnAll();
if (pInstance)
pInstance->SetData(DATA_DEVOURER, NOT_STARTED);
}
uint32 GetData(uint32 id) const
{
if (id == 1)
return bAchiev;
uint32 GetData(uint32 id) const
{
if (id == 1)
return bAchiev;
return 0;
}
return 0;
}
void EnterCombat(Unit* /*who*/)
{
Talk(SAY_FACE_AGGRO);
DoZoneInCombat();
events.Reset();
events.RescheduleEvent(EVENT_SPELL_PHANTOM_BLAST, 5000);
events.RescheduleEvent(EVENT_SPELL_MIRRORED_SOUL, 9000);
events.RescheduleEvent(EVENT_SPELL_WELL_OF_SOULS, urand(6000,8000));
events.RescheduleEvent(EVENT_SPELL_UNLEASHED_SOULS, urand(18000,20000));
events.RescheduleEvent(EVENT_SPELL_WAILING_SOULS, 65000);
void EnterCombat(Unit* /*who*/)
{
Talk(SAY_FACE_AGGRO);
DoZoneInCombat();
events.Reset();
events.RescheduleEvent(EVENT_SPELL_PHANTOM_BLAST, 5000);
events.RescheduleEvent(EVENT_SPELL_MIRRORED_SOUL, 9000);
events.RescheduleEvent(EVENT_SPELL_WELL_OF_SOULS, urand(6000,8000));
events.RescheduleEvent(EVENT_SPELL_UNLEASHED_SOULS, urand(18000,20000));
events.RescheduleEvent(EVENT_SPELL_WAILING_SOULS, 65000);
if (pInstance)
pInstance->SetData(DATA_DEVOURER, IN_PROGRESS);
if (pInstance)
pInstance->SetData(DATA_DEVOURER, IN_PROGRESS);
// Suport for Quest Tempering the Blade
Map::PlayerList const& pList = me->GetMap()->GetPlayers();
for(Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr)
{
Player* player = itr->GetSource();
if ((player->GetTeamId() == TEAM_ALLIANCE && player->GetQuestStatus(QUEST_TEMPERING_THE_BLADE_A) == QUEST_STATUS_INCOMPLETE) ||
(player->GetTeamId() == TEAM_HORDE && player->GetQuestStatus(QUEST_TEMPERING_THE_BLADE_H) == QUEST_STATUS_INCOMPLETE))
{
if (!me->FindNearestCreature(NPC_CRUCIBLE_OF_SOULS, 100.0f))
me->SummonCreature(NPC_CRUCIBLE_OF_SOULS, 5672.29f, 2520.69f, 713.44f, 0.96f);
}
}
}
// Suport for Quest Tempering the Blade
Map::PlayerList const& pList = me->GetMap()->GetPlayers();
for(Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr)
{
Player* player = itr->GetSource();
if ((player->GetTeamId() == TEAM_ALLIANCE && player->GetQuestStatus(QUEST_TEMPERING_THE_BLADE_A) == QUEST_STATUS_INCOMPLETE) ||
(player->GetTeamId() == TEAM_HORDE && player->GetQuestStatus(QUEST_TEMPERING_THE_BLADE_H) == QUEST_STATUS_INCOMPLETE))
{
if (!me->FindNearestCreature(NPC_CRUCIBLE_OF_SOULS, 100.0f))
me->SummonCreature(NPC_CRUCIBLE_OF_SOULS, 5672.29f, 2520.69f, 713.44f, 0.96f);
}
}
}
void SpellHitTarget(Unit* target, const SpellInfo *spell)
{
if (spell->Id == SPELL_PHANTOM_BLAST_H)
bAchiev = false;
else if (spell->Id == SPELL_WAILING_SOULS_TARGETING)
{
me->SetOrientation(me->GetAngle(target));
me->SetControlled(true, UNIT_STATE_ROOT);
me->DisableRotate(true);
me->SetUInt64Value(UNIT_FIELD_TARGET, 0);
me->SetReactState(REACT_PASSIVE);
me->GetMotionMaster()->Clear(false);
me->GetMotionMaster()->MoveIdle();
me->StopMovingOnCurrentPos();
void SpellHitTarget(Unit* target, const SpellInfo *spell)
{
if (spell->Id == SPELL_PHANTOM_BLAST_H)
bAchiev = false;
else if (spell->Id == SPELL_WAILING_SOULS_TARGETING)
{
me->SetOrientation(me->GetAngle(target));
me->SetControlled(true, UNIT_STATE_ROOT);
me->DisableRotate(true);
me->SetUInt64Value(UNIT_FIELD_TARGET, 0);
me->SetReactState(REACT_PASSIVE);
me->GetMotionMaster()->Clear(false);
me->GetMotionMaster()->MoveIdle();
me->StopMovingOnCurrentPos();
me->SetFacingToObject(target);
me->SendMovementFlagUpdate();
me->CastSpell(me, SPELL_WAILING_SOULS, false);
}
}
me->SetFacingToObject(target);
me->SendMovementFlagUpdate();
me->CastSpell(me, SPELL_WAILING_SOULS, false);
}
}
bool CanAIAttack(const Unit* target) const { return target->GetPositionZ() > 706.5f; }
bool CanAIAttack(const Unit* target) const { return target->GetPositionZ() > 706.5f; }
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
events.Update(diff);
events.Update(diff);
if (Spell* s = me->GetCurrentSpell(CURRENT_CHANNELED_SPELL))
if (s->m_spellInfo->Id == SPELL_MIRRORED_SOUL)
{
switch (events.GetEvent())
{
case 0:
break;
case EVENT_SPELL_PHANTOM_BLAST:
me->CastSpell(me->GetVictim(), SPELL_PHANTOM_BLAST, false);
events.RepeatEvent(5000);
break;
default:
events.RepeatEvent(1000);
break;
}
if (Spell* s = me->GetCurrentSpell(CURRENT_CHANNELED_SPELL))
if (s->m_spellInfo->Id == SPELL_MIRRORED_SOUL)
{
switch (events.GetEvent())
{
case 0:
break;
case EVENT_SPELL_PHANTOM_BLAST:
me->CastSpell(me->GetVictim(), SPELL_PHANTOM_BLAST, false);
events.RepeatEvent(5000);
break;
default:
events.RepeatEvent(1000);
break;
}
if (!me->GetCurrentSpell(CURRENT_GENERIC_SPELL))
{
me->ClearUnitState(UNIT_STATE_CASTING);
DoMeleeAttackIfReady();
me->AddUnitState(UNIT_STATE_CASTING);
}
if (!me->GetCurrentSpell(CURRENT_GENERIC_SPELL))
{
me->ClearUnitState(UNIT_STATE_CASTING);
DoMeleeAttackIfReady();
me->AddUnitState(UNIT_STATE_CASTING);
}
return;
}
return;
}
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch(events.GetEvent())
{
case 0:
break;
case EVENT_SPELL_PHANTOM_BLAST:
me->CastSpell(me->GetVictim(), SPELL_PHANTOM_BLAST, false);
events.RepeatEvent(5000);
break;
case EVENT_SPELL_MIRRORED_SOUL:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 90.0f, true))
{
me->CastSpell(target, SPELL_MIRRORED_SOUL, false);
me->setAttackTimer(BASE_ATTACK, 2500);
Talk(EMOTE_MIRRORED_SOUL);
}
events.RepeatEvent(urand(20000,30000));
break;
case EVENT_SPELL_WELL_OF_SOULS:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true))
me->CastSpell(target, SPELL_WELL_OF_SOULS, false);
events.RepeatEvent(urand(25000,30000));
events.DelayEventsToMax(4000, 0);
break;
case EVENT_SPELL_UNLEASHED_SOULS:
me->CastSpell(me, SPELL_UNLEASHED_SOULS, false);
Talk(SAY_FACE_UNLEASH_SOUL);
Talk(EMOTE_UNLEASH_SOUL);
events.RepeatEvent(urand(30000,40000));
events.DelayEventsToMax(5000, 0);
me->setAttackTimer(BASE_ATTACK, 5500);
break;
case EVENT_SPELL_WAILING_SOULS:
Talk(SAY_FACE_WAILING_SOUL);
Talk(EMOTE_WAILING_SOUL);
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
me->CastCustomSpell(SPELL_WAILING_SOULS_TARGETING, SPELLVALUE_MAX_TARGETS, 1, target, false);
events.RepeatEvent(80000);
events.DelayEventsToMax(20000, 0);
break;
}
switch(events.GetEvent())
{
case 0:
break;
case EVENT_SPELL_PHANTOM_BLAST:
me->CastSpell(me->GetVictim(), SPELL_PHANTOM_BLAST, false);
events.RepeatEvent(5000);
break;
case EVENT_SPELL_MIRRORED_SOUL:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 90.0f, true))
{
me->CastSpell(target, SPELL_MIRRORED_SOUL, false);
me->setAttackTimer(BASE_ATTACK, 2500);
Talk(EMOTE_MIRRORED_SOUL);
}
events.RepeatEvent(urand(20000,30000));
break;
case EVENT_SPELL_WELL_OF_SOULS:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true))
me->CastSpell(target, SPELL_WELL_OF_SOULS, false);
events.RepeatEvent(urand(25000,30000));
events.DelayEventsToMax(4000, 0);
break;
case EVENT_SPELL_UNLEASHED_SOULS:
me->CastSpell(me, SPELL_UNLEASHED_SOULS, false);
Talk(SAY_FACE_UNLEASH_SOUL);
Talk(EMOTE_UNLEASH_SOUL);
events.RepeatEvent(urand(30000,40000));
events.DelayEventsToMax(5000, 0);
me->setAttackTimer(BASE_ATTACK, 5500);
break;
case EVENT_SPELL_WAILING_SOULS:
Talk(SAY_FACE_WAILING_SOUL);
Talk(EMOTE_WAILING_SOUL);
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
me->CastCustomSpell(SPELL_WAILING_SOULS_TARGETING, SPELLVALUE_MAX_TARGETS, 1, target, false);
events.RepeatEvent(80000);
events.DelayEventsToMax(20000, 0);
break;
}
DoMeleeAttackIfReady();
}
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*killer*/)
{
Talk(SAY_FACE_DEATH);
summons.DespawnAll();
if (pInstance)
pInstance->SetData(DATA_DEVOURER, DONE);
}
void JustDied(Unit* /*killer*/)
{
Talk(SAY_FACE_DEATH);
summons.DespawnAll();
if (pInstance)
pInstance->SetData(DATA_DEVOURER, DONE);
}
void KilledUnit(Unit* victim)
{
if (victim->GetTypeId() != TYPEID_PLAYER)
return;
void KilledUnit(Unit* victim)
{
if (victim->GetTypeId() != TYPEID_PLAYER)
return;
int32 textId = 0;
switch (me->GetDisplayId())
{
case DISPLAY_ANGER:
textId = SAY_FACE_ANGER_SLAY;
break;
case DISPLAY_SORROW:
textId = SAY_FACE_SORROW_SLAY;
break;
case DISPLAY_DESIRE:
textId = SAY_FACE_DESIRE_SLAY;
break;
default:
break;
}
int32 textId = 0;
switch (me->GetDisplayId())
{
case DISPLAY_ANGER:
textId = SAY_FACE_ANGER_SLAY;
break;
case DISPLAY_SORROW:
textId = SAY_FACE_SORROW_SLAY;
break;
case DISPLAY_DESIRE:
textId = SAY_FACE_DESIRE_SLAY;
break;
default:
break;
}
if (textId)
Talk(textId);
}
if (textId)
Talk(textId);
}
void JustSummoned(Creature* summon)
{
if (summon->GetEntry() != NPC_CRUCIBLE_OF_SOULS)
summons.Summon(summon);
void JustSummoned(Creature* summon)
{
if (summon->GetEntry() != NPC_CRUCIBLE_OF_SOULS)
summons.Summon(summon);
if (summon->GetEntry() == 36595)
if (Player* plr = summon->SelectNearestPlayer(100.0f))
{
summon->AddThreat(plr, 100000.0f);
summon->AI()->AttackStart(plr);
}
}
if (summon->GetEntry() == 36595)
if (Player* plr = summon->SelectNearestPlayer(100.0f))
{
summon->AddThreat(plr, 100000.0f);
summon->AI()->AttackStart(plr);
}
}
void EnterEvadeMode()
{
me->SetControlled(false, UNIT_STATE_ROOT);
me->DisableRotate(false);
ScriptedAI::EnterEvadeMode();
}
};
void EnterEvadeMode()
{
me->SetControlled(false, UNIT_STATE_ROOT);
me->DisableRotate(false);
ScriptedAI::EnterEvadeMode();
}
};
CreatureAI *GetAI(Creature* creature) const
{
return new boss_devourer_of_soulsAI(creature);
}
CreatureAI *GetAI(Creature* creature) const
{
return new boss_devourer_of_soulsAI(creature);
}
};
class spell_wailing_souls_periodic : public SpellScriptLoader
{
public:
spell_wailing_souls_periodic() : SpellScriptLoader("spell_wailing_souls_periodic") { }
spell_wailing_souls_periodic() : SpellScriptLoader("spell_wailing_souls_periodic") { }
class spell_wailing_souls_periodic_AuraScript : public AuraScript
{
PrepareAuraScript(spell_wailing_souls_periodic_AuraScript);
class spell_wailing_souls_periodic_AuraScript : public AuraScript
{
PrepareAuraScript(spell_wailing_souls_periodic_AuraScript);
int8 dir;
int8 dir;
bool Load()
{
dir = urand(0,1) ? 1 : -1;
return true;
}
bool Load()
{
dir = urand(0,1) ? 1 : -1;
return true;
}
void HandlePeriodicTick(AuraEffect const* aurEff)
{
PreventDefaultAction();
if (Unit* t = GetTarget())
{
if (aurEff->GetTickNumber() < 30)
{
// spinning, casting, etc.
float diff = (2*M_PI)/(4*30);
float new_o = t->GetOrientation() + diff*dir;
if (new_o >= 2*M_PI)
new_o -= 2*M_PI;
else if (new_o < 0)
new_o += 2*M_PI;
t->UpdateOrientation(new_o);
t->SetFacingTo(new_o);
t->CastSpell(t, SPELL_WAILING_SOULS_DMG_N, true);
}
else if (aurEff->GetTickNumber() == 33)
{
t->SetControlled(false, UNIT_STATE_ROOT);
t->DisableRotate(false);
if (t->GetTypeId() == TYPEID_UNIT)
t->ToCreature()->SetReactState(REACT_AGGRESSIVE);
if (t->GetVictim())
{
t->SetUInt64Value(UNIT_FIELD_TARGET, t->GetVictim()->GetGUID());
t->GetMotionMaster()->MoveChase(t->GetVictim());
}
}
else if (aurEff->GetTickNumber() >= 34)
Remove(AURA_REMOVE_BY_EXPIRE);
}
}
void HandlePeriodicTick(AuraEffect const* aurEff)
{
PreventDefaultAction();
if (Unit* t = GetTarget())
{
if (aurEff->GetTickNumber() < 30)
{
// spinning, casting, etc.
float diff = (2*M_PI)/(4*30);
float new_o = t->GetOrientation() + diff*dir;
if (new_o >= 2*M_PI)
new_o -= 2*M_PI;
else if (new_o < 0)
new_o += 2*M_PI;
t->UpdateOrientation(new_o);
t->SetFacingTo(new_o);
t->CastSpell(t, SPELL_WAILING_SOULS_DMG_N, true);
}
else if (aurEff->GetTickNumber() == 33)
{
t->SetControlled(false, UNIT_STATE_ROOT);
t->DisableRotate(false);
if (t->GetTypeId() == TYPEID_UNIT)
t->ToCreature()->SetReactState(REACT_AGGRESSIVE);
if (t->GetVictim())
{
t->SetUInt64Value(UNIT_FIELD_TARGET, t->GetVictim()->GetGUID());
t->GetMotionMaster()->MoveChase(t->GetVictim());
}
}
else if (aurEff->GetTickNumber() >= 34)
Remove(AURA_REMOVE_BY_EXPIRE);
}
}
void Register()
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_wailing_souls_periodic_AuraScript::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
}
};
void Register()
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_wailing_souls_periodic_AuraScript::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
}
};
AuraScript* GetAuraScript() const
{
return new spell_wailing_souls_periodic_AuraScript();
}
AuraScript* GetAuraScript() const
{
return new spell_wailing_souls_periodic_AuraScript();
}
};
void AddSC_boss_devourer_of_souls()
{
new boss_devourer_of_souls();
new spell_wailing_souls_periodic();
new boss_devourer_of_souls();
new spell_wailing_souls_periodic();
}

View File

@@ -27,262 +27,262 @@ enum Yells
SAY_SYLVANAS_INTRO_5 = 4,
SAY_SYLVANAS_INTRO_6 = 5,
SAY_JAINA_OUTRO = 0,
SAY_SYLVANAS_OUTRO = 0,
SAY_JAINA_OUTRO = 0,
SAY_SYLVANAS_OUTRO = 0,
};
class npc_fos_leader : public CreatureScript
{
public:
npc_fos_leader() : CreatureScript("npc_fos_leader") { }
npc_fos_leader() : CreatureScript("npc_fos_leader") { }
struct npc_fos_leaderAI: public ScriptedAI
{
npc_fos_leaderAI(Creature* creature) : ScriptedAI(creature) {}
struct npc_fos_leaderAI: public ScriptedAI
{
npc_fos_leaderAI(Creature* creature) : ScriptedAI(creature) {}
EventMap events;
EventMap events;
void Reset()
{
events.Reset();
}
void Reset()
{
events.Reset();
}
void DoAction(int32 a)
{
if (a == 1)
if (me->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP))
{
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
events.Reset();
events.ScheduleEvent(1, 1000);
}
}
void DoAction(int32 a)
{
if (a == 1)
if (me->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP))
{
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
events.Reset();
events.ScheduleEvent(1, 1000);
}
}
void UpdateAI(uint32 diff)
{
events.Update(diff);
switch(events.GetEvent())
{
case 0:
break;
case 1:
events.PopEvent();
if (me->GetEntry() == NPC_JAINA_PART1)
{
Talk(SAY_JAINA_INTRO_1);
events.ScheduleEvent(2, 8000);
}
else
{
Talk(SAY_SYLVANAS_INTRO_1);
events.ScheduleEvent(2, 11500);
}
break;
case 2:
events.PopEvent();
if (me->GetEntry() == NPC_JAINA_PART1)
{
Talk(SAY_JAINA_INTRO_2);
events.ScheduleEvent(3, 9000);
}
else
{
Talk(SAY_SYLVANAS_INTRO_2);
events.ScheduleEvent(3, 10500);
}
break;
case 3:
events.PopEvent();
if (me->GetEntry() == NPC_JAINA_PART1)
{
Talk(SAY_JAINA_INTRO_3);
events.ScheduleEvent(4, 8000);
}
else
{
Talk(SAY_SYLVANAS_INTRO_3);
events.ScheduleEvent(4, 10500);
}
break;
case 4:
events.PopEvent();
if (me->GetEntry() == NPC_JAINA_PART1)
{
Talk(SAY_JAINA_INTRO_4);
events.ScheduleEvent(5, 10000);
}
else
{
Talk(SAY_SYLVANAS_INTRO_4);
events.ScheduleEvent(5, 11000);
}
break;
case 5:
events.PopEvent();
if (me->GetEntry() == NPC_JAINA_PART1)
{
Talk(SAY_JAINA_INTRO_5);
events.ScheduleEvent(6, 8000);
}
else
{
Talk(SAY_SYLVANAS_INTRO_5);
events.ScheduleEvent(6, 9500);
}
break;
case 6:
events.PopEvent();
if (me->GetEntry() == NPC_JAINA_PART1)
{
Talk(SAY_JAINA_INTRO_6);
events.ScheduleEvent(7, 12000);
}
else
{
Talk(SAY_SYLVANAS_INTRO_6);
}
break;
case 7:
events.PopEvent();
if (me->GetEntry() == NPC_JAINA_PART1)
{
Talk(SAY_JAINA_INTRO_7);
events.ScheduleEvent(8, 8000);
}
break;
case 8:
events.PopEvent();
if (me->GetEntry() == NPC_JAINA_PART1)
{
Talk(SAY_JAINA_INTRO_8);
}
break;
}
void UpdateAI(uint32 diff)
{
events.Update(diff);
switch(events.GetEvent())
{
case 0:
break;
case 1:
events.PopEvent();
if (me->GetEntry() == NPC_JAINA_PART1)
{
Talk(SAY_JAINA_INTRO_1);
events.ScheduleEvent(2, 8000);
}
else
{
Talk(SAY_SYLVANAS_INTRO_1);
events.ScheduleEvent(2, 11500);
}
break;
case 2:
events.PopEvent();
if (me->GetEntry() == NPC_JAINA_PART1)
{
Talk(SAY_JAINA_INTRO_2);
events.ScheduleEvent(3, 9000);
}
else
{
Talk(SAY_SYLVANAS_INTRO_2);
events.ScheduleEvent(3, 10500);
}
break;
case 3:
events.PopEvent();
if (me->GetEntry() == NPC_JAINA_PART1)
{
Talk(SAY_JAINA_INTRO_3);
events.ScheduleEvent(4, 8000);
}
else
{
Talk(SAY_SYLVANAS_INTRO_3);
events.ScheduleEvent(4, 10500);
}
break;
case 4:
events.PopEvent();
if (me->GetEntry() == NPC_JAINA_PART1)
{
Talk(SAY_JAINA_INTRO_4);
events.ScheduleEvent(5, 10000);
}
else
{
Talk(SAY_SYLVANAS_INTRO_4);
events.ScheduleEvent(5, 11000);
}
break;
case 5:
events.PopEvent();
if (me->GetEntry() == NPC_JAINA_PART1)
{
Talk(SAY_JAINA_INTRO_5);
events.ScheduleEvent(6, 8000);
}
else
{
Talk(SAY_SYLVANAS_INTRO_5);
events.ScheduleEvent(6, 9500);
}
break;
case 6:
events.PopEvent();
if (me->GetEntry() == NPC_JAINA_PART1)
{
Talk(SAY_JAINA_INTRO_6);
events.ScheduleEvent(7, 12000);
}
else
{
Talk(SAY_SYLVANAS_INTRO_6);
}
break;
case 7:
events.PopEvent();
if (me->GetEntry() == NPC_JAINA_PART1)
{
Talk(SAY_JAINA_INTRO_7);
events.ScheduleEvent(8, 8000);
}
break;
case 8:
events.PopEvent();
if (me->GetEntry() == NPC_JAINA_PART1)
{
Talk(SAY_JAINA_INTRO_8);
}
break;
}
if (!UpdateVictim())
return;
if (!UpdateVictim())
return;
DoMeleeAttackIfReady();
}
};
DoMeleeAttackIfReady();
}
};
bool OnGossipHello(Player* player, Creature* creature)
{
if (creature->IsQuestGiver())
player->PrepareQuestMenu(creature->GetGUID());
bool OnGossipHello(Player* player, Creature* creature)
{
if (creature->IsQuestGiver())
player->PrepareQuestMenu(creature->GetGUID());
if (creature->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP))
{
if (creature->GetEntry() == NPC_JAINA_PART1)
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "What would you have of me, my lady?", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
else
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "What would you have of me, Banshee Queen?", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
}
if (creature->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP))
{
if (creature->GetEntry() == NPC_JAINA_PART1)
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "What would you have of me, my lady?", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
else
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "What would you have of me, Banshee Queen?", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
}
player->SEND_GOSSIP_MENU(15207, creature->GetGUID());
return true;
}
player->SEND_GOSSIP_MENU(15207, creature->GetGUID());
return true;
}
bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction)
{
player->PlayerTalkClass->ClearMenus();
switch(uiAction)
{
case GOSSIP_ACTION_INFO_DEF+1:
player->CLOSE_GOSSIP_MENU();
if (creature->AI())
creature->AI()->DoAction(1);
break;
}
bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction)
{
player->PlayerTalkClass->ClearMenus();
switch(uiAction)
{
case GOSSIP_ACTION_INFO_DEF+1:
player->CLOSE_GOSSIP_MENU();
if (creature->AI())
creature->AI()->DoAction(1);
break;
}
return true;
}
return true;
}
CreatureAI *GetAI(Creature* creature) const
{
return new npc_fos_leaderAI(creature);
}
CreatureAI *GetAI(Creature* creature) const
{
return new npc_fos_leaderAI(creature);
}
};
class npc_fos_leader_second : public CreatureScript
{
public:
npc_fos_leader_second() : CreatureScript("npc_fos_leader_second") { }
npc_fos_leader_second() : CreatureScript("npc_fos_leader_second") { }
struct npc_fos_leader_secondAI: public ScriptedAI
{
npc_fos_leader_secondAI(Creature* creature) : ScriptedAI(creature)
{
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
}
struct npc_fos_leader_secondAI: public ScriptedAI
{
npc_fos_leader_secondAI(Creature* creature) : ScriptedAI(creature)
{
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
}
void MovementInform(uint32 type, uint32 id)
{
if (type == POINT_MOTION_TYPE && id == 1)
{
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
if (me->GetEntry() == NPC_JAINA_PART1)
Talk(SAY_JAINA_OUTRO);
else
Talk(SAY_SYLVANAS_OUTRO);
me->HandleEmoteCommand(EMOTE_ONESHOT_KNEEL);
}
}
};
void MovementInform(uint32 type, uint32 id)
{
if (type == POINT_MOTION_TYPE && id == 1)
{
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
if (me->GetEntry() == NPC_JAINA_PART1)
Talk(SAY_JAINA_OUTRO);
else
Talk(SAY_SYLVANAS_OUTRO);
me->HandleEmoteCommand(EMOTE_ONESHOT_KNEEL);
}
}
};
CreatureAI *GetAI(Creature* creature) const
{
return new npc_fos_leader_secondAI(creature);
}
CreatureAI *GetAI(Creature* creature) const
{
return new npc_fos_leader_secondAI(creature);
}
};
class spell_shield_of_bones : public SpellScriptLoader
{
public:
spell_shield_of_bones() : SpellScriptLoader("spell_shield_of_bones") { }
spell_shield_of_bones() : SpellScriptLoader("spell_shield_of_bones") { }
class spell_shield_of_bones_AuraScript : public AuraScript
{
PrepareAuraScript(spell_shield_of_bones_AuraScript);
class spell_shield_of_bones_AuraScript : public AuraScript
{
PrepareAuraScript(spell_shield_of_bones_AuraScript);
int32 amount;
bool fired;
int32 amount;
bool fired;
bool Load()
{
fired = false;
amount = 0;
return true;
}
bool Load()
{
fired = false;
amount = 0;
return true;
}
void HandleAfterEffectAbsorb(AuraEffect* /*aurEff*/, DamageInfo & /*dmgInfo*/, uint32 & absorbAmount)
{
amount += absorbAmount;
if (!fired && amount >= GetSpellInfo()->Effects[EFFECT_0].BasePoints+1)
if (Unit* caster = GetCaster())
{
fired = true;
caster->CastSpell(caster, 69642, true);
}
}
void HandleAfterEffectAbsorb(AuraEffect* /*aurEff*/, DamageInfo & /*dmgInfo*/, uint32 & absorbAmount)
{
amount += absorbAmount;
if (!fired && amount >= GetSpellInfo()->Effects[EFFECT_0].BasePoints+1)
if (Unit* caster = GetCaster())
{
fired = true;
caster->CastSpell(caster, 69642, true);
}
}
void Register()
{
AfterEffectAbsorb += AuraEffectAbsorbFn(spell_shield_of_bones_AuraScript::HandleAfterEffectAbsorb, EFFECT_0);
}
};
void Register()
{
AfterEffectAbsorb += AuraEffectAbsorbFn(spell_shield_of_bones_AuraScript::HandleAfterEffectAbsorb, EFFECT_0);
}
};
AuraScript* GetAuraScript() const
{
return new spell_shield_of_bones_AuraScript();
}
AuraScript* GetAuraScript() const
{
return new spell_shield_of_bones_AuraScript();
}
};
void AddSC_forge_of_souls()
{
new npc_fos_leader();
new npc_fos_leader_second();
new spell_shield_of_bones();
new npc_fos_leader();
new npc_fos_leader_second();
new spell_shield_of_bones();
}

View File

@@ -7,68 +7,68 @@ REWRITTEN FROM SCRATCH BY PUSSYWIZARD, IT OWNS NOW!
enum Data
{
DATA_BRONJAHM,
DATA_DEVOURER,
MAX_ENCOUNTER,
DATA_BRONJAHM,
DATA_DEVOURER,
MAX_ENCOUNTER,
};
enum Creatures
{
NPC_BRONJAHM = 36497,
NPC_DEVOURER = 36502,
NPC_BRONJAHM = 36497,
NPC_DEVOURER = 36502,
NPC_SYLVANAS_PART1 = 37596,
NPC_SYLVANAS_PART2 = 38161,
NPC_JAINA_PART1 = 37597,
NPC_JAINA_PART2 = 38160,
NPC_KALIRA = 37583,
NPC_ELANDRA = 37774,
NPC_LORALEN = 37779,
NPC_KORELN = 37582,
NPC_SYLVANAS_PART1 = 37596,
NPC_SYLVANAS_PART2 = 38161,
NPC_JAINA_PART1 = 37597,
NPC_JAINA_PART2 = 38160,
NPC_KALIRA = 37583,
NPC_ELANDRA = 37774,
NPC_LORALEN = 37779,
NPC_KORELN = 37582,
NPC_CHAMPION_1_HORDE = 37584,
NPC_CHAMPION_2_HORDE = 37587,
NPC_CHAMPION_3_HORDE = 37588,
NPC_CHAMPION_1_ALLIANCE = 37496,
NPC_CHAMPION_2_ALLIANCE = 37497,
NPC_CHAMPION_1_HORDE = 37584,
NPC_CHAMPION_2_HORDE = 37587,
NPC_CHAMPION_3_HORDE = 37588,
NPC_CHAMPION_1_ALLIANCE = 37496,
NPC_CHAMPION_2_ALLIANCE = 37497,
};
// OUTRO:
struct outroPosition
{
uint32 entry[2];
Position startPosition;
uint32 pathId;
uint32 entry[2];
Position startPosition;
uint32 pathId;
};
#define PATH_BEGIN_VALUE 3000100
const outroPosition outroPositions[] =
{
{ { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 5590.47f, 2427.79f, 705.935f, 0.802851f }, PATH_BEGIN_VALUE+14 },
{ { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 5593.59f, 2428.34f, 705.935f, 0.977384f }, PATH_BEGIN_VALUE+15 },
{ { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 5600.81f, 2429.31f, 705.935f, 0.890118f }, PATH_BEGIN_VALUE+5 },
{ { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 5600.81f, 2421.12f, 705.935f, 0.890118f }, PATH_BEGIN_VALUE+18 },
{ { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 5601.43f, 2426.53f, 705.935f, 0.890118f }, PATH_BEGIN_VALUE+6 },
{ { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 5601.55f, 2418.36f, 705.935f, 1.15192f }, PATH_BEGIN_VALUE+17 },
{ { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 5598, 2429.14f, 705.935f, 1.0472f }, PATH_BEGIN_VALUE+4 },
{ { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 5594.04f, 2424.87f, 705.935f, 1.15192f }, PATH_BEGIN_VALUE+16 },
{ { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 5597.89f, 2421.54f, 705.935f, 0.610865f }, PATH_BEGIN_VALUE+19 },
{ { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_2_HORDE }, { 5598.57f, 2434.62f, 705.935f, 1.13446f }, PATH_BEGIN_VALUE+2 },
{ { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_2_HORDE }, { 5585.46f, 2417.99f, 705.935f, 1.06465f }, PATH_BEGIN_VALUE+12 },
{ { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_2_HORDE }, { 5605.81f, 2428.42f, 705.935f, 0.820305f }, PATH_BEGIN_VALUE+3 },
{ { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_2_HORDE }, { 5591.61f, 2412.66f, 705.935f, 0.925025f }, PATH_BEGIN_VALUE+11 },
{ { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_2_HORDE }, { 5593.9f, 2410.64f, 705.935f, 0.872665f }, PATH_BEGIN_VALUE+10 },
{ { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_2_HORDE }, { 5586.76f, 2416.73f, 705.935f, 0.942478f }, PATH_BEGIN_VALUE+13 },
{ { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_3_HORDE }, { 5592.23f, 2419.14f, 705.935f, 0.855211f }, PATH_BEGIN_VALUE+8 },
{ { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_3_HORDE }, { 5594.61f, 2416.87f, 705.935f, 0.907571f }, PATH_BEGIN_VALUE+7 },
{ { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_3_HORDE }, { 5589.77f, 2421.03f, 705.935f, 0.855211f }, PATH_BEGIN_VALUE+9 },
{ { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 5590.47f, 2427.79f, 705.935f, 0.802851f }, PATH_BEGIN_VALUE+14 },
{ { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 5593.59f, 2428.34f, 705.935f, 0.977384f }, PATH_BEGIN_VALUE+15 },
{ { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 5600.81f, 2429.31f, 705.935f, 0.890118f }, PATH_BEGIN_VALUE+5 },
{ { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 5600.81f, 2421.12f, 705.935f, 0.890118f }, PATH_BEGIN_VALUE+18 },
{ { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 5601.43f, 2426.53f, 705.935f, 0.890118f }, PATH_BEGIN_VALUE+6 },
{ { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 5601.55f, 2418.36f, 705.935f, 1.15192f }, PATH_BEGIN_VALUE+17 },
{ { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 5598, 2429.14f, 705.935f, 1.0472f }, PATH_BEGIN_VALUE+4 },
{ { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 5594.04f, 2424.87f, 705.935f, 1.15192f }, PATH_BEGIN_VALUE+16 },
{ { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 5597.89f, 2421.54f, 705.935f, 0.610865f }, PATH_BEGIN_VALUE+19 },
{ { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_2_HORDE }, { 5598.57f, 2434.62f, 705.935f, 1.13446f }, PATH_BEGIN_VALUE+2 },
{ { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_2_HORDE }, { 5585.46f, 2417.99f, 705.935f, 1.06465f }, PATH_BEGIN_VALUE+12 },
{ { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_2_HORDE }, { 5605.81f, 2428.42f, 705.935f, 0.820305f }, PATH_BEGIN_VALUE+3 },
{ { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_2_HORDE }, { 5591.61f, 2412.66f, 705.935f, 0.925025f }, PATH_BEGIN_VALUE+11 },
{ { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_2_HORDE }, { 5593.9f, 2410.64f, 705.935f, 0.872665f }, PATH_BEGIN_VALUE+10 },
{ { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_2_HORDE }, { 5586.76f, 2416.73f, 705.935f, 0.942478f }, PATH_BEGIN_VALUE+13 },
{ { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_3_HORDE }, { 5592.23f, 2419.14f, 705.935f, 0.855211f }, PATH_BEGIN_VALUE+8 },
{ { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_3_HORDE }, { 5594.61f, 2416.87f, 705.935f, 0.907571f }, PATH_BEGIN_VALUE+7 },
{ { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_3_HORDE }, { 5589.77f, 2421.03f, 705.935f, 0.855211f }, PATH_BEGIN_VALUE+9 },
{ { NPC_KORELN, NPC_LORALEN }, { 5602.58f, 2435.95f, 705.935f, 0.959931f }, PATH_BEGIN_VALUE+0 },
{ { NPC_ELANDRA, NPC_KALIRA }, { 5606.13f, 2433.16f, 705.935f, 0.785398f }, PATH_BEGIN_VALUE+1 },
{ { NPC_KORELN, NPC_LORALEN }, { 5602.58f, 2435.95f, 705.935f, 0.959931f }, PATH_BEGIN_VALUE+0 },
{ { NPC_ELANDRA, NPC_KALIRA }, { 5606.13f, 2433.16f, 705.935f, 0.785398f }, PATH_BEGIN_VALUE+1 },
{ { 0, 0 }, { 0.0f, 0.0f, 0.0f, 0.0f }, 0 }
{ { 0, 0 }, { 0.0f, 0.0f, 0.0f, 0.0f }, 0 }
};
const Position outroSpawnPoint = {5618.139f, 2451.873f, 705.854f, 0.0f};

View File

@@ -10,225 +10,225 @@ REWRITTEN FROM SCRATCH BY PUSSYWIZARD, IT OWNS NOW!
class instance_forge_of_souls : public InstanceMapScript
{
public:
instance_forge_of_souls() : InstanceMapScript("instance_forge_of_souls", 632) { }
instance_forge_of_souls() : InstanceMapScript("instance_forge_of_souls", 632) { }
InstanceScript* GetInstanceScript(InstanceMap *map) const
{
return new instance_forge_of_souls_InstanceScript(map);
}
InstanceScript* GetInstanceScript(InstanceMap *map) const
{
return new instance_forge_of_souls_InstanceScript(map);
}
struct instance_forge_of_souls_InstanceScript : public InstanceScript
{
instance_forge_of_souls_InstanceScript(Map* map) : InstanceScript(map) {}
struct instance_forge_of_souls_InstanceScript : public InstanceScript
{
instance_forge_of_souls_InstanceScript(Map* map) : InstanceScript(map) {}
uint32 m_auiEncounter[MAX_ENCOUNTER];
TeamId teamIdInInstance;
std::string str_data;
uint64 NPC_BronjahmGUID;
uint64 NPC_DevourerGUID;
uint32 m_auiEncounter[MAX_ENCOUNTER];
TeamId teamIdInInstance;
std::string str_data;
uint64 NPC_BronjahmGUID;
uint64 NPC_DevourerGUID;
uint64 NPC_LeaderFirstGUID;
uint64 NPC_LeaderSecondGUID;
uint64 NPC_GuardFirstGUID;
uint64 NPC_GuardSecondGUID;
uint64 NPC_LeaderFirstGUID;
uint64 NPC_LeaderSecondGUID;
uint64 NPC_GuardFirstGUID;
uint64 NPC_GuardSecondGUID;
void Initialize()
{
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
teamIdInInstance = TEAM_NEUTRAL;
NPC_BronjahmGUID = 0;
NPC_DevourerGUID = 0;
void Initialize()
{
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
teamIdInInstance = TEAM_NEUTRAL;
NPC_BronjahmGUID = 0;
NPC_DevourerGUID = 0;
NPC_LeaderFirstGUID = 0;
NPC_LeaderSecondGUID = 0;
NPC_GuardFirstGUID = 0;
NPC_GuardSecondGUID = 0;
}
NPC_LeaderFirstGUID = 0;
NPC_LeaderSecondGUID = 0;
NPC_GuardFirstGUID = 0;
NPC_GuardSecondGUID = 0;
}
bool IsEncounterInProgress() const
{
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS) return true;
bool IsEncounterInProgress() const
{
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS) return true;
return false;
}
return false;
}
void OnPlayerEnter(Player* /*plr*/)
{
// this will happen only after crash and loading the instance from db
if (m_auiEncounter[0] == DONE && m_auiEncounter[1] == DONE && (!NPC_LeaderSecondGUID || !instance->GetCreature(NPC_LeaderSecondGUID)))
{
Position pos = {5658.15f, 2502.564f, 708.83f, 0.885207f};
instance->SummonCreature(NPC_SYLVANAS_PART2, pos);
}
}
void OnPlayerEnter(Player* /*plr*/)
{
// this will happen only after crash and loading the instance from db
if (m_auiEncounter[0] == DONE && m_auiEncounter[1] == DONE && (!NPC_LeaderSecondGUID || !instance->GetCreature(NPC_LeaderSecondGUID)))
{
Position pos = {5658.15f, 2502.564f, 708.83f, 0.885207f};
instance->SummonCreature(NPC_SYLVANAS_PART2, pos);
}
}
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 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_BRONJAHM:
NPC_BronjahmGUID = creature->GetGUID();
break;
case NPC_DEVOURER:
NPC_DevourerGUID = creature->GetGUID();
break;
case NPC_SYLVANAS_PART1:
if (teamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_JAINA_PART1);
NPC_LeaderFirstGUID = creature->GetGUID();
switch (creature->GetEntry())
{
case NPC_BRONJAHM:
NPC_BronjahmGUID = creature->GetGUID();
break;
case NPC_DEVOURER:
NPC_DevourerGUID = creature->GetGUID();
break;
case NPC_SYLVANAS_PART1:
if (teamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_JAINA_PART1);
NPC_LeaderFirstGUID = creature->GetGUID();
if (m_auiEncounter[0] == DONE && m_auiEncounter[1] == DONE)
creature->SetVisible(false);
break;
case NPC_SYLVANAS_PART2:
if (teamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_JAINA_PART2);
NPC_LeaderSecondGUID = creature->GetGUID();
break;
case NPC_LORALEN:
if (teamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_ELANDRA);
if (!NPC_GuardFirstGUID)
{
NPC_GuardFirstGUID = creature->GetGUID();
if (m_auiEncounter[0] == DONE && m_auiEncounter[1] == DONE)
creature->SetVisible(false);
}
break;
case NPC_KALIRA:
if (teamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_KORELN);
if (!NPC_GuardSecondGUID)
{
NPC_GuardSecondGUID = creature->GetGUID();
if (m_auiEncounter[0] == DONE && m_auiEncounter[1] == DONE)
creature->SetVisible(false);
}
break;
}
}
if (m_auiEncounter[0] == DONE && m_auiEncounter[1] == DONE)
creature->SetVisible(false);
break;
case NPC_SYLVANAS_PART2:
if (teamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_JAINA_PART2);
NPC_LeaderSecondGUID = creature->GetGUID();
break;
case NPC_LORALEN:
if (teamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_ELANDRA);
if (!NPC_GuardFirstGUID)
{
NPC_GuardFirstGUID = creature->GetGUID();
if (m_auiEncounter[0] == DONE && m_auiEncounter[1] == DONE)
creature->SetVisible(false);
}
break;
case NPC_KALIRA:
if (teamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_KORELN);
if (!NPC_GuardSecondGUID)
{
NPC_GuardSecondGUID = creature->GetGUID();
if (m_auiEncounter[0] == DONE && m_auiEncounter[1] == DONE)
creature->SetVisible(false);
}
break;
}
}
void HandleOutro()
{
if (!NPC_LeaderSecondGUID || !instance->GetCreature(NPC_LeaderSecondGUID))
if (Creature* leader = instance->SummonCreature(NPC_SYLVANAS_PART2, outroSpawnPoint))
if (Creature* boss = instance->GetCreature(NPC_DevourerGUID))
{
float angle = boss->GetAngle(leader);
leader->GetMotionMaster()->MovePoint(1, boss->GetPositionX()+10.0f*cos(angle), boss->GetPositionY()+10.0f*sin(angle), boss->GetPositionZ());
}
void HandleOutro()
{
if (!NPC_LeaderSecondGUID || !instance->GetCreature(NPC_LeaderSecondGUID))
if (Creature* leader = instance->SummonCreature(NPC_SYLVANAS_PART2, outroSpawnPoint))
if (Creature* boss = instance->GetCreature(NPC_DevourerGUID))
{
float angle = boss->GetAngle(leader);
leader->GetMotionMaster()->MovePoint(1, boss->GetPositionX()+10.0f*cos(angle), boss->GetPositionY()+10.0f*sin(angle), boss->GetPositionZ());
}
for (int8 i = 0; outroPositions[i].entry[teamIdInInstance] != 0; ++i)
if (Creature* summon = instance->SummonCreature(outroPositions[i].entry[teamIdInInstance], outroPositions[i].startPosition))
summon->GetMotionMaster()->MovePath(outroPositions[i].pathId, false);
}
for (int8 i = 0; outroPositions[i].entry[teamIdInInstance] != 0; ++i)
if (Creature* summon = instance->SummonCreature(outroPositions[i].entry[teamIdInInstance], outroPositions[i].startPosition))
summon->GetMotionMaster()->MovePath(outroPositions[i].pathId, false);
}
void SetData(uint32 type, uint32 data)
{
switch(type)
{
case DATA_BRONJAHM:
m_auiEncounter[type] = data;
break;
case DATA_DEVOURER:
m_auiEncounter[type] = data;
if (m_auiEncounter[0] == DONE && m_auiEncounter[1] == DONE)
HandleOutro();
break;
}
void SetData(uint32 type, uint32 data)
{
switch(type)
{
case DATA_BRONJAHM:
m_auiEncounter[type] = data;
break;
case DATA_DEVOURER:
m_auiEncounter[type] = data;
if (m_auiEncounter[0] == DONE && m_auiEncounter[1] == DONE)
HandleOutro();
break;
}
if (data == DONE)
SaveToDB();
}
if (data == DONE)
SaveToDB();
}
uint64 GetData64(uint32 type) const
{
switch (type)
{
case DATA_BRONJAHM: return NPC_BronjahmGUID;
}
uint64 GetData64(uint32 type) const
{
switch (type)
{
case DATA_BRONJAHM: return NPC_BronjahmGUID;
}
return 0;
}
return 0;
}
bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* source, Unit const* target = NULL, uint32 miscvalue1 = 0)
{
switch(criteria_id)
{
case 12752: // Soul Power
if( Creature* c = instance->GetCreature(NPC_BronjahmGUID) )
{
std::list<Creature*> L;
uint8 count = 0;
c->GetCreaturesWithEntryInRange(L, 200.0f, 36535); // find all Corrupted Soul Fragment (36535)
for( std::list<Creature*>::const_iterator itr = L.begin(); itr != L.end(); ++itr )
if( (*itr)->IsAlive() )
++count;
return (count >= 4);
}
break;
case 12976:
if( Creature* c = instance->GetCreature(NPC_DevourerGUID) )
return (bool)c->AI()->GetData(1);
break;
}
return false;
}
bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* source, Unit const* target = NULL, uint32 miscvalue1 = 0)
{
switch(criteria_id)
{
case 12752: // Soul Power
if( Creature* c = instance->GetCreature(NPC_BronjahmGUID) )
{
std::list<Creature*> L;
uint8 count = 0;
c->GetCreaturesWithEntryInRange(L, 200.0f, 36535); // find all Corrupted Soul Fragment (36535)
for( std::list<Creature*>::const_iterator itr = L.begin(); itr != L.end(); ++itr )
if( (*itr)->IsAlive() )
++count;
return (count >= 4);
}
break;
case 12976:
if( Creature* c = instance->GetCreature(NPC_DevourerGUID) )
return (bool)c->AI()->GetData(1);
break;
}
return false;
}
std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << "F S " << m_auiEncounter[0] << ' ' << m_auiEncounter[1];
str_data = saveStream.str();
std::ostringstream saveStream;
saveStream << "F S " << m_auiEncounter[0] << ' ' << m_auiEncounter[1];
str_data = saveStream.str();
OUT_SAVE_INST_DATA_COMPLETE;
return str_data;
}
OUT_SAVE_INST_DATA_COMPLETE;
return str_data;
}
void Load(const char* in)
{
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
void Load(const char* in)
{
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(in);
OUT_LOAD_INST_DATA(in);
char dataHead1, dataHead2;
uint32 data0, data1;
char dataHead1, dataHead2;
uint32 data0, data1;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2 >> data0 >> data1;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2 >> data0 >> data1;
if (dataHead1 == 'F' && dataHead2 == 'S')
{
m_auiEncounter[0] = data0;
m_auiEncounter[1] = data1;
if (dataHead1 == 'F' && dataHead2 == 'S')
{
m_auiEncounter[0] = data0;
m_auiEncounter[1] = data1;
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS)
m_auiEncounter[i] = NOT_STARTED;
}
else OUT_LOAD_INST_DATA_FAIL;
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS)
m_auiEncounter[i] = NOT_STARTED;
}
else OUT_LOAD_INST_DATA_FAIL;
OUT_LOAD_INST_DATA_COMPLETE;
}
};
OUT_LOAD_INST_DATA_COMPLETE;
}
};
};
void AddSC_instance_forge_of_souls()
{
new instance_forge_of_souls();
new instance_forge_of_souls();
}

View File

@@ -7,28 +7,28 @@ REWRITTEN FROM SCRATCH BY PUSSYWIZARD, IT OWNS NOW!
enum Yells
{
SAY_AGGRO = 50,
SAY_SLAY_1 = 51,
SAY_SLAY_2 = 52,
SAY_DEATH = 53,
SAY_IMPENDING_DESPAIR = 54,
SAY_DEFILING_HORROR = 55,
SAY_AGGRO = 50,
SAY_SLAY_1 = 51,
SAY_SLAY_2 = 52,
SAY_DEATH = 53,
SAY_IMPENDING_DESPAIR = 54,
SAY_DEFILING_HORROR = 55,
};
enum Spells
{
SPELL_QUIVERING_STRIKE = 72422,
SPELL_IMPENDING_DESPAIR = 72426,
SPELL_DEFILING_HORROR = 72435,
SPELL_QUIVERING_STRIKE = 72422,
SPELL_IMPENDING_DESPAIR = 72426,
SPELL_DEFILING_HORROR = 72435,
};
enum Events
{
EVENT_NONE,
EVENT_QUIVERING_STRIKE,
EVENT_IMPENDING_DESPAIR,
EVENT_DEFILING_HORROR,
EVENT_UNROOT,
EVENT_NONE,
EVENT_QUIVERING_STRIKE,
EVENT_IMPENDING_DESPAIR,
EVENT_DEFILING_HORROR,
EVENT_UNROOT,
};
const uint32 hopelessnessId[3][2] = { {72395, 72390}, {72396, 72391}, {72397, 72393} };
@@ -36,138 +36,138 @@ const uint32 hopelessnessId[3][2] = { {72395, 72390}, {72396, 72391}, {72397, 72
class boss_falric : public CreatureScript
{
public:
boss_falric() : CreatureScript("boss_falric") { }
boss_falric() : CreatureScript("boss_falric") { }
struct boss_falricAI : public ScriptedAI
{
boss_falricAI(Creature* creature) : ScriptedAI(creature)
{
pInstance = creature->GetInstanceScript();
}
struct boss_falricAI : public ScriptedAI
{
boss_falricAI(Creature* creature) : ScriptedAI(creature)
{
pInstance = creature->GetInstanceScript();
}
InstanceScript* pInstance;
EventMap events;
uint8 uiHopelessnessCount;
uint16 startFightTimer;
InstanceScript* pInstance;
EventMap events;
uint8 uiHopelessnessCount;
uint16 startFightTimer;
void Reset()
{
startFightTimer = 0;
uiHopelessnessCount = 0;
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
me->SetControlled(false, UNIT_STATE_ROOT);
events.Reset();
if (pInstance)
pInstance->SetData(DATA_FALRIC, NOT_STARTED);
}
void Reset()
{
startFightTimer = 0;
uiHopelessnessCount = 0;
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
me->SetControlled(false, UNIT_STATE_ROOT);
events.Reset();
if (pInstance)
pInstance->SetData(DATA_FALRIC, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/)
{
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
void EnterCombat(Unit* /*who*/)
{
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
events.ScheduleEvent(EVENT_QUIVERING_STRIKE, 5000);
events.ScheduleEvent(EVENT_IMPENDING_DESPAIR, 11000);
events.ScheduleEvent(EVENT_DEFILING_HORROR, 20000);
}
events.ScheduleEvent(EVENT_QUIVERING_STRIKE, 5000);
events.ScheduleEvent(EVENT_IMPENDING_DESPAIR, 11000);
events.ScheduleEvent(EVENT_DEFILING_HORROR, 20000);
}
void DoAction(int32 a)
{
if (a == 1)
{
Talk(SAY_AGGRO);
startFightTimer = 8000;
}
}
void DoAction(int32 a)
{
if (a == 1)
{
Talk(SAY_AGGRO);
startFightTimer = 8000;
}
}
void UpdateAI(uint32 diff)
{
if (startFightTimer)
{
if (startFightTimer <= diff)
{
startFightTimer = 0;
me->SetInCombatWithZone();
}
else
startFightTimer -= diff;
}
void UpdateAI(uint32 diff)
{
if (startFightTimer)
{
if (startFightTimer <= diff)
{
startFightTimer = 0;
me->SetInCombatWithZone();
}
else
startFightTimer -= diff;
}
if (!UpdateVictim())
return;
if (!UpdateVictim())
return;
events.Update(diff);
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case EVENT_QUIVERING_STRIKE:
me->CastSpell(me->GetVictim(), SPELL_QUIVERING_STRIKE, false);
events.ScheduleEvent(EVENT_QUIVERING_STRIKE, 5000);
break;
case EVENT_IMPENDING_DESPAIR:
if (Unit* target = SelectTargetFromPlayerList(45.0f, 0, true))
{
Talk(SAY_IMPENDING_DESPAIR);
me->CastSpell(target, SPELL_IMPENDING_DESPAIR, false);
}
events.ScheduleEvent(EVENT_IMPENDING_DESPAIR, 12000);
break;
case EVENT_DEFILING_HORROR:
Talk(SAY_DEFILING_HORROR);
me->CastSpell((Unit*)NULL, SPELL_DEFILING_HORROR, false);
me->SetControlled(true, UNIT_STATE_ROOT);
events.DelayEventsToMax(5000, 0);
events.ScheduleEvent(EVENT_UNROOT, 4000);
events.ScheduleEvent(EVENT_DEFILING_HORROR, 20000);
break;
case EVENT_UNROOT:
me->SetControlled(false, UNIT_STATE_ROOT);
break;
}
switch (events.ExecuteEvent())
{
case EVENT_QUIVERING_STRIKE:
me->CastSpell(me->GetVictim(), SPELL_QUIVERING_STRIKE, false);
events.ScheduleEvent(EVENT_QUIVERING_STRIKE, 5000);
break;
case EVENT_IMPENDING_DESPAIR:
if (Unit* target = SelectTargetFromPlayerList(45.0f, 0, true))
{
Talk(SAY_IMPENDING_DESPAIR);
me->CastSpell(target, SPELL_IMPENDING_DESPAIR, false);
}
events.ScheduleEvent(EVENT_IMPENDING_DESPAIR, 12000);
break;
case EVENT_DEFILING_HORROR:
Talk(SAY_DEFILING_HORROR);
me->CastSpell((Unit*)NULL, SPELL_DEFILING_HORROR, false);
me->SetControlled(true, UNIT_STATE_ROOT);
events.DelayEventsToMax(5000, 0);
events.ScheduleEvent(EVENT_UNROOT, 4000);
events.ScheduleEvent(EVENT_DEFILING_HORROR, 20000);
break;
case EVENT_UNROOT:
me->SetControlled(false, UNIT_STATE_ROOT);
break;
}
if ((uiHopelessnessCount == 0 && HealthBelowPct(67)) || (uiHopelessnessCount == 1 && HealthBelowPct(34)) || (uiHopelessnessCount == 2 && HealthBelowPct(11)))
{
if (uiHopelessnessCount)
me->RemoveOwnedAura(hopelessnessId[uiHopelessnessCount-1][DUNGEON_MODE(0, 1)]);
me->CastSpell((Unit*)NULL, hopelessnessId[uiHopelessnessCount][DUNGEON_MODE(0, 1)], true);
++uiHopelessnessCount;
}
if ((uiHopelessnessCount == 0 && HealthBelowPct(67)) || (uiHopelessnessCount == 1 && HealthBelowPct(34)) || (uiHopelessnessCount == 2 && HealthBelowPct(11)))
{
if (uiHopelessnessCount)
me->RemoveOwnedAura(hopelessnessId[uiHopelessnessCount-1][DUNGEON_MODE(0, 1)]);
me->CastSpell((Unit*)NULL, hopelessnessId[uiHopelessnessCount][DUNGEON_MODE(0, 1)], true);
++uiHopelessnessCount;
}
if (!me->HasUnitState(UNIT_STATE_ROOT))
DoMeleeAttackIfReady();
}
if (!me->HasUnitState(UNIT_STATE_ROOT))
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*killer*/)
{
Talk(SAY_DEATH);
if (pInstance)
pInstance->SetData(DATA_FALRIC, DONE);
}
void JustDied(Unit* /*killer*/)
{
Talk(SAY_DEATH);
if (pInstance)
pInstance->SetData(DATA_FALRIC, DONE);
}
void KilledUnit(Unit* who)
{
if (who->GetTypeId() == TYPEID_PLAYER)
Talk(RAND(SAY_SLAY_1, SAY_SLAY_2));
}
void KilledUnit(Unit* who)
{
if (who->GetTypeId() == TYPEID_PLAYER)
Talk(RAND(SAY_SLAY_1, SAY_SLAY_2));
}
void EnterEvadeMode()
{
me->SetControlled(false, UNIT_STATE_ROOT);
ScriptedAI::EnterEvadeMode();
if (startFightTimer)
Reset();
}
};
void EnterEvadeMode()
{
me->SetControlled(false, UNIT_STATE_ROOT);
ScriptedAI::EnterEvadeMode();
if (startFightTimer)
Reset();
}
};
CreatureAI* GetAI(Creature* creature) const
{
return new boss_falricAI(creature);
}
CreatureAI* GetAI(Creature* creature) const
{
return new boss_falricAI(creature);
}
};
void AddSC_boss_falric()
{
new boss_falric();
new boss_falric();
}

View File

@@ -7,198 +7,198 @@ REWRITTEN FROM SCRATCH BY PUSSYWIZARD, IT OWNS NOW!
enum Yells
{
SAY_AGGRO = 60,
SAY_SLAY_1 = 61,
SAY_SLAY_2 = 62,
SAY_DEATH = 63,
SAY_CORRUPTED_FLESH_1 = 64,
SAY_CORRUPTED_FLESH_2 = 65,
SAY_AGGRO = 60,
SAY_SLAY_1 = 61,
SAY_SLAY_2 = 62,
SAY_DEATH = 63,
SAY_CORRUPTED_FLESH_1 = 64,
SAY_CORRUPTED_FLESH_2 = 65,
};
enum Spells
{
SPELL_OBLITERATE = 72360,
SPELL_WELL_OF_CORRUPTION = 72362,
SPELL_CORRUPTED_FLESH = 72363,
SPELL_SHARED_SUFFERING = 72368,
SPELL_OBLITERATE = 72360,
SPELL_WELL_OF_CORRUPTION = 72362,
SPELL_CORRUPTED_FLESH = 72363,
SPELL_SHARED_SUFFERING = 72368,
};
enum Events
{
EVENT_NONE,
EVENT_OBLITERATE,
EVENT_WELL_OF_CORRUPTION,
EVENT_CORRUPTED_FLESH,
EVENT_SHARED_SUFFERING,
EVENT_NONE,
EVENT_OBLITERATE,
EVENT_WELL_OF_CORRUPTION,
EVENT_CORRUPTED_FLESH,
EVENT_SHARED_SUFFERING,
};
class boss_marwyn : public CreatureScript
{
public:
boss_marwyn() : CreatureScript("boss_marwyn") { }
boss_marwyn() : CreatureScript("boss_marwyn") { }
struct boss_marwynAI : public ScriptedAI
{
boss_marwynAI(Creature* creature) : ScriptedAI(creature)
{
pInstance = creature->GetInstanceScript();
}
struct boss_marwynAI : public ScriptedAI
{
boss_marwynAI(Creature* creature) : ScriptedAI(creature)
{
pInstance = creature->GetInstanceScript();
}
InstanceScript* pInstance;
EventMap events;
uint16 startFightTimer;
InstanceScript* pInstance;
EventMap events;
uint16 startFightTimer;
void Reset()
{
startFightTimer = 0;
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
events.Reset();
if (pInstance)
pInstance->SetData(DATA_MARWYN, NOT_STARTED);
}
void Reset()
{
startFightTimer = 0;
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
events.Reset();
if (pInstance)
pInstance->SetData(DATA_MARWYN, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/)
{
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
void EnterCombat(Unit* /*who*/)
{
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
events.ScheduleEvent(EVENT_OBLITERATE, 15000);
events.ScheduleEvent(EVENT_WELL_OF_CORRUPTION, 13000);
events.ScheduleEvent(EVENT_CORRUPTED_FLESH, 20000);
events.ScheduleEvent(EVENT_SHARED_SUFFERING, 5000);
}
events.ScheduleEvent(EVENT_OBLITERATE, 15000);
events.ScheduleEvent(EVENT_WELL_OF_CORRUPTION, 13000);
events.ScheduleEvent(EVENT_CORRUPTED_FLESH, 20000);
events.ScheduleEvent(EVENT_SHARED_SUFFERING, 5000);
}
void DoAction(int32 a)
{
if (a == 1)
{
Talk(SAY_AGGRO);
startFightTimer = 8000;
}
}
void DoAction(int32 a)
{
if (a == 1)
{
Talk(SAY_AGGRO);
startFightTimer = 8000;
}
}
void UpdateAI(uint32 diff)
{
if (startFightTimer)
{
if (startFightTimer <= diff)
{
startFightTimer = 0;
me->SetInCombatWithZone();
}
else
startFightTimer -= diff;
}
void UpdateAI(uint32 diff)
{
if (startFightTimer)
{
if (startFightTimer <= diff)
{
startFightTimer = 0;
me->SetInCombatWithZone();
}
else
startFightTimer -= diff;
}
if (!UpdateVictim())
return;
if (!UpdateVictim())
return;
events.Update(diff);
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case EVENT_OBLITERATE:
if (me->IsWithinMeleeRange(me->GetVictim()))
{
me->CastSpell(me->GetVictim(), SPELL_OBLITERATE, false);
events.ScheduleEvent(EVENT_OBLITERATE, 15000);
}
else
events.ScheduleEvent(EVENT_OBLITERATE, 3000);
break;
case EVENT_WELL_OF_CORRUPTION:
if (Unit* target = SelectTargetFromPlayerList(40.0f, 0, true))
me->CastSpell(target, SPELL_WELL_OF_CORRUPTION, false);
events.ScheduleEvent(EVENT_WELL_OF_CORRUPTION, 13000);
break;
case EVENT_CORRUPTED_FLESH:
Talk(RAND(SAY_CORRUPTED_FLESH_1, SAY_CORRUPTED_FLESH_2));
me->CastSpell((Unit*)NULL, SPELL_CORRUPTED_FLESH, false);
events.ScheduleEvent(EVENT_CORRUPTED_FLESH, 20000);
break;
case EVENT_SHARED_SUFFERING:
if (Unit* target = SelectTargetFromPlayerList(200.0f, 0, true))
me->CastSpell(target, SPELL_SHARED_SUFFERING, true);
events.ScheduleEvent(EVENT_SHARED_SUFFERING, 15000);
break;
}
switch (events.ExecuteEvent())
{
case EVENT_OBLITERATE:
if (me->IsWithinMeleeRange(me->GetVictim()))
{
me->CastSpell(me->GetVictim(), SPELL_OBLITERATE, false);
events.ScheduleEvent(EVENT_OBLITERATE, 15000);
}
else
events.ScheduleEvent(EVENT_OBLITERATE, 3000);
break;
case EVENT_WELL_OF_CORRUPTION:
if (Unit* target = SelectTargetFromPlayerList(40.0f, 0, true))
me->CastSpell(target, SPELL_WELL_OF_CORRUPTION, false);
events.ScheduleEvent(EVENT_WELL_OF_CORRUPTION, 13000);
break;
case EVENT_CORRUPTED_FLESH:
Talk(RAND(SAY_CORRUPTED_FLESH_1, SAY_CORRUPTED_FLESH_2));
me->CastSpell((Unit*)NULL, SPELL_CORRUPTED_FLESH, false);
events.ScheduleEvent(EVENT_CORRUPTED_FLESH, 20000);
break;
case EVENT_SHARED_SUFFERING:
if (Unit* target = SelectTargetFromPlayerList(200.0f, 0, true))
me->CastSpell(target, SPELL_SHARED_SUFFERING, true);
events.ScheduleEvent(EVENT_SHARED_SUFFERING, 15000);
break;
}
DoMeleeAttackIfReady();
}
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*killer*/)
{
Talk(SAY_DEATH);
if (pInstance)
pInstance->SetData(DATA_MARWYN, DONE);
}
void JustDied(Unit* /*killer*/)
{
Talk(SAY_DEATH);
if (pInstance)
pInstance->SetData(DATA_MARWYN, DONE);
}
void KilledUnit(Unit* who)
{
if (who->GetTypeId() == TYPEID_PLAYER)
Talk(RAND(SAY_SLAY_1, SAY_SLAY_2));
}
void KilledUnit(Unit* who)
{
if (who->GetTypeId() == TYPEID_PLAYER)
Talk(RAND(SAY_SLAY_1, SAY_SLAY_2));
}
void EnterEvadeMode()
{
ScriptedAI::EnterEvadeMode();
if (startFightTimer)
Reset();
}
};
void EnterEvadeMode()
{
ScriptedAI::EnterEvadeMode();
if (startFightTimer)
Reset();
}
};
CreatureAI* GetAI(Creature* creature) const
{
return new boss_marwynAI(creature);
}
CreatureAI* GetAI(Creature* creature) const
{
return new boss_marwynAI(creature);
}
};
class spell_hor_shared_suffering : public SpellScriptLoader
{
public:
spell_hor_shared_suffering() : SpellScriptLoader("spell_hor_shared_suffering") { }
spell_hor_shared_suffering() : SpellScriptLoader("spell_hor_shared_suffering") { }
class spell_hor_shared_sufferingAuraScript : public AuraScript
{
PrepareAuraScript(spell_hor_shared_sufferingAuraScript);
class spell_hor_shared_sufferingAuraScript : public AuraScript
{
PrepareAuraScript(spell_hor_shared_sufferingAuraScript);
void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes mode)
{
if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_ENEMY_SPELL) // dispelled
if (Unit* caster = GetCaster())
if (Map* map = caster->FindMap())
if (Aura* a = aurEff->GetBase())
{
uint32 count = 0;
uint32 ticks = 0;
uint32 dmgPerTick = a->GetSpellInfo()->Effects[0].BasePoints;
Map::PlayerList const& pl = map->GetPlayers();
for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr)
if (Player* p = itr->GetSource())
if (p->IsAlive())
++count;
ticks = (a->GetDuration() / int32(a->GetSpellInfo()->Effects[0].Amplitude)) + 1;
int32 dmg = (ticks*dmgPerTick)/count;
caster->CastCustomSpell(GetTarget(), 72373, NULL, &dmg, NULL, true);
}
}
void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes mode)
{
if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_ENEMY_SPELL) // dispelled
if (Unit* caster = GetCaster())
if (Map* map = caster->FindMap())
if (Aura* a = aurEff->GetBase())
{
uint32 count = 0;
uint32 ticks = 0;
uint32 dmgPerTick = a->GetSpellInfo()->Effects[0].BasePoints;
Map::PlayerList const& pl = map->GetPlayers();
for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr)
if (Player* p = itr->GetSource())
if (p->IsAlive())
++count;
ticks = (a->GetDuration() / int32(a->GetSpellInfo()->Effects[0].Amplitude)) + 1;
int32 dmg = (ticks*dmgPerTick)/count;
caster->CastCustomSpell(GetTarget(), 72373, NULL, &dmg, NULL, true);
}
}
void Register()
{
AfterEffectRemove += AuraEffectRemoveFn(spell_hor_shared_sufferingAuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL);
}
};
void Register()
{
AfterEffectRemove += AuraEffectRemoveFn(spell_hor_shared_sufferingAuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL);
}
};
AuraScript* GetAuraScript() const
{
return new spell_hor_shared_sufferingAuraScript();
}
AuraScript* GetAuraScript() const
{
return new spell_hor_shared_sufferingAuraScript();
}
};
void AddSC_boss_marwyn()
{
new boss_marwyn();
new spell_hor_shared_suffering();
new boss_marwyn();
new spell_hor_shared_suffering();
}

View File

@@ -7,88 +7,88 @@ REWRITTEN FROM SCRATCH BY PUSSYWIZARD, IT OWNS NOW!
enum Data
{
DATA_INTRO,
DATA_FALRIC,
DATA_MARWYN,
DATA_FROSTSWORN_GENERAL,
DATA_LK_INTRO,
DATA_LICH_KING,
DATA_BATTERED_HILT,
MAX_ENCOUNTER,
ACTION_SHOW_TRASH,
ACTION_SPIRITUAL_REFLECTIONS_COPY,
ACTION_SPIRITUAL_REFLECTIONS_ACTIVATE,
ACTION_SPIRITUAL_REFLECTIONS_HIDE,
ACTION_START_LK_FIGHT,
ACTION_STOP_LK_FIGHT,
ACTION_DELETE_ICE_WALL,
DATA_WAVE_NUMBER,
DATA_INTRO,
DATA_FALRIC,
DATA_MARWYN,
DATA_FROSTSWORN_GENERAL,
DATA_LK_INTRO,
DATA_LICH_KING,
DATA_BATTERED_HILT,
MAX_ENCOUNTER,
ACTION_SHOW_TRASH,
ACTION_SPIRITUAL_REFLECTIONS_COPY,
ACTION_SPIRITUAL_REFLECTIONS_ACTIVATE,
ACTION_SPIRITUAL_REFLECTIONS_HIDE,
ACTION_START_LK_FIGHT,
ACTION_STOP_LK_FIGHT,
ACTION_DELETE_ICE_WALL,
DATA_WAVE_NUMBER,
};
enum Creatures
{
NPC_FALRIC = 38112,
NPC_MARWYN = 38113,
NPC_LICH_KING_EVENT = 37226,
NPC_LICH_KING_BOSS = 36954,
NPC_FALRIC = 38112,
NPC_MARWYN = 38113,
NPC_LICH_KING_EVENT = 37226,
NPC_LICH_KING_BOSS = 36954,
NPC_UTHER = 37225,
NPC_JAINA_PART1 = 37221,
NPC_JAINA_PART2 = 36955,
NPC_SYLVANAS_PART1 = 37223,
NPC_SYLVANAS_PART2 = 37554,
NPC_UTHER = 37225,
NPC_JAINA_PART1 = 37221,
NPC_JAINA_PART2 = 36955,
NPC_SYLVANAS_PART1 = 37223,
NPC_SYLVANAS_PART2 = 37554,
NPC_DARK_RANGER_LORALEN = 37779,
NPC_ARCHMAGE_ELANDRA = 37774,
NPC_DARK_RANGER_LORALEN = 37779,
NPC_ARCHMAGE_ELANDRA = 37774,
NPC_WAVE_MERCENARY = 38177,
NPC_WAVE_FOOTMAN = 38173,
NPC_WAVE_RIFLEMAN = 38176,
NPC_WAVE_PRIEST = 38175,
NPC_WAVE_MAGE = 38172,
NPC_PHANTOM_HALLUCINATION = 38567,
NPC_WAVE_MERCENARY = 38177,
NPC_WAVE_FOOTMAN = 38173,
NPC_WAVE_RIFLEMAN = 38176,
NPC_WAVE_PRIEST = 38175,
NPC_WAVE_MAGE = 38172,
NPC_PHANTOM_HALLUCINATION = 38567,
NPC_FROSTSWORN_GENERAL = 36723,
NPC_SPIRITUAL_REFLECTION = 37068,
NPC_ICE_WALL_TARGET = 37014,
NPC_WRATH_OF_THE_LICH_KING_CREDIT = 38211,
NPC_HIGH_CAPTAIN_JUSTIN_BARLETT = 30344,
NPC_SKY_REAVER_KORM_BLACKSKAR = 30824,
NPC_ALTAR_BUNNY = 37704,
NPC_QUEL_DELAR = 37158,
NPC_FROSTSWORN_GENERAL = 36723,
NPC_SPIRITUAL_REFLECTION = 37068,
NPC_ICE_WALL_TARGET = 37014,
NPC_WRATH_OF_THE_LICH_KING_CREDIT = 38211,
NPC_HIGH_CAPTAIN_JUSTIN_BARLETT = 30344,
NPC_SKY_REAVER_KORM_BLACKSKAR = 30824,
NPC_ALTAR_BUNNY = 37704,
NPC_QUEL_DELAR = 37158,
};
enum GameObjects
{
GO_FROSTMOURNE = 202302,
GO_FROSTMOURNE_ALTAR = 202236,
GO_FRONT_DOOR = 201976,
GO_ARTHAS_DOOR = 197341,
GO_CAVE_IN = 201596,
GO_DOOR_BEFORE_THRONE = 197342,
GO_DOOR_AFTER_THRONE = 197343,
GO_ICE_WALL = 201385,
GO_THE_SKYBREAKER = 201598,
GO_ORGRIMS_HAMMER = 201599,
GO_STAIRS_ALLIANCE = 201709,
GO_STAIRS_HORDE = 202211,
GO_CHEST_NORMAL = 201710,
GO_CHEST_HEROIC = 202336,
GO_PORTAL_TO_DALARAN = 195682,
GO_FROSTMOURNE = 202302,
GO_FROSTMOURNE_ALTAR = 202236,
GO_FRONT_DOOR = 201976,
GO_ARTHAS_DOOR = 197341,
GO_CAVE_IN = 201596,
GO_DOOR_BEFORE_THRONE = 197342,
GO_DOOR_AFTER_THRONE = 197343,
GO_ICE_WALL = 201385,
GO_THE_SKYBREAKER = 201598,
GO_ORGRIMS_HAMMER = 201599,
GO_STAIRS_ALLIANCE = 201709,
GO_STAIRS_HORDE = 202211,
GO_CHEST_NORMAL = 201710,
GO_CHEST_HEROIC = 202336,
GO_PORTAL_TO_DALARAN = 195682,
};
enum HorWorldStates
{
WORLD_STATE_HOR_COUNTER = 4884,
WORLD_STATE_HOR_WAVE_COUNT = 4882,
WORLD_STATE_HOR_COUNTER = 4884,
WORLD_STATE_HOR_WAVE_COUNT = 4882,
};
enum BatteredHiltStatusFlags
{
BHSF_NONE = 0,
BHSF_STARTED = 1,
BHSF_THROWN = 2,
BHSF_FINISHED = 4,
BHSF_NONE = 0,
BHSF_STARTED = 1,
BHSF_THROWN = 2,
BHSF_FINISHED = 4,
};
#define NUM_OF_TRASH 34
@@ -97,158 +97,158 @@ enum BatteredHiltStatusFlags
enum hYells
{
SAY_JAINA_INTRO_1 = 1,
SAY_JAINA_INTRO_2 = 2,
SAY_JAINA_INTRO_3 = 3,
SAY_JAINA_INTRO_4 = 4,
SAY_UTHER_INTRO_A2_1 = 5,
SAY_JAINA_INTRO_5 = 6,
SAY_UTHER_INTRO_A2_2 = 7,
SAY_JAINA_INTRO_6 = 8,
SAY_UTHER_INTRO_A2_3 = 9,
SAY_JAINA_INTRO_7 = 10,
SAY_UTHER_INTRO_A2_4 = 11,
SAY_JAINA_INTRO_8 = 12,
SAY_UTHER_INTRO_A2_5 = 13,
SAY_JAINA_INTRO_9 = 14,
SAY_UTHER_INTRO_A2_6 = 15,
SAY_UTHER_INTRO_A2_7 = 16,
SAY_JAINA_INTRO_10 = 17,
SAY_UTHER_INTRO_A2_8 = 18,
SAY_JAINA_INTRO_11 = 19,
SAY_UTHER_INTRO_A2_9 = 20,
SAY_JAINA_INTRO_1 = 1,
SAY_JAINA_INTRO_2 = 2,
SAY_JAINA_INTRO_3 = 3,
SAY_JAINA_INTRO_4 = 4,
SAY_UTHER_INTRO_A2_1 = 5,
SAY_JAINA_INTRO_5 = 6,
SAY_UTHER_INTRO_A2_2 = 7,
SAY_JAINA_INTRO_6 = 8,
SAY_UTHER_INTRO_A2_3 = 9,
SAY_JAINA_INTRO_7 = 10,
SAY_UTHER_INTRO_A2_4 = 11,
SAY_JAINA_INTRO_8 = 12,
SAY_UTHER_INTRO_A2_5 = 13,
SAY_JAINA_INTRO_9 = 14,
SAY_UTHER_INTRO_A2_6 = 15,
SAY_UTHER_INTRO_A2_7 = 16,
SAY_JAINA_INTRO_10 = 17,
SAY_UTHER_INTRO_A2_8 = 18,
SAY_JAINA_INTRO_11 = 19,
SAY_UTHER_INTRO_A2_9 = 20,
SAY_SYLVANAS_INTRO_1 = 21,
SAY_SYLVANAS_INTRO_2 = 22,
SAY_SYLVANAS_INTRO_3 = 23,
SAY_UTHER_INTRO_H2_1 = 24,
SAY_SYLVANAS_INTRO_4 = 25,
SAY_UTHER_INTRO_H2_2 = 26,
SAY_SYLVANAS_INTRO_5 = 27,
SAY_UTHER_INTRO_H2_3 = 28,
SAY_SYLVANAS_INTRO_6 = 29,
SAY_UTHER_INTRO_H2_4 = 30,
SAY_SYLVANAS_INTRO_7 = 31,
SAY_UTHER_INTRO_H2_5 = 32,
SAY_UTHER_INTRO_H2_6 = 33,
SAY_SYLVANAS_INTRO_8 = 34,
SAY_UTHER_INTRO_H2_7 = 35,
SAY_SYLVANAS_INTRO_1 = 21,
SAY_SYLVANAS_INTRO_2 = 22,
SAY_SYLVANAS_INTRO_3 = 23,
SAY_UTHER_INTRO_H2_1 = 24,
SAY_SYLVANAS_INTRO_4 = 25,
SAY_UTHER_INTRO_H2_2 = 26,
SAY_SYLVANAS_INTRO_5 = 27,
SAY_UTHER_INTRO_H2_3 = 28,
SAY_SYLVANAS_INTRO_6 = 29,
SAY_UTHER_INTRO_H2_4 = 30,
SAY_SYLVANAS_INTRO_7 = 31,
SAY_UTHER_INTRO_H2_5 = 32,
SAY_UTHER_INTRO_H2_6 = 33,
SAY_SYLVANAS_INTRO_8 = 34,
SAY_UTHER_INTRO_H2_7 = 35,
SAY_LK_INTRO_1 = 36,
SAY_LK_INTRO_2 = 37,
SAY_LK_INTRO_3 = 38,
SAY_FALRIC_INTRO_1 = 39,
SAY_MARWYN_INTRO_1 = 40,
SAY_FALRIC_INTRO_2 = 41,
SAY_LK_INTRO_1 = 36,
SAY_LK_INTRO_2 = 37,
SAY_LK_INTRO_3 = 38,
SAY_FALRIC_INTRO_1 = 39,
SAY_MARWYN_INTRO_1 = 40,
SAY_FALRIC_INTRO_2 = 41,
SAY_JAINA_INTRO_END = 42,
SAY_SYLVANAS_INTRO_END = 43,
SAY_JAINA_INTRO_END = 42,
SAY_SYLVANAS_INTRO_END = 43,
SAY_FROSTSWORN_GENERAL_AGGRO = 98,
SAY_FROSTSWORN_GENERAL_DEATH = 99,
SAY_FROSTSWORN_GENERAL_AGGRO = 98,
SAY_FROSTSWORN_GENERAL_DEATH = 99,
SAY_LK_AGGRO_HORDE = 100,
SAY_LK_AGGRO_ALLY = 101,
SAY_SYLVANAS_LEAVE = 102,
SAY_JAINA_LEAVE = 103,
SAY_LK_IW_1 = 104,
SAY_LK_IW_2 = 105,
SAY_LK_IW_3 = 106,
SAY_LK_IW_4 = 107,
SAY_LK_IW_1_SUMMON = 108,
SAY_SYLVANAS_IW_1 = 109,
SAY_SYLVANAS_IW_2 = 110,
SAY_SYLVANAS_IW_3 = 111,
SAY_SYLVANAS_IW_4 = 112,
SAY_SYLVANAS_OPENING = 113,
SAY_SYLVANAS_END = 114,
SAY_LK_NOWHERE_TO_RUN = 115,
SAY_FIRE_HORDE = 116,
SAY_ONBOARD_HORDE = 117,
SAY_FINAL_HORDE = 118,
SAY_JAINA_IW_1 = 119,
SAY_JAINA_IW_2 = 120,
SAY_JAINA_IW_3 = 121,
SAY_JAINA_IW_4 = 122,
SAY_JAINA_OPENING = 123,
SAY_JAINA_END = 124,
SAY_FIRE_ALLY = 125,
SAY_ONBOARD_ALLY = 126,
SAY_FINAL_ALLY = 127,
SAY_FINAL_ALLY_SECOND = 128,
SAY_LK_AGGRO_HORDE = 100,
SAY_LK_AGGRO_ALLY = 101,
SAY_SYLVANAS_LEAVE = 102,
SAY_JAINA_LEAVE = 103,
SAY_LK_IW_1 = 104,
SAY_LK_IW_2 = 105,
SAY_LK_IW_3 = 106,
SAY_LK_IW_4 = 107,
SAY_LK_IW_1_SUMMON = 108,
SAY_SYLVANAS_IW_1 = 109,
SAY_SYLVANAS_IW_2 = 110,
SAY_SYLVANAS_IW_3 = 111,
SAY_SYLVANAS_IW_4 = 112,
SAY_SYLVANAS_OPENING = 113,
SAY_SYLVANAS_END = 114,
SAY_LK_NOWHERE_TO_RUN = 115,
SAY_FIRE_HORDE = 116,
SAY_ONBOARD_HORDE = 117,
SAY_FINAL_HORDE = 118,
SAY_JAINA_IW_1 = 119,
SAY_JAINA_IW_2 = 120,
SAY_JAINA_IW_3 = 121,
SAY_JAINA_IW_4 = 122,
SAY_JAINA_OPENING = 123,
SAY_JAINA_END = 124,
SAY_FIRE_ALLY = 125,
SAY_ONBOARD_ALLY = 126,
SAY_FINAL_ALLY = 127,
SAY_FINAL_ALLY_SECOND = 128,
SAY_BATTERED_HILT_HALT = 200,
SAY_BATTERED_HILT_LEAP = 201,
SAY_BATTERED_HILT_REALIZE = 202,
SAY_BATTERED_HILT_PREPARE = 203,
SAY_BATTERED_HILT_OUTRO1 = 204,
SAY_BATTERED_HILT_OUTRO2 = 205,
SAY_BATTERED_HILT_OUTRO3 = 206,
SAY_BATTERED_HILT_OUTRO4 = 207,
SAY_BATTERED_HILT_HALT = 200,
SAY_BATTERED_HILT_LEAP = 201,
SAY_BATTERED_HILT_REALIZE = 202,
SAY_BATTERED_HILT_PREPARE = 203,
SAY_BATTERED_HILT_OUTRO1 = 204,
SAY_BATTERED_HILT_OUTRO2 = 205,
SAY_BATTERED_HILT_OUTRO3 = 206,
SAY_BATTERED_HILT_OUTRO4 = 207,
};
enum hMisc
{
ACTION_START_INTRO,
ACTION_SKIP_INTRO,
ACTION_START_LK_FIGHT_REAL,
ACTION_INFORM_TRASH_DIED,
ACTION_CHECK_TRASH_DIED,
ACTION_INFORM_WALL_DESTROYED,
ACTION_START_INTRO,
ACTION_SKIP_INTRO,
ACTION_START_LK_FIGHT_REAL,
ACTION_INFORM_TRASH_DIED,
ACTION_CHECK_TRASH_DIED,
ACTION_INFORM_WALL_DESTROYED,
QUEST_DELIVRANCE_FROM_THE_PIT_A2 = 24710,
QUEST_DELIVRANCE_FROM_THE_PIT_H2 = 24712,
QUEST_WRATH_OF_THE_LICH_KING_A2 = 24500,
QUEST_WRATH_OF_THE_LICH_KING_H2 = 24802,
ACHIEV_RETREATING_TIMED_EVENT = 22615,
QUEST_DELIVRANCE_FROM_THE_PIT_A2 = 24710,
QUEST_DELIVRANCE_FROM_THE_PIT_H2 = 24712,
QUEST_WRATH_OF_THE_LICH_KING_A2 = 24500,
QUEST_WRATH_OF_THE_LICH_KING_H2 = 24802,
ACHIEV_RETREATING_TIMED_EVENT = 22615,
SPELL_FROSTMOURNE_SPAWN_SOUND = 70667,
SPELL_FROSTMOURNE_EQUIP = 72729,
SPELL_HOR_START_QUEST_ALLY = 71351,
SPELL_HOR_START_QUEST_HORDE = 71542,
SPELL_SHADOWMOURNE_VISUAL = 72523,
SPELL_ARCANE_CAST_VISUAL = 65633,
SPELL_WELL_OF_SOULS_VISUAL = 72630,
SPELL_FROSTMOURNE_SPAWN_SOUND = 70667,
SPELL_FROSTMOURNE_EQUIP = 72729,
SPELL_HOR_START_QUEST_ALLY = 71351,
SPELL_HOR_START_QUEST_HORDE = 71542,
SPELL_SHADOWMOURNE_VISUAL = 72523,
SPELL_ARCANE_CAST_VISUAL = 65633,
SPELL_WELL_OF_SOULS_VISUAL = 72630,
// Frostsworn General
EVENT_ACTIVATE_REFLECTIONS = 1,
EVENT_THROW_SHIELD = 2,
EVENT_BALEFUL_STRIKE = 3,
SPELL_THROW_SHIELD = 69222,
SPELL_SUMMON_REFLECTIONS_DUMMY = 69223,
SPELL_HOR_CLONE = 69828,
SPELL_HOR_CLONE_NAME = 69837,
SPELL_BALEFUL_STRIKE = 69933,
SPELL_SPIRIT_BURST = 69900,
SPELL_JAINA_ICE_BARRIER = 69787,
SPELL_SYLVANAS_CLOAK_OF_DARKNESS = 70188,
SPELL_JAINA_ICE_PRISON = 69708,
SPELL_SYLVANAS_DARK_BINDING = 70194,
SPELL_REMORSELESS_WINTER = 69780,
SPELL_LICH_KING_ZAP_PLAYER = 70653,
SPELL_DESTROY_WALL_JAINA = 69784,
SPELL_DESTROY_WALL_SYLVANAS = 70224,
SPELL_SUMMON_ICE_WALL = 69768,
SPELL_FURY_OF_FROSTMOURNE = 70063,
SPELL_HARVEST_SOUL = 70070,
SPELL_HOR_SUICIDE = 69908,
SPELL_SUMMON_RAGING_GHOULS = 69818,
SPELL_SUMMON_RISEN_WITCH_DOCTOR = 69836,
SPELL_SUMMON_LUMBERING_ABOMINATION = 69835,
SPELL_GUNSHIP_CANNON_FIRE_PERIODIC = 70017,
SPELL_ACHIEVEMENT_CHECK = 72830,
// Frostsworn General
EVENT_ACTIVATE_REFLECTIONS = 1,
EVENT_THROW_SHIELD = 2,
EVENT_BALEFUL_STRIKE = 3,
SPELL_THROW_SHIELD = 69222,
SPELL_SUMMON_REFLECTIONS_DUMMY = 69223,
SPELL_HOR_CLONE = 69828,
SPELL_HOR_CLONE_NAME = 69837,
SPELL_BALEFUL_STRIKE = 69933,
SPELL_SPIRIT_BURST = 69900,
SPELL_JAINA_ICE_BARRIER = 69787,
SPELL_SYLVANAS_CLOAK_OF_DARKNESS = 70188,
SPELL_JAINA_ICE_PRISON = 69708,
SPELL_SYLVANAS_DARK_BINDING = 70194,
SPELL_REMORSELESS_WINTER = 69780,
SPELL_LICH_KING_ZAP_PLAYER = 70653,
SPELL_DESTROY_WALL_JAINA = 69784,
SPELL_DESTROY_WALL_SYLVANAS = 70224,
SPELL_SUMMON_ICE_WALL = 69768,
SPELL_FURY_OF_FROSTMOURNE = 70063,
SPELL_HARVEST_SOUL = 70070,
SPELL_HOR_SUICIDE = 69908,
SPELL_SUMMON_RAGING_GHOULS = 69818,
SPELL_SUMMON_RISEN_WITCH_DOCTOR = 69836,
SPELL_SUMMON_LUMBERING_ABOMINATION = 69835,
SPELL_GUNSHIP_CANNON_FIRE_PERIODIC = 70017,
SPELL_ACHIEVEMENT_CHECK = 72830,
};
const uint32 allowedCompositions[8][5] =
{
{NPC_WAVE_MERCENARY, NPC_WAVE_PRIEST, NPC_WAVE_RIFLEMAN, 0, 0},
{NPC_WAVE_MAGE, NPC_WAVE_RIFLEMAN, NPC_WAVE_FOOTMAN, 0, 0},
{NPC_WAVE_MERCENARY, NPC_WAVE_PRIEST, NPC_WAVE_FOOTMAN, NPC_WAVE_FOOTMAN, 0},
{NPC_WAVE_MAGE, NPC_WAVE_PRIEST, NPC_WAVE_FOOTMAN, NPC_WAVE_FOOTMAN, 0},
{NPC_WAVE_MERCENARY, NPC_WAVE_MAGE, NPC_WAVE_RIFLEMAN, NPC_WAVE_FOOTMAN, NPC_WAVE_FOOTMAN},
{NPC_WAVE_MERCENARY, NPC_WAVE_MAGE, NPC_WAVE_PRIEST, NPC_WAVE_RIFLEMAN, NPC_WAVE_RIFLEMAN},
{NPC_WAVE_MERCENARY, NPC_WAVE_MAGE, NPC_WAVE_PRIEST, NPC_WAVE_RIFLEMAN, NPC_WAVE_FOOTMAN},
{NPC_WAVE_MERCENARY, NPC_WAVE_MAGE, NPC_WAVE_PRIEST, NPC_WAVE_FOOTMAN, NPC_WAVE_FOOTMAN}
{NPC_WAVE_MERCENARY, NPC_WAVE_PRIEST, NPC_WAVE_RIFLEMAN, 0, 0},
{NPC_WAVE_MAGE, NPC_WAVE_RIFLEMAN, NPC_WAVE_FOOTMAN, 0, 0},
{NPC_WAVE_MERCENARY, NPC_WAVE_PRIEST, NPC_WAVE_FOOTMAN, NPC_WAVE_FOOTMAN, 0},
{NPC_WAVE_MAGE, NPC_WAVE_PRIEST, NPC_WAVE_FOOTMAN, NPC_WAVE_FOOTMAN, 0},
{NPC_WAVE_MERCENARY, NPC_WAVE_MAGE, NPC_WAVE_RIFLEMAN, NPC_WAVE_FOOTMAN, NPC_WAVE_FOOTMAN},
{NPC_WAVE_MERCENARY, NPC_WAVE_MAGE, NPC_WAVE_PRIEST, NPC_WAVE_RIFLEMAN, NPC_WAVE_RIFLEMAN},
{NPC_WAVE_MERCENARY, NPC_WAVE_MAGE, NPC_WAVE_PRIEST, NPC_WAVE_RIFLEMAN, NPC_WAVE_FOOTMAN},
{NPC_WAVE_MERCENARY, NPC_WAVE_MAGE, NPC_WAVE_PRIEST, NPC_WAVE_FOOTMAN, NPC_WAVE_FOOTMAN}
};
const Position CenterPos = {5309.459473f, 2006.478516f, 711.595459f, 0.0f};
@@ -275,53 +275,53 @@ const uint8 WP_STOP[6] = {0, 5, 8, 10, 14, 18};
const Position PathWaypoints[PATH_WP_COUNT] =
{
{5588.055664f, 2229.327393f, 733.011353f, 5.440755f},
{5605.567383f, 2203.448486f, 731.304626f, 5.059827f},
{5607.415039f, 2189.225098f, 731.022217f, 4.203760f},
{5598.958984f, 2169.660156f, 730.919800f, 4.093812f},
{5586.018066f, 2149.685303f, 731.090759f, 4.093815f},
{5558.182617f, 2103.950928f, 731.263000f, 4.239113f}, // Leader Ice Wall 1
{5534.202637f, 2054.254150f, 731.131165f, 4.360846f},
{5526.244629f, 2023.878540f, 732.408264f, 4.419744f},
{5513.573242f, 1996.611206f, 735.115723f, 4.239110f}, // Leader Ice Wall 2
{5478.590820f, 1938.773315f, 741.926697f, 4.168423f},
{5456.632324f, 1902.801025f, 747.220886f, 4.058471f}, // Leader Ice Wall 3
{5423.630371f, 1858.672363f, 754.901367f, 4.078105f},
{5402.314453f, 1829.705811f, 758.029907f, 3.932807f},
{5374.380371f, 1802.807007f, 760.831238f, 3.897464f},
{5340.560059f, 1772.791016f, 766.478149f, 3.760019f}, // Leader Ice Wall 4
{5318.707031f, 1750.379395f, 771.635132f, 3.944588f},
{5297.951660f, 1725.419067f, 778.211548f, 4.121302f},
{5279.251953f, 1697.474365f, 785.700256f, 4.152715f},
{5262.773926f, 1669.980103f, 784.301697f, 1.015049f}
{5588.055664f, 2229.327393f, 733.011353f, 5.440755f},
{5605.567383f, 2203.448486f, 731.304626f, 5.059827f},
{5607.415039f, 2189.225098f, 731.022217f, 4.203760f},
{5598.958984f, 2169.660156f, 730.919800f, 4.093812f},
{5586.018066f, 2149.685303f, 731.090759f, 4.093815f},
{5558.182617f, 2103.950928f, 731.263000f, 4.239113f}, // Leader Ice Wall 1
{5534.202637f, 2054.254150f, 731.131165f, 4.360846f},
{5526.244629f, 2023.878540f, 732.408264f, 4.419744f},
{5513.573242f, 1996.611206f, 735.115723f, 4.239110f}, // Leader Ice Wall 2
{5478.590820f, 1938.773315f, 741.926697f, 4.168423f},
{5456.632324f, 1902.801025f, 747.220886f, 4.058471f}, // Leader Ice Wall 3
{5423.630371f, 1858.672363f, 754.901367f, 4.078105f},
{5402.314453f, 1829.705811f, 758.029907f, 3.932807f},
{5374.380371f, 1802.807007f, 760.831238f, 3.897464f},
{5340.560059f, 1772.791016f, 766.478149f, 3.760019f}, // Leader Ice Wall 4
{5318.707031f, 1750.379395f, 771.635132f, 3.944588f},
{5297.951660f, 1725.419067f, 778.211548f, 4.121302f},
{5279.251953f, 1697.474365f, 785.700256f, 4.152715f},
{5262.773926f, 1669.980103f, 784.301697f, 1.015049f}
};
const Position CannonFirePos[2][3] =
{
{
{5231.177734f, 1617.087280f, 813.603755f, 0.990318f},
{5222.555664f, 1623.302490f, 813.603755f, 0.868589f},
{5203.667480f, 1630.986694f, 813.603755f, 0.790045f}
},
{
{5233.234863f, 1572.758789f, 816.572266f, 1.202728f},
{5220.500488f, 1577.656860f, 816.572266f, 1.128118f},
{5209.669922f, 1584.753784f, 816.572266f, 0.982819f}
}
{
{5231.177734f, 1617.087280f, 813.603755f, 0.990318f},
{5222.555664f, 1623.302490f, 813.603755f, 0.868589f},
{5203.667480f, 1630.986694f, 813.603755f, 0.790045f}
},
{
{5233.234863f, 1572.758789f, 816.572266f, 1.202728f},
{5220.500488f, 1577.656860f, 816.572266f, 1.128118f},
{5209.669922f, 1584.753784f, 816.572266f, 0.982819f}
}
};
const Position StairsPos[2][3] =
{
{
{5226.36f, 1640.87f, 785.737f, 5.56137f},
{5213.76f, 1626.21f, 798.068f, 5.56534f},
{0.0f, 0.0f, 0.0f, 0.0f}
},
{
{5233.61f, 1607.48f, 796.5f, 5.77774f},
{5223.32f, 1589.24f, 809.0f, 5.76989f},
{5243.42f, 1624.8f, 784.361f, 5.76592f}
}
{
{5226.36f, 1640.87f, 785.737f, 5.56137f},
{5213.76f, 1626.21f, 798.068f, 5.56534f},
{0.0f, 0.0f, 0.0f, 0.0f}
},
{
{5233.61f, 1607.48f, 796.5f, 5.77774f},
{5223.32f, 1589.24f, 809.0f, 5.76989f},
{5243.42f, 1624.8f, 784.361f, 5.76592f}
}
};
#endif

View File

@@ -14,23 +14,23 @@ REWRITTEN FROM SCRATCH BY PUSSYWIZARD, IT OWNS NOW!
enum Yells
{
SAY_AGGRO = 14,
SAY_SLAY_1 = 15,
SAY_DEATH = 17,
SAY_FORGE_1 = 18,
SAY_FORGE_2 = 19,
SAY_AGGRO = 14,
SAY_SLAY_1 = 15,
SAY_DEATH = 17,
SAY_FORGE_1 = 18,
SAY_FORGE_2 = 19,
SAY_BOULDER_HIT = 16,
EMOTE_DEEP_FREEZE = 23,
SAY_BOULDER_HIT = 16,
EMOTE_DEEP_FREEZE = 23,
};
#define EMOTE_THROW_SARONITE "%s hurls a massive saronite boulder at you!"
#define EMOTE_THROW_SARONITE "%s hurls a massive saronite boulder at you!"
enum MiscData
{
EQUIP_ID_SWORD = 49345,
EQUIP_ID_MACE = 49344,
GO_SARONITE_ROCK = 196485,
EQUIP_ID_SWORD = 49345,
EQUIP_ID_MACE = 49344,
GO_SARONITE_ROCK = 196485,
};
Position const northForgePos = {722.5643f, -234.1615f, 527.182f, 2.16421f};
@@ -38,336 +38,336 @@ Position const southForgePos = {639.257f, -210.1198f, 529.015f, 0.523599f};
enum Spells
{
SPELL_PERMAFROST = 70326,
SPELL_THROW_SARONITE = 68788,
SPELL_THUNDERING_STOMP = 68771,
SPELL_PERMAFROST = 70326,
SPELL_THROW_SARONITE = 68788,
SPELL_THUNDERING_STOMP = 68771,
SPELL_CHILLING_WAVE = 68778,
SPELL_DEEP_FREEZE = 70381,
SPELL_CHILLING_WAVE = 68778,
SPELL_DEEP_FREEZE = 70381,
};
#define SPELL_FORGE_BLADE RAID_MODE(68774, 70334)
#define SPELL_FORGE_MACE RAID_MODE(68785, 70335)
#define SPELL_SARONITE_TRIGGERED RAID_MODE(68789, 70851)
#define SPELL_FORGE_BLADE RAID_MODE(68774, 70334)
#define SPELL_FORGE_MACE RAID_MODE(68785, 70335)
#define SPELL_SARONITE_TRIGGERED RAID_MODE(68789, 70851)
enum Events
{
EVENT_SPELL_THROW_SARONITE = 1,
EVENT_JUMP,
EVENT_SPELL_CHILLING_WAVE,
EVENT_SPELL_DEEP_FREEZE,
EVENT_SPELL_THROW_SARONITE = 1,
EVENT_JUMP,
EVENT_SPELL_CHILLING_WAVE,
EVENT_SPELL_DEEP_FREEZE,
};
class boss_garfrost : public CreatureScript
{
public:
boss_garfrost() : CreatureScript("boss_garfrost") { }
boss_garfrost() : CreatureScript("boss_garfrost") { }
struct boss_garfrostAI : public ScriptedAI
{
boss_garfrostAI(Creature* creature) : ScriptedAI(creature)
{
pInstance = creature->GetInstanceScript();
}
struct boss_garfrostAI : public ScriptedAI
{
boss_garfrostAI(Creature* creature) : ScriptedAI(creature)
{
pInstance = creature->GetInstanceScript();
}
InstanceScript* pInstance;
EventMap events;
uint8 phase;
bool bCanSayBoulderHit;
InstanceScript* pInstance;
EventMap events;
uint8 phase;
bool bCanSayBoulderHit;
void Reset()
{
me->RemoveAura(SPELL_PERMAFROST);
SetEquipmentSlots(true);
me->SetReactState(REACT_AGGRESSIVE);
me->SetControlled(false, UNIT_STATE_ROOT);
me->DisableRotate(false);
phase = 0;
bCanSayBoulderHit = true;
void Reset()
{
me->RemoveAura(SPELL_PERMAFROST);
SetEquipmentSlots(true);
me->SetReactState(REACT_AGGRESSIVE);
me->SetControlled(false, UNIT_STATE_ROOT);
me->DisableRotate(false);
phase = 0;
bCanSayBoulderHit = true;
events.Reset();
if (pInstance)
pInstance->SetData(DATA_GARFROST, NOT_STARTED);
}
events.Reset();
if (pInstance)
pInstance->SetData(DATA_GARFROST, NOT_STARTED);
}
void SetData(uint32 id, uint32 data)
{
if (id == 1 && pInstance)
pInstance->SetData(DATA_ACHIEV_ELEVEN, 0);
}
void SetData(uint32 id, uint32 data)
{
if (id == 1 && pInstance)
pInstance->SetData(DATA_ACHIEV_ELEVEN, 0);
}
void EnterCombat(Unit* /*who*/)
{
me->CastSpell(me, SPELL_PERMAFROST, true);
void EnterCombat(Unit* /*who*/)
{
me->CastSpell(me, SPELL_PERMAFROST, true);
Talk(SAY_AGGRO);
DoZoneInCombat();
events.RescheduleEvent(EVENT_SPELL_THROW_SARONITE, urand(5000,7500));
Talk(SAY_AGGRO);
DoZoneInCombat();
events.RescheduleEvent(EVENT_SPELL_THROW_SARONITE, urand(5000,7500));
if (pInstance)
pInstance->SetData(DATA_GARFROST, IN_PROGRESS);
}
if (pInstance)
pInstance->SetData(DATA_GARFROST, IN_PROGRESS);
}
void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType /*damagetype*/, SpellSchoolMask /*damageSchoolMask*/)
{
if (phase == 0 && !HealthAbovePct(66) && !me->HasUnitState(UNIT_STATE_ROOT))
{
phase = 1;
me->SetReactState(REACT_PASSIVE);
me->SetTarget(0);
me->SendMeleeAttackStop(me->GetVictim());
events.DelayEvents(8000);
me->CastSpell(me, SPELL_THUNDERING_STOMP, false);
events.RescheduleEvent(EVENT_JUMP, 1250);
return;
}
void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType /*damagetype*/, SpellSchoolMask /*damageSchoolMask*/)
{
if (phase == 0 && !HealthAbovePct(66) && !me->HasUnitState(UNIT_STATE_ROOT))
{
phase = 1;
me->SetReactState(REACT_PASSIVE);
me->SetTarget(0);
me->SendMeleeAttackStop(me->GetVictim());
events.DelayEvents(8000);
me->CastSpell(me, SPELL_THUNDERING_STOMP, false);
events.RescheduleEvent(EVENT_JUMP, 1250);
return;
}
if (phase == 1 && !HealthAbovePct(33) && !me->HasUnitState(UNIT_STATE_ROOT))
{
events.CancelEvent(EVENT_SPELL_CHILLING_WAVE);
phase = 2;
me->SetReactState(REACT_PASSIVE);
me->SetTarget(0);
me->SendMeleeAttackStop(me->GetVictim());
events.DelayEvents(8000);
me->CastSpell(me, SPELL_THUNDERING_STOMP, false);
events.RescheduleEvent(EVENT_JUMP, 1250);
return;
}
}
if (phase == 1 && !HealthAbovePct(33) && !me->HasUnitState(UNIT_STATE_ROOT))
{
events.CancelEvent(EVENT_SPELL_CHILLING_WAVE);
phase = 2;
me->SetReactState(REACT_PASSIVE);
me->SetTarget(0);
me->SendMeleeAttackStop(me->GetVictim());
events.DelayEvents(8000);
me->CastSpell(me, SPELL_THUNDERING_STOMP, false);
events.RescheduleEvent(EVENT_JUMP, 1250);
return;
}
}
void MovementInform(uint32 type, uint32 id)
{
if (type != EFFECT_MOTION_TYPE || id != 0)
return;
void MovementInform(uint32 type, uint32 id)
{
if (type != EFFECT_MOTION_TYPE || id != 0)
return;
if (phase == 1)
{
me->SetControlled(true, UNIT_STATE_ROOT);
me->CastSpell(me, SPELL_FORGE_BLADE, false);
Talk(SAY_FORGE_1);
}
else if (phase == 2)
{
me->SetControlled(true, UNIT_STATE_ROOT);
me->RemoveAurasDueToSpell(SPELL_FORGE_BLADE);
me->CastSpell(me, SPELL_FORGE_MACE, false);
Talk(SAY_FORGE_2);
}
}
if (phase == 1)
{
me->SetControlled(true, UNIT_STATE_ROOT);
me->CastSpell(me, SPELL_FORGE_BLADE, false);
Talk(SAY_FORGE_1);
}
else if (phase == 2)
{
me->SetControlled(true, UNIT_STATE_ROOT);
me->RemoveAurasDueToSpell(SPELL_FORGE_BLADE);
me->CastSpell(me, SPELL_FORGE_MACE, false);
Talk(SAY_FORGE_2);
}
}
void SpellHitTarget(Unit* target, const SpellInfo* spell)
{
if (spell->Id == SPELL_SARONITE_TRIGGERED)
{
if (bCanSayBoulderHit)
{
bCanSayBoulderHit = false;
Talk(SAY_BOULDER_HIT);
}
}
if (spell->Id == SPELL_FORGE_BLADE)
{
events.RescheduleEvent(EVENT_SPELL_CHILLING_WAVE, 10000);
SetEquipmentSlots(false, EQUIP_ID_SWORD);
me->SetReactState(REACT_AGGRESSIVE);
me->SetControlled(false, UNIT_STATE_ROOT);
me->DisableRotate(false);
if (me->GetVictim())
{
AttackStart(me->GetVictim());
me->SetTarget(me->GetVictim()->GetGUID());
}
}
else if (spell->Id == SPELL_FORGE_MACE)
{
events.RescheduleEvent(EVENT_SPELL_DEEP_FREEZE, 10000);
SetEquipmentSlots(false, EQUIP_ID_MACE);
me->SetReactState(REACT_AGGRESSIVE);
me->SetControlled(false, UNIT_STATE_ROOT);
me->DisableRotate(false);
if (me->GetVictim())
{
AttackStart(me->GetVictim());
me->SetTarget(me->GetVictim()->GetGUID());
}
}
}
{
if (spell->Id == SPELL_SARONITE_TRIGGERED)
{
if (bCanSayBoulderHit)
{
bCanSayBoulderHit = false;
Talk(SAY_BOULDER_HIT);
}
}
if (spell->Id == SPELL_FORGE_BLADE)
{
events.RescheduleEvent(EVENT_SPELL_CHILLING_WAVE, 10000);
SetEquipmentSlots(false, EQUIP_ID_SWORD);
me->SetReactState(REACT_AGGRESSIVE);
me->SetControlled(false, UNIT_STATE_ROOT);
me->DisableRotate(false);
if (me->GetVictim())
{
AttackStart(me->GetVictim());
me->SetTarget(me->GetVictim()->GetGUID());
}
}
else if (spell->Id == SPELL_FORGE_MACE)
{
events.RescheduleEvent(EVENT_SPELL_DEEP_FREEZE, 10000);
SetEquipmentSlots(false, EQUIP_ID_MACE);
me->SetReactState(REACT_AGGRESSIVE);
me->SetControlled(false, UNIT_STATE_ROOT);
me->DisableRotate(false);
if (me->GetVictim())
{
AttackStart(me->GetVictim());
me->SetTarget(me->GetVictim()->GetGUID());
}
}
}
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
if (me->GetVictim())
{
float x,y,z;
me->GetVictim()->GetPosition(x, y, z);
if (x<600.0f || x>770.0f || y<-270.0f || y>-137.0f || z<514.0f || z>550.0f)
{
me->SetHealth(me->GetMaxHealth());
EnterEvadeMode();
if (CreatureGroup* f = me->GetFormation())
{
const CreatureGroup::CreatureGroupMemberType& m = f->GetMembers();
for (CreatureGroup::CreatureGroupMemberType::const_iterator itr = m.begin(); itr != m.end(); ++itr)
if (itr->first->IsAlive() && itr->first->IsInCombat() && !itr->first->IsInEvadeMode() && itr->first->IsAIEnabled)
itr->first->AI()->EnterEvadeMode();
}
return;
}
}
if (me->GetVictim())
{
float x,y,z;
me->GetVictim()->GetPosition(x, y, z);
if (x<600.0f || x>770.0f || y<-270.0f || y>-137.0f || z<514.0f || z>550.0f)
{
me->SetHealth(me->GetMaxHealth());
EnterEvadeMode();
if (CreatureGroup* f = me->GetFormation())
{
const CreatureGroup::CreatureGroupMemberType& m = f->GetMembers();
for (CreatureGroup::CreatureGroupMemberType::const_iterator itr = m.begin(); itr != m.end(); ++itr)
if (itr->first->IsAlive() && itr->first->IsInCombat() && !itr->first->IsInEvadeMode() && itr->first->IsAIEnabled)
itr->first->AI()->EnterEvadeMode();
}
return;
}
}
events.Update(diff);
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch(events.GetEvent())
{
case 0:
break;
case EVENT_SPELL_THROW_SARONITE:
bCanSayBoulderHit = true;
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 140.0f, true))
{
WorldPacket data;
ChatHandler::BuildChatPacket(data, CHAT_MSG_RAID_BOSS_EMOTE, LANG_UNIVERSAL, me, NULL, EMOTE_THROW_SARONITE);
target->ToPlayer()->GetSession()->SendPacket(&data);
me->CastSpell(target, SPELL_THROW_SARONITE, false);
}
events.RepeatEvent(urand(12500,20000));
break;
case EVENT_JUMP:
me->DisableRotate(true);
if (phase == 1)
me->GetMotionMaster()->MoveJump(northForgePos.GetPositionX(), northForgePos.GetPositionY(), northForgePos.GetPositionZ(), 25.0f, 15.0f, 0);
else if (phase == 2)
me->GetMotionMaster()->MoveJump(southForgePos.GetPositionX(), southForgePos.GetPositionY(), southForgePos.GetPositionZ(), 25.0f, 15.0f, 0);
events.PopEvent();
break;
case EVENT_SPELL_CHILLING_WAVE:
me->CastSpell(me->GetVictim(), SPELL_CHILLING_WAVE, false);
events.RepeatEvent(35000);
break;
case EVENT_SPELL_DEEP_FREEZE:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
{
Talk(EMOTE_DEEP_FREEZE, target);
me->CastSpell(target, SPELL_DEEP_FREEZE, false);
}
events.RepeatEvent(35000);
break;
}
switch(events.GetEvent())
{
case 0:
break;
case EVENT_SPELL_THROW_SARONITE:
bCanSayBoulderHit = true;
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 140.0f, true))
{
WorldPacket data;
ChatHandler::BuildChatPacket(data, CHAT_MSG_RAID_BOSS_EMOTE, LANG_UNIVERSAL, me, NULL, EMOTE_THROW_SARONITE);
target->ToPlayer()->GetSession()->SendPacket(&data);
me->CastSpell(target, SPELL_THROW_SARONITE, false);
}
events.RepeatEvent(urand(12500,20000));
break;
case EVENT_JUMP:
me->DisableRotate(true);
if (phase == 1)
me->GetMotionMaster()->MoveJump(northForgePos.GetPositionX(), northForgePos.GetPositionY(), northForgePos.GetPositionZ(), 25.0f, 15.0f, 0);
else if (phase == 2)
me->GetMotionMaster()->MoveJump(southForgePos.GetPositionX(), southForgePos.GetPositionY(), southForgePos.GetPositionZ(), 25.0f, 15.0f, 0);
events.PopEvent();
break;
case EVENT_SPELL_CHILLING_WAVE:
me->CastSpell(me->GetVictim(), SPELL_CHILLING_WAVE, false);
events.RepeatEvent(35000);
break;
case EVENT_SPELL_DEEP_FREEZE:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
{
Talk(EMOTE_DEEP_FREEZE, target);
me->CastSpell(target, SPELL_DEEP_FREEZE, false);
}
events.RepeatEvent(35000);
break;
}
DoMeleeAttackIfReady();
}
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*killer*/)
{
Talk(SAY_DEATH);
if (pInstance)
pInstance->SetData(DATA_GARFROST, DONE);
}
void JustDied(Unit* /*killer*/)
{
Talk(SAY_DEATH);
if (pInstance)
pInstance->SetData(DATA_GARFROST, DONE);
}
void KilledUnit(Unit* who)
{
if (who->GetTypeId() == TYPEID_PLAYER)
Talk(SAY_SLAY_1);
}
void KilledUnit(Unit* who)
{
if (who->GetTypeId() == TYPEID_PLAYER)
Talk(SAY_SLAY_1);
}
void EnterEvadeMode()
{
me->SetControlled(false, UNIT_STATE_ROOT);
me->DisableRotate(false);
ScriptedAI::EnterEvadeMode();
}
};
void EnterEvadeMode()
{
me->SetControlled(false, UNIT_STATE_ROOT);
me->DisableRotate(false);
ScriptedAI::EnterEvadeMode();
}
};
CreatureAI* GetAI(Creature* creature) const
{
return new boss_garfrostAI(creature);
}
CreatureAI* GetAI(Creature* creature) const
{
return new boss_garfrostAI(creature);
}
};
class spell_garfrost_permafrost : public SpellScriptLoader
{
public:
spell_garfrost_permafrost() : SpellScriptLoader("spell_garfrost_permafrost") { }
spell_garfrost_permafrost() : SpellScriptLoader("spell_garfrost_permafrost") { }
class spell_garfrost_permafrost_SpellScript : public SpellScript
{
PrepareSpellScript(spell_garfrost_permafrost_SpellScript);
class spell_garfrost_permafrost_SpellScript : public SpellScript
{
PrepareSpellScript(spell_garfrost_permafrost_SpellScript);
std::list<WorldObject*> targetList;
std::list<WorldObject*> targetList;
void Unload()
{
targetList.clear();
}
void Unload()
{
targetList.clear();
}
void FilterTargets(std::list<WorldObject*>& targets)
{
if (Unit* caster = GetCaster())
{
std::list<GameObject*> blockList;
caster->GetGameObjectListWithEntryInGrid(blockList, GO_SARONITE_ROCK, 100.0f);
void FilterTargets(std::list<WorldObject*>& targets)
{
if (Unit* caster = GetCaster())
{
std::list<GameObject*> blockList;
caster->GetGameObjectListWithEntryInGrid(blockList, GO_SARONITE_ROCK, 100.0f);
if (!blockList.empty())
{
for (std::list<WorldObject*>::iterator itrU = targets.begin(); itrU != targets.end(); ++itrU)
if (WorldObject* target = (*itrU))
{
bool valid = true;
if (!caster->IsWithinMeleeRange(target->ToUnit()))
for (std::list<GameObject*>::const_iterator itr = blockList.begin(); itr != blockList.end(); ++itr)
if (!(*itr)->IsInvisibleDueToDespawn())
if ((*itr)->IsInBetween(caster, target, 4.0f))
{
valid = false;
break;
}
if (valid)
{
if (Aura* aur = target->ToUnit()->GetAura(70336))
if (aur->GetStackAmount() >= 10 && caster->GetTypeId() == TYPEID_UNIT)
caster->ToCreature()->AI()->SetData(1, aur->GetStackAmount());
targetList.push_back(*itrU);
}
}
}
else
{
targetList = targets;
return;
}
}
if (!blockList.empty())
{
for (std::list<WorldObject*>::iterator itrU = targets.begin(); itrU != targets.end(); ++itrU)
if (WorldObject* target = (*itrU))
{
bool valid = true;
if (!caster->IsWithinMeleeRange(target->ToUnit()))
for (std::list<GameObject*>::const_iterator itr = blockList.begin(); itr != blockList.end(); ++itr)
if (!(*itr)->IsInvisibleDueToDespawn())
if ((*itr)->IsInBetween(caster, target, 4.0f))
{
valid = false;
break;
}
if (valid)
{
if (Aura* aur = target->ToUnit()->GetAura(70336))
if (aur->GetStackAmount() >= 10 && caster->GetTypeId() == TYPEID_UNIT)
caster->ToCreature()->AI()->SetData(1, aur->GetStackAmount());
targetList.push_back(*itrU);
}
}
}
else
{
targetList = targets;
return;
}
}
targets = targetList;
}
targets = targetList;
}
void FilterTargetsNext(std::list<WorldObject*>& targets)
{
targets = targetList;
}
void FilterTargetsNext(std::list<WorldObject*>& targets)
{
targets = targetList;
}
void Register()
{
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_garfrost_permafrost_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY);
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_garfrost_permafrost_SpellScript::FilterTargetsNext, EFFECT_1, TARGET_UNIT_DEST_AREA_ENEMY);
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_garfrost_permafrost_SpellScript::FilterTargetsNext, EFFECT_2, TARGET_UNIT_DEST_AREA_ENEMY);
}
};
void Register()
{
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_garfrost_permafrost_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY);
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_garfrost_permafrost_SpellScript::FilterTargetsNext, EFFECT_1, TARGET_UNIT_DEST_AREA_ENEMY);
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_garfrost_permafrost_SpellScript::FilterTargetsNext, EFFECT_2, TARGET_UNIT_DEST_AREA_ENEMY);
}
};
SpellScript* GetSpellScript() const
{
return new spell_garfrost_permafrost_SpellScript();
}
SpellScript* GetSpellScript() const
{
return new spell_garfrost_permafrost_SpellScript();
}
};
void AddSC_boss_garfrost()
{
new boss_garfrost();
new boss_garfrost();
new spell_garfrost_permafrost();
new spell_garfrost_permafrost();
}

View File

@@ -15,517 +15,517 @@ REWRITTEN FROM SCRATCH BY PUSSYWIZARD, IT OWNS NOW!
enum Yells
{
SAY_AGGRO = 24,
SAY_SLAY_1 = 25,
SAY_SLAY_2 = 26,
SAY_ORDER_STOP = 27,
SAY_ORDER_BLOW = 28,
SAY_TARGET_1 = 29,
SAY_TARGET_2 = 30,
SAY_TARGET_3 = 31,
EMOTE_KRICK_MINES = 32,
EMOTE_ICK_POISON = 33,
SAY_AGGRO = 24,
SAY_SLAY_1 = 25,
SAY_SLAY_2 = 26,
SAY_ORDER_STOP = 27,
SAY_ORDER_BLOW = 28,
SAY_TARGET_1 = 29,
SAY_TARGET_2 = 30,
SAY_TARGET_3 = 31,
EMOTE_KRICK_MINES = 32,
EMOTE_ICK_POISON = 33,
};
#define EMOTE_ICK_CHASING "%s is chasing you!"
#define EMOTE_ICK_CHASING "%s is chasing you!"
enum Spells
{
SPELL_TOXIC_WASTE = 69024,
SPELL_MIGHTY_KICK = 69021,
SPELL_SHADOW_BOLT = 69028,
SPELL_TOXIC_WASTE = 69024,
SPELL_MIGHTY_KICK = 69021,
SPELL_SHADOW_BOLT = 69028,
SPELL_PURSUIT = 68987,
SPELL_PURSUIT = 68987,
SPELL_POISON_NOVA = 68989,
SPELL_POISON_NOVA = 68989,
SPELL_EXPLOSIVE_BARRAGE_KRICK = 69012,
SPELL_EXPLOSIVE_BARRAGE_ICK = 69263,
SPELL_EXPLOSIVE_BARRAGE_SUMMON = 69015,
SPELL_EXPLODING_ORB_VISUAL = 69017,
SPELL_AUTO_GROW = 69020,
SPELL_HASTY_GROW = 44851,
SPELL_EXPLOSIVE_BARRAGE_DAMAGE = 69019,
SPELL_EXPLOSIVE_BARRAGE_KRICK = 69012,
SPELL_EXPLOSIVE_BARRAGE_ICK = 69263,
SPELL_EXPLOSIVE_BARRAGE_SUMMON = 69015,
SPELL_EXPLODING_ORB_VISUAL = 69017,
SPELL_AUTO_GROW = 69020,
SPELL_HASTY_GROW = 44851,
SPELL_EXPLOSIVE_BARRAGE_DAMAGE = 69019,
};
enum Events
{
EVENT_SPELL_TOXIC_WASTE = 1,
EVENT_SPELL_MIGHTY_KICK,
EVENT_SPELL_SHADOW_BOLT,
EVENT_SPECIAL,
EVENT_SET_REACT_AGGRESSIVE,
EVENT_SPELL_TOXIC_WASTE = 1,
EVENT_SPELL_MIGHTY_KICK,
EVENT_SPELL_SHADOW_BOLT,
EVENT_SPECIAL,
EVENT_SET_REACT_AGGRESSIVE,
};
class boss_ick : public CreatureScript
{
public:
boss_ick() : CreatureScript("boss_ick") { }
boss_ick() : CreatureScript("boss_ick") { }
struct boss_ickAI : public ScriptedAI
{
boss_ickAI(Creature* creature) : ScriptedAI(creature)
{
pInstance = creature->GetInstanceScript();
}
struct boss_ickAI : public ScriptedAI
{
boss_ickAI(Creature* creature) : ScriptedAI(creature)
{
pInstance = creature->GetInstanceScript();
}
InstanceScript* pInstance;
EventMap events;
InstanceScript* pInstance;
EventMap events;
void Reset()
{
me->SetReactState(REACT_AGGRESSIVE);
events.Reset();
if (pInstance)
pInstance->SetData(DATA_ICK, NOT_STARTED);
}
void Reset()
{
me->SetReactState(REACT_AGGRESSIVE);
events.Reset();
if (pInstance)
pInstance->SetData(DATA_ICK, NOT_STARTED);
}
bool CanAIAttack(const Unit* who) const
{
return pInstance && pInstance->GetData(DATA_INSTANCE_PROGRESS) >= INSTANCE_PROGRESS_FINISHED_INTRO;
}
bool CanAIAttack(const Unit* who) const
{
return pInstance && pInstance->GetData(DATA_INSTANCE_PROGRESS) >= INSTANCE_PROGRESS_FINISHED_INTRO;
}
void EnterCombat(Unit* /*who*/)
{
if (Creature* k = GetKrick())
k->AI()->Talk(SAY_AGGRO);
DoZoneInCombat();
events.Reset();
events.RescheduleEvent(EVENT_SPELL_TOXIC_WASTE, urand(3000,5000));
events.RescheduleEvent(EVENT_SPELL_MIGHTY_KICK, urand(10000, 20000));
events.RescheduleEvent(EVENT_SPELL_SHADOW_BOLT, 10000);
events.RescheduleEvent(EVENT_SPECIAL, 25000);
void EnterCombat(Unit* /*who*/)
{
if (Creature* k = GetKrick())
k->AI()->Talk(SAY_AGGRO);
DoZoneInCombat();
events.Reset();
events.RescheduleEvent(EVENT_SPELL_TOXIC_WASTE, urand(3000,5000));
events.RescheduleEvent(EVENT_SPELL_MIGHTY_KICK, urand(10000, 20000));
events.RescheduleEvent(EVENT_SPELL_SHADOW_BOLT, 10000);
events.RescheduleEvent(EVENT_SPECIAL, 25000);
if (pInstance)
pInstance->SetData(DATA_ICK, IN_PROGRESS);
}
if (pInstance)
pInstance->SetData(DATA_ICK, IN_PROGRESS);
}
void SpellHitTarget(Unit* target, const SpellInfo* spell)
{
if (!target || !spell)
return;
if (spell->Id == SPELL_PURSUIT && target->GetTypeId() == TYPEID_PLAYER)
{
WorldPacket data;
void SpellHitTarget(Unit* target, const SpellInfo* spell)
{
if (!target || !spell)
return;
if (spell->Id == SPELL_PURSUIT && target->GetTypeId() == TYPEID_PLAYER)
{
WorldPacket data;
ChatHandler::BuildChatPacket(data, CHAT_MSG_RAID_BOSS_EMOTE, LANG_UNIVERSAL, me, NULL, EMOTE_ICK_CHASING);
target->ToPlayer()->GetSession()->SendPacket(&data);
AttackStart(target);
me->SetReactState(REACT_PASSIVE);
events.RescheduleEvent(EVENT_SET_REACT_AGGRESSIVE, 12000);
}
}
ChatHandler::BuildChatPacket(data, CHAT_MSG_RAID_BOSS_EMOTE, LANG_UNIVERSAL, me, NULL, EMOTE_ICK_CHASING);
target->ToPlayer()->GetSession()->SendPacket(&data);
AttackStart(target);
me->SetReactState(REACT_PASSIVE);
events.RescheduleEvent(EVENT_SET_REACT_AGGRESSIVE, 12000);
}
}
Creature* GetKrick()
{
if (Vehicle* v = me->GetVehicleKit())
if (Unit* p = v->GetPassenger(0))
return p->ToCreature();
return (Creature*)NULL;
}
Creature* GetKrick()
{
if (Vehicle* v = me->GetVehicleKit())
if (Unit* p = v->GetPassenger(0))
return p->ToCreature();
return (Creature*)NULL;
}
void DamageTaken(Unit* /*doneBy*/, uint32& damage, DamageEffectType, SpellSchoolMask)
{
if (damage >= me->GetHealth())
if (Creature* krick = GetKrick())
{
krick->InterruptNonMeleeSpells(true);
krick->RemoveAllAuras();
Position myPos(*me), exitPos;
float ang = me->GetOrientation()+3*M_PI/2;
float dist = 3.0f;
exitPos.Relocate(myPos.GetPositionX()+dist*cos(ang), myPos.GetPositionY()+dist*sin(ang), 515.0f, M_PI);
exitPos.m_positionZ = me->GetMap()->GetHeight(exitPos.GetPositionX(), exitPos.GetPositionY(), exitPos.GetPositionZ());
void DamageTaken(Unit* /*doneBy*/, uint32& damage, DamageEffectType, SpellSchoolMask)
{
if (damage >= me->GetHealth())
if (Creature* krick = GetKrick())
{
krick->InterruptNonMeleeSpells(true);
krick->RemoveAllAuras();
Position myPos(*me), exitPos;
float ang = me->GetOrientation()+3*M_PI/2;
float dist = 3.0f;
exitPos.Relocate(myPos.GetPositionX()+dist*cos(ang), myPos.GetPositionY()+dist*sin(ang), 515.0f, M_PI);
exitPos.m_positionZ = me->GetMap()->GetHeight(exitPos.GetPositionX(), exitPos.GetPositionY(), exitPos.GetPositionZ());
if (exitPos.GetPositionZ() < 505.0f || exitPos.GetPositionZ() > 512.0f || !me->IsWithinLOS(exitPos.GetPositionX(), exitPos.GetPositionY(), exitPos.GetPositionZ()))
exitPos.Relocate(myPos);
if (exitPos.GetPositionZ() < 505.0f || exitPos.GetPositionZ() > 512.0f || !me->IsWithinLOS(exitPos.GetPositionX(), exitPos.GetPositionY(), exitPos.GetPositionZ()))
exitPos.Relocate(myPos);
krick->_ExitVehicle(&exitPos);
krick->AI()->DoAction(1);
}
}
krick->_ExitVehicle(&exitPos);
krick->AI()->DoAction(1);
}
}
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
if (me->GetVictim())
{
float x,y,z;
me->GetVictim()->GetPosition(x, y, z);
if (KrickCenterPos.GetExactDist(x,y,z) > 80.0f || z > KrickCenterPos.GetPositionZ()+20.0f || z < KrickCenterPos.GetPositionZ()-20.0f)
{
me->SetHealth(me->GetMaxHealth());
EnterEvadeMode();
return;
}
}
if (me->GetVictim())
{
float x,y,z;
me->GetVictim()->GetPosition(x, y, z);
if (KrickCenterPos.GetExactDist(x,y,z) > 80.0f || z > KrickCenterPos.GetPositionZ()+20.0f || z < KrickCenterPos.GetPositionZ()-20.0f)
{
me->SetHealth(me->GetMaxHealth());
EnterEvadeMode();
return;
}
}
events.Update(diff);
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING | UNIT_STATE_STUNNED))
return;
if (me->HasUnitState(UNIT_STATE_CASTING | UNIT_STATE_STUNNED))
return;
switch(events.GetEvent())
{
case 0:
break;
case EVENT_SPELL_TOXIC_WASTE:
if (Creature* k = GetKrick())
if (!k->HasUnitState(UNIT_STATE_CASTING))
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true))
{
k->CastSpell(target, SPELL_TOXIC_WASTE);
events.RepeatEvent(urand(7000,10000));
break;
}
events.RepeatEvent(2500);
break;
case EVENT_SPELL_MIGHTY_KICK:
me->CastSpell(me->GetVictim(), SPELL_MIGHTY_KICK, false);
events.RepeatEvent(urand(20000,25000));
break;
case EVENT_SPELL_SHADOW_BOLT:
if (Creature* k = GetKrick())
if (!k->HasUnitState(UNIT_STATE_CASTING))
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 35.0f, true))
{
k->CastSpell(target, SPELL_SHADOW_BOLT);
events.RepeatEvent(14000);
break;
}
events.RepeatEvent(2500);
break;
case EVENT_SET_REACT_AGGRESSIVE:
me->SetReactState(REACT_AGGRESSIVE);
if (!UpdateVictim())
return;
events.PopEvent();
break;
case EVENT_SPECIAL:
switch(urand(0,2))
{
case 0: // Pursuit
if (Creature* k = GetKrick())
k->AI()->Talk(RAND(SAY_TARGET_1, SAY_TARGET_2, SAY_TARGET_3));
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 70.0f, true))
me->CastSpell(target, SPELL_PURSUIT, false);
break;
case 1: // Poison Nova
if (Creature* k = GetKrick())
{
k->AI()->Talk(SAY_ORDER_BLOW);
Talk(EMOTE_ICK_POISON);
}
me->CastSpell(me, SPELL_POISON_NOVA, false);
break;
case 2: // Explosive Barrage
if (Creature* k = GetKrick())
{
k->AI()->Talk(SAY_ORDER_STOP);
k->AI()->Talk(EMOTE_KRICK_MINES);
k->InterruptNonMeleeSpells(false);
me->InterruptNonMeleeSpells(false);
k->CastSpell(k, SPELL_EXPLOSIVE_BARRAGE_KRICK, false);
me->CastSpell(me, SPELL_EXPLOSIVE_BARRAGE_ICK, false);
}
events.DelayEvents(20000);
break;
}
events.RepeatEvent(urand(25000,30000));
break;
}
switch(events.GetEvent())
{
case 0:
break;
case EVENT_SPELL_TOXIC_WASTE:
if (Creature* k = GetKrick())
if (!k->HasUnitState(UNIT_STATE_CASTING))
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true))
{
k->CastSpell(target, SPELL_TOXIC_WASTE);
events.RepeatEvent(urand(7000,10000));
break;
}
events.RepeatEvent(2500);
break;
case EVENT_SPELL_MIGHTY_KICK:
me->CastSpell(me->GetVictim(), SPELL_MIGHTY_KICK, false);
events.RepeatEvent(urand(20000,25000));
break;
case EVENT_SPELL_SHADOW_BOLT:
if (Creature* k = GetKrick())
if (!k->HasUnitState(UNIT_STATE_CASTING))
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 35.0f, true))
{
k->CastSpell(target, SPELL_SHADOW_BOLT);
events.RepeatEvent(14000);
break;
}
events.RepeatEvent(2500);
break;
case EVENT_SET_REACT_AGGRESSIVE:
me->SetReactState(REACT_AGGRESSIVE);
if (!UpdateVictim())
return;
events.PopEvent();
break;
case EVENT_SPECIAL:
switch(urand(0,2))
{
case 0: // Pursuit
if (Creature* k = GetKrick())
k->AI()->Talk(RAND(SAY_TARGET_1, SAY_TARGET_2, SAY_TARGET_3));
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 70.0f, true))
me->CastSpell(target, SPELL_PURSUIT, false);
break;
case 1: // Poison Nova
if (Creature* k = GetKrick())
{
k->AI()->Talk(SAY_ORDER_BLOW);
Talk(EMOTE_ICK_POISON);
}
me->CastSpell(me, SPELL_POISON_NOVA, false);
break;
case 2: // Explosive Barrage
if (Creature* k = GetKrick())
{
k->AI()->Talk(SAY_ORDER_STOP);
k->AI()->Talk(EMOTE_KRICK_MINES);
k->InterruptNonMeleeSpells(false);
me->InterruptNonMeleeSpells(false);
k->CastSpell(k, SPELL_EXPLOSIVE_BARRAGE_KRICK, false);
me->CastSpell(me, SPELL_EXPLOSIVE_BARRAGE_ICK, false);
}
events.DelayEvents(20000);
break;
}
events.RepeatEvent(urand(25000,30000));
break;
}
DoMeleeAttackIfReady();
}
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*killer*/)
{
if (pInstance)
pInstance->SetData(DATA_ICK, DONE);
me->RemoveAllAuras();
}
void JustDied(Unit* /*killer*/)
{
if (pInstance)
pInstance->SetData(DATA_ICK, DONE);
me->RemoveAllAuras();
}
void KilledUnit(Unit* who)
{
// if during pursuit ick kills his target, set to aggressive again
if (who && me->GetVictim() && who->GetGUID() == me->GetVictim()->GetGUID())
if (me->GetReactState() == REACT_PASSIVE)
me->SetReactState(REACT_AGGRESSIVE);
void KilledUnit(Unit* who)
{
// if during pursuit ick kills his target, set to aggressive again
if (who && me->GetVictim() && who->GetGUID() == me->GetVictim()->GetGUID())
if (me->GetReactState() == REACT_PASSIVE)
me->SetReactState(REACT_AGGRESSIVE);
if (who->GetTypeId() == TYPEID_PLAYER)
if (Creature* k = GetKrick())
k->AI()->Talk(RAND(SAY_SLAY_1, SAY_SLAY_2));
}
if (who->GetTypeId() == TYPEID_PLAYER)
if (Creature* k = GetKrick())
k->AI()->Talk(RAND(SAY_SLAY_1, SAY_SLAY_2));
}
void JustSummoned(Creature* summon)
{
}
};
void JustSummoned(Creature* summon)
{
}
};
CreatureAI* GetAI(Creature* creature) const
{
return new boss_ickAI(creature);
}
CreatureAI* GetAI(Creature* creature) const
{
return new boss_ickAI(creature);
}
};
class boss_krick : public CreatureScript
{
public:
boss_krick() : CreatureScript("boss_krick") { }
boss_krick() : CreatureScript("boss_krick") { }
struct boss_krickAI : public NullCreatureAI
{
boss_krickAI(Creature* creature) : NullCreatureAI(creature)
{
pInstance = creature->GetInstanceScript();
}
struct boss_krickAI : public NullCreatureAI
{
boss_krickAI(Creature* creature) : NullCreatureAI(creature)
{
pInstance = creature->GetInstanceScript();
}
InstanceScript* pInstance;
EventMap events;
InstanceScript* pInstance;
EventMap events;
void DoAction(int32 a)
{
if (a==1)
{
me->setActive(true);
events.RescheduleEvent(20, 0);
}
}
void DoAction(int32 a)
{
if (a==1)
{
me->setActive(true);
events.RescheduleEvent(20, 0);
}
}
void UpdateAI(uint32 diff)
{
events.Update(diff);
switch(events.GetEvent())
{
case 0:
break;
case 20:
if (pInstance)
{
pInstance->SetData(DATA_INSTANCE_PROGRESS, INSTANCE_PROGRESS_FINISHED_KRICK_SCENE);
void UpdateAI(uint32 diff)
{
events.Update(diff);
switch(events.GetEvent())
{
case 0:
break;
case 20:
if (pInstance)
{
pInstance->SetData(DATA_INSTANCE_PROGRESS, INSTANCE_PROGRESS_FINISHED_KRICK_SCENE);
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_LEADER_FIRST_GUID)))
{
c->GetMotionMaster()->Clear();
c->UpdatePosition(SBSLeaderStartPos, true);
c->StopMovingOnCurrentPos();
c->AI()->Reset();
}
}
events.PopEvent();
events.RescheduleEvent(1, 3000);
break;
case 1:
Talk(SAY_OUTRO_KRICK_1);
if (pInstance)
{
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_LEADER_FIRST_GUID)))
{
float angle = me->GetAngle(c);
me->SetFacingTo(angle);
float x = me->GetPositionX()+cos(angle)*7.0f;
float y = me->GetPositionY()+sin(angle)*7.0f;
c->GetMotionMaster()->MovePoint(0, x, y, me->GetPositionZ());
}
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_LEADER_FIRST_GUID)))
{
c->GetMotionMaster()->Clear();
c->UpdatePosition(SBSLeaderStartPos, true);
c->StopMovingOnCurrentPos();
c->AI()->Reset();
}
}
events.PopEvent();
events.RescheduleEvent(1, 3000);
break;
case 1:
Talk(SAY_OUTRO_KRICK_1);
if (pInstance)
{
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_LEADER_FIRST_GUID)))
{
float angle = me->GetAngle(c);
me->SetFacingTo(angle);
float x = me->GetPositionX()+cos(angle)*7.0f;
float y = me->GetPositionY()+sin(angle)*7.0f;
c->GetMotionMaster()->MovePoint(0, x, y, me->GetPositionZ());
}
for (uint8 i=0; i<2; ++i)
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_GUARD_1_GUID+i)))
c->DespawnOrUnsummon();
}
events.PopEvent();
events.RescheduleEvent(2, 7000);
break;
case 2:
if (pInstance)
{
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_TYRANNUS_EVENT_GUID)))
{
c->setActive(true);
c->UpdatePosition(SBSTyrannusStartPos, true);
c->SetHomePosition(SBSTyrannusStartPos);
}
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_LEADER_FIRST_GUID)))
c->AI()->Talk(c->GetEntry() == NPC_JAINA_PART1 ? SAY_JAINA_KRICK_1 : SAY_SYLVANAS_KRICK_1);
}
events.PopEvent();
events.RescheduleEvent(3, 6500);
break;
case 3:
Talk(SAY_OUTRO_KRICK_2);
events.PopEvent();
events.RescheduleEvent(4, 17000);
break;
case 4:
if (pInstance)
{
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_TYRANNUS_EVENT_GUID)))
c->GetMotionMaster()->MovePath(PATH_BEGIN_VALUE+10, false);
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_LEADER_FIRST_GUID)))
c->AI()->Talk(c->GetEntry() == NPC_JAINA_PART1 ? SAY_JAINA_KRICK_2 : SAY_SYLVANAS_KRICK_2);
}
events.PopEvent();
events.RescheduleEvent(5, 6500);
break;
case 5:
Talk(SAY_OUTRO_KRICK_3);
events.PopEvent();
events.RescheduleEvent(6, 6500);
break;
case 6:
if (pInstance)
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_TYRANNUS_EVENT_GUID)))
{
c->SetFacingToObject(me);
c->AI()->Talk(SAY_TYRANNUS_KRICK_1);
}
events.PopEvent();
events.RescheduleEvent(7, 4000);
break;
case 7:
me->CastSpell(me, 69413, true);
me->SendMeleeAttackStop(me->GetVictim());
me->SetCanFly(true);
me->SetDisableGravity(true);
me->SendMovementFlagUpdate();
me->GetMotionMaster()->MoveTakeoff(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+9.0f, 0.5f * 7.0f);
for (uint8 i=0; i<2; ++i)
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_GUARD_1_GUID+i)))
c->DespawnOrUnsummon();
}
events.PopEvent();
events.RescheduleEvent(2, 7000);
break;
case 2:
if (pInstance)
{
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_TYRANNUS_EVENT_GUID)))
{
c->setActive(true);
c->UpdatePosition(SBSTyrannusStartPos, true);
c->SetHomePosition(SBSTyrannusStartPos);
}
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_LEADER_FIRST_GUID)))
c->AI()->Talk(c->GetEntry() == NPC_JAINA_PART1 ? SAY_JAINA_KRICK_1 : SAY_SYLVANAS_KRICK_1);
}
events.PopEvent();
events.RescheduleEvent(3, 6500);
break;
case 3:
Talk(SAY_OUTRO_KRICK_2);
events.PopEvent();
events.RescheduleEvent(4, 17000);
break;
case 4:
if (pInstance)
{
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_TYRANNUS_EVENT_GUID)))
c->GetMotionMaster()->MovePath(PATH_BEGIN_VALUE+10, false);
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_LEADER_FIRST_GUID)))
c->AI()->Talk(c->GetEntry() == NPC_JAINA_PART1 ? SAY_JAINA_KRICK_2 : SAY_SYLVANAS_KRICK_2);
}
events.PopEvent();
events.RescheduleEvent(5, 6500);
break;
case 5:
Talk(SAY_OUTRO_KRICK_3);
events.PopEvent();
events.RescheduleEvent(6, 6500);
break;
case 6:
if (pInstance)
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_TYRANNUS_EVENT_GUID)))
{
c->SetFacingToObject(me);
c->AI()->Talk(SAY_TYRANNUS_KRICK_1);
}
events.PopEvent();
events.RescheduleEvent(7, 4000);
break;
case 7:
me->CastSpell(me, 69413, true);
me->SendMeleeAttackStop(me->GetVictim());
me->SetCanFly(true);
me->SetDisableGravity(true);
me->SendMovementFlagUpdate();
me->GetMotionMaster()->MoveTakeoff(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+9.0f, 0.5f * 7.0f);
events.PopEvent();
events.RescheduleEvent(8, 2000);
break;
case 8:
Talk(SAY_OUTRO_KRICK_4);
events.PopEvent();
events.RescheduleEvent(9, 1500);
break;
case 9:
if (pInstance)
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_TYRANNUS_EVENT_GUID)))
c->CastSpell(c, 69753, false);
events.PopEvent();
events.RescheduleEvent(8, 2000);
break;
case 8:
Talk(SAY_OUTRO_KRICK_4);
events.PopEvent();
events.RescheduleEvent(9, 1500);
break;
case 9:
if (pInstance)
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_TYRANNUS_EVENT_GUID)))
c->CastSpell(c, 69753, false);
me->SetReactState(REACT_PASSIVE);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29 | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
me->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
me->AddUnitState(UNIT_STATE_DIED);
me->SetReactState(REACT_PASSIVE);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29 | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
me->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
me->AddUnitState(UNIT_STATE_DIED);
me->CastSpell(me, SPELL_KRICK_KILL_CREDIT, true);
me->CastSpell(me, SPELL_KRICK_KILL_CREDIT, true);
me->RemoveAllAuras();
me->GetMotionMaster()->MoveFall(0, true);
events.PopEvent();
events.RescheduleEvent(10, 5000);
break;
case 10:
if (pInstance)
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_TYRANNUS_EVENT_GUID)))
c->AI()->Talk(SAY_TYRANNUS_KRICK_2);
events.PopEvent();
events.RescheduleEvent(11, 9000);
break;
case 11:
if (pInstance)
{
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_TYRANNUS_EVENT_GUID)))
c->GetMotionMaster()->MovePoint(1, 809.39f, 74.69f, 541.54f);
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_LEADER_FIRST_GUID)))
{
c->AI()->Talk(c->GetEntry() == NPC_JAINA_PART1 ? SAY_JAINA_KRICK_3 : SAY_SYLVANAS_KRICK_3);
c->GetMotionMaster()->MovePath(PATH_BEGIN_VALUE+11, false);
}
}
me->setActive(false);
Unit::Kill(me, me);
events.PopEvent();
break;
}
}
};
me->RemoveAllAuras();
me->GetMotionMaster()->MoveFall(0, true);
events.PopEvent();
events.RescheduleEvent(10, 5000);
break;
case 10:
if (pInstance)
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_TYRANNUS_EVENT_GUID)))
c->AI()->Talk(SAY_TYRANNUS_KRICK_2);
events.PopEvent();
events.RescheduleEvent(11, 9000);
break;
case 11:
if (pInstance)
{
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_TYRANNUS_EVENT_GUID)))
c->GetMotionMaster()->MovePoint(1, 809.39f, 74.69f, 541.54f);
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_LEADER_FIRST_GUID)))
{
c->AI()->Talk(c->GetEntry() == NPC_JAINA_PART1 ? SAY_JAINA_KRICK_3 : SAY_SYLVANAS_KRICK_3);
c->GetMotionMaster()->MovePath(PATH_BEGIN_VALUE+11, false);
}
}
me->setActive(false);
Unit::Kill(me, me);
events.PopEvent();
break;
}
}
};
CreatureAI* GetAI(Creature* creature) const
{
return new boss_krickAI(creature);
}
CreatureAI* GetAI(Creature* creature) const
{
return new boss_krickAI(creature);
}
};
class spell_krick_explosive_barrage : public SpellScriptLoader
{
public:
spell_krick_explosive_barrage() : SpellScriptLoader("spell_krick_explosive_barrage") { }
spell_krick_explosive_barrage() : SpellScriptLoader("spell_krick_explosive_barrage") { }
class spell_krick_explosive_barrage_AuraScript : public AuraScript
{
PrepareAuraScript(spell_krick_explosive_barrage_AuraScript);
class spell_krick_explosive_barrage_AuraScript : public AuraScript
{
PrepareAuraScript(spell_krick_explosive_barrage_AuraScript);
void HandlePeriodicTick(AuraEffect const* /*aurEff*/)
{
PreventDefaultAction();
if (Unit* caster = GetCaster())
if (caster->GetTypeId() == TYPEID_UNIT)
{
Map::PlayerList const &players = caster->GetMap()->GetPlayers();
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
if (Player* player = itr->GetSource())
if (player->IsWithinDist(caster, 100.0f))
caster->CastSpell(player, SPELL_EXPLOSIVE_BARRAGE_SUMMON, true);
}
}
void HandlePeriodicTick(AuraEffect const* /*aurEff*/)
{
PreventDefaultAction();
if (Unit* caster = GetCaster())
if (caster->GetTypeId() == TYPEID_UNIT)
{
Map::PlayerList const &players = caster->GetMap()->GetPlayers();
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
if (Player* player = itr->GetSource())
if (player->IsWithinDist(caster, 100.0f))
caster->CastSpell(player, SPELL_EXPLOSIVE_BARRAGE_SUMMON, true);
}
}
void Register()
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_krick_explosive_barrage_AuraScript::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
}
};
void Register()
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_krick_explosive_barrage_AuraScript::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
}
};
AuraScript* GetAuraScript() const
{
return new spell_krick_explosive_barrage_AuraScript();
}
AuraScript* GetAuraScript() const
{
return new spell_krick_explosive_barrage_AuraScript();
}
};
class spell_exploding_orb_auto_grow : public SpellScriptLoader
{
public:
spell_exploding_orb_auto_grow() : SpellScriptLoader("spell_exploding_orb_auto_grow") { }
spell_exploding_orb_auto_grow() : SpellScriptLoader("spell_exploding_orb_auto_grow") { }
class spell_exploding_orb_auto_grow_AuraScript : public AuraScript
{
PrepareAuraScript(spell_exploding_orb_auto_grow_AuraScript);
class spell_exploding_orb_auto_grow_AuraScript : public AuraScript
{
PrepareAuraScript(spell_exploding_orb_auto_grow_AuraScript);
void HandlePeriodicTick(AuraEffect const* aurEff)
{
if (aurEff->GetTickNumber() >= 16)
if (Unit* target = GetTarget())
{
PreventDefaultAction();
target->CastSpell(target, SPELL_EXPLOSIVE_BARRAGE_DAMAGE, false);
target->RemoveAurasDueToSpell(SPELL_HASTY_GROW);
target->RemoveAurasDueToSpell(SPELL_AUTO_GROW);
target->RemoveAurasDueToSpell(SPELL_EXPLODING_ORB_VISUAL);
if (target->GetTypeId() == TYPEID_UNIT)
target->ToCreature()->DespawnOrUnsummon(2000);
}
}
void HandlePeriodicTick(AuraEffect const* aurEff)
{
if (aurEff->GetTickNumber() >= 16)
if (Unit* target = GetTarget())
{
PreventDefaultAction();
target->CastSpell(target, SPELL_EXPLOSIVE_BARRAGE_DAMAGE, false);
target->RemoveAurasDueToSpell(SPELL_HASTY_GROW);
target->RemoveAurasDueToSpell(SPELL_AUTO_GROW);
target->RemoveAurasDueToSpell(SPELL_EXPLODING_ORB_VISUAL);
if (target->GetTypeId() == TYPEID_UNIT)
target->ToCreature()->DespawnOrUnsummon(2000);
}
}
void Register()
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_exploding_orb_auto_grow_AuraScript::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
}
};
void Register()
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_exploding_orb_auto_grow_AuraScript::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
}
};
AuraScript* GetAuraScript() const
{
return new spell_exploding_orb_auto_grow_AuraScript();
}
AuraScript* GetAuraScript() const
{
return new spell_exploding_orb_auto_grow_AuraScript();
}
};
void AddSC_boss_ick()
{
new boss_ick();
new boss_krick();
new boss_ick();
new boss_krick();
new spell_krick_explosive_barrage();
new spell_exploding_orb_auto_grow();
new spell_krick_explosive_barrage();
new spell_exploding_orb_auto_grow();
}

View File

@@ -9,222 +9,222 @@ REWRITTEN FROM SCRATCH BY PUSSYWIZARD, IT OWNS NOW!
enum Texts
{
SAY_AGGRO = 53,
SAY_SLAY_1 = 54,
SAY_SLAY_2 = 55,
SAY_DEATH = 56,
SAY_MARK = 57,
SAY_SMASH = 58,
EMOTE_RIMEFANG_ICEBOLT = 59,
EMOTE_SMASH = 60,
SAY_AGGRO = 53,
SAY_SLAY_1 = 54,
SAY_SLAY_2 = 55,
SAY_DEATH = 56,
SAY_MARK = 57,
SAY_SMASH = 58,
EMOTE_RIMEFANG_ICEBOLT = 59,
EMOTE_SMASH = 60,
};
enum Spells
{
SPELL_OVERLORDS_BRAND = 69172,
SPELL_OVERLORDS_BRAND_HEAL = 69190,
SPELL_OVERLORDS_BRAND_DAMAGE = 69189,
SPELL_FORCEFUL_SMASH = 69155,
SPELL_UNHOLY_POWER = 69167,
RIMEFANG_SPELL_ICY_BLAST = 69232,
SPELL_MARK_OF_RIMEFANG = 69275,
RIMEFANG_SPELL_HOARFROST = 69246,
SPELL_OVERLORDS_BRAND = 69172,
SPELL_OVERLORDS_BRAND_HEAL = 69190,
SPELL_OVERLORDS_BRAND_DAMAGE = 69189,
SPELL_FORCEFUL_SMASH = 69155,
SPELL_UNHOLY_POWER = 69167,
RIMEFANG_SPELL_ICY_BLAST = 69232,
SPELL_MARK_OF_RIMEFANG = 69275,
RIMEFANG_SPELL_HOARFROST = 69246,
};
enum Events
{
EVENT_SPELL_FORCEFUL_SMASH = 1,
EVENT_SPELL_UNHOLY_POWER,
EVENT_SPELL_OVERLORDS_BRAND,
EVENT_RIMEFANG_SPELL_ICY_BLAST,
EVENT_SPELL_MARK_OF_RIMEFANG,
EVENT_SPELL_FORCEFUL_SMASH = 1,
EVENT_SPELL_UNHOLY_POWER,
EVENT_SPELL_OVERLORDS_BRAND,
EVENT_RIMEFANG_SPELL_ICY_BLAST,
EVENT_SPELL_MARK_OF_RIMEFANG,
};
class boss_tyrannus : public CreatureScript
{
public:
boss_tyrannus() : CreatureScript("boss_tyrannus") { }
boss_tyrannus() : CreatureScript("boss_tyrannus") { }
struct boss_tyrannusAI : public ScriptedAI
{
boss_tyrannusAI(Creature* creature) : ScriptedAI(creature)
{
pInstance = me->GetInstanceScript();
me->SetReactState(REACT_PASSIVE);
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_RIMEFANG_GUID)))
{
c->SetCanFly(true);
}
}
struct boss_tyrannusAI : public ScriptedAI
{
boss_tyrannusAI(Creature* creature) : ScriptedAI(creature)
{
pInstance = me->GetInstanceScript();
me->SetReactState(REACT_PASSIVE);
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_RIMEFANG_GUID)))
{
c->SetCanFly(true);
}
}
InstanceScript* pInstance;
EventMap events;
InstanceScript* pInstance;
EventMap events;
void Reset()
{
events.Reset();
if (me->HasReactState(REACT_AGGRESSIVE)) // Reset() called by EnterEvadeMode()
{
if (!pInstance)
return;
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_MARTIN_OR_GORKUN_GUID)))
{
c->AI()->DoAction(1);
c->DespawnOrUnsummon();
pInstance->SetData64(DATA_MARTIN_OR_GORKUN_GUID, 0);
}
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_RIMEFANG_GUID)))
{
c->GetMotionMaster()->Clear();
c->GetMotionMaster()->MoveIdle();
void Reset()
{
events.Reset();
if (me->HasReactState(REACT_AGGRESSIVE)) // Reset() called by EnterEvadeMode()
{
if (!pInstance)
return;
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_MARTIN_OR_GORKUN_GUID)))
{
c->AI()->DoAction(1);
c->DespawnOrUnsummon();
pInstance->SetData64(DATA_MARTIN_OR_GORKUN_GUID, 0);
}
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_RIMEFANG_GUID)))
{
c->GetMotionMaster()->Clear();
c->GetMotionMaster()->MoveIdle();
c->RemoveAllAuras();
c->UpdatePosition(1017.3f, 168.974f, 642.926f, 5.2709f, true);
c->StopMovingOnCurrentPos();
if (Vehicle* v = c->GetVehicleKit())
v->InstallAllAccessories(false);
}
}
}
c->RemoveAllAuras();
c->UpdatePosition(1017.3f, 168.974f, 642.926f, 5.2709f, true);
c->StopMovingOnCurrentPos();
if (Vehicle* v = c->GetVehicleKit())
v->InstallAllAccessories(false);
}
}
}
void DoAction(int32 param)
{
if (param == 1)
{
Position exitPos = {1023.46f, 159.12f, 628.2f, 5.23f};
me->RemoveAllAuras();
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_RIMEFANG_GUID)))
{
c->RemoveAura(46598);
c->GetMotionMaster()->Clear();
c->GetMotionMaster()->MovePath(PATH_BEGIN_VALUE+18, true);
}
me->SetHomePosition(exitPos);
me->GetMotionMaster()->MoveJump(exitPos, 10.0f, 2.0f);
void DoAction(int32 param)
{
if (param == 1)
{
Position exitPos = {1023.46f, 159.12f, 628.2f, 5.23f};
me->RemoveAllAuras();
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_RIMEFANG_GUID)))
{
c->RemoveAura(46598);
c->GetMotionMaster()->Clear();
c->GetMotionMaster()->MovePath(PATH_BEGIN_VALUE+18, true);
}
me->SetHomePosition(exitPos);
me->GetMotionMaster()->MoveJump(exitPos, 10.0f, 2.0f);
// start real fight
DoZoneInCombat();
me->CastSpell(me, 43979, true);
Talk(SAY_AGGRO);
events.Reset();
events.RescheduleEvent(EVENT_SPELL_FORCEFUL_SMASH, urand(14000,16000));
events.RescheduleEvent(EVENT_SPELL_OVERLORDS_BRAND, urand(4000,6000));
events.RescheduleEvent(EVENT_RIMEFANG_SPELL_ICY_BLAST, 5000);
events.RescheduleEvent(EVENT_SPELL_MARK_OF_RIMEFANG, 25000);
}
}
// start real fight
DoZoneInCombat();
me->CastSpell(me, 43979, true);
Talk(SAY_AGGRO);
events.Reset();
events.RescheduleEvent(EVENT_SPELL_FORCEFUL_SMASH, urand(14000,16000));
events.RescheduleEvent(EVENT_SPELL_OVERLORDS_BRAND, urand(4000,6000));
events.RescheduleEvent(EVENT_RIMEFANG_SPELL_ICY_BLAST, 5000);
events.RescheduleEvent(EVENT_SPELL_MARK_OF_RIMEFANG, 25000);
}
}
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
if (me->GetVictim())
{
float x,y,z;
me->GetVictim()->GetPosition(x, y, z);
if (TSDistCheckPos.GetExactDist(x,y,z) > 100.0f || z > TSDistCheckPos.GetPositionZ()+20.0f || z < TSDistCheckPos.GetPositionZ()-20.0f)
{
me->SetHealth(me->GetMaxHealth());
EnterEvadeMode();
return;
}
}
if (me->GetVictim())
{
float x,y,z;
me->GetVictim()->GetPosition(x, y, z);
if (TSDistCheckPos.GetExactDist(x,y,z) > 100.0f || z > TSDistCheckPos.GetPositionZ()+20.0f || z < TSDistCheckPos.GetPositionZ()-20.0f)
{
me->SetHealth(me->GetMaxHealth());
EnterEvadeMode();
return;
}
}
events.Update(diff);
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch(events.GetEvent())
{
case 0:
break;
case EVENT_SPELL_FORCEFUL_SMASH:
if (me->IsWithinMeleeRange(me->GetVictim()))
{
me->CastSpell(me->GetVictim(), SPELL_FORCEFUL_SMASH, false);
events.PopEvent();
events.RescheduleEvent(EVENT_SPELL_UNHOLY_POWER, 1000);
break;
}
events.RepeatEvent(3000);
break;
case EVENT_SPELL_UNHOLY_POWER:
Talk(SAY_SMASH);
Talk(EMOTE_SMASH);
me->CastSpell(me, SPELL_UNHOLY_POWER, false);
events.PopEvent();
events.ScheduleEvent(EVENT_SPELL_FORCEFUL_SMASH, urand(40000, 48000));
break;
case EVENT_SPELL_OVERLORDS_BRAND:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 95.0f, true))
me->CastSpell(target, SPELL_OVERLORDS_BRAND, false);
events.RepeatEvent(urand(11000,12000));
break;
case EVENT_RIMEFANG_SPELL_ICY_BLAST:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 190.0f, true))
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_RIMEFANG_GUID)))
c->CastSpell(target, RIMEFANG_SPELL_ICY_BLAST, false);
events.RepeatEvent(5000);
break;
case EVENT_SPELL_MARK_OF_RIMEFANG:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 190.0f, true))
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_RIMEFANG_GUID)))
{
Talk(SAY_MARK);
c->AI()->Talk(EMOTE_RIMEFANG_ICEBOLT, target);
c->CastSpell(target, RIMEFANG_SPELL_HOARFROST, false);
}
events.RepeatEvent(25000);
events.RescheduleEvent(EVENT_RIMEFANG_SPELL_ICY_BLAST, 10000);
break;
}
switch(events.GetEvent())
{
case 0:
break;
case EVENT_SPELL_FORCEFUL_SMASH:
if (me->IsWithinMeleeRange(me->GetVictim()))
{
me->CastSpell(me->GetVictim(), SPELL_FORCEFUL_SMASH, false);
events.PopEvent();
events.RescheduleEvent(EVENT_SPELL_UNHOLY_POWER, 1000);
break;
}
events.RepeatEvent(3000);
break;
case EVENT_SPELL_UNHOLY_POWER:
Talk(SAY_SMASH);
Talk(EMOTE_SMASH);
me->CastSpell(me, SPELL_UNHOLY_POWER, false);
events.PopEvent();
events.ScheduleEvent(EVENT_SPELL_FORCEFUL_SMASH, urand(40000, 48000));
break;
case EVENT_SPELL_OVERLORDS_BRAND:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 95.0f, true))
me->CastSpell(target, SPELL_OVERLORDS_BRAND, false);
events.RepeatEvent(urand(11000,12000));
break;
case EVENT_RIMEFANG_SPELL_ICY_BLAST:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 190.0f, true))
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_RIMEFANG_GUID)))
c->CastSpell(target, RIMEFANG_SPELL_ICY_BLAST, false);
events.RepeatEvent(5000);
break;
case EVENT_SPELL_MARK_OF_RIMEFANG:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 190.0f, true))
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_RIMEFANG_GUID)))
{
Talk(SAY_MARK);
c->AI()->Talk(EMOTE_RIMEFANG_ICEBOLT, target);
c->CastSpell(target, RIMEFANG_SPELL_HOARFROST, false);
}
events.RepeatEvent(25000);
events.RescheduleEvent(EVENT_RIMEFANG_SPELL_ICY_BLAST, 10000);
break;
}
DoMeleeAttackIfReady();
}
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*killer*/)
{
Talk(SAY_DEATH);
if (pInstance)
pInstance->SetData(DATA_TYRANNUS, DONE);
if (me->IsSummon())
me->ToTempSummon()->SetTempSummonType(TEMPSUMMON_MANUAL_DESPAWN);
}
void JustDied(Unit* /*killer*/)
{
Talk(SAY_DEATH);
if (pInstance)
pInstance->SetData(DATA_TYRANNUS, DONE);
if (me->IsSummon())
me->ToTempSummon()->SetTempSummonType(TEMPSUMMON_MANUAL_DESPAWN);
}
void KilledUnit(Unit* who)
{
if (who->GetTypeId() == TYPEID_PLAYER)
Talk(RAND(SAY_SLAY_1,SAY_SLAY_2));
}
void KilledUnit(Unit* who)
{
if (who->GetTypeId() == TYPEID_PLAYER)
Talk(RAND(SAY_SLAY_1,SAY_SLAY_2));
}
bool CanAIAttack(const Unit* who) const
{
switch (who->GetEntry())
{
case NPC_MARTIN_VICTUS_2:
case NPC_GORKUN_IRONSKULL_2:
case NPC_FREED_SLAVE_1_ALLIANCE:
case NPC_FREED_SLAVE_2_ALLIANCE:
case NPC_FREED_SLAVE_3_ALLIANCE:
case NPC_FREED_SLAVE_1_HORDE:
case NPC_FREED_SLAVE_2_HORDE:
case NPC_FREED_SLAVE_3_HORDE:
return false;
default:
return true;
}
}
};
bool CanAIAttack(const Unit* who) const
{
switch (who->GetEntry())
{
case NPC_MARTIN_VICTUS_2:
case NPC_GORKUN_IRONSKULL_2:
case NPC_FREED_SLAVE_1_ALLIANCE:
case NPC_FREED_SLAVE_2_ALLIANCE:
case NPC_FREED_SLAVE_3_ALLIANCE:
case NPC_FREED_SLAVE_1_HORDE:
case NPC_FREED_SLAVE_2_HORDE:
case NPC_FREED_SLAVE_3_HORDE:
return false;
default:
return true;
}
}
};
CreatureAI* GetAI(Creature* creature) const
{
return new boss_tyrannusAI(creature);
}
CreatureAI* GetAI(Creature* creature) const
{
return new boss_tyrannusAI(creature);
}
};
void AddSC_boss_tyrannus()
{
new boss_tyrannus();
new boss_tyrannus();
}

View File

@@ -10,74 +10,74 @@ REWRITTEN FROM SCRATCH BY PUSSYWIZARD, IT OWNS NOW!
class instance_pit_of_saron : public InstanceMapScript
{
public:
instance_pit_of_saron() : InstanceMapScript("instance_pit_of_saron", 658) { }
instance_pit_of_saron() : InstanceMapScript("instance_pit_of_saron", 658) { }
struct instance_pit_of_saron_InstanceScript : public InstanceScript
{
instance_pit_of_saron_InstanceScript(Map* map) : InstanceScript(map) {}
struct instance_pit_of_saron_InstanceScript : public InstanceScript
{
instance_pit_of_saron_InstanceScript(Map* map) : InstanceScript(map) {}
uint32 m_auiEncounter[MAX_ENCOUNTER];
TeamId teamIdInInstance;
uint32 InstanceProgress;
std::string str_data;
uint32 m_auiEncounter[MAX_ENCOUNTER];
TeamId teamIdInInstance;
uint32 InstanceProgress;
std::string str_data;
uint64 NPC_LeaderFirstGUID;
uint64 NPC_LeaderSecondGUID;
uint64 NPC_TyrannusEventGUID;
uint64 NPC_Necrolyte1GUID;
uint64 NPC_Necrolyte2GUID;
uint64 NPC_GuardFirstGUID;
uint64 NPC_GuardSecondGUID;
uint64 NPC_SindragosaGUID;
uint64 NPC_LeaderFirstGUID;
uint64 NPC_LeaderSecondGUID;
uint64 NPC_TyrannusEventGUID;
uint64 NPC_Necrolyte1GUID;
uint64 NPC_Necrolyte2GUID;
uint64 NPC_GuardFirstGUID;
uint64 NPC_GuardSecondGUID;
uint64 NPC_SindragosaGUID;
uint64 NPC_GarfrostGUID;
uint64 NPC_MartinOrGorkunGUID;
uint64 NPC_RimefangGUID;
uint64 NPC_TyrannusGUID;
uint64 NPC_GarfrostGUID;
uint64 NPC_MartinOrGorkunGUID;
uint64 NPC_RimefangGUID;
uint64 NPC_TyrannusGUID;
uint64 GO_IceWallGUID;
uint64 GO_IceWallGUID;
bool bAchievEleven;
bool bAchievDontLookUp;
bool bAchievEleven;
bool bAchievDontLookUp;
void Initialize()
{
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
teamIdInInstance = TEAM_NEUTRAL;
InstanceProgress = INSTANCE_PROGRESS_NONE;
void Initialize()
{
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
teamIdInInstance = TEAM_NEUTRAL;
InstanceProgress = INSTANCE_PROGRESS_NONE;
NPC_LeaderFirstGUID = 0;
NPC_LeaderSecondGUID = 0;
NPC_TyrannusEventGUID = 0;
NPC_Necrolyte1GUID = 0;
NPC_Necrolyte2GUID = 0;
NPC_GuardFirstGUID = 0;
NPC_GuardSecondGUID = 0;
NPC_SindragosaGUID = 0;
NPC_LeaderFirstGUID = 0;
NPC_LeaderSecondGUID = 0;
NPC_TyrannusEventGUID = 0;
NPC_Necrolyte1GUID = 0;
NPC_Necrolyte2GUID = 0;
NPC_GuardFirstGUID = 0;
NPC_GuardSecondGUID = 0;
NPC_SindragosaGUID = 0;
NPC_GarfrostGUID = 0;
NPC_MartinOrGorkunGUID = 0;
NPC_RimefangGUID = 0;
NPC_TyrannusGUID = 0;
NPC_GarfrostGUID = 0;
NPC_MartinOrGorkunGUID = 0;
NPC_RimefangGUID = 0;
NPC_TyrannusGUID = 0;
GO_IceWallGUID = 0;
GO_IceWallGUID = 0;
bAchievEleven = true;
bAchievDontLookUp = true;
}
bAchievEleven = true;
bAchievDontLookUp = true;
}
bool IsEncounterInProgress() const
{
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS) return true;
bool IsEncounterInProgress() const
{
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS) return true;
return false;
}
return false;
}
void OnPlayerEnter(Player* plr)
{
instance->LoadGrid(LeaderIntroPos.GetPositionX(), LeaderIntroPos.GetPositionY());
}
void OnPlayerEnter(Player* plr)
{
instance->LoadGrid(LeaderIntroPos.GetPositionX(), LeaderIntroPos.GetPositionY());
}
uint32 GetCreatureEntry(uint32 /*guidLow*/, CreatureData const* data)
{
@@ -100,338 +100,338 @@ public:
if (teamIdInInstance == TEAM_ALLIANCE)
return 0;
break;
}
}
return entry;
}
return entry;
}
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 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_SYLVANAS_PART1:
if (teamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_JAINA_PART1);
NPC_LeaderFirstGUID = creature->GetGUID();
switch (creature->GetEntry())
{
case NPC_SYLVANAS_PART1:
if (teamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_JAINA_PART1);
NPC_LeaderFirstGUID = creature->GetGUID();
switch (InstanceProgress)
{
case INSTANCE_PROGRESS_FINISHED_INTRO:
creature->SetPosition(LeaderIntroPos);
break;
case INSTANCE_PROGRESS_FINISHED_KRICK_SCENE:
case INSTANCE_PROGRESS_AFTER_WARN_1:
case INSTANCE_PROGRESS_AFTER_WARN_2:
case INSTANCE_PROGRESS_AFTER_TUNNEL_WARN:
case INSTANCE_PROGRESS_TYRANNUS_INTRO:
creature->SetPosition(SBSLeaderEndPos);
break;
}
break;
case NPC_SYLVANAS_PART2:
if (teamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_JAINA_PART2);
NPC_LeaderSecondGUID = creature->GetGUID();
break;
case NPC_TYRANNUS_EVENT:
if (!NPC_TyrannusEventGUID)
{
switch (InstanceProgress)
{
case INSTANCE_PROGRESS_FINISHED_INTRO:
creature->SetPosition(SBSTyrannusStartPos);
break;
case INSTANCE_PROGRESS_FINISHED_KRICK_SCENE:
creature->SetPosition(PTSTyrannusWaitPos1);
break;
case INSTANCE_PROGRESS_AFTER_WARN_1:
creature->SetPosition(PTSTyrannusWaitPos2);
break;
case INSTANCE_PROGRESS_AFTER_WARN_2:
creature->SetPosition(PTSTyrannusWaitPos3);
break;
case INSTANCE_PROGRESS_AFTER_TUNNEL_WARN:
case INSTANCE_PROGRESS_TYRANNUS_INTRO:
creature->SetPosition(SBSTyrannusStartPos);
break;
}
NPC_TyrannusEventGUID = creature->GetGUID();
}
break;
case NPC_LORALEN:
if (teamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_ELANDRA);
if (!NPC_GuardFirstGUID)
NPC_GuardFirstGUID = creature->GetGUID();
break;
case NPC_KALIRA:
if (teamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_KORELN);
if (!NPC_GuardSecondGUID)
NPC_GuardSecondGUID = creature->GetGUID();
break;
case NPC_HORDE_SLAVE_1:
if (teamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_ALLIANCE_SLAVE_1);
break;
case NPC_HORDE_SLAVE_2:
if (teamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_ALLIANCE_SLAVE_2);
break;
case NPC_HORDE_SLAVE_3:
if (teamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_ALLIANCE_SLAVE_3);
break;
case NPC_HORDE_SLAVE_4:
if (teamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_ALLIANCE_SLAVE_4);
break;
case NPC_GORKUN_IRONSKULL_1:
if (teamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_MARTIN_VICTUS_1);
break;
case NPC_GARFROST:
NPC_GarfrostGUID = creature->GetGUID();
break;
case NPC_FREED_SLAVE_1_HORDE:
if (teamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_FREED_SLAVE_1_ALLIANCE);
break;
case NPC_FREED_SLAVE_2_HORDE:
if (teamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_FREED_SLAVE_2_ALLIANCE);
break;
case NPC_FREED_SLAVE_3_HORDE:
if (teamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_FREED_SLAVE_3_ALLIANCE);
break;
case NPC_GORKUN_IRONSKULL_2:
if (NPC_MartinOrGorkunGUID)
if (Creature* c = instance->GetCreature(NPC_MartinOrGorkunGUID))
{
c->AI()->DoAction(1); // despawn summons
c->DespawnOrUnsummon();
}
if (teamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_MARTIN_VICTUS_2);
NPC_MartinOrGorkunGUID = creature->GetGUID();
break;
case NPC_RIMEFANG:
NPC_RimefangGUID = creature->GetGUID();
if (m_auiEncounter[2] == DONE)
creature->SetVisible(false);
break;
case NPC_TYRANNUS:
if (NPC_TyrannusGUID)
if (Creature* c = instance->GetCreature(NPC_TyrannusGUID))
c->DespawnOrUnsummon();
NPC_TyrannusGUID = creature->GetGUID();
switch (InstanceProgress)
{
case INSTANCE_PROGRESS_FINISHED_INTRO:
creature->SetPosition(LeaderIntroPos);
break;
case INSTANCE_PROGRESS_FINISHED_KRICK_SCENE:
case INSTANCE_PROGRESS_AFTER_WARN_1:
case INSTANCE_PROGRESS_AFTER_WARN_2:
case INSTANCE_PROGRESS_AFTER_TUNNEL_WARN:
case INSTANCE_PROGRESS_TYRANNUS_INTRO:
creature->SetPosition(SBSLeaderEndPos);
break;
}
break;
case NPC_SYLVANAS_PART2:
if (teamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_JAINA_PART2);
NPC_LeaderSecondGUID = creature->GetGUID();
break;
case NPC_TYRANNUS_EVENT:
if (!NPC_TyrannusEventGUID)
{
switch (InstanceProgress)
{
case INSTANCE_PROGRESS_FINISHED_INTRO:
creature->SetPosition(SBSTyrannusStartPos);
break;
case INSTANCE_PROGRESS_FINISHED_KRICK_SCENE:
creature->SetPosition(PTSTyrannusWaitPos1);
break;
case INSTANCE_PROGRESS_AFTER_WARN_1:
creature->SetPosition(PTSTyrannusWaitPos2);
break;
case INSTANCE_PROGRESS_AFTER_WARN_2:
creature->SetPosition(PTSTyrannusWaitPos3);
break;
case INSTANCE_PROGRESS_AFTER_TUNNEL_WARN:
case INSTANCE_PROGRESS_TYRANNUS_INTRO:
creature->SetPosition(SBSTyrannusStartPos);
break;
}
NPC_TyrannusEventGUID = creature->GetGUID();
}
break;
case NPC_LORALEN:
if (teamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_ELANDRA);
if (!NPC_GuardFirstGUID)
NPC_GuardFirstGUID = creature->GetGUID();
break;
case NPC_KALIRA:
if (teamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_KORELN);
if (!NPC_GuardSecondGUID)
NPC_GuardSecondGUID = creature->GetGUID();
break;
case NPC_HORDE_SLAVE_1:
if (teamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_ALLIANCE_SLAVE_1);
break;
case NPC_HORDE_SLAVE_2:
if (teamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_ALLIANCE_SLAVE_2);
break;
case NPC_HORDE_SLAVE_3:
if (teamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_ALLIANCE_SLAVE_3);
break;
case NPC_HORDE_SLAVE_4:
if (teamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_ALLIANCE_SLAVE_4);
break;
case NPC_GORKUN_IRONSKULL_1:
if (teamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_MARTIN_VICTUS_1);
break;
case NPC_GARFROST:
NPC_GarfrostGUID = creature->GetGUID();
break;
case NPC_FREED_SLAVE_1_HORDE:
if (teamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_FREED_SLAVE_1_ALLIANCE);
break;
case NPC_FREED_SLAVE_2_HORDE:
if (teamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_FREED_SLAVE_2_ALLIANCE);
break;
case NPC_FREED_SLAVE_3_HORDE:
if (teamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_FREED_SLAVE_3_ALLIANCE);
break;
case NPC_GORKUN_IRONSKULL_2:
if (NPC_MartinOrGorkunGUID)
if (Creature* c = instance->GetCreature(NPC_MartinOrGorkunGUID))
{
c->AI()->DoAction(1); // despawn summons
c->DespawnOrUnsummon();
}
if (teamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_MARTIN_VICTUS_2);
NPC_MartinOrGorkunGUID = creature->GetGUID();
break;
case NPC_RIMEFANG:
NPC_RimefangGUID = creature->GetGUID();
if (m_auiEncounter[2] == DONE)
creature->SetVisible(false);
break;
case NPC_TYRANNUS:
if (NPC_TyrannusGUID)
if (Creature* c = instance->GetCreature(NPC_TyrannusGUID))
c->DespawnOrUnsummon();
NPC_TyrannusGUID = creature->GetGUID();
if (m_auiEncounter[2] == DONE)
creature->SetVisible(false);
break;
case NPC_SINDRAGOSA:
NPC_SindragosaGUID = creature->GetGUID();
break;
}
}
if (m_auiEncounter[2] == DONE)
creature->SetVisible(false);
break;
case NPC_SINDRAGOSA:
NPC_SindragosaGUID = creature->GetGUID();
break;
}
}
void OnGameObjectCreate(GameObject* go)
{
switch (go->GetEntry())
{
case GO_ICE_WALL:
GO_IceWallGUID = go->GetGUID();
if (GetData(DATA_GARFROST) == DONE && GetData(DATA_ICK) == DONE)
go->SetGoState(GO_STATE_ACTIVE);
break;
}
}
case GO_ICE_WALL:
GO_IceWallGUID = go->GetGUID();
if (GetData(DATA_GARFROST) == DONE && GetData(DATA_ICK) == DONE)
go->SetGoState(GO_STATE_ACTIVE);
break;
}
}
void SetData(uint32 type, uint32 data)
{
switch(type)
{
case DATA_INSTANCE_PROGRESS:
if (InstanceProgress < data)
{
InstanceProgress = data;
if (InstanceProgress == INSTANCE_PROGRESS_TYRANNUS_INTRO && instance->GetDifficulty() == DUNGEON_DIFFICULTY_HEROIC && bAchievDontLookUp) // achiev Don't Look Up (4525)
DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, 72845);
}
break;
case DATA_GARFROST:
m_auiEncounter[0] = data;
if (data == DONE)
instance->SummonCreature(NPC_GORKUN_IRONSKULL_1, FBSSpawnPos);
else // NOT_STARTED, IN_PROGRESS
bAchievEleven = true;
if (data == DONE && GetData(DATA_ICK) == DONE)
if (GameObject* icewall = instance->GetGameObject(GO_IceWallGUID))
icewall->SetGoState(GO_STATE_ACTIVE);
break;
case DATA_ICK:
m_auiEncounter[1] = data;
if (data == DONE && GetData(DATA_GARFROST) == DONE)
if (GameObject* icewall = instance->GetGameObject(GO_IceWallGUID))
icewall->SetGoState(GO_STATE_ACTIVE);
break;
case DATA_TYRANNUS:
m_auiEncounter[2] = data;
if (data == DONE)
instance->SummonCreature(NPC_SYLVANAS_PART2, TSLeaderSpawnPos);
break;
case DATA_ACHIEV_ELEVEN:
bAchievEleven = false;
break;
case DATA_ACHIEV_DONT_LOOK_UP:
bAchievDontLookUp = false;
break;
}
void SetData(uint32 type, uint32 data)
{
switch(type)
{
case DATA_INSTANCE_PROGRESS:
if (InstanceProgress < data)
{
InstanceProgress = data;
if (InstanceProgress == INSTANCE_PROGRESS_TYRANNUS_INTRO && instance->GetDifficulty() == DUNGEON_DIFFICULTY_HEROIC && bAchievDontLookUp) // achiev Don't Look Up (4525)
DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, 72845);
}
break;
case DATA_GARFROST:
m_auiEncounter[0] = data;
if (data == DONE)
instance->SummonCreature(NPC_GORKUN_IRONSKULL_1, FBSSpawnPos);
else // NOT_STARTED, IN_PROGRESS
bAchievEleven = true;
if (data == DONE && GetData(DATA_ICK) == DONE)
if (GameObject* icewall = instance->GetGameObject(GO_IceWallGUID))
icewall->SetGoState(GO_STATE_ACTIVE);
break;
case DATA_ICK:
m_auiEncounter[1] = data;
if (data == DONE && GetData(DATA_GARFROST) == DONE)
if (GameObject* icewall = instance->GetGameObject(GO_IceWallGUID))
icewall->SetGoState(GO_STATE_ACTIVE);
break;
case DATA_TYRANNUS:
m_auiEncounter[2] = data;
if (data == DONE)
instance->SummonCreature(NPC_SYLVANAS_PART2, TSLeaderSpawnPos);
break;
case DATA_ACHIEV_ELEVEN:
bAchievEleven = false;
break;
case DATA_ACHIEV_DONT_LOOK_UP:
bAchievDontLookUp = false;
break;
}
if (data == DONE || type == DATA_INSTANCE_PROGRESS)
SaveToDB();
}
if (data == DONE || type == DATA_INSTANCE_PROGRESS)
SaveToDB();
}
void SetData64(uint32 type, uint64 data)
{
switch(type)
{
case DATA_NECROLYTE_1_GUID:
NPC_Necrolyte1GUID = data;
break;
case DATA_NECROLYTE_2_GUID:
NPC_Necrolyte2GUID = data;
break;
case DATA_MARTIN_OR_GORKUN_GUID:
NPC_MartinOrGorkunGUID = data;
break;
}
}
void SetData64(uint32 type, uint64 data)
{
switch(type)
{
case DATA_NECROLYTE_1_GUID:
NPC_Necrolyte1GUID = data;
break;
case DATA_NECROLYTE_2_GUID:
NPC_Necrolyte2GUID = data;
break;
case DATA_MARTIN_OR_GORKUN_GUID:
NPC_MartinOrGorkunGUID = data;
break;
}
}
uint32 GetData(uint32 type) const
{
switch (type)
{
case DATA_INSTANCE_PROGRESS:
return InstanceProgress;
case DATA_TEAMID_IN_INSTANCE:
return teamIdInInstance;
case DATA_GARFROST:
return m_auiEncounter[0];
case DATA_ICK:
return m_auiEncounter[1];
case DATA_TYRANNUS:
return m_auiEncounter[2];
}
uint32 GetData(uint32 type) const
{
switch (type)
{
case DATA_INSTANCE_PROGRESS:
return InstanceProgress;
case DATA_TEAMID_IN_INSTANCE:
return teamIdInInstance;
case DATA_GARFROST:
return m_auiEncounter[0];
case DATA_ICK:
return m_auiEncounter[1];
case DATA_TYRANNUS:
return m_auiEncounter[2];
}
return 0;
}
return 0;
}
uint64 GetData64(uint32 type) const
{
switch (type)
{
case DATA_TYRANNUS_EVENT_GUID:
return NPC_TyrannusEventGUID;
case DATA_NECROLYTE_1_GUID:
return NPC_Necrolyte1GUID;
case DATA_NECROLYTE_2_GUID:
return NPC_Necrolyte2GUID;
case DATA_GUARD_1_GUID:
return NPC_GuardFirstGUID;
case DATA_GUARD_2_GUID:
return NPC_GuardSecondGUID;
case DATA_LEADER_FIRST_GUID:
return NPC_LeaderFirstGUID;
case DATA_GARFROST_GUID:
return NPC_GarfrostGUID;
case DATA_MARTIN_OR_GORKUN_GUID:
return NPC_MartinOrGorkunGUID;
case DATA_RIMEFANG_GUID:
return NPC_RimefangGUID;
case DATA_TYRANNUS_GUID:
return NPC_TyrannusGUID;
case DATA_LEADER_SECOND_GUID:
return NPC_LeaderSecondGUID;
case DATA_SINDRAGOSA_GUID:
return NPC_SindragosaGUID;
}
uint64 GetData64(uint32 type) const
{
switch (type)
{
case DATA_TYRANNUS_EVENT_GUID:
return NPC_TyrannusEventGUID;
case DATA_NECROLYTE_1_GUID:
return NPC_Necrolyte1GUID;
case DATA_NECROLYTE_2_GUID:
return NPC_Necrolyte2GUID;
case DATA_GUARD_1_GUID:
return NPC_GuardFirstGUID;
case DATA_GUARD_2_GUID:
return NPC_GuardSecondGUID;
case DATA_LEADER_FIRST_GUID:
return NPC_LeaderFirstGUID;
case DATA_GARFROST_GUID:
return NPC_GarfrostGUID;
case DATA_MARTIN_OR_GORKUN_GUID:
return NPC_MartinOrGorkunGUID;
case DATA_RIMEFANG_GUID:
return NPC_RimefangGUID;
case DATA_TYRANNUS_GUID:
return NPC_TyrannusGUID;
case DATA_LEADER_SECOND_GUID:
return NPC_LeaderSecondGUID;
case DATA_SINDRAGOSA_GUID:
return NPC_SindragosaGUID;
}
return 0;
}
return 0;
}
bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* source, Unit const* target = NULL, uint32 miscvalue1 = 0)
{
switch(criteria_id)
{
case 12993: // Doesn't Go to Eleven (4524)
return bAchievEleven;
}
return false;
}
bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* source, Unit const* target = NULL, uint32 miscvalue1 = 0)
{
switch(criteria_id)
{
case 12993: // Doesn't Go to Eleven (4524)
return bAchievEleven;
}
return false;
}
std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << "P S " << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' ' << m_auiEncounter[2] << ' ' << InstanceProgress;
str_data = saveStream.str();
std::ostringstream saveStream;
saveStream << "P S " << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' ' << m_auiEncounter[2] << ' ' << InstanceProgress;
str_data = saveStream.str();
OUT_SAVE_INST_DATA_COMPLETE;
return str_data;
}
OUT_SAVE_INST_DATA_COMPLETE;
return str_data;
}
void Load(const char* in)
{
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
void Load(const char* in)
{
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(in);
OUT_LOAD_INST_DATA(in);
char dataHead1, dataHead2;
uint32 data0, data1, data2, data3;
char dataHead1, dataHead2;
uint32 data0, data1, data2, data3;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3;
if (dataHead1 == 'P' && dataHead2 == 'S')
{
m_auiEncounter[0] = data0;
m_auiEncounter[1] = data1;
m_auiEncounter[2] = data2;
InstanceProgress = data3;
if (dataHead1 == 'P' && dataHead2 == 'S')
{
m_auiEncounter[0] = data0;
m_auiEncounter[1] = data1;
m_auiEncounter[2] = data2;
InstanceProgress = data3;
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS)
m_auiEncounter[i] = NOT_STARTED;
}
else OUT_LOAD_INST_DATA_FAIL;
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS)
m_auiEncounter[i] = NOT_STARTED;
}
else OUT_LOAD_INST_DATA_FAIL;
OUT_LOAD_INST_DATA_COMPLETE;
}
};
OUT_LOAD_INST_DATA_COMPLETE;
}
};
InstanceScript* GetInstanceScript(InstanceMap* map) const
{
return new instance_pit_of_saron_InstanceScript(map);
}
InstanceScript* GetInstanceScript(InstanceMap* map) const
{
return new instance_pit_of_saron_InstanceScript(map);
}
};
void AddSC_instance_pit_of_saron()
{
new instance_pit_of_saron();
new instance_pit_of_saron();
}

View File

@@ -7,116 +7,116 @@ REWRITTEN FROM SCRATCH BY PUSSYWIZARD, IT OWNS NOW!
enum DataTypes
{
DATA_GARFROST,
DATA_ICK,
DATA_TYRANNUS,
MAX_ENCOUNTER,
DATA_GARFROST,
DATA_ICK,
DATA_TYRANNUS,
MAX_ENCOUNTER,
DATA_INSTANCE_PROGRESS,
DATA_TEAMID_IN_INSTANCE,
DATA_TYRANNUS_EVENT_GUID,
DATA_NECROLYTE_1_GUID,
DATA_NECROLYTE_2_GUID,
DATA_GUARD_1_GUID,
DATA_GUARD_2_GUID,
DATA_LEADER_FIRST_GUID,
DATA_GARFROST_GUID,
DATA_MARTIN_OR_GORKUN_GUID,
DATA_RIMEFANG_GUID,
DATA_TYRANNUS_GUID,
DATA_LEADER_SECOND_GUID,
DATA_SINDRAGOSA_GUID,
DATA_ACHIEV_ELEVEN,
DATA_ACHIEV_DONT_LOOK_UP,
DATA_START_INTRO,
DATA_INSTANCE_PROGRESS,
DATA_TEAMID_IN_INSTANCE,
DATA_TYRANNUS_EVENT_GUID,
DATA_NECROLYTE_1_GUID,
DATA_NECROLYTE_2_GUID,
DATA_GUARD_1_GUID,
DATA_GUARD_2_GUID,
DATA_LEADER_FIRST_GUID,
DATA_GARFROST_GUID,
DATA_MARTIN_OR_GORKUN_GUID,
DATA_RIMEFANG_GUID,
DATA_TYRANNUS_GUID,
DATA_LEADER_SECOND_GUID,
DATA_SINDRAGOSA_GUID,
DATA_ACHIEV_ELEVEN,
DATA_ACHIEV_DONT_LOOK_UP,
DATA_START_INTRO,
};
enum InstanceProgressConst
{
INSTANCE_PROGRESS_NONE,
INSTANCE_PROGRESS_FINISHED_INTRO,
INSTANCE_PROGRESS_FINISHED_KRICK_SCENE,
INSTANCE_PROGRESS_AFTER_WARN_1,
INSTANCE_PROGRESS_AFTER_WARN_2,
INSTANCE_PROGRESS_AFTER_TUNNEL_WARN,
INSTANCE_PROGRESS_TYRANNUS_INTRO,
INSTANCE_PROGRESS_NONE,
INSTANCE_PROGRESS_FINISHED_INTRO,
INSTANCE_PROGRESS_FINISHED_KRICK_SCENE,
INSTANCE_PROGRESS_AFTER_WARN_1,
INSTANCE_PROGRESS_AFTER_WARN_2,
INSTANCE_PROGRESS_AFTER_TUNNEL_WARN,
INSTANCE_PROGRESS_TYRANNUS_INTRO,
};
enum CreatureIds
{
NPC_GARFROST = 36494,
NPC_KRICK = 36477,
NPC_ICK = 36476,
NPC_TYRANNUS = 36658,
NPC_RIMEFANG = 36661,
NPC_SINDRAGOSA = 37755,
NPC_GARFROST = 36494,
NPC_KRICK = 36477,
NPC_ICK = 36476,
NPC_TYRANNUS = 36658,
NPC_RIMEFANG = 36661,
NPC_SINDRAGOSA = 37755,
NPC_TYRANNUS_EVENT = 36794,
NPC_TYRANNUS_VOICE = 36795,
NPC_SYLVANAS_PART1 = 36990,
NPC_SYLVANAS_PART2 = 38189,
NPC_JAINA_PART1 = 36993,
NPC_JAINA_PART2 = 38188,
NPC_TYRANNUS_EVENT = 36794,
NPC_TYRANNUS_VOICE = 36795,
NPC_SYLVANAS_PART1 = 36990,
NPC_SYLVANAS_PART2 = 38189,
NPC_JAINA_PART1 = 36993,
NPC_JAINA_PART2 = 38188,
NPC_KALIRA = 37583,
NPC_ELANDRA = 37774,
NPC_LORALEN = 37779,
NPC_KORELN = 37582,
NPC_KALIRA = 37583,
NPC_ELANDRA = 37774,
NPC_LORALEN = 37779,
NPC_KORELN = 37582,
NPC_CHAMPION_1_HORDE = 37584,
NPC_CHAMPION_2_HORDE = 37587,
NPC_CHAMPION_3_HORDE = 37588,
NPC_CHAMPION_1_ALLIANCE = 37496,
NPC_CHAMPION_2_ALLIANCE = 37497,
NPC_CHAMPION_1_HORDE = 37584,
NPC_CHAMPION_2_HORDE = 37587,
NPC_CHAMPION_3_HORDE = 37588,
NPC_CHAMPION_1_ALLIANCE = 37496,
NPC_CHAMPION_2_ALLIANCE = 37497,
NPC_HORDE_SLAVE_1 = 36770,
NPC_HORDE_SLAVE_2 = 36771,
NPC_HORDE_SLAVE_3 = 36772,
NPC_HORDE_SLAVE_4 = 36773,
NPC_ALLIANCE_SLAVE_1 = 36764,
NPC_ALLIANCE_SLAVE_2 = 36765,
NPC_ALLIANCE_SLAVE_3 = 36766,
NPC_ALLIANCE_SLAVE_4 = 36767,
NPC_HORDE_SLAVE_1 = 36770,
NPC_HORDE_SLAVE_2 = 36771,
NPC_HORDE_SLAVE_3 = 36772,
NPC_HORDE_SLAVE_4 = 36773,
NPC_ALLIANCE_SLAVE_1 = 36764,
NPC_ALLIANCE_SLAVE_2 = 36765,
NPC_ALLIANCE_SLAVE_3 = 36766,
NPC_ALLIANCE_SLAVE_4 = 36767,
NPC_RESCUED_ALLIANCE_SLAVE = 36888,
NPC_RESCUED_HORDE_SLAVE = 36889,
NPC_RESCUED_ALLIANCE_SLAVE = 36888,
NPC_RESCUED_HORDE_SLAVE = 36889,
NPC_YMIRJAR_DEATHBRINGER = 36892,
NPC_YMIRJAR_WRATHBRINGER = 36840,
NPC_YMIRJAR_FLAMEBEARER = 36893,
NPC_YMIRJAR_DEATHBRINGER = 36892,
NPC_YMIRJAR_WRATHBRINGER = 36840,
NPC_YMIRJAR_FLAMEBEARER = 36893,
NPC_FALLEN_WARRIOR = 36841,
NPC_WRATHBONE_COLDWRAITH = 36842,
NPC_FALLEN_WARRIOR = 36841,
NPC_WRATHBONE_COLDWRAITH = 36842,
NPC_MARTIN_VICTUS_1 = 37591,
NPC_GORKUN_IRONSKULL_1 = 37592,
NPC_MARTIN_VICTUS_1 = 37591,
NPC_GORKUN_IRONSKULL_1 = 37592,
NPC_MARTIN_VICTUS_2 = 37580,
NPC_GORKUN_IRONSKULL_2 = 37581,
NPC_FREED_SLAVE_1_ALLIANCE = 37576, // mage
NPC_FREED_SLAVE_2_ALLIANCE = 37575, // warr
NPC_FREED_SLAVE_3_ALLIANCE = 37572, // warr
NPC_FREED_SLAVE_1_HORDE = 37579, // mage
NPC_FREED_SLAVE_2_HORDE = 37578, // warr
NPC_FREED_SLAVE_3_HORDE = 37577, // warr
NPC_MARTIN_VICTUS_2 = 37580,
NPC_GORKUN_IRONSKULL_2 = 37581,
NPC_FREED_SLAVE_1_ALLIANCE = 37576, // mage
NPC_FREED_SLAVE_2_ALLIANCE = 37575, // warr
NPC_FREED_SLAVE_3_ALLIANCE = 37572, // warr
NPC_FREED_SLAVE_1_HORDE = 37579, // mage
NPC_FREED_SLAVE_2_HORDE = 37578, // warr
NPC_FREED_SLAVE_3_HORDE = 37577, // warr
};
enum GameObjectIds
{
GO_HOR_PORTCULLIS = 201848,
GO_ICE_WALL = 201885,
GO_HOR_PORTCULLIS = 201848,
GO_ICE_WALL = 201885,
};
enum eSpells
{
SPELL_NECROLYTE_CHANNELING = 30540,
SPELL_KRICK_KILL_CREDIT = 71308,
SPELL_TUNNEL_ICICLE = 69424,
SPELL_TELEPORT_JAINA_VISUAL = 70623,
SPELL_TELEPORT_JAINA = 70525,
SPELL_TELEPORT_SYLVANAS_VISUAL = 70638,
SPELL_TELEPORT_SYLVANAS = 70639,
SPELL_SINDRAGOSA_FROST_BOMB_POS = 70521,
SPELL_NECROLYTE_CHANNELING = 30540,
SPELL_KRICK_KILL_CREDIT = 71308,
SPELL_TUNNEL_ICICLE = 69424,
SPELL_TELEPORT_JAINA_VISUAL = 70623,
SPELL_TELEPORT_JAINA = 70525,
SPELL_TELEPORT_SYLVANAS_VISUAL = 70638,
SPELL_TELEPORT_SYLVANAS = 70639,
SPELL_SINDRAGOSA_FROST_BOMB_POS = 70521,
};
#define PATH_BEGIN_VALUE 3000200
@@ -127,19 +127,19 @@ enum eSpells
enum eIntroTexts
{
SAY_TYRANNUS_INTRO_1 = 1,
SAY_JAINA_INTRO_1 = 2,
SAY_SYLVANAS_INTRO_1 = 3,
SAY_TYRANNUS_INTRO_2 = 4,
SAY_TYRANNUS_INTRO_3 = 5,
SAY_JAINA_INTRO_2 = 6,
SAY_SYLVANAS_INTRO_2 = 7,
SAY_TYRANNUS_INTRO_4 = 8,
SAY_JAINA_INTRO_3 = 9,
SAY_JAINA_INTRO_4 = 10,
SAY_SYLVANAS_INTRO_3 = 11,
SAY_JAINA_INTRO_5 = 12,
SAY_SYLVANAS_INTRO_4 = 13,
SAY_TYRANNUS_INTRO_1 = 1,
SAY_JAINA_INTRO_1 = 2,
SAY_SYLVANAS_INTRO_1 = 3,
SAY_TYRANNUS_INTRO_2 = 4,
SAY_TYRANNUS_INTRO_3 = 5,
SAY_JAINA_INTRO_2 = 6,
SAY_SYLVANAS_INTRO_2 = 7,
SAY_TYRANNUS_INTRO_4 = 8,
SAY_JAINA_INTRO_3 = 9,
SAY_JAINA_INTRO_4 = 10,
SAY_SYLVANAS_INTRO_3 = 11,
SAY_JAINA_INTRO_5 = 12,
SAY_SYLVANAS_INTRO_4 = 13,
};
const Position PortalPos = {424.46f, 212.16f, 528.8f, 0.0f};
@@ -149,34 +149,34 @@ const Position NecrolytePos2 = {506.127f, 231.46f, 528.71f, M_PI};
struct ChampionPosition
{
uint32 entry[2];
Position endPosition;
uint32 entry[2];
Position endPosition;
};
const ChampionPosition introPositions[] =
{
{ { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 452.884f, 209.141f, 528.84f, 0.0f } },
{ { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 450.541f, 212.28f, 528.84f, 0.0f } },
{ { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 449.835f, 206.68f, 528.84f, 0.0f } },
{ { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_2_HORDE }, { 446.542f, 209.986f, 528.84f, 0.0f } },
{ { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_2_HORDE }, { 447.29f, 213.916f, 528.84f, 0.0f } },
{ { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_2_HORDE }, { 445.794f, 206.057f, 528.84f, 0.0f } },
{ { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 452.884f, 209.141f, 528.84f, 0.0f } },
{ { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 450.541f, 212.28f, 528.84f, 0.0f } },
{ { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 449.835f, 206.68f, 528.84f, 0.0f } },
{ { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_2_HORDE }, { 446.542f, 209.986f, 528.84f, 0.0f } },
{ { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_2_HORDE }, { 447.29f, 213.916f, 528.84f, 0.0f } },
{ { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_2_HORDE }, { 445.794f, 206.057f, 528.84f, 0.0f } },
{ { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 446.74f, 228.577f, 528.84f, 0.0f } },
{ { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 449.19f, 226.21f, 528.84f, 0.0f } },
{ { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 447.352f, 222.754f, 528.84f, 0.0f } },
{ { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 443.346f, 192.343f, 528.84f, 0.0f } },
{ { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 446.293f, 195.047f, 528.84f, 0.0f } },
{ { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 444.035f, 197.67f, 528.84f, 0.0f } },
{ { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_3_HORDE }, { 442.69f, 223.525f, 528.84f, 0.0f } },
{ { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_3_HORDE }, { 442.967f, 219.535f, 528.84f, 0.0f } },
{ { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_3_HORDE }, { 442.526f, 199.361f, 528.84f, 0.0f } },
{ { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_3_HORDE }, { 442.843f, 203.193f, 528.84f, 0.0f } },
{ { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 446.74f, 228.577f, 528.84f, 0.0f } },
{ { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 449.19f, 226.21f, 528.84f, 0.0f } },
{ { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 447.352f, 222.754f, 528.84f, 0.0f } },
{ { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 443.346f, 192.343f, 528.84f, 0.0f } },
{ { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 446.293f, 195.047f, 528.84f, 0.0f } },
{ { NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE }, { 444.035f, 197.67f, 528.84f, 0.0f } },
{ { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_3_HORDE }, { 442.69f, 223.525f, 528.84f, 0.0f } },
{ { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_3_HORDE }, { 442.967f, 219.535f, 528.84f, 0.0f } },
{ { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_3_HORDE }, { 442.526f, 199.361f, 528.84f, 0.0f } },
{ { NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_3_HORDE }, { 442.843f, 203.193f, 528.84f, 0.0f } },
{ { NPC_LORALEN, NPC_LORALEN }, { 438.505f, 211.54f, 528.71f, 0.0f } },
{ { NPC_LORALEN, NPC_KALIRA }, { 438.946f, 215.427f, 528.71f, 0.0f } },
{ { NPC_LORALEN, NPC_LORALEN }, { 438.505f, 211.54f, 528.71f, 0.0f } },
{ { NPC_LORALEN, NPC_KALIRA }, { 438.946f, 215.427f, 528.71f, 0.0f } },
{ { 0, 0 }, { 0.0f, 0.0f, 0.0f, 0.0f } }
{ { 0, 0 }, { 0.0f, 0.0f, 0.0f, 0.0f } }
};
/************
@@ -185,30 +185,30 @@ const ChampionPosition introPositions[] =
enum eFBSTexts
{
SAY_GENERAL_GARFROST = 21,
SAY_TYRANNUS_GARFROST = 20,
SAY_GENERAL_GARFROST = 21,
SAY_TYRANNUS_GARFROST = 20,
};
const Position FBSSpawnPos = {695.685f, -118.825f, 513.877f, 3*M_PI/2};
struct FBSPosition
{
uint32 entry;
uint32 pathId;
uint32 entry;
uint32 pathId;
};
const FBSPosition FBSData[] =
{
{ NPC_HORDE_SLAVE_1, PATH_BEGIN_VALUE+0 },
{ NPC_HORDE_SLAVE_1, PATH_BEGIN_VALUE+1 },
{ NPC_HORDE_SLAVE_2, PATH_BEGIN_VALUE+2 },
{ NPC_HORDE_SLAVE_2, PATH_BEGIN_VALUE+3 },
{ NPC_HORDE_SLAVE_2, PATH_BEGIN_VALUE+4 },
{ NPC_HORDE_SLAVE_3, PATH_BEGIN_VALUE+5 },
{ NPC_HORDE_SLAVE_3, PATH_BEGIN_VALUE+6 },
{ NPC_HORDE_SLAVE_4, PATH_BEGIN_VALUE+7 },
{ NPC_HORDE_SLAVE_4, PATH_BEGIN_VALUE+8 },
{ 0, 0 }
{ NPC_HORDE_SLAVE_1, PATH_BEGIN_VALUE+0 },
{ NPC_HORDE_SLAVE_1, PATH_BEGIN_VALUE+1 },
{ NPC_HORDE_SLAVE_2, PATH_BEGIN_VALUE+2 },
{ NPC_HORDE_SLAVE_2, PATH_BEGIN_VALUE+3 },
{ NPC_HORDE_SLAVE_2, PATH_BEGIN_VALUE+4 },
{ NPC_HORDE_SLAVE_3, PATH_BEGIN_VALUE+5 },
{ NPC_HORDE_SLAVE_3, PATH_BEGIN_VALUE+6 },
{ NPC_HORDE_SLAVE_4, PATH_BEGIN_VALUE+7 },
{ NPC_HORDE_SLAVE_4, PATH_BEGIN_VALUE+8 },
{ 0, 0 }
};
/************
@@ -222,18 +222,18 @@ const Position SBSLeaderEndPos = {823.2f, -4.4497f, 509.49f, 0.86f};
enum eSBSTexts
{
SAY_OUTRO_KRICK_1 = 35,
SAY_JAINA_KRICK_1 = 36,
SAY_SYLVANAS_KRICK_1 = 37,
SAY_OUTRO_KRICK_2 = 38,
SAY_JAINA_KRICK_2 = 39,
SAY_SYLVANAS_KRICK_2 = 40,
SAY_OUTRO_KRICK_3 = 41,
SAY_TYRANNUS_KRICK_1 = 42,
SAY_OUTRO_KRICK_4 = 43,
SAY_TYRANNUS_KRICK_2 = 44,
SAY_JAINA_KRICK_3 = 45,
SAY_SYLVANAS_KRICK_3 = 46,
SAY_OUTRO_KRICK_1 = 35,
SAY_JAINA_KRICK_1 = 36,
SAY_SYLVANAS_KRICK_1 = 37,
SAY_OUTRO_KRICK_2 = 38,
SAY_JAINA_KRICK_2 = 39,
SAY_SYLVANAS_KRICK_2 = 40,
SAY_OUTRO_KRICK_3 = 41,
SAY_TYRANNUS_KRICK_1 = 42,
SAY_OUTRO_KRICK_4 = 43,
SAY_TYRANNUS_KRICK_2 = 44,
SAY_JAINA_KRICK_3 = 45,
SAY_SYLVANAS_KRICK_3 = 46,
};
/************
@@ -246,9 +246,9 @@ const Position PTSTyrannusWaitPos3 = {1117.93f, -125.16f, 760.34f, 0.10f};
enum ePTSTexts
{
SAY_TYRANNUS_AMBUSH_1 = 47,
SAY_TYRANNUS_AMBUSH_2 = 48,
SAY_TYRANNUS_TRAP_TUNNEL = 49,
SAY_TYRANNUS_AMBUSH_1 = 47,
SAY_TYRANNUS_AMBUSH_2 = 48,
SAY_TYRANNUS_TRAP_TUNNEL = 49,
};
/************
@@ -266,47 +266,47 @@ const Position TSSindragosaPos2 = {948.39f, 215.47f, 653.71f, 5.51f};
struct TSPosition
{
uint32 entry;
float x,y;
uint32 entry;
float x,y;
};
const TSPosition TSData[] =
{
{ NPC_FREED_SLAVE_3_HORDE, 1047.8f, 126.01f },
{ NPC_FREED_SLAVE_3_HORDE, 1049.21f, 127.10f },
{ NPC_FREED_SLAVE_3_HORDE, 1051.68f, 129.02f },
{ NPC_FREED_SLAVE_3_HORDE, 1053.24f, 130.23f },
{ NPC_FREED_SLAVE_1_HORDE, 1044.82f, 121.30f },
{ NPC_FREED_SLAVE_1_HORDE, 1049.33f, 124.01f },
{ NPC_FREED_SLAVE_1_HORDE, 1056.79f, 130.86f },
{ NPC_FREED_SLAVE_2_HORDE, 1045.56f, 118.46f },
{ NPC_FREED_SLAVE_2_HORDE, 1047.75f, 120.85f },
{ NPC_FREED_SLAVE_2_HORDE, 1052.93f, 124.156f },
{ NPC_FREED_SLAVE_2_HORDE, 1057.35f, 127.95f },
{ NPC_FREED_SLAVE_2_HORDE, 1059.18f, 129.86f },
{ NPC_FREED_SLAVE_2_HORDE, 1049.865f, 118.735f },
{ NPC_FREED_SLAVE_2_HORDE, 1052.32f, 121.827f },
{ NPC_FREED_SLAVE_2_HORDE, 1055.38f, 123.99f },
{ NPC_FREED_SLAVE_2_HORDE, 1058.723f, 125.98f },
{ 0, 0.0f, 0.0f }
{ NPC_FREED_SLAVE_3_HORDE, 1047.8f, 126.01f },
{ NPC_FREED_SLAVE_3_HORDE, 1049.21f, 127.10f },
{ NPC_FREED_SLAVE_3_HORDE, 1051.68f, 129.02f },
{ NPC_FREED_SLAVE_3_HORDE, 1053.24f, 130.23f },
{ NPC_FREED_SLAVE_1_HORDE, 1044.82f, 121.30f },
{ NPC_FREED_SLAVE_1_HORDE, 1049.33f, 124.01f },
{ NPC_FREED_SLAVE_1_HORDE, 1056.79f, 130.86f },
{ NPC_FREED_SLAVE_2_HORDE, 1045.56f, 118.46f },
{ NPC_FREED_SLAVE_2_HORDE, 1047.75f, 120.85f },
{ NPC_FREED_SLAVE_2_HORDE, 1052.93f, 124.156f },
{ NPC_FREED_SLAVE_2_HORDE, 1057.35f, 127.95f },
{ NPC_FREED_SLAVE_2_HORDE, 1059.18f, 129.86f },
{ NPC_FREED_SLAVE_2_HORDE, 1049.865f, 118.735f },
{ NPC_FREED_SLAVE_2_HORDE, 1052.32f, 121.827f },
{ NPC_FREED_SLAVE_2_HORDE, 1055.38f, 123.99f },
{ NPC_FREED_SLAVE_2_HORDE, 1058.723f, 125.98f },
{ 0, 0.0f, 0.0f }
};
enum eTSTexts
{
SAY_PREFIGHT_1 = 50,
SAY_GENERAL_HORDE_TRASH = 51,
SAY_PREFIGHT_2 = 52,
SAY_PREFIGHT_AGGRO = 53,
SAY_PREFIGHT_1 = 50,
SAY_GENERAL_HORDE_TRASH = 51,
SAY_PREFIGHT_2 = 52,
SAY_PREFIGHT_AGGRO = 53,
SAY_GENERAL_HORDE_OUTRO_1 = 61,
SAY_GENERAL_OUTRO_2 = 62,
SAY_JAINA_OUTRO_1 = 63,
SAY_SYLVANAS_OUTRO_1 = 64,
SAY_JAINA_OUTRO_2 = 65,
SAY_JAINA_OUTRO_3 = 66,
SAY_SYLVANAS_OUTRO_2 = 67,
SAY_GENERAL_ALLIANCE_OUTRO_1 = 68,
SAY_GENERAL_ALLIANCE_TRASH = 69,
SAY_GENERAL_HORDE_OUTRO_1 = 61,
SAY_GENERAL_OUTRO_2 = 62,
SAY_JAINA_OUTRO_1 = 63,
SAY_SYLVANAS_OUTRO_1 = 64,
SAY_JAINA_OUTRO_2 = 65,
SAY_JAINA_OUTRO_3 = 66,
SAY_SYLVANAS_OUTRO_2 = 67,
SAY_GENERAL_ALLIANCE_OUTRO_1 = 68,
SAY_GENERAL_ALLIANCE_TRASH = 69,
};
#endif