mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-21 20:56:23 +00:00
converted all tabs to 4 spaces
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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};
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user