mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-18 11:25:42 +00:00
Big re-organization of repository [W.I.P]
This commit is contained in:
@@ -1,317 +0,0 @@
|
||||
/*
|
||||
REWRITTEN BY XINEF
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "magisters_terrace.h"
|
||||
#include "WorldPacket.h"
|
||||
#include "Opcodes.h"
|
||||
|
||||
enum Says
|
||||
{
|
||||
SAY_AGGRO = 0,
|
||||
SAY_PHOENIX = 1,
|
||||
SAY_FLAMESTRIKE = 2,
|
||||
SAY_GRAVITY_LAPSE = 3,
|
||||
SAY_TIRED = 4,
|
||||
SAY_RECAST_GRAVITY = 5,
|
||||
SAY_DEATH = 6
|
||||
};
|
||||
|
||||
enum Spells
|
||||
{
|
||||
// Phase 1
|
||||
SPELL_FIREBALL_N = 44189,
|
||||
SPELL_FIREBALL_H = 46164,
|
||||
SPELL_FLAMESTRIKE_SUMMON = 44192,
|
||||
SPELL_PHOENIX = 44194,
|
||||
SPELL_SHOCK_BARRIER = 46165,
|
||||
SPELL_PYROBLAST = 36819,
|
||||
|
||||
// Phase 2
|
||||
SPELL_SUMMON_ARCANE_SPHERE = 44265,
|
||||
SPELL_TELEPORT_CENTER = 44218,
|
||||
SPELL_GRAVITY_LAPSE_INITIAL = 44224,
|
||||
SPELL_GRAVITY_LAPSE_PLAYER = 44219, // Till 44223, 5 players
|
||||
SPELL_GRAVITY_LAPSE_FLY = 44227,
|
||||
SPELL_GRAVITY_LAPSE_DOT = 44226,
|
||||
SPELL_GRAVITY_LAPSE_CHANNEL = 44251,
|
||||
SPELL_POWER_FEEDBACK = 44233
|
||||
};
|
||||
|
||||
enum Misc
|
||||
{
|
||||
EVENT_INIT_COMBAT = 1,
|
||||
EVENT_SPELL_FIREBALL = 2,
|
||||
EVENT_SPELL_PHOENIX = 3,
|
||||
EVENT_SPELL_FLAMESTRIKE = 4,
|
||||
EVENT_SPELL_SHOCK_BARRIER = 5,
|
||||
EVENT_CHECK_HEALTH = 6,
|
||||
EVENT_GRAVITY_LAPSE_1_1 = 7,
|
||||
EVENT_GRAVITY_LAPSE_1_2 = 8,
|
||||
EVENT_GRAVITY_LAPSE_2 = 9,
|
||||
EVENT_GRAVITY_LAPSE_3 = 10,
|
||||
EVENT_GRAVITY_LAPSE_4 = 11,
|
||||
EVENT_GRAVITY_LAPSE_5 = 12,
|
||||
EVENT_FINISH_TALK = 13,
|
||||
|
||||
ACTION_TELEPORT_PLAYERS = 1,
|
||||
ACTION_KNOCKUP = 2,
|
||||
ACTION_ALLOW_FLY = 3,
|
||||
ACTION_REMOVE_FLY = 4,
|
||||
|
||||
CREATURE_ARCANE_SPHERE = 24708
|
||||
};
|
||||
|
||||
class boss_felblood_kaelthas : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_felblood_kaelthas() : CreatureScript("boss_felblood_kaelthas") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_felblood_kaelthasAI(creature);
|
||||
}
|
||||
|
||||
struct boss_felblood_kaelthasAI : public ScriptedAI
|
||||
{
|
||||
boss_felblood_kaelthasAI(Creature* creature) : ScriptedAI(creature), summons(me)
|
||||
{
|
||||
instance = creature->GetInstanceScript();
|
||||
introSpeak = false;
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
EventMap events;
|
||||
EventMap events2;
|
||||
SummonList summons;
|
||||
bool introSpeak;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
summons.DespawnAll();
|
||||
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, false);
|
||||
instance->SetData(DATA_KAELTHAS_EVENT, NOT_STARTED);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
|
||||
if (*itr == summon->GetGUID())
|
||||
return;
|
||||
summons.Summon(summon);
|
||||
}
|
||||
|
||||
void InitializeAI()
|
||||
{
|
||||
ScriptedAI::InitializeAI();
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
}
|
||||
|
||||
void JustDied(Unit*)
|
||||
{
|
||||
instance->SetData(DATA_KAELTHAS_EVENT, DONE);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
instance->SetData(DATA_KAELTHAS_EVENT, IN_PROGRESS);
|
||||
me->SetInCombatWithZone();
|
||||
|
||||
events.ScheduleEvent(EVENT_SPELL_FIREBALL, 0);
|
||||
events.ScheduleEvent(EVENT_SPELL_PHOENIX, 15000);
|
||||
events.ScheduleEvent(EVENT_SPELL_FLAMESTRIKE, 22000);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
|
||||
|
||||
if (IsHeroic())
|
||||
events.ScheduleEvent(EVENT_SPELL_SHOCK_BARRIER, 50000);
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who)
|
||||
{
|
||||
if (!introSpeak && me->IsWithinDistInMap(who, 40.0f) && who->GetTypeId() == TYPEID_PLAYER)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
introSpeak = true;
|
||||
events2.ScheduleEvent(EVENT_INIT_COMBAT, 35000);
|
||||
}
|
||||
|
||||
ScriptedAI::MoveInLineOfSight(who);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask)
|
||||
{
|
||||
if (damage >= me->GetHealth())
|
||||
{
|
||||
damage = me->GetHealth()-1;
|
||||
if (me->isRegeneratingHealth())
|
||||
{
|
||||
me->SetRegeneratingHealth(false);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE|UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
me->CombatStop();
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
LapseAction(ACTION_REMOVE_FLY);
|
||||
events.Reset();
|
||||
events2.ScheduleEvent(EVENT_FINISH_TALK, 6000);
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LapseAction(uint8 action)
|
||||
{
|
||||
uint8 counter = 0;
|
||||
Map::PlayerList const& playerList = me->GetMap()->GetPlayers();
|
||||
for (Map::PlayerList::const_iterator itr = playerList.begin(); itr != playerList.end(); ++itr, ++counter)
|
||||
if (Player* player = itr->GetSource())
|
||||
{
|
||||
if (action == ACTION_TELEPORT_PLAYERS)
|
||||
me->CastSpell(player, SPELL_GRAVITY_LAPSE_PLAYER+counter, true);
|
||||
else if (action == ACTION_KNOCKUP)
|
||||
player->CastSpell(player, SPELL_GRAVITY_LAPSE_DOT, true, NULL, NULL, me->GetGUID());
|
||||
else if (action == ACTION_ALLOW_FLY)
|
||||
player->CastSpell(player, SPELL_GRAVITY_LAPSE_FLY, true, NULL, NULL, me->GetGUID());
|
||||
else if (action == ACTION_REMOVE_FLY)
|
||||
{
|
||||
player->RemoveAurasDueToSpell(SPELL_GRAVITY_LAPSE_FLY);
|
||||
player->RemoveAurasDueToSpell(SPELL_GRAVITY_LAPSE_DOT);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
events2.Update(diff);
|
||||
switch (events2.ExecuteEvent())
|
||||
{
|
||||
case EVENT_INIT_COMBAT:
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
if (Unit* target = SelectTargetFromPlayerList(50.0f))
|
||||
AttackStart(target);
|
||||
return;
|
||||
case EVENT_FINISH_TALK:
|
||||
Unit::Kill(me, me);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPELL_FIREBALL:
|
||||
me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_FIREBALL_N, SPELL_FIREBALL_H), false);
|
||||
events.ScheduleEvent(EVENT_SPELL_FIREBALL, urand(3000, 4500));
|
||||
break;
|
||||
case EVENT_SPELL_FLAMESTRIKE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
|
||||
{
|
||||
me->CastSpell(target, SPELL_FLAMESTRIKE_SUMMON, true);
|
||||
Talk(SAY_FLAMESTRIKE);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_SPELL_FLAMESTRIKE, 25000);
|
||||
break;
|
||||
case EVENT_SPELL_SHOCK_BARRIER:
|
||||
me->CastSpell(me, SPELL_SHOCK_BARRIER, true);
|
||||
me->CastCustomSpell(SPELL_PYROBLAST, SPELLVALUE_MAX_TARGETS, 1, (Unit*)NULL, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_SHOCK_BARRIER, 50000);
|
||||
break;
|
||||
case EVENT_SPELL_PHOENIX:
|
||||
Talk(SAY_PHOENIX);
|
||||
me->CastSpell(me, SPELL_PHOENIX, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_PHOENIX, 60000);
|
||||
break;
|
||||
case EVENT_CHECK_HEALTH:
|
||||
if (HealthBelowPct(50))
|
||||
{
|
||||
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, true);
|
||||
me->CastSpell(me, SPELL_TELEPORT_CENTER, true);
|
||||
events.Reset();
|
||||
|
||||
me->StopMoving();
|
||||
me->GetMotionMaster()->Clear();
|
||||
me->GetMotionMaster()->MoveIdle();
|
||||
|
||||
events.SetPhase(1);
|
||||
events.ScheduleEvent(EVENT_GRAVITY_LAPSE_1_1, 0);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 500);
|
||||
break;
|
||||
case EVENT_GRAVITY_LAPSE_1_1:
|
||||
case EVENT_GRAVITY_LAPSE_1_2:
|
||||
Talk(eventId == EVENT_GRAVITY_LAPSE_1_1 ? SAY_GRAVITY_LAPSE : SAY_RECAST_GRAVITY);
|
||||
me->CastSpell(me, SPELL_GRAVITY_LAPSE_INITIAL, false);
|
||||
events.ScheduleEvent(EVENT_GRAVITY_LAPSE_2, 2000);
|
||||
break;
|
||||
case EVENT_GRAVITY_LAPSE_2:
|
||||
LapseAction(ACTION_TELEPORT_PLAYERS);
|
||||
events.ScheduleEvent(EVENT_GRAVITY_LAPSE_3, 1000);
|
||||
break;
|
||||
case EVENT_GRAVITY_LAPSE_3:
|
||||
LapseAction(ACTION_KNOCKUP);
|
||||
events.ScheduleEvent(EVENT_GRAVITY_LAPSE_4, 1000);
|
||||
break;
|
||||
case EVENT_GRAVITY_LAPSE_4:
|
||||
LapseAction(ACTION_ALLOW_FLY);
|
||||
for (uint8 i = 0; i < 3; ++i)
|
||||
me->CastSpell(me, SPELL_SUMMON_ARCANE_SPHERE, true);
|
||||
|
||||
me->CastSpell(me, SPELL_GRAVITY_LAPSE_CHANNEL, false);
|
||||
events.ScheduleEvent(EVENT_GRAVITY_LAPSE_5, 30000);
|
||||
break;
|
||||
case EVENT_GRAVITY_LAPSE_5:
|
||||
LapseAction(ACTION_REMOVE_FLY);
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
Talk(SAY_TIRED);
|
||||
me->CastSpell(me, SPELL_POWER_FEEDBACK, false);
|
||||
events.ScheduleEvent(EVENT_GRAVITY_LAPSE_1_2, 10000);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
if (events.GetPhaseMask() == 0)
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
class spell_mt_phoenix_burn : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_mt_phoenix_burn() : SpellScriptLoader("spell_mt_phoenix_burn") { }
|
||||
|
||||
class spell_mt_phoenix_burn_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_mt_phoenix_burn_SpellScript);
|
||||
|
||||
void HandleAfterCast()
|
||||
{
|
||||
uint32 damage = CalculatePct(GetCaster()->GetMaxHealth(), 5);
|
||||
Unit::DealDamage(GetCaster(), GetCaster(), damage);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
AfterCast += SpellCastFn(spell_mt_phoenix_burn_SpellScript::HandleAfterCast);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_mt_phoenix_burn_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_felblood_kaelthas()
|
||||
{
|
||||
new boss_felblood_kaelthas();
|
||||
new spell_mt_phoenix_burn();
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,226 +0,0 @@
|
||||
/*
|
||||
REWRITTEN BY XINEF
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "magisters_terrace.h"
|
||||
|
||||
enum Says
|
||||
{
|
||||
SAY_AGGRO = 0,
|
||||
SAY_ENERGY = 1,
|
||||
SAY_EMPOWERED = 2,
|
||||
SAY_KILL = 3,
|
||||
SAY_DEATH = 4,
|
||||
EMOTE_CRYSTAL = 5
|
||||
};
|
||||
|
||||
enum Spells
|
||||
{
|
||||
SPELL_FEL_CRYSTAL_COSMETIC = 44374,
|
||||
SPELL_MANA_RAGE = 44320,
|
||||
SPELL_MANA_RAGE_TRIGGER = 44321,
|
||||
|
||||
//Selin's spells
|
||||
SPELL_DRAIN_LIFE_N = 44294,
|
||||
SPELL_DRAIN_LIFE_H = 46155,
|
||||
SPELL_FEL_EXPLOSION = 44314,
|
||||
SPELL_DRAIN_MANA = 46153
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_SPELL_DRAIN_LIFE = 1,
|
||||
EVENT_SPELL_FEL_EXPLOSION = 2,
|
||||
EVENT_SPELL_DRAIN_MANA = 3,
|
||||
EVENT_DRAIN_CRYSTAL = 4,
|
||||
EVENT_EMPOWER = 5,
|
||||
EVENT_RESTORE_COMBAT = 6
|
||||
};
|
||||
|
||||
class boss_selin_fireheart : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_selin_fireheart() : CreatureScript("boss_selin_fireheart") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetInstanceAI<boss_selin_fireheartAI>(creature);
|
||||
};
|
||||
|
||||
struct boss_selin_fireheartAI : public ScriptedAI
|
||||
{
|
||||
boss_selin_fireheartAI(Creature* creature) : ScriptedAI(creature), summons(me)
|
||||
{
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
EventMap events;
|
||||
SummonList summons;
|
||||
uint64 CrystalGUID;
|
||||
|
||||
bool CanAIAttack(const Unit* who) const
|
||||
{
|
||||
return who->GetPositionX() > 216.0f;
|
||||
}
|
||||
|
||||
void SpawnCrystals()
|
||||
{
|
||||
me->SummonCreature(NPC_FEL_CRYSTAL, 248.053f, 14.592f, 3.74882f, 3.94444f, TEMPSUMMON_CORPSE_DESPAWN);
|
||||
me->SummonCreature(NPC_FEL_CRYSTAL, 225.969f, -20.0775f, -2.9731f, 0.942478f, TEMPSUMMON_CORPSE_DESPAWN);
|
||||
me->SummonCreature(NPC_FEL_CRYSTAL, 226.314f, 20.2183f, -2.98127f, 5.32325f, TEMPSUMMON_CORPSE_DESPAWN);
|
||||
me->SummonCreature(NPC_FEL_CRYSTAL, 247.888f, -14.6252f, 3.80777f, 2.33874f, TEMPSUMMON_CORPSE_DESPAWN);
|
||||
me->SummonCreature(NPC_FEL_CRYSTAL, 263.149f, 0.309245f, 1.32057f, 3.15905f, TEMPSUMMON_CORPSE_DESPAWN);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summon->SetReactState(REACT_PASSIVE);
|
||||
summons.Summon(summon);
|
||||
}
|
||||
|
||||
void SummonedCreatureDies(Creature* summon, Unit*)
|
||||
{
|
||||
summons.Despawn(summon);
|
||||
if (events.GetPhaseMask() & 0x01)
|
||||
events.ScheduleEvent(EVENT_RESTORE_COMBAT, 0);
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
summons.DespawnAll();
|
||||
SpawnCrystals();
|
||||
instance->SetData(DATA_SELIN_EVENT, NOT_STARTED);
|
||||
CrystalGUID = 0;
|
||||
me->SetPower(POWER_MANA, 0);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
instance->SetData(DATA_SELIN_EVENT, IN_PROGRESS);
|
||||
|
||||
events.ScheduleEvent(EVENT_SPELL_DRAIN_LIFE, 2500, 1);
|
||||
events.ScheduleEvent(EVENT_SPELL_FEL_EXPLOSION, 2000);
|
||||
events.ScheduleEvent(EVENT_DRAIN_CRYSTAL, 14000);
|
||||
|
||||
if (IsHeroic())
|
||||
events.ScheduleEvent(EVENT_SPELL_DRAIN_MANA, 7500, 1);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
|
||||
instance->SetData(DATA_SELIN_EVENT, DONE); // Encounter complete!
|
||||
summons.DespawnAll();
|
||||
}
|
||||
|
||||
void SelectNearestCrystal()
|
||||
{
|
||||
if (summons.empty())
|
||||
return;
|
||||
|
||||
CrystalGUID = 0;
|
||||
Unit* crystal = NULL;
|
||||
for (SummonList::const_iterator i = summons.begin(); i != summons.end(); )
|
||||
if (Creature* summon = ObjectAccessor::GetCreature(*me, *i++))
|
||||
if (!crystal || me->GetDistanceOrder(summon, crystal, false))
|
||||
crystal = summon;
|
||||
|
||||
if (crystal)
|
||||
{
|
||||
Talk(SAY_ENERGY);
|
||||
float x, y, z;
|
||||
crystal->GetClosePoint(x, y, z, me->GetObjectSize(), CONTACT_DISTANCE);
|
||||
CrystalGUID = crystal->GetGUID();
|
||||
me->GetMotionMaster()->MovePoint(2, x, y, z);
|
||||
}
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 id)
|
||||
{
|
||||
if (type == POINT_MOTION_TYPE && id == 2)
|
||||
{
|
||||
if (Unit* crystal = ObjectAccessor::GetUnit(*me, CrystalGUID))
|
||||
{
|
||||
Talk(EMOTE_CRYSTAL);
|
||||
crystal->SetUInt32Value(UNIT_FIELD_FLAGS, 0);
|
||||
crystal->CastSpell(me, SPELL_MANA_RAGE, true);
|
||||
me->CastSpell(crystal, SPELL_FEL_CRYSTAL_COSMETIC, true);
|
||||
events.SetPhase(1);
|
||||
events.ScheduleEvent(EVENT_EMPOWER, 0, 0, 1);
|
||||
}
|
||||
else
|
||||
events.ScheduleEvent(EVENT_RESTORE_COMBAT, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SPELL_DRAIN_LIFE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
me->CastSpell(target, DUNGEON_MODE(SPELL_DRAIN_LIFE_N, SPELL_DRAIN_LIFE_H), false);
|
||||
events.ScheduleEvent(EVENT_SPELL_DRAIN_LIFE, 10000, 1);
|
||||
return;
|
||||
case EVENT_SPELL_DRAIN_MANA:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, PowerUsersSelector(me, POWER_MANA, 40.0f, false)))
|
||||
me->CastSpell(target, SPELL_DRAIN_MANA, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_DRAIN_MANA, 10000, 1);
|
||||
return;
|
||||
case EVENT_SPELL_FEL_EXPLOSION:
|
||||
me->RemoveAuraFromStack(SPELL_MANA_RAGE_TRIGGER);
|
||||
me->CastSpell(me, SPELL_FEL_EXPLOSION, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_FEL_EXPLOSION, 2000);
|
||||
break;
|
||||
case EVENT_DRAIN_CRYSTAL:
|
||||
events.DelayEvents(10001);
|
||||
events.ScheduleEvent(EVENT_EMPOWER, 10000);
|
||||
events.ScheduleEvent(EVENT_DRAIN_CRYSTAL, 30000);
|
||||
SelectNearestCrystal();
|
||||
break;
|
||||
case EVENT_EMPOWER:
|
||||
if (me->GetPower(POWER_MANA) == me->GetMaxPower(POWER_MANA))
|
||||
{
|
||||
Talk(SAY_EMPOWERED);
|
||||
if (Unit* crystal = ObjectAccessor::GetUnit(*me, CrystalGUID))
|
||||
Unit::Kill(crystal, crystal);
|
||||
events.DelayEvents(10000, 1);
|
||||
events.ScheduleEvent(EVENT_RESTORE_COMBAT, 0);
|
||||
}
|
||||
else
|
||||
events.ScheduleEvent(EVENT_EMPOWER, 0, 0, 1);
|
||||
break;
|
||||
case EVENT_RESTORE_COMBAT:
|
||||
events.SetPhase(0);
|
||||
me->GetMotionMaster()->MoveChase(me->GetVictim());
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
void AddSC_boss_selin_fireheart()
|
||||
{
|
||||
new boss_selin_fireheart();
|
||||
}
|
||||
@@ -1,177 +0,0 @@
|
||||
/*
|
||||
REWRITTEN BY XINEF
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "magisters_terrace.h"
|
||||
|
||||
enum Yells
|
||||
{
|
||||
SAY_AGGRO = 0,
|
||||
SAY_ENERGY = 1,
|
||||
SAY_OVERLOAD = 2,
|
||||
SAY_KILL = 3,
|
||||
EMOTE_DISCHARGE_ENERGY = 4
|
||||
};
|
||||
|
||||
enum Spells
|
||||
{
|
||||
// Pure energy spell info
|
||||
SPELL_ENERGY_FEEDBACK_CHANNEL = 44328,
|
||||
SPELL_ENERGY_FEEDBACK = 44335,
|
||||
|
||||
// Vexallus spell info
|
||||
SPELL_CHAIN_LIGHTNING_N = 44318,
|
||||
SPELL_CHAIN_LIGHTNING_H = 46380,
|
||||
SPELL_OVERLOAD = 44352,
|
||||
SPELL_ARCANE_SHOCK_N = 44319,
|
||||
SPELL_ARCANE_SHOCK_H = 46381,
|
||||
|
||||
SPELL_SUMMON_PURE_ENERGY_N = 44322,
|
||||
SPELL_SUMMON_PURE_ENERGY_H1 = 46154,
|
||||
SPELL_SUMMON_PURE_ENERGY_H2 = 46159
|
||||
};
|
||||
|
||||
enum Misc
|
||||
{
|
||||
NPC_PURE_ENERGY = 24745,
|
||||
|
||||
INTERVAL_MODIFIER = 15,
|
||||
INTERVAL_SWITCH = 6,
|
||||
|
||||
EVENT_SPELL_CHAIN_LIGHTNING = 1,
|
||||
EVENT_SPELL_ARCANE_SHOCK = 2,
|
||||
EVENT_HEALTH_CHECK = 3,
|
||||
};
|
||||
|
||||
class boss_vexallus : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_vexallus() : CreatureScript("boss_vexallus") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_vexallusAI(creature);
|
||||
};
|
||||
|
||||
struct boss_vexallusAI : public ScriptedAI
|
||||
{
|
||||
boss_vexallusAI(Creature* creature) : ScriptedAI(creature), summons(me)
|
||||
{
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
EventMap events;
|
||||
SummonList summons;
|
||||
|
||||
uint8 IntervalHealthAmount;
|
||||
bool Enraged;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
summons.DespawnAll();
|
||||
IntervalHealthAmount = 1;
|
||||
|
||||
instance->SetData(DATA_VEXALLUS_EVENT, NOT_STARTED);
|
||||
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_ENERGY_FEEDBACK);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
summons.DespawnAll();
|
||||
instance->SetData(DATA_VEXALLUS_EVENT, DONE);
|
||||
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_ENERGY_FEEDBACK);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
instance->SetData(DATA_VEXALLUS_EVENT, IN_PROGRESS);
|
||||
|
||||
events.ScheduleEvent(EVENT_SPELL_CHAIN_LIGHTNING, 8000);
|
||||
events.ScheduleEvent(EVENT_SPELL_ARCANE_SHOCK, 5000);
|
||||
events.ScheduleEvent(EVENT_HEALTH_CHECK, 1000);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
{
|
||||
summon->GetMotionMaster()->MoveFollow(target, 0.0f, 0.0f);
|
||||
summon->CastSpell(target, SPELL_ENERGY_FEEDBACK_CHANNEL, false);
|
||||
}
|
||||
summons.Summon(summon);
|
||||
}
|
||||
|
||||
void SummonedCreatureDies(Creature* summon, Unit* killer)
|
||||
{
|
||||
summons.Despawn(summon);
|
||||
summon->DespawnOrUnsummon(1);
|
||||
if (killer)
|
||||
killer->CastSpell(killer, SPELL_ENERGY_FEEDBACK, true, 0, 0, summon->GetGUID());
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_HEALTH_CHECK:
|
||||
//used for check, when Vexallus cast adds 85%, 70%, 55%, 40%
|
||||
if (!HealthAbovePct(100 - INTERVAL_MODIFIER * IntervalHealthAmount))
|
||||
{
|
||||
if (IntervalHealthAmount++ == INTERVAL_SWITCH)
|
||||
{
|
||||
events.Reset();
|
||||
me->CastSpell(me, SPELL_OVERLOAD, true);
|
||||
return;
|
||||
}
|
||||
|
||||
Talk(SAY_ENERGY);
|
||||
Talk(EMOTE_DISCHARGE_ENERGY);
|
||||
|
||||
if (IsHeroic())
|
||||
{
|
||||
me->CastSpell(me, SPELL_SUMMON_PURE_ENERGY_H1, false);
|
||||
me->CastSpell(me, SPELL_SUMMON_PURE_ENERGY_H2, false);
|
||||
}
|
||||
else
|
||||
me->CastSpell(me, SPELL_SUMMON_PURE_ENERGY_N, false);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_HEALTH_CHECK, 0);
|
||||
break;
|
||||
case EVENT_SPELL_CHAIN_LIGHTNING:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
me->CastSpell(target, DUNGEON_MODE(SPELL_CHAIN_LIGHTNING_N, SPELL_CHAIN_LIGHTNING_H), false);
|
||||
events.ScheduleEvent(EVENT_SPELL_CHAIN_LIGHTNING, 8000);
|
||||
break;
|
||||
case EVENT_SPELL_ARCANE_SHOCK:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 20.0f))
|
||||
me->CastSpell(target, DUNGEON_MODE(SPELL_ARCANE_SHOCK_N, SPELL_ARCANE_SHOCK_H), false);
|
||||
events.ScheduleEvent(EVENT_SPELL_ARCANE_SHOCK, 8000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
void AddSC_boss_vexallus()
|
||||
{
|
||||
new boss_vexallus();
|
||||
}
|
||||
@@ -1,205 +0,0 @@
|
||||
/*
|
||||
REWRITTEN BY XINEF
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "InstanceScript.h"
|
||||
#include "magisters_terrace.h"
|
||||
|
||||
class instance_magisters_terrace : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
instance_magisters_terrace() : InstanceMapScript("instance_magisters_terrace", 585) { }
|
||||
|
||||
struct instance_magisters_terrace_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_magisters_terrace_InstanceMapScript(Map* map) : InstanceScript(map) { }
|
||||
|
||||
uint32 Encounter[MAX_ENCOUNTER];
|
||||
|
||||
uint64 VexallusDoorGUID;
|
||||
uint64 SelinDoorGUID;
|
||||
uint64 SelinEncounterDoorGUID;
|
||||
uint64 DelrissaDoorGUID;
|
||||
uint64 KaelDoorGUID;
|
||||
uint64 EscapeOrbGUID;
|
||||
|
||||
uint64 DelrissaGUID;
|
||||
uint64 KaelGUID;
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
memset(&Encounter, 0, sizeof(Encounter));
|
||||
|
||||
VexallusDoorGUID = 0;
|
||||
SelinDoorGUID = 0;
|
||||
SelinEncounterDoorGUID = 0;
|
||||
DelrissaDoorGUID = 0;
|
||||
KaelDoorGUID = 0;
|
||||
EscapeOrbGUID = 0;
|
||||
|
||||
DelrissaGUID = 0;
|
||||
KaelGUID = 0;
|
||||
}
|
||||
|
||||
bool IsEncounterInProgress() const
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
if (Encounter[i] == IN_PROGRESS)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 identifier) const
|
||||
{
|
||||
switch (identifier)
|
||||
{
|
||||
case DATA_SELIN_EVENT:
|
||||
case DATA_VEXALLUS_EVENT:
|
||||
case DATA_DELRISSA_EVENT:
|
||||
case DATA_KAELTHAS_EVENT:
|
||||
return Encounter[identifier];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void SetData(uint32 identifier, uint32 data)
|
||||
{
|
||||
switch (identifier)
|
||||
{
|
||||
case DATA_SELIN_EVENT:
|
||||
HandleGameObject(SelinDoorGUID, data == DONE);
|
||||
HandleGameObject(SelinEncounterDoorGUID, data != IN_PROGRESS);
|
||||
Encounter[identifier] = data;
|
||||
break;
|
||||
case DATA_VEXALLUS_EVENT:
|
||||
if (data == DONE)
|
||||
HandleGameObject(VexallusDoorGUID, true);
|
||||
Encounter[identifier] = data;
|
||||
break;
|
||||
case DATA_DELRISSA_EVENT:
|
||||
if (data == DONE)
|
||||
HandleGameObject(DelrissaDoorGUID, true);
|
||||
Encounter[identifier] = data;
|
||||
break;
|
||||
case DATA_KAELTHAS_EVENT:
|
||||
HandleGameObject(KaelDoorGUID, data != IN_PROGRESS);
|
||||
if (data == DONE)
|
||||
if (GameObject* escapeOrb = instance->GetGameObject(EscapeOrbGUID))
|
||||
escapeOrb->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
Encounter[identifier] = data;
|
||||
break;
|
||||
}
|
||||
|
||||
SaveToDB();
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case NPC_DELRISSA:
|
||||
DelrissaGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_KAEL_THAS:
|
||||
KaelGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_PHOENIX:
|
||||
case NPC_PHOENIX_EGG:
|
||||
if (Creature* kael = instance->GetCreature(KaelGUID))
|
||||
kael->AI()->JustSummoned(creature);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* go)
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_SELIN_DOOR:
|
||||
if (GetData(DATA_SELIN_EVENT) == DONE)
|
||||
HandleGameObject(0, true, go);
|
||||
SelinDoorGUID = go->GetGUID();
|
||||
break;
|
||||
case GO_SELIN_ENCOUNTER_DOOR:
|
||||
SelinEncounterDoorGUID = go->GetGUID();
|
||||
break;
|
||||
|
||||
case GO_VEXALLUS_DOOR:
|
||||
if (GetData(DATA_VEXALLUS_EVENT) == DONE)
|
||||
HandleGameObject(0, true, go);
|
||||
VexallusDoorGUID = go->GetGUID();
|
||||
break;
|
||||
|
||||
case GO_DELRISSA_DOOR:
|
||||
if (GetData(DATA_DELRISSA_EVENT) == DONE)
|
||||
HandleGameObject(0, true, go);
|
||||
DelrissaDoorGUID = go->GetGUID();
|
||||
break;
|
||||
case GO_KAEL_DOOR:
|
||||
KaelDoorGUID = go->GetGUID();
|
||||
break;
|
||||
case GO_ESCAPE_ORB:
|
||||
if (GetData(DATA_KAELTHAS_EVENT) == DONE)
|
||||
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
EscapeOrbGUID = go->GetGUID();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
std::ostringstream saveStream;
|
||||
saveStream << Encounter[0] << ' ' << Encounter[1] << ' ' << Encounter[2] << ' ' << Encounter[3];
|
||||
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void Load(const char* str)
|
||||
{
|
||||
if (!str)
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA(str);
|
||||
|
||||
std::istringstream loadStream(str);
|
||||
|
||||
for (uint32 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
{
|
||||
uint32 tmpState;
|
||||
loadStream >> tmpState;
|
||||
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
|
||||
tmpState = NOT_STARTED;
|
||||
SetData(i, tmpState);
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
}
|
||||
|
||||
uint64 GetData64(uint32 identifier) const
|
||||
{
|
||||
switch (identifier)
|
||||
{
|
||||
case NPC_DELRISSA:
|
||||
return DelrissaGUID;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_magisters_terrace_InstanceMapScript(map);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_instance_magisters_terrace()
|
||||
{
|
||||
new instance_magisters_terrace();
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
/*
|
||||
REWRITTEN BY XINEF
|
||||
*/
|
||||
|
||||
#ifndef DEF_MAGISTERS_TERRACE_H
|
||||
#define DEF_MAGISTERS_TERRACE_H
|
||||
|
||||
enum MTData
|
||||
{
|
||||
DATA_SELIN_EVENT = 0,
|
||||
DATA_VEXALLUS_EVENT = 1,
|
||||
DATA_DELRISSA_EVENT = 2,
|
||||
DATA_KAELTHAS_EVENT = 3,
|
||||
MAX_ENCOUNTER = 4
|
||||
};
|
||||
|
||||
|
||||
enum MTCreatures
|
||||
{
|
||||
NPC_DELRISSA = 24560,
|
||||
NPC_FEL_CRYSTAL = 24722,
|
||||
NPC_KAEL_THAS = 24664,
|
||||
NPC_PHOENIX = 21362,
|
||||
NPC_PHOENIX_EGG = 21364
|
||||
};
|
||||
|
||||
enum MTGameObjects
|
||||
{
|
||||
GO_VEXALLUS_DOOR = 187896,
|
||||
GO_SELIN_DOOR = 187979,
|
||||
GO_SELIN_ENCOUNTER_DOOR = 188065,
|
||||
GO_DELRISSA_DOOR = 187770,
|
||||
GO_KAEL_DOOR = 188064,
|
||||
GO_ESCAPE_ORB = 188173
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user