mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-27 07:36:23 +00:00
refactor(Core/Scripts): restyle scripts lib with astyle (#3467)
This commit is contained in:
@@ -35,182 +35,182 @@ enum Misc
|
||||
|
||||
class boss_dred : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_dred() : CreatureScript("boss_dred") {}
|
||||
public:
|
||||
boss_dred() : CreatureScript("boss_dred") {}
|
||||
|
||||
CreatureAI *GetAI(Creature *creature) const
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_dredAI>(creature);
|
||||
}
|
||||
|
||||
struct boss_dredAI : public BossAI
|
||||
{
|
||||
boss_dredAI(Creature* creature) : BossAI(creature, DATA_DRED)
|
||||
{
|
||||
return GetInstanceAI<boss_dredAI>(creature);
|
||||
}
|
||||
|
||||
struct boss_dredAI : public BossAI
|
||||
void Reset()
|
||||
{
|
||||
boss_dredAI(Creature* creature) : BossAI(creature, DATA_DRED)
|
||||
BossAI::Reset();
|
||||
_raptorCount = 0;
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 data) const
|
||||
{
|
||||
if (data == me->GetEntry())
|
||||
return uint32(_raptorCount);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32)
|
||||
{
|
||||
if (type == me->GetEntry())
|
||||
++_raptorCount;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
_raptorCount = 0;
|
||||
|
||||
events.ScheduleEvent(EVENT_SPELL_BELLOWING_ROAR, 33000);
|
||||
events.ScheduleEvent(EVENT_SPELL_GRIEVOUS_BITE, 20000);
|
||||
events.ScheduleEvent(EVENT_SPELL_MANGLING_SLASH, 18500);
|
||||
events.ScheduleEvent(EVENT_SPELL_FEARSOME_ROAR, urand(10000, 20000));
|
||||
events.ScheduleEvent(EVENT_SPELL_PIERCING_SLASH, 17000);
|
||||
if (IsHeroic())
|
||||
{
|
||||
events.ScheduleEvent(EVENT_MENACING_CLAW, 21000);
|
||||
events.ScheduleEvent(EVENT_SPELL_RAPTOR_CALL, urand(20000, 25000));
|
||||
}
|
||||
}
|
||||
|
||||
void Reset()
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
BossAI::Reset();
|
||||
_raptorCount = 0;
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 data) const
|
||||
{
|
||||
if (data == me->GetEntry())
|
||||
return uint32(_raptorCount);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32)
|
||||
{
|
||||
if (type == me->GetEntry())
|
||||
++_raptorCount;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
_raptorCount = 0;
|
||||
|
||||
events.ScheduleEvent(EVENT_SPELL_BELLOWING_ROAR, 33000);
|
||||
events.ScheduleEvent(EVENT_SPELL_GRIEVOUS_BITE, 20000);
|
||||
events.ScheduleEvent(EVENT_SPELL_MANGLING_SLASH, 18500);
|
||||
events.ScheduleEvent(EVENT_SPELL_FEARSOME_ROAR, urand(10000,20000));
|
||||
events.ScheduleEvent(EVENT_SPELL_PIERCING_SLASH, 17000);
|
||||
if (IsHeroic())
|
||||
{
|
||||
events.ScheduleEvent(EVENT_MENACING_CLAW, 21000);
|
||||
events.ScheduleEvent(EVENT_SPELL_RAPTOR_CALL, urand(20000,25000));
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPELL_BELLOWING_ROAR:
|
||||
me->CastSpell(me, SPELL_BELLOWING_ROAR, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_BELLOWING_ROAR, 40000);
|
||||
break;
|
||||
case EVENT_SPELL_GRIEVOUS_BITE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_GRIEVOUS_BITE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_GRIEVOUS_BITE, 20000);
|
||||
break;
|
||||
case EVENT_SPELL_MANGLING_SLASH:
|
||||
me->CastSpell(me->GetVictim(), SPELL_MANGLING_SLASH, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_MANGLING_SLASH, 20000);
|
||||
break;
|
||||
case EVENT_SPELL_FEARSOME_ROAR:
|
||||
me->CastSpell(me, SPELL_FEARSOME_ROAR, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_FEARSOME_ROAR, 17000);
|
||||
break;
|
||||
case EVENT_SPELL_PIERCING_SLASH:
|
||||
me->CastSpell(me->GetVictim(), SPELL_PIERCING_SLASH, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_PIERCING_SLASH, 20000);
|
||||
break;
|
||||
case EVENT_SPELL_RAPTOR_CALL:
|
||||
me->CastSpell(me, SPELL_RAPTOR_CALL, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_RAPTOR_CALL, 20000);
|
||||
break;
|
||||
case EVENT_MENACING_CLAW:
|
||||
Talk(SAY_CLAW_EMOTE);
|
||||
me->setAttackTimer(BASE_ATTACK, 2000);
|
||||
case EVENT_SPELL_BELLOWING_ROAR:
|
||||
me->CastSpell(me, SPELL_BELLOWING_ROAR, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_BELLOWING_ROAR, 40000);
|
||||
break;
|
||||
case EVENT_SPELL_GRIEVOUS_BITE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_GRIEVOUS_BITE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_GRIEVOUS_BITE, 20000);
|
||||
break;
|
||||
case EVENT_SPELL_MANGLING_SLASH:
|
||||
me->CastSpell(me->GetVictim(), SPELL_MANGLING_SLASH, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_MANGLING_SLASH, 20000);
|
||||
break;
|
||||
case EVENT_SPELL_FEARSOME_ROAR:
|
||||
me->CastSpell(me, SPELL_FEARSOME_ROAR, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_FEARSOME_ROAR, 17000);
|
||||
break;
|
||||
case EVENT_SPELL_PIERCING_SLASH:
|
||||
me->CastSpell(me->GetVictim(), SPELL_PIERCING_SLASH, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_PIERCING_SLASH, 20000);
|
||||
break;
|
||||
case EVENT_SPELL_RAPTOR_CALL:
|
||||
me->CastSpell(me, SPELL_RAPTOR_CALL, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_RAPTOR_CALL, 20000);
|
||||
break;
|
||||
case EVENT_MENACING_CLAW:
|
||||
Talk(SAY_CLAW_EMOTE);
|
||||
me->setAttackTimer(BASE_ATTACK, 2000);
|
||||
me->AttackerStateUpdate(me->GetVictim());
|
||||
if (me->GetVictim())
|
||||
me->AttackerStateUpdate(me->GetVictim());
|
||||
if (me->GetVictim())
|
||||
me->AttackerStateUpdate(me->GetVictim());
|
||||
if (me->GetVictim())
|
||||
me->AttackerStateUpdate(me->GetVictim());
|
||||
events.ScheduleEvent(EVENT_MENACING_CLAW, 20000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
if (me->GetVictim())
|
||||
me->AttackerStateUpdate(me->GetVictim());
|
||||
events.ScheduleEvent(EVENT_MENACING_CLAW, 20000);
|
||||
break;
|
||||
}
|
||||
|
||||
private:
|
||||
uint8 _raptorCount;
|
||||
};
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
uint8 _raptorCount;
|
||||
};
|
||||
};
|
||||
|
||||
class spell_dred_grievious_bite : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_dred_grievious_bite() : SpellScriptLoader("spell_dred_grievious_bite") { }
|
||||
public:
|
||||
spell_dred_grievious_bite() : SpellScriptLoader("spell_dred_grievious_bite") { }
|
||||
|
||||
class spell_dred_grievious_bite_AuraScript : public AuraScript
|
||||
class spell_dred_grievious_bite_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_dred_grievious_bite_AuraScript);
|
||||
|
||||
void OnPeriodic(AuraEffect const* /*aurEff*/)
|
||||
{
|
||||
PrepareAuraScript(spell_dred_grievious_bite_AuraScript);
|
||||
|
||||
void OnPeriodic(AuraEffect const* /*aurEff*/)
|
||||
{
|
||||
if (Unit* target = GetTarget())
|
||||
if (target->GetHealth() == target->GetMaxHealth())
|
||||
{
|
||||
PreventDefaultAction();
|
||||
SetDuration(0);
|
||||
}
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_dred_grievious_bite_AuraScript::OnPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_dred_grievious_bite_AuraScript();
|
||||
if (Unit* target = GetTarget())
|
||||
if (target->GetHealth() == target->GetMaxHealth())
|
||||
{
|
||||
PreventDefaultAction();
|
||||
SetDuration(0);
|
||||
}
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_dred_grievious_bite_AuraScript::OnPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_dred_grievious_bite_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_dred_raptor_call : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_dred_raptor_call() : SpellScriptLoader("spell_dred_raptor_call") { }
|
||||
public:
|
||||
spell_dred_raptor_call() : SpellScriptLoader("spell_dred_raptor_call") { }
|
||||
|
||||
class spell_dred_raptor_call_SpellScript : public SpellScript
|
||||
class spell_dred_raptor_call_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_dred_raptor_call_SpellScript);
|
||||
|
||||
void HandleDummy(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
PrepareSpellScript(spell_dred_raptor_call_SpellScript);
|
||||
|
||||
void HandleDummy(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
GetCaster()->SummonCreature(RAND(NPC_DRAKKARI_GUTRIPPER, NPC_DRAKKARI_SCYTHECLAW), -522.02f, -718.89f, 30.26f, 2.41f);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_dred_raptor_call_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_dred_raptor_call_SpellScript();
|
||||
GetCaster()->SummonCreature(RAND(NPC_DRAKKARI_GUTRIPPER, NPC_DRAKKARI_SCYTHECLAW), -522.02f, -718.89f, 30.26f, 2.41f);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_dred_raptor_call_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_dred_raptor_call_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class achievement_better_off_dred : public AchievementCriteriaScript
|
||||
{
|
||||
public:
|
||||
achievement_better_off_dred() : AchievementCriteriaScript("achievement_better_off_dred")
|
||||
{
|
||||
}
|
||||
public:
|
||||
achievement_better_off_dred() : AchievementCriteriaScript("achievement_better_off_dred")
|
||||
{
|
||||
}
|
||||
|
||||
bool OnCheck(Player* /*player*/, Unit* target)
|
||||
{
|
||||
if (!target)
|
||||
return false;
|
||||
bool OnCheck(Player* /*player*/, Unit* target)
|
||||
{
|
||||
if (!target)
|
||||
return false;
|
||||
|
||||
return target->GetAI()->GetData(target->GetEntry());
|
||||
}
|
||||
return target->GetAI()->GetData(target->GetEntry());
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_dred()
|
||||
|
||||
@@ -48,7 +48,7 @@ enum Misc
|
||||
EVENT_KILL_TALK = 6,
|
||||
EVENT_CHECK_PHASE = 7,
|
||||
EVENT_SPELL_SUMMON_MINIONS = 8,
|
||||
|
||||
|
||||
ROOM_RIGHT = 0,
|
||||
ROOM_LEFT = 1,
|
||||
ROOM_STAIRS = 2
|
||||
@@ -63,286 +63,286 @@ std::unordered_map<uint32, std::tuple <uint32, Position>> const npcSummon =
|
||||
|
||||
class boss_novos : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_novos() : CreatureScript("boss_novos") { }
|
||||
public:
|
||||
boss_novos() : CreatureScript("boss_novos") { }
|
||||
|
||||
struct boss_novosAI : public BossAI
|
||||
struct boss_novosAI : public BossAI
|
||||
{
|
||||
boss_novosAI(Creature* creature) : BossAI(creature, DATA_NOVOS)
|
||||
{
|
||||
boss_novosAI(Creature* creature) : BossAI(creature, DATA_NOVOS)
|
||||
{
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
instance->SetBossState(DATA_NOVOS_CRYSTALS, IN_PROGRESS);
|
||||
instance->SetBossState(DATA_NOVOS_CRYSTALS, NOT_STARTED);
|
||||
_crystalCounter = _summonTargetRightGUID = _summonTargetLeftGUID = _stage = 0;
|
||||
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
|
||||
_achievement = true;
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 data) const
|
||||
{
|
||||
if (data == me->GetEntry())
|
||||
return uint32(_achievement);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32)
|
||||
{
|
||||
if (type == me->GetEntry())
|
||||
_achievement = false;
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* /*who*/) { }
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
BossAI::EnterCombat(who);
|
||||
|
||||
events.ScheduleEvent(EVENT_SUMMON_FETID_TROLL, 3000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_SHADOWCASTER, 9000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_HULKING_CORPSE, 30000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_CRYSTAL_HANDLER, 20000);
|
||||
events.ScheduleEvent(EVENT_CHECK_PHASE, 80000);
|
||||
|
||||
me->CastSpell(me, SPELL_ARCANE_BLAST, true);
|
||||
me->CastSpell(me, SPELL_ARCANE_FIELD, true);
|
||||
me->CastSpell(me, SPELL_DESPAWN_CRYSTAL_HANDLER, true);
|
||||
|
||||
for (auto itr : npcSummon)
|
||||
{
|
||||
uint32 summonEntry;
|
||||
Position summonPos;
|
||||
std::tie(summonEntry, summonPos) = itr.second;
|
||||
if (Creature *creature = me->SummonCreature(summonEntry, summonPos))
|
||||
switch (itr.first)
|
||||
{
|
||||
case ROOM_LEFT:
|
||||
_summonTargetLeftGUID = creature->GetGUID();
|
||||
break;
|
||||
case ROOM_RIGHT:
|
||||
_summonTargetRightGUID = creature->GetGUID();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
me->SetUInt64Value(UNIT_FIELD_TARGET, 0);
|
||||
me->RemoveAllAuras();
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
BossAI::JustDied(killer);
|
||||
instance->SetBossState(DATA_NOVOS_CRYSTALS, DONE);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
}
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE) && summon->GetEntry() != NPC_CRYSTAL_CHANNEL_TARGET && summon->GetEntry() != NPC_CRYSTAL_HANDLER)
|
||||
summon->SetReactState(REACT_DEFENSIVE);
|
||||
else if (summon->GetEntry() != NPC_CRYSTAL_CHANNEL_TARGET)
|
||||
summon->SetInCombatWithZone();
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SUMMON_FETID_TROLL:
|
||||
if (Creature* trigger = summons.GetCreatureWithEntry(NPC_CRYSTAL_CHANNEL_TARGET))
|
||||
trigger->CastSpell(trigger, SPELL_SUMMON_FETID_TROLL_CORPSE, true, nullptr, nullptr, me->GetGUID());
|
||||
events.ScheduleEvent(EVENT_SUMMON_FETID_TROLL, 3000);
|
||||
break;
|
||||
case EVENT_SUMMON_HULKING_CORPSE:
|
||||
if (Creature* trigger = summons.GetCreatureWithEntry(NPC_CRYSTAL_CHANNEL_TARGET))
|
||||
trigger->CastSpell(trigger, SPELL_SUMMON_HULKING_CORPSE, true, nullptr, nullptr, me->GetGUID());
|
||||
events.ScheduleEvent(EVENT_SUMMON_HULKING_CORPSE, 30000);
|
||||
break;
|
||||
case EVENT_SUMMON_SHADOWCASTER:
|
||||
if (Creature* trigger = summons.GetCreatureWithEntry(NPC_CRYSTAL_CHANNEL_TARGET))
|
||||
trigger->CastSpell(trigger, SPELL_SUMMON_RISEN_SHADOWCASTER, true, nullptr, nullptr, me->GetGUID());
|
||||
events.ScheduleEvent(EVENT_SUMMON_SHADOWCASTER, 10000);
|
||||
break;
|
||||
case EVENT_SUMMON_CRYSTAL_HANDLER:
|
||||
if (_crystalCounter++ < 4)
|
||||
{
|
||||
Talk(SAY_SUMMONING_ADDS);
|
||||
Talk(EMOTE_SUMMONING_ADDS);
|
||||
if (Creature* target = ObjectAccessor::GetCreature(*me, _stage ? _summonTargetLeftGUID : _summonTargetRightGUID))
|
||||
target->CastSpell(target, SPELL_SUMMON_CRYSTAL_HANDLER, true, nullptr, nullptr, me->GetGUID());
|
||||
_stage = _stage ? 0 : 1;
|
||||
events.ScheduleEvent(EVENT_SUMMON_CRYSTAL_HANDLER, 20000);
|
||||
}
|
||||
break;
|
||||
case EVENT_CHECK_PHASE:
|
||||
if (me->HasAura(SPELL_BEAM_CHANNEL))
|
||||
{
|
||||
events.ScheduleEvent(EVENT_CHECK_PHASE, 2000);
|
||||
break;
|
||||
}
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_CAST_OFFENSIVE_SPELL, 3000);
|
||||
events.ScheduleEvent(EVENT_SPELL_SUMMON_MINIONS, 10000);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
break;
|
||||
case EVENT_CAST_OFFENSIVE_SPELL:
|
||||
if (!me->HasUnitState(UNIT_STATE_CASTING))
|
||||
if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
|
||||
me->CastSpell(target, RAND(SPELL_BLIZZARD,SPELL_FROSTBOLT,SPELL_TOUCH_OF_MISERY), false);
|
||||
|
||||
events.ScheduleEvent(EVENT_CAST_OFFENSIVE_SPELL, 500);
|
||||
break;
|
||||
case EVENT_SPELL_SUMMON_MINIONS:
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
{
|
||||
me->CastSpell(me, SPELL_SUMMON_MINIONS, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_SUMMON_MINIONS, 15000);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_SPELL_SUMMON_MINIONS, 500);
|
||||
break;
|
||||
}
|
||||
|
||||
EnterEvadeIfOutOfCombatArea();
|
||||
}
|
||||
|
||||
bool CheckEvadeIfOutOfCombatArea() const
|
||||
{
|
||||
return !SelectTargetFromPlayerList(80.0f);
|
||||
}
|
||||
|
||||
private:
|
||||
uint8 _crystalCounter;
|
||||
uint8 _stage;
|
||||
uint64 _summonTargetRightGUID;
|
||||
uint64 _summonTargetLeftGUID;
|
||||
|
||||
bool _achievement;
|
||||
};
|
||||
|
||||
CreatureAI *GetAI(Creature *creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_novosAI>(creature);
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
instance->SetBossState(DATA_NOVOS_CRYSTALS, IN_PROGRESS);
|
||||
instance->SetBossState(DATA_NOVOS_CRYSTALS, NOT_STARTED);
|
||||
_crystalCounter = _summonTargetRightGUID = _summonTargetLeftGUID = _stage = 0;
|
||||
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
|
||||
_achievement = true;
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 data) const
|
||||
{
|
||||
if (data == me->GetEntry())
|
||||
return uint32(_achievement);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32)
|
||||
{
|
||||
if (type == me->GetEntry())
|
||||
_achievement = false;
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* /*who*/) { }
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
BossAI::EnterCombat(who);
|
||||
|
||||
events.ScheduleEvent(EVENT_SUMMON_FETID_TROLL, 3000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_SHADOWCASTER, 9000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_HULKING_CORPSE, 30000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_CRYSTAL_HANDLER, 20000);
|
||||
events.ScheduleEvent(EVENT_CHECK_PHASE, 80000);
|
||||
|
||||
me->CastSpell(me, SPELL_ARCANE_BLAST, true);
|
||||
me->CastSpell(me, SPELL_ARCANE_FIELD, true);
|
||||
me->CastSpell(me, SPELL_DESPAWN_CRYSTAL_HANDLER, true);
|
||||
|
||||
for (auto itr : npcSummon)
|
||||
{
|
||||
uint32 summonEntry;
|
||||
Position summonPos;
|
||||
std::tie(summonEntry, summonPos) = itr.second;
|
||||
if (Creature* creature = me->SummonCreature(summonEntry, summonPos))
|
||||
switch (itr.first)
|
||||
{
|
||||
case ROOM_LEFT:
|
||||
_summonTargetLeftGUID = creature->GetGUID();
|
||||
break;
|
||||
case ROOM_RIGHT:
|
||||
_summonTargetRightGUID = creature->GetGUID();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
me->SetUInt64Value(UNIT_FIELD_TARGET, 0);
|
||||
me->RemoveAllAuras();
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
BossAI::JustDied(killer);
|
||||
instance->SetBossState(DATA_NOVOS_CRYSTALS, DONE);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
}
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE) && summon->GetEntry() != NPC_CRYSTAL_CHANNEL_TARGET && summon->GetEntry() != NPC_CRYSTAL_HANDLER)
|
||||
summon->SetReactState(REACT_DEFENSIVE);
|
||||
else if (summon->GetEntry() != NPC_CRYSTAL_CHANNEL_TARGET)
|
||||
summon->SetInCombatWithZone();
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SUMMON_FETID_TROLL:
|
||||
if (Creature* trigger = summons.GetCreatureWithEntry(NPC_CRYSTAL_CHANNEL_TARGET))
|
||||
trigger->CastSpell(trigger, SPELL_SUMMON_FETID_TROLL_CORPSE, true, nullptr, nullptr, me->GetGUID());
|
||||
events.ScheduleEvent(EVENT_SUMMON_FETID_TROLL, 3000);
|
||||
break;
|
||||
case EVENT_SUMMON_HULKING_CORPSE:
|
||||
if (Creature* trigger = summons.GetCreatureWithEntry(NPC_CRYSTAL_CHANNEL_TARGET))
|
||||
trigger->CastSpell(trigger, SPELL_SUMMON_HULKING_CORPSE, true, nullptr, nullptr, me->GetGUID());
|
||||
events.ScheduleEvent(EVENT_SUMMON_HULKING_CORPSE, 30000);
|
||||
break;
|
||||
case EVENT_SUMMON_SHADOWCASTER:
|
||||
if (Creature* trigger = summons.GetCreatureWithEntry(NPC_CRYSTAL_CHANNEL_TARGET))
|
||||
trigger->CastSpell(trigger, SPELL_SUMMON_RISEN_SHADOWCASTER, true, nullptr, nullptr, me->GetGUID());
|
||||
events.ScheduleEvent(EVENT_SUMMON_SHADOWCASTER, 10000);
|
||||
break;
|
||||
case EVENT_SUMMON_CRYSTAL_HANDLER:
|
||||
if (_crystalCounter++ < 4)
|
||||
{
|
||||
Talk(SAY_SUMMONING_ADDS);
|
||||
Talk(EMOTE_SUMMONING_ADDS);
|
||||
if (Creature* target = ObjectAccessor::GetCreature(*me, _stage ? _summonTargetLeftGUID : _summonTargetRightGUID))
|
||||
target->CastSpell(target, SPELL_SUMMON_CRYSTAL_HANDLER, true, nullptr, nullptr, me->GetGUID());
|
||||
_stage = _stage ? 0 : 1;
|
||||
events.ScheduleEvent(EVENT_SUMMON_CRYSTAL_HANDLER, 20000);
|
||||
}
|
||||
break;
|
||||
case EVENT_CHECK_PHASE:
|
||||
if (me->HasAura(SPELL_BEAM_CHANNEL))
|
||||
{
|
||||
events.ScheduleEvent(EVENT_CHECK_PHASE, 2000);
|
||||
break;
|
||||
}
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_CAST_OFFENSIVE_SPELL, 3000);
|
||||
events.ScheduleEvent(EVENT_SPELL_SUMMON_MINIONS, 10000);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
break;
|
||||
case EVENT_CAST_OFFENSIVE_SPELL:
|
||||
if (!me->HasUnitState(UNIT_STATE_CASTING))
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
|
||||
me->CastSpell(target, RAND(SPELL_BLIZZARD, SPELL_FROSTBOLT, SPELL_TOUCH_OF_MISERY), false);
|
||||
|
||||
events.ScheduleEvent(EVENT_CAST_OFFENSIVE_SPELL, 500);
|
||||
break;
|
||||
case EVENT_SPELL_SUMMON_MINIONS:
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
{
|
||||
me->CastSpell(me, SPELL_SUMMON_MINIONS, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_SUMMON_MINIONS, 15000);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_SPELL_SUMMON_MINIONS, 500);
|
||||
break;
|
||||
}
|
||||
|
||||
EnterEvadeIfOutOfCombatArea();
|
||||
}
|
||||
|
||||
bool CheckEvadeIfOutOfCombatArea() const
|
||||
{
|
||||
return !SelectTargetFromPlayerList(80.0f);
|
||||
}
|
||||
|
||||
private:
|
||||
uint8 _crystalCounter;
|
||||
uint8 _stage;
|
||||
uint64 _summonTargetRightGUID;
|
||||
uint64 _summonTargetLeftGUID;
|
||||
|
||||
bool _achievement;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_novosAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
class spell_novos_despawn_crystal_handler : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_novos_despawn_crystal_handler() : SpellScriptLoader("spell_novos_despawn_crystal_handler") { }
|
||||
public:
|
||||
spell_novos_despawn_crystal_handler() : SpellScriptLoader("spell_novos_despawn_crystal_handler") { }
|
||||
|
||||
class spell_novos_despawn_crystal_handler_SpellScript : public SpellScript
|
||||
class spell_novos_despawn_crystal_handler_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_novos_despawn_crystal_handler_SpellScript);
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
PrepareSpellScript(spell_novos_despawn_crystal_handler_SpellScript);
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (Unit* target = GetHitUnit())
|
||||
target->CastSpell(GetCaster(), SPELL_BEAM_CHANNEL, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_novos_despawn_crystal_handler_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_novos_despawn_crystal_handler_SpellScript();
|
||||
if (Unit* target = GetHitUnit())
|
||||
target->CastSpell(GetCaster(), SPELL_BEAM_CHANNEL, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_novos_despawn_crystal_handler_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_novos_despawn_crystal_handler_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_novos_crystal_handler_death : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_novos_crystal_handler_death() : SpellScriptLoader("spell_novos_crystal_handler_death") { }
|
||||
public:
|
||||
spell_novos_crystal_handler_death() : SpellScriptLoader("spell_novos_crystal_handler_death") { }
|
||||
|
||||
class spell_novos_crystal_handler_death_AuraScript : public AuraScript
|
||||
class spell_novos_crystal_handler_death_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_novos_crystal_handler_death_AuraScript)
|
||||
|
||||
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
PrepareAuraScript(spell_novos_crystal_handler_death_AuraScript)
|
||||
|
||||
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
GetUnitOwner()->InterruptNonMeleeSpells(false);
|
||||
if (GameObject* crystal = GetUnitOwner()->FindNearestGameObjectOfType(GAMEOBJECT_TYPE_DOOR, 5.0f))
|
||||
crystal->SetGoState(GO_STATE_READY);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectApply += AuraEffectApplyFn(spell_novos_crystal_handler_death_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_novos_crystal_handler_death_AuraScript();
|
||||
GetUnitOwner()->InterruptNonMeleeSpells(false);
|
||||
if (GameObject* crystal = GetUnitOwner()->FindNearestGameObjectOfType(GAMEOBJECT_TYPE_DOOR, 5.0f))
|
||||
crystal->SetGoState(GO_STATE_READY);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectApply += AuraEffectApplyFn(spell_novos_crystal_handler_death_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_novos_crystal_handler_death_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_novos_summon_minions : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_novos_summon_minions() : SpellScriptLoader("spell_novos_summon_minions") { }
|
||||
public:
|
||||
spell_novos_summon_minions() : SpellScriptLoader("spell_novos_summon_minions") { }
|
||||
|
||||
class spell_novos_summon_minions_SpellScript : public SpellScript
|
||||
class spell_novos_summon_minions_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_novos_summon_minions_SpellScript);
|
||||
|
||||
void HandleScript(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
PrepareSpellScript(spell_novos_summon_minions_SpellScript);
|
||||
|
||||
void HandleScript(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
for (uint8 i = 0; i < 4; ++i)
|
||||
GetCaster()->CastSpell((Unit*)NULL, SPELL_COPY_OF_SUMMON_MINIONS, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_novos_summon_minions_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_novos_summon_minions_SpellScript();
|
||||
for (uint8 i = 0; i < 4; ++i)
|
||||
GetCaster()->CastSpell((Unit*)NULL, SPELL_COPY_OF_SUMMON_MINIONS, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_novos_summon_minions_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_novos_summon_minions_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class achievement_oh_novos : public AchievementCriteriaScript
|
||||
{
|
||||
public:
|
||||
achievement_oh_novos() : AchievementCriteriaScript("achievement_oh_novos") { }
|
||||
public:
|
||||
achievement_oh_novos() : AchievementCriteriaScript("achievement_oh_novos") { }
|
||||
|
||||
bool OnCheck(Player* /*player*/, Unit* target)
|
||||
{
|
||||
return target && target->GetAI()->GetData(target->GetEntry());
|
||||
}
|
||||
bool OnCheck(Player* /*player*/, Unit* target)
|
||||
{
|
||||
return target && target->GetAI()->GetData(target->GetEntry());
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_novos()
|
||||
|
||||
@@ -54,240 +54,240 @@ enum Misc
|
||||
|
||||
class boss_tharon_ja : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_tharon_ja() : CreatureScript("boss_tharon_ja") { }
|
||||
public:
|
||||
boss_tharon_ja() : CreatureScript("boss_tharon_ja") { }
|
||||
|
||||
CreatureAI *GetAI(Creature *creature) const
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_tharon_jaAI>(creature);
|
||||
}
|
||||
|
||||
struct boss_tharon_jaAI : public BossAI
|
||||
{
|
||||
boss_tharon_jaAI(Creature* creature) : BossAI(creature, DATA_THARON_JA)
|
||||
{
|
||||
return GetInstanceAI<boss_tharon_jaAI>(creature);
|
||||
}
|
||||
|
||||
struct boss_tharon_jaAI : public BossAI
|
||||
void Reset()
|
||||
{
|
||||
boss_tharon_jaAI(Creature* creature) : BossAI(creature, DATA_THARON_JA)
|
||||
{
|
||||
}
|
||||
BossAI::Reset();
|
||||
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK_DEST, true);
|
||||
me->SetDisplayId(me->GetNativeDisplayId());
|
||||
me->CastSpell(me, SPELL_CLEAR_GIFT, true);
|
||||
}
|
||||
|
||||
void Reset()
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
BossAI::EnterCombat(who);
|
||||
events.ScheduleEvent(EVENT_SPELL_CURSE_OF_LIFE, 5000);
|
||||
events.ScheduleEvent(EVENT_SPELL_RAIN_OF_FIRE, urand(14000, 18000));
|
||||
events.ScheduleEvent(EVENT_SPELL_SHADOW_VOLLEY, urand(8000, 10000));
|
||||
events.ScheduleEvent(EVENT_SPELL_TURN_FLESH, 1000);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
}
|
||||
}
|
||||
|
||||
void DoAction(int32 param)
|
||||
{
|
||||
if (param == ACTION_TURN_BONES && me->IsAlive())
|
||||
{
|
||||
Talk(SAY_SKELETON);
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_TURN_BONES_REAL, 3000);
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
BossAI::JustDied(killer);
|
||||
me->CastSpell(me, SPELL_ACHIEVEMENT_CHECK, true);
|
||||
me->CastSpell(me, SPELL_CLEAR_GIFT, true);
|
||||
if (me->GetDisplayId() != me->GetNativeDisplayId())
|
||||
{
|
||||
BossAI::Reset();
|
||||
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK_DEST, true);
|
||||
me->SetDisplayId(me->GetNativeDisplayId());
|
||||
me->CastSpell(me, SPELL_CLEAR_GIFT, true);
|
||||
me->CastSpell(me, SPELL_FLESH_VISUAL, true);
|
||||
}
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
BossAI::EnterCombat(who);
|
||||
events.ScheduleEvent(EVENT_SPELL_CURSE_OF_LIFE, 5000);
|
||||
events.ScheduleEvent(EVENT_SPELL_RAIN_OF_FIRE, urand(14000,18000));
|
||||
events.ScheduleEvent(EVENT_SPELL_SHADOW_VOLLEY, urand(8000,10000));
|
||||
events.ScheduleEvent(EVENT_SPELL_TURN_FLESH, 1000);
|
||||
}
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
void KilledUnit(Unit * /*victim*/)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
}
|
||||
}
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
void DoAction(int32 param)
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
if (param == ACTION_TURN_BONES && me->IsAlive())
|
||||
{
|
||||
Talk(SAY_SKELETON);
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_TURN_BONES_REAL, 3000);
|
||||
}
|
||||
}
|
||||
case EVENT_SPELL_CURSE_OF_LIFE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true))
|
||||
me->CastSpell(target, SPELL_CURSE_OF_LIFE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_CURSE_OF_LIFE, 13000);
|
||||
break;
|
||||
case EVENT_SPELL_RAIN_OF_FIRE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true))
|
||||
me->CastSpell(target, SPELL_RAIN_OF_FIRE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_RAIN_OF_FIRE, 16000);
|
||||
break;
|
||||
case EVENT_SPELL_SHADOW_VOLLEY:
|
||||
me->CastSpell(me, SPELL_SHADOW_VOLLEY, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_SHADOW_VOLLEY, 9000);
|
||||
break;
|
||||
case EVENT_SPELL_TURN_FLESH:
|
||||
if (me->HealthBelowPct(50))
|
||||
{
|
||||
Talk(SAY_FLESH);
|
||||
me->getThreatManager().resetAllAggro();
|
||||
me->CastSpell((Unit*)NULL, SPELL_TURN_FLESH, false);
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
BossAI::JustDied(killer);
|
||||
me->CastSpell(me, SPELL_ACHIEVEMENT_CHECK, true);
|
||||
me->CastSpell(me, SPELL_CLEAR_GIFT, true);
|
||||
if (me->GetDisplayId() != me->GetNativeDisplayId())
|
||||
{
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_TURN_FLESH_REAL, 3000);
|
||||
return;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_SPELL_TURN_FLESH, 1000);
|
||||
break;
|
||||
case EVENT_TURN_FLESH_REAL:
|
||||
me->CastSpell(me, SPELL_DUMMY, true);
|
||||
|
||||
me->GetMotionMaster()->MoveChase(me->GetVictim());
|
||||
events.ScheduleEvent(EVENT_SPELL_EYE_BEAM, 11000);
|
||||
events.ScheduleEvent(EVENT_SPELL_LIGHTNING_BREATH, 3000);
|
||||
events.ScheduleEvent(EVENT_SPELL_POISON_CLOUD, 6000);
|
||||
break;
|
||||
case EVENT_SPELL_EYE_BEAM:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 35.0f, true))
|
||||
me->CastSpell(target, SPELL_EYE_BEAM, false);
|
||||
break;
|
||||
case EVENT_SPELL_LIGHTNING_BREATH:
|
||||
me->CastSpell(me->GetVictim(), SPELL_LIGHTNING_BREATH, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_LIGHTNING_BREATH, 8000);
|
||||
break;
|
||||
case EVENT_SPELL_POISON_CLOUD:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 35.0f, true))
|
||||
me->CastSpell(target, SPELL_POISON_CLOUD, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_POISON_CLOUD, 10000);
|
||||
break;
|
||||
case EVENT_TURN_BONES_REAL:
|
||||
me->SetDisplayId(me->GetNativeDisplayId());
|
||||
me->CastSpell(me, SPELL_FLESH_VISUAL, true);
|
||||
}
|
||||
me->CastSpell(me, SPELL_CLEAR_GIFT, true);
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_SPELL_CURSE_OF_LIFE, 1000);
|
||||
events.ScheduleEvent(EVENT_SPELL_RAIN_OF_FIRE, urand(12000, 14000));
|
||||
events.ScheduleEvent(EVENT_SPELL_SHADOW_VOLLEY, urand(8000, 10000));
|
||||
break;
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPELL_CURSE_OF_LIFE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true))
|
||||
me->CastSpell(target, SPELL_CURSE_OF_LIFE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_CURSE_OF_LIFE, 13000);
|
||||
break;
|
||||
case EVENT_SPELL_RAIN_OF_FIRE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true))
|
||||
me->CastSpell(target, SPELL_RAIN_OF_FIRE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_RAIN_OF_FIRE, 16000);
|
||||
break;
|
||||
case EVENT_SPELL_SHADOW_VOLLEY:
|
||||
me->CastSpell(me, SPELL_SHADOW_VOLLEY, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_SHADOW_VOLLEY, 9000);
|
||||
break;
|
||||
case EVENT_SPELL_TURN_FLESH:
|
||||
if (me->HealthBelowPct(50))
|
||||
{
|
||||
Talk(SAY_FLESH);
|
||||
me->getThreatManager().resetAllAggro();
|
||||
me->CastSpell((Unit*)NULL, SPELL_TURN_FLESH, false);
|
||||
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_TURN_FLESH_REAL, 3000);
|
||||
return;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_SPELL_TURN_FLESH, 1000);
|
||||
break;
|
||||
case EVENT_TURN_FLESH_REAL:
|
||||
me->CastSpell(me, SPELL_DUMMY, true);
|
||||
|
||||
me->GetMotionMaster()->MoveChase(me->GetVictim());
|
||||
events.ScheduleEvent(EVENT_SPELL_EYE_BEAM, 11000);
|
||||
events.ScheduleEvent(EVENT_SPELL_LIGHTNING_BREATH, 3000);
|
||||
events.ScheduleEvent(EVENT_SPELL_POISON_CLOUD, 6000);
|
||||
break;
|
||||
case EVENT_SPELL_EYE_BEAM:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 35.0f, true))
|
||||
me->CastSpell(target, SPELL_EYE_BEAM, false);
|
||||
break;
|
||||
case EVENT_SPELL_LIGHTNING_BREATH:
|
||||
me->CastSpell(me->GetVictim(), SPELL_LIGHTNING_BREATH, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_LIGHTNING_BREATH, 8000);
|
||||
break;
|
||||
case EVENT_SPELL_POISON_CLOUD:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 35.0f, true))
|
||||
me->CastSpell(target, SPELL_POISON_CLOUD, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_POISON_CLOUD, 10000);
|
||||
break;
|
||||
case EVENT_TURN_BONES_REAL:
|
||||
me->SetDisplayId(me->GetNativeDisplayId());
|
||||
me->CastSpell(me, SPELL_FLESH_VISUAL, true);
|
||||
me->CastSpell(me, SPELL_CLEAR_GIFT, true);
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_SPELL_CURSE_OF_LIFE, 1000);
|
||||
events.ScheduleEvent(EVENT_SPELL_RAIN_OF_FIRE, urand(12000,14000));
|
||||
events.ScheduleEvent(EVENT_SPELL_SHADOW_VOLLEY, urand(8000,10000));
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
class spell_tharon_ja_curse_of_life : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_tharon_ja_curse_of_life() : SpellScriptLoader("spell_tharon_ja_curse_of_life") { }
|
||||
public:
|
||||
spell_tharon_ja_curse_of_life() : SpellScriptLoader("spell_tharon_ja_curse_of_life") { }
|
||||
|
||||
class spell_tharon_ja_curse_of_life_AuraScript : public AuraScript
|
||||
class spell_tharon_ja_curse_of_life_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_tharon_ja_curse_of_life_AuraScript);
|
||||
|
||||
void OnPeriodic(AuraEffect const* /*aurEff*/)
|
||||
{
|
||||
PrepareAuraScript(spell_tharon_ja_curse_of_life_AuraScript);
|
||||
|
||||
void OnPeriodic(AuraEffect const* /*aurEff*/)
|
||||
if (GetUnitOwner()->HealthBelowPct(50))
|
||||
{
|
||||
if (GetUnitOwner()->HealthBelowPct(50))
|
||||
{
|
||||
PreventDefaultAction();
|
||||
SetDuration(0);
|
||||
}
|
||||
PreventDefaultAction();
|
||||
SetDuration(0);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_tharon_ja_curse_of_life_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_tharon_ja_curse_of_life_AuraScript();
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_tharon_ja_curse_of_life_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_tharon_ja_curse_of_life_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_tharon_ja_dummy : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_tharon_ja_dummy() : SpellScriptLoader("spell_tharon_ja_dummy") { }
|
||||
public:
|
||||
spell_tharon_ja_dummy() : SpellScriptLoader("spell_tharon_ja_dummy") { }
|
||||
|
||||
class spell_tharon_ja_dummy_AuraScript : public AuraScript
|
||||
class spell_tharon_ja_dummy_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_tharon_ja_dummy_AuraScript)
|
||||
|
||||
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
PrepareAuraScript(spell_tharon_ja_dummy_AuraScript)
|
||||
|
||||
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
PreventDefaultAction();
|
||||
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_FLESH_VISUAL, true);
|
||||
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_GIFT_OF_THARON_JA, true);
|
||||
GetUnitOwner()->SetDisplayId(GetUnitOwner()->GetNativeDisplayId()+1);
|
||||
}
|
||||
|
||||
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
PreventDefaultAction();
|
||||
GetUnitOwner()->getThreatManager().resetAllAggro();
|
||||
GetUnitOwner()->GetMotionMaster()->Clear();
|
||||
GetUnitOwner()->CastSpell((Unit*)NULL, SPELL_TURN_BONES, false);
|
||||
GetUnitOwner()->GetAI()->DoAction(ACTION_TURN_BONES);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectApply += AuraEffectApplyFn(spell_tharon_ja_dummy_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
|
||||
OnEffectRemove += AuraEffectRemoveFn(spell_tharon_ja_dummy_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_tharon_ja_dummy_AuraScript();
|
||||
PreventDefaultAction();
|
||||
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_FLESH_VISUAL, true);
|
||||
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_GIFT_OF_THARON_JA, true);
|
||||
GetUnitOwner()->SetDisplayId(GetUnitOwner()->GetNativeDisplayId() + 1);
|
||||
}
|
||||
|
||||
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
PreventDefaultAction();
|
||||
GetUnitOwner()->getThreatManager().resetAllAggro();
|
||||
GetUnitOwner()->GetMotionMaster()->Clear();
|
||||
GetUnitOwner()->CastSpell((Unit*)NULL, SPELL_TURN_BONES, false);
|
||||
GetUnitOwner()->GetAI()->DoAction(ACTION_TURN_BONES);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectApply += AuraEffectApplyFn(spell_tharon_ja_dummy_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
|
||||
OnEffectRemove += AuraEffectRemoveFn(spell_tharon_ja_dummy_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_tharon_ja_dummy_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_tharon_ja_clear_gift_of_tharon_ja : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_tharon_ja_clear_gift_of_tharon_ja() : SpellScriptLoader("spell_tharon_ja_clear_gift_of_tharon_ja") { }
|
||||
public:
|
||||
spell_tharon_ja_clear_gift_of_tharon_ja() : SpellScriptLoader("spell_tharon_ja_clear_gift_of_tharon_ja") { }
|
||||
|
||||
class spell_tharon_ja_clear_gift_of_tharon_ja_SpellScript : public SpellScript
|
||||
class spell_tharon_ja_clear_gift_of_tharon_ja_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_tharon_ja_clear_gift_of_tharon_ja_SpellScript);
|
||||
|
||||
void HandleScript(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
PrepareSpellScript(spell_tharon_ja_clear_gift_of_tharon_ja_SpellScript);
|
||||
|
||||
void HandleScript(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (Unit* target = GetHitUnit())
|
||||
target->RemoveAura(SPELL_GIFT_OF_THARON_JA);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_tharon_ja_clear_gift_of_tharon_ja_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_tharon_ja_clear_gift_of_tharon_ja_SpellScript();
|
||||
if (Unit* target = GetHitUnit())
|
||||
target->RemoveAura(SPELL_GIFT_OF_THARON_JA);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_tharon_ja_clear_gift_of_tharon_ja_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_tharon_ja_clear_gift_of_tharon_ja_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_tharon_ja()
|
||||
|
||||
@@ -43,223 +43,223 @@ enum Events
|
||||
|
||||
class boss_trollgore : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_trollgore() : CreatureScript("boss_trollgore") { }
|
||||
public:
|
||||
boss_trollgore() : CreatureScript("boss_trollgore") { }
|
||||
|
||||
struct boss_trollgoreAI : public BossAI
|
||||
struct boss_trollgoreAI : public BossAI
|
||||
{
|
||||
boss_trollgoreAI(Creature* creature) : BossAI(creature, DATA_TROLLGORE)
|
||||
{
|
||||
boss_trollgoreAI(Creature* creature) : BossAI(creature, DATA_TROLLGORE)
|
||||
{
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
events2.Reset();
|
||||
events2.ScheduleEvent(EVENT_SPAWN_INVADERS, 30000);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
events.ScheduleEvent(EVENT_SPELL_INFECTED_WOUND, urand(6000,10000));
|
||||
events.ScheduleEvent(EVENT_SPELL_CRUSH, urand(3000,5000));
|
||||
events.ScheduleEvent(EVENT_SPELL_CONSUME, 15000);
|
||||
events.ScheduleEvent(EVENT_SPELL_CORPSE_EXPLODE, 35000);
|
||||
events.ScheduleEvent(EVENT_SPAWN_INVADERS, 20000, 30000);
|
||||
|
||||
me->setActive(true);
|
||||
instance->SetBossState(DATA_TROLLGORE, IN_PROGRESS);
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
me->SetInCombatWithZone();
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
BossAI::JustDied(killer);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
}
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
events2.Update(diff);
|
||||
switch (events2.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPAWN_INVADERS:
|
||||
me->CastSpell(me, SPELL_SUMMON_INVADER_A, true);
|
||||
me->CastSpell(me, SPELL_SUMMON_INVADER_B, true);
|
||||
me->CastSpell(me, SPELL_SUMMON_INVADER_C, true);
|
||||
events2.ScheduleEvent(EVENT_SPAWN_INVADERS, 30000);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch(events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPELL_INFECTED_WOUND:
|
||||
me->CastSpell(me->GetVictim(), SPELL_INFECTED_WOUND, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_INFECTED_WOUND, urand(25000,35000));
|
||||
break;
|
||||
case EVENT_SPELL_CRUSH:
|
||||
me->CastSpell(me->GetVictim(), SPELL_CRUSH, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_CRUSH, urand(10000,15000));
|
||||
break;
|
||||
case EVENT_SPELL_CONSUME:
|
||||
Talk(SAY_CONSUME);
|
||||
me->CastSpell(me, SPELL_CONSUME, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_CONSUME, 15000);
|
||||
break;
|
||||
case EVENT_SPELL_CORPSE_EXPLODE:
|
||||
Talk(SAY_EXPLODE);
|
||||
me->CastSpell(me, SPELL_CORPSE_EXPLODE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_CORPSE_EXPLODE, urand(15000,19000));
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
EnterEvadeIfOutOfCombatArea();
|
||||
}
|
||||
|
||||
bool CheckEvadeIfOutOfCombatArea() const
|
||||
{
|
||||
return me->GetHomePosition().GetExactDist2d(me) > 60.0f;
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap events2;
|
||||
};
|
||||
|
||||
CreatureAI *GetAI(Creature *creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_trollgoreAI>(creature);
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
events2.Reset();
|
||||
events2.ScheduleEvent(EVENT_SPAWN_INVADERS, 30000);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
events.ScheduleEvent(EVENT_SPELL_INFECTED_WOUND, urand(6000, 10000));
|
||||
events.ScheduleEvent(EVENT_SPELL_CRUSH, urand(3000, 5000));
|
||||
events.ScheduleEvent(EVENT_SPELL_CONSUME, 15000);
|
||||
events.ScheduleEvent(EVENT_SPELL_CORPSE_EXPLODE, 35000);
|
||||
events.ScheduleEvent(EVENT_SPAWN_INVADERS, 20000, 30000);
|
||||
|
||||
me->setActive(true);
|
||||
instance->SetBossState(DATA_TROLLGORE, IN_PROGRESS);
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
me->SetInCombatWithZone();
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
BossAI::JustDied(killer);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
}
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
events2.Update(diff);
|
||||
switch (events2.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPAWN_INVADERS:
|
||||
me->CastSpell(me, SPELL_SUMMON_INVADER_A, true);
|
||||
me->CastSpell(me, SPELL_SUMMON_INVADER_B, true);
|
||||
me->CastSpell(me, SPELL_SUMMON_INVADER_C, true);
|
||||
events2.ScheduleEvent(EVENT_SPAWN_INVADERS, 30000);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch(events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPELL_INFECTED_WOUND:
|
||||
me->CastSpell(me->GetVictim(), SPELL_INFECTED_WOUND, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_INFECTED_WOUND, urand(25000, 35000));
|
||||
break;
|
||||
case EVENT_SPELL_CRUSH:
|
||||
me->CastSpell(me->GetVictim(), SPELL_CRUSH, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_CRUSH, urand(10000, 15000));
|
||||
break;
|
||||
case EVENT_SPELL_CONSUME:
|
||||
Talk(SAY_CONSUME);
|
||||
me->CastSpell(me, SPELL_CONSUME, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_CONSUME, 15000);
|
||||
break;
|
||||
case EVENT_SPELL_CORPSE_EXPLODE:
|
||||
Talk(SAY_EXPLODE);
|
||||
me->CastSpell(me, SPELL_CORPSE_EXPLODE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_CORPSE_EXPLODE, urand(15000, 19000));
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
EnterEvadeIfOutOfCombatArea();
|
||||
}
|
||||
|
||||
bool CheckEvadeIfOutOfCombatArea() const
|
||||
{
|
||||
return me->GetHomePosition().GetExactDist2d(me) > 60.0f;
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap events2;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_trollgoreAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
class spell_trollgore_consume : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_trollgore_consume() : SpellScriptLoader("spell_trollgore_consume") { }
|
||||
public:
|
||||
spell_trollgore_consume() : SpellScriptLoader("spell_trollgore_consume") { }
|
||||
|
||||
class spell_trollgore_consume_SpellScript : public SpellScript
|
||||
class spell_trollgore_consume_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_trollgore_consume_SpellScript);
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
PrepareSpellScript(spell_trollgore_consume_SpellScript);
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (Unit* target = GetHitUnit())
|
||||
target->CastSpell(GetCaster(), SPELL_CONSUME_AURA, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_trollgore_consume_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_trollgore_consume_SpellScript();
|
||||
if (Unit* target = GetHitUnit())
|
||||
target->CastSpell(GetCaster(), SPELL_CONSUME_AURA, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_trollgore_consume_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_trollgore_consume_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_trollgore_corpse_explode : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_trollgore_corpse_explode() : SpellScriptLoader("spell_trollgore_corpse_explode") { }
|
||||
public:
|
||||
spell_trollgore_corpse_explode() : SpellScriptLoader("spell_trollgore_corpse_explode") { }
|
||||
|
||||
class spell_trollgore_corpse_explode_AuraScript : public AuraScript
|
||||
class spell_trollgore_corpse_explode_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_trollgore_corpse_explode_AuraScript);
|
||||
|
||||
void PeriodicTick(AuraEffect const* aurEff)
|
||||
{
|
||||
PrepareAuraScript(spell_trollgore_corpse_explode_AuraScript);
|
||||
|
||||
void PeriodicTick(AuraEffect const* aurEff)
|
||||
{
|
||||
if (aurEff->GetTickNumber() == 2)
|
||||
if (Unit* caster = GetCaster())
|
||||
caster->CastSpell(GetTarget(), SPELL_CORPSE_EXPLODE_DAMAGE, true);
|
||||
}
|
||||
|
||||
void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
if (Creature* target = GetTarget()->ToCreature())
|
||||
target->DespawnOrUnsummon(1);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_trollgore_corpse_explode_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
|
||||
AfterEffectRemove += AuraEffectRemoveFn(spell_trollgore_corpse_explode_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_trollgore_corpse_explode_AuraScript();
|
||||
if (aurEff->GetTickNumber() == 2)
|
||||
if (Unit* caster = GetCaster())
|
||||
caster->CastSpell(GetTarget(), SPELL_CORPSE_EXPLODE_DAMAGE, true);
|
||||
}
|
||||
|
||||
void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
if (Creature* target = GetTarget()->ToCreature())
|
||||
target->DespawnOrUnsummon(1);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_trollgore_corpse_explode_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
|
||||
AfterEffectRemove += AuraEffectRemoveFn(spell_trollgore_corpse_explode_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_trollgore_corpse_explode_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_trollgore_invader_taunt : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_trollgore_invader_taunt() : SpellScriptLoader("spell_trollgore_invader_taunt") { }
|
||||
public:
|
||||
spell_trollgore_invader_taunt() : SpellScriptLoader("spell_trollgore_invader_taunt") { }
|
||||
|
||||
class spell_trollgore_invader_taunt_SpellScript : public SpellScript
|
||||
class spell_trollgore_invader_taunt_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_trollgore_invader_taunt_SpellScript);
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
PrepareSpellScript(spell_trollgore_invader_taunt_SpellScript);
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (Unit* target = GetHitUnit())
|
||||
target->CastSpell(GetCaster(), uint32(GetEffectValue()), true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_trollgore_invader_taunt_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_trollgore_invader_taunt_SpellScript();
|
||||
if (Unit* target = GetHitUnit())
|
||||
target->CastSpell(GetCaster(), uint32(GetEffectValue()), true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_trollgore_invader_taunt_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_trollgore_invader_taunt_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class achievement_consumption_junction : public AchievementCriteriaScript
|
||||
{
|
||||
public:
|
||||
achievement_consumption_junction() : AchievementCriteriaScript("achievement_consumption_junction")
|
||||
{
|
||||
}
|
||||
public:
|
||||
achievement_consumption_junction() : AchievementCriteriaScript("achievement_consumption_junction")
|
||||
{
|
||||
}
|
||||
|
||||
bool OnCheck(Player* /*player*/, Unit* target)
|
||||
{
|
||||
if (!target)
|
||||
return false;
|
||||
bool OnCheck(Player* /*player*/, Unit* target)
|
||||
{
|
||||
if (!target)
|
||||
return false;
|
||||
|
||||
return target->GetAuraCount(sSpellMgr->GetSpellIdForDifficulty(SPELL_CONSUME_AURA, target)) < 10;
|
||||
}
|
||||
return target->GetAuraCount(sSpellMgr->GetSpellIdForDifficulty(SPELL_CONSUME_AURA, target)) < 10;
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_trollgore()
|
||||
|
||||
@@ -17,134 +17,134 @@ DoorData const doorData[] =
|
||||
|
||||
class instance_drak_tharon_keep : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
instance_drak_tharon_keep() : InstanceMapScript("instance_drak_tharon_keep", 600) { }
|
||||
public:
|
||||
instance_drak_tharon_keep() : InstanceMapScript("instance_drak_tharon_keep", 600) { }
|
||||
|
||||
struct instance_drak_tharon_keep_InstanceScript : public InstanceScript
|
||||
struct instance_drak_tharon_keep_InstanceScript : public InstanceScript
|
||||
{
|
||||
instance_drak_tharon_keep_InstanceScript(Map* map) : InstanceScript(map)
|
||||
{
|
||||
instance_drak_tharon_keep_InstanceScript(Map* map) : InstanceScript(map)
|
||||
{
|
||||
SetBossNumber(MAX_ENCOUNTERS);
|
||||
LoadDoorData(doorData);
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* go)
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_NOVOS_CRYSTAL_1:
|
||||
case GO_NOVOS_CRYSTAL_2:
|
||||
case GO_NOVOS_CRYSTAL_3:
|
||||
case GO_NOVOS_CRYSTAL_4:
|
||||
AddDoor(go, true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectRemove(GameObject* go)
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_NOVOS_CRYSTAL_1:
|
||||
case GO_NOVOS_CRYSTAL_2:
|
||||
case GO_NOVOS_CRYSTAL_3:
|
||||
case GO_NOVOS_CRYSTAL_4:
|
||||
AddDoor(go, false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "D K " << GetBossSaveData();
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void Load(const char* in)
|
||||
{
|
||||
if( !in )
|
||||
return;
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
std::istringstream loadStream(in);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
if (dataHead1 == 'D' && dataHead2 == 'K')
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
|
||||
{
|
||||
uint32 tmpState;
|
||||
loadStream >> tmpState;
|
||||
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
|
||||
tmpState = NOT_STARTED;
|
||||
SetBossState(i, EncounterState(tmpState));
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap *map) const
|
||||
{
|
||||
return new instance_drak_tharon_keep_InstanceScript(map);
|
||||
SetBossNumber(MAX_ENCOUNTERS);
|
||||
LoadDoorData(doorData);
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* go)
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_NOVOS_CRYSTAL_1:
|
||||
case GO_NOVOS_CRYSTAL_2:
|
||||
case GO_NOVOS_CRYSTAL_3:
|
||||
case GO_NOVOS_CRYSTAL_4:
|
||||
AddDoor(go, true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectRemove(GameObject* go)
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_NOVOS_CRYSTAL_1:
|
||||
case GO_NOVOS_CRYSTAL_2:
|
||||
case GO_NOVOS_CRYSTAL_3:
|
||||
case GO_NOVOS_CRYSTAL_4:
|
||||
AddDoor(go, false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "D K " << GetBossSaveData();
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void Load(const char* in)
|
||||
{
|
||||
if( !in )
|
||||
return;
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
std::istringstream loadStream(in);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
if (dataHead1 == 'D' && dataHead2 == 'K')
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
|
||||
{
|
||||
uint32 tmpState;
|
||||
loadStream >> tmpState;
|
||||
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
|
||||
tmpState = NOT_STARTED;
|
||||
SetBossState(i, EncounterState(tmpState));
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_drak_tharon_keep_InstanceScript(map);
|
||||
}
|
||||
};
|
||||
|
||||
class spell_dtk_raise_dead : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_dtk_raise_dead() : SpellScriptLoader("spell_dtk_raise_dead") { }
|
||||
public:
|
||||
spell_dtk_raise_dead() : SpellScriptLoader("spell_dtk_raise_dead") { }
|
||||
|
||||
class spell_dtk_raise_dead_AuraScript : public AuraScript
|
||||
class spell_dtk_raise_dead_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_dtk_raise_dead_AuraScript)
|
||||
|
||||
bool Load()
|
||||
{
|
||||
PrepareAuraScript(spell_dtk_raise_dead_AuraScript)
|
||||
|
||||
bool Load()
|
||||
{
|
||||
return GetUnitOwner()->GetTypeId() == TYPEID_UNIT;
|
||||
}
|
||||
|
||||
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
GetUnitOwner()->ToCreature()->DespawnOrUnsummon(1);
|
||||
GetUnitOwner()->SummonCreature(NPC_RISEN_DRAKKARI_WARRIOR, *GetUnitOwner());
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
AfterEffectRemove += AuraEffectRemoveFn(spell_dtk_raise_dead_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_dtk_raise_dead_AuraScript();
|
||||
return GetUnitOwner()->GetTypeId() == TYPEID_UNIT;
|
||||
}
|
||||
|
||||
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
GetUnitOwner()->ToCreature()->DespawnOrUnsummon(1);
|
||||
GetUnitOwner()->SummonCreature(NPC_RISEN_DRAKKARI_WARRIOR, *GetUnitOwner());
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
AfterEffectRemove += AuraEffectRemoveFn(spell_dtk_raise_dead_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_dtk_raise_dead_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_dtk_summon_random_drakkari : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_dtk_summon_random_drakkari() : SpellScriptLoader("spell_dtk_summon_random_drakkari") { }
|
||||
public:
|
||||
spell_dtk_summon_random_drakkari() : SpellScriptLoader("spell_dtk_summon_random_drakkari") { }
|
||||
|
||||
class spell_dtk_summon_random_drakkari_SpellScript : public SpellScript
|
||||
class spell_dtk_summon_random_drakkari_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_dtk_summon_random_drakkari_SpellScript);
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
PrepareSpellScript(spell_dtk_summon_random_drakkari_SpellScript);
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
GetCaster()->CastSpell(GetCaster(), RAND(SPELL_SUMMON_DRAKKARI_SHAMAN, SPELL_SUMMON_DRAKKARI_GUARDIAN), true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_dtk_summon_random_drakkari_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_dtk_summon_random_drakkari_SpellScript();
|
||||
GetCaster()->CastSpell(GetCaster(), RAND(SPELL_SUMMON_DRAKKARI_SHAMAN, SPELL_SUMMON_DRAKKARI_GUARDIAN), true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_dtk_summon_random_drakkari_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_dtk_summon_random_drakkari_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_instance_drak_tharon_keep()
|
||||
|
||||
Reference in New Issue
Block a user