aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGustavo <sirikfoll@hotmail.com>2017-09-25 17:17:42 -0300
committerShauren <shauren.trinity@gmail.com>2020-09-12 00:13:32 +0200
commite531beeb8312f393896e1975ea537827594bedb7 (patch)
tree657dc446711f02a70dda510df43205a17e4254d0 /src
parented79d904e02d05144f8c5953249da9d5acf01218 (diff)
Core/Scripts: Boss Jedoga Shadowseeker rewrite (#20279)
* Core/Scripts: Boss Jedoga Shadowseeker rewrite Added all missing spells and visuals Added Twilight volunteers in the fight Fixed Jedoga Controller's behavior, mostly moved to boss_prince_taldaram, where they belong Updated script register model Misc updates and improvements Updated instance model (cherry picked from commit f1ff7e642f8feb027d668a53adc39ecaa7488cc2)
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h14
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp837
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp16
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp186
4 files changed, 411 insertions, 642 deletions
diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h
index f3aa82768d3..d508da97427 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h
@@ -37,13 +37,7 @@ enum AKDataTypes
// Additional Data
DATA_SPHERE_1 = 5,
DATA_SPHERE_2 = 6,
- DATA_PRINCE_TALDARAM_PLATFORM = 7,
- DATA_PL_JEDOGA_TARGET = 8,
- DATA_ADD_JEDOGA_OPFER = 9,
- DATA_ADD_JEDOGA_INITIAND = 10,
- DATA_JEDOGA_TRIGGER_SWITCH = 11,
- DATA_JEDOGA_RESET_INITIANDS = 12,
- DATA_ALL_INITIAND_DEAD = 13
+ DATA_PRINCE_TALDARAM_PLATFORM = 7
};
enum AKCreatureIds
@@ -59,7 +53,9 @@ enum AKCreatureIds
NPC_AHNKAHAR_SWARMER = 30178,
// Jedoga Shadowseeker
- NPC_INITIAND = 30114,
+ NPC_TWILIGHT_INITIATE = 30114,
+ NPC_TWILIGHT_VOLUNTEER = 30385,
+ NPC_TWILIGHT_WORSHIPPER = 30111,
NPC_JEDOGA_CONTROLLER = 30181,
// Amanitar
@@ -88,4 +84,6 @@ inline AI* GetAhnKahetAI(T* obj)
return GetInstanceAI<AI>(obj, AhnKahetScriptName);
}
+#define RegisterAhnKahetCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetAhnKahetAI)
+
#endif // AHNKAHET_H_
diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp
index d64ccae7cd2..87a99e4df6f 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp
@@ -15,589 +15,484 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/*
- * Comment: Visuals missing, de-germanize code, wow 3.3.5a-ize
- * Patch 3.3.2 (2010-01-02): Jedoga Shadowseeker now only ascends once during the encounter.
- */
-
#include "ScriptMgr.h"
#include "ahnkahet.h"
#include "InstanceScript.h"
#include "MotionMaster.h"
#include "ObjectAccessor.h"
#include "ScriptedCreature.h"
+#include "Spell.h"
+#include "SpellScript.h"
+#include "TemporarySummon.h"
enum Yells
{
- TEXT_AGGRO = 0,
- TEXT_SACRIFICE_1 = 1,
- TEXT_SACRIFICE_2 = 2,
- TEXT_SLAY = 3,
- TEXT_DEATH = 4,
- TEXT_PREACHING = 5
+ SAY_AGGRO = 0,
+ SAY_CHOOSE = 1,
+ SAY_SACRIFICE = 2,
+ SAY_SLAY = 3,
+ SAY_DEATH = 4,
+ SAY_PREACHING = 5,
+
+ SAY_CHOSEN = 0,
+ SAY_SACRIFICED = 1
};
-enum Spells
+enum JedogaSpells
{
- SPELL_SPHERE_VISUAL = 56075,
- SPELL_GIFT_OF_THE_HERALD = 56219,
- SPELL_CYCLONE_STRIKE = 56855, // Self
- SPELL_LIGHTNING_BOLT = 56891, // 40Y
- SPELL_THUNDERSHOCK = 56926 // 30Y
+ SPELL_RANDOM_LIGHTNING_VISUAL = 56327,
+ SPELL_HOVER_FALL_1 = 56100,
+ SPELL_HOVER_FALL_2 = 56157,
+ SPELL_SPHERE_VISUAL = 56075,
+ SPELL_LIGHTNING_BOLT = 56891,
+ SPELL_THUNDERSHOCK = 56926,
+ SPELL_CYCLONE_STRIKE = 56855,
+ SPELL_SACRIFICE_BEAM = 56150,
+
+ //Jedoga Controller
+ SPELL_BEAM_VISUAL_JEDOGA = 56312,
+ SPELL_SACRIFICE_VISUAL = 56133,
+
+ //Twilight Volunteer
+ SPELL_SPHERE_VISUAL_VOLUNTEER = 56102,
+ SPELL_PILLAR_OF_LIGHTNING = 56868
};
-const Position JedogaPosition[2] =
+enum JedogaEvents
{
- {372.330994f, -705.278015f, -0.624178f, 5.427970f},
- {372.330994f, -705.278015f, -16.179716f, 5.427970f}
+ EVENT_INTRO_SAY = 1,
+ EVENT_START_FIGHT_1,
+ EVENT_START_FIGHT_2,
+ EVENT_CYCLONE_STRIKE,
+ EVENT_LIGHTNING_BOLT,
+ EVENT_THUNDERSHOCK,
+ EVENT_START_PHASE_TWO,
+ EVENT_FLY_DELAY,
+ EVENT_END_PHASE_TWO,
+ EVENT_CHOOSE_VOLUNTEER,
+ EVENT_SUMMON_VOLUNTEER
};
-enum Misc
+enum JedogaPhases
{
- ACTION_INITIAND_KILLED = 1,
- DATA_VOLUNTEER_WORK = 2
+ PHASE_INTRO = 0,
+ PHASE_ONE,
+ PHASE_TWO,
+ PHASE_THREE
};
-class boss_jedoga_shadowseeker : public CreatureScript
+enum JedogaPoints
{
-public:
- boss_jedoga_shadowseeker() : CreatureScript("boss_jedoga_shadowseeker") { }
-
- struct boss_jedoga_shadowseekerAI : public ScriptedAI
- {
- boss_jedoga_shadowseekerAI(Creature* creature) : ScriptedAI(creature)
- {
- Initialize();
- instance = creature->GetInstanceScript();
- bFirstTime = true;
- bPreDone = false;
- }
-
- void Initialize()
- {
- uiOpFerTimer = urand(15 * IN_MILLISECONDS, 20 * IN_MILLISECONDS);
+ POINT_INITIAL_POSITION = 0,
+ POINT_SACRIFICE,
+ POINT_GROUND,
+ POINT_PHASE_TWO,
+ POINT_PHASE_TWO_FLY
+};
- uiCycloneTimer = 3 * IN_MILLISECONDS;
- uiBoltTimer = 7 * IN_MILLISECONDS;
- uiThunderTimer = 12 * IN_MILLISECONDS;
+Position const SacrificePosition = { 376.5385f, -707.3567f, -16.14124f };
+Position const JedogaGroundPosition = { 371.6281f, -704.4836f, -16.17967f };
+Position const JedogaFlyPosition = { 371.627f, -704.4217f, -6.707521f };
+Position const JedogaControllerPositions[3] =
+{
+ { 402.7893f, -748.5251f, 29.39399f, 2.024582f },
+ { 420.1999f, -727.0132f, 28.88036f, 2.042035f },
+ { 375.4977f, -707.3635f, -16.0964f, 2.426008f }
+};
- bOpFerok = false;
- bOpFerokFail = false;
- bOnGround = false;
- bCanDown = false;
- volunteerWork = true;
- }
+typedef std::pair<Position, Position> VolunteerPositionPair;
+std::vector<VolunteerPositionPair> const VolunteerSpotPositions =
+{
+ { { 400.7701f, -784.8928f, -31.60143f }, { 365.9514f, -719.1235f, -16.17974f } },
+ { { 397.3595f, -788.5157f, -31.59679f }, { 359.7433f, -715.017f, -16.17974f } },
+ { { 399.3177f, -787.2599f, -31.59631f }, { 362.0263f, -719.1036f, -16.17974f } },
+ { { 460.4623f, -719.2227f, -31.58718f }, { 389.266f, -679.3693f, -16.17973f } },
+ { { 456.0909f, -724.3412f, -31.58718f }, { 400.5992f, -691.7954f, -16.17973f } },
+ { { 452.6613f, -726.9518f, -31.58718f }, { 400.3423f, -701.5115f, -16.17974f } },
+ { { 447.8852f, -732.3298f, -31.58718f }, { 389.861f, -710.6993f, -16.17974f } },
+ { { 457.562f, -721.1855f, -31.58718f }, { 395.4494f, -684.5345f, -16.17973f } },
+ { { 451.7243f, -730.2181f, -31.58718f }, { 397.0945f, -708.4188f, -15.99747f } },
+ { { 413.9582f, -777.132f, -31.58716f }, { 388.1394f, -723.124f, -15.9938f } },
+ { { 411.5661f, -781.2356f, -31.58716f }, { 381.7102f, -730.0745f, -15.99554f } },
+ { { 407.395f, -786.793f, -31.58716f }, { 366.9791f, -737.3303f, -16.17974f } },
+ { { 404.9166f, -788.3472f, -31.58716f }, { 358.6124f, -735.9944f, -15.9855f } },
+ { { 401.5697f, -791.2033f, -31.58717f }, { 351.9383f, -729.6436f, -16.17974f } },
+ { { 410.1105f, -785.4691f, -31.58716f }, { 373.1659f, -736.2893f, -16.17974f } },
+ { { 442.5644f, -730.2499f, -31.59826f }, { 390.5955f, -714.6851f, -16.17974f } },
+ { { 445.5233f, -725.9542f, -31.60173f }, { 393.9694f, -708.1727f, -16.17974f } },
+ { { 448.5531f, -722.5888f, -31.60066f }, { 395.2702f, -702.556f, -16.17974f } },
+ { { 449.8521f, -719.7265f, -31.58849f }, { 394.5757f, -695.1004f, -16.17974f } },
+ { { 453.5134f, -717.7018f, -31.59883f }, { 387.6152f, -690.1782f, -16.17974f } },
+ { { 457.8564f, -711.7424f, -31.59773f }, { 378.6874f, -687.1343f, -16.17973f } },
+ { { 410.0583f, -774.4119f, -31.60115f }, { 383.8151f, -723.4276f, -16.17974f } },
+ { { 408.7458f, -777.955f, -31.59873f }, { 376.9857f, -725.0735f, -16.17974f } },
+ { { 405.2404f, -779.6614f, -31.60512f }, { 373.3736f, -722.7498f, -16.17974f } },
+ { { 404.0797f, -783.829f, -31.59497f }, { 367.8631f, -722.5212f, -16.17974f } }
+};
- InstanceScript* instance;
+enum JedogaMisc
+{
+ SUMMON_GROUP_INITIATES = 1,
+ SUMMON_GROUP_WORSHIPPERS = 2,
+ DATA_VOLUNTEER_WORK = 1,
+ ACTION_CHOSEN = 1,
+ ACTION_SACRIFICE = 2,
+ TWILIGHT_INITIATES_SIZE = 15
+};
- uint32 uiOpFerTimer;
- uint32 uiCycloneTimer;
- uint32 uiBoltTimer;
- uint32 uiThunderTimer;
+struct boss_jedoga_shadowseeker : public BossAI
+{
+ boss_jedoga_shadowseeker(Creature* creature) : BossAI(creature, DATA_JEDOGA_SHADOWSEEKER), _initiatesKilled(0), _volunteerWork(true) { }
- bool bPreDone;
- bool bOpFerok;
- bool bOnGround;
- bool bOpFerokFail;
- bool bCanDown;
- bool volunteerWork;
- bool bFirstTime;
+ void Reset() override
+ {
+ _Reset();
+ events.SetPhase(PHASE_INTRO);
+ me->SetReactState(REACT_PASSIVE);
+ me->SummonCreatureGroup(SUMMON_GROUP_INITIATES);
- void Reset() override
- {
- Initialize();
+ if (TempSummon* controller = me->SummonCreature(NPC_JEDOGA_CONTROLLER, JedogaControllerPositions[0], TEMPSUMMON_MANUAL_DESPAWN))
+ controller->CastSpell(me, SPELL_BEAM_VISUAL_JEDOGA);
+ if (TempSummon* controller = me->SummonCreature(NPC_JEDOGA_CONTROLLER, JedogaControllerPositions[1], TEMPSUMMON_MANUAL_DESPAWN))
+ controller->CastSpell(me, SPELL_BEAM_VISUAL_JEDOGA);
- if (!bFirstTime)
- instance->SetBossState(DATA_JEDOGA_SHADOWSEEKER, FAIL);
+ events.ScheduleEvent(EVENT_INTRO_SAY, Minutes(2), 0, PHASE_INTRO);
+ }
- instance->SetGuidData(DATA_PL_JEDOGA_TARGET, ObjectGuid::Empty);
- instance->SetGuidData(DATA_ADD_JEDOGA_OPFER, ObjectGuid::Empty);
- instance->SetData(DATA_JEDOGA_RESET_INITIANDS, 0);
- MoveUp();
+ void EnterCombat(Unit* /*who*/) override
+ {
+ me->RemoveAurasDueToSpell(SPELL_SPHERE_VISUAL);
+ me->RemoveAurasDueToSpell(SPELL_RANDOM_LIGHTNING_VISUAL);
+ me->SummonCreatureGroup(SUMMON_GROUP_WORSHIPPERS);
- bFirstTime = false;
- }
+ _EnterCombat();
+ Talk(SAY_AGGRO);
+ events.SetPhase(PHASE_ONE);
- void EnterCombat(Unit* who) override
+ for (VolunteerPositionPair posPair : VolunteerSpotPositions)
{
- if (!instance || (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_JEDOGA_CONTROLLER))
- return;
-
- Talk(TEXT_AGGRO);
- me->SetInCombatWithZone();
- instance->SetBossState(DATA_JEDOGA_SHADOWSEEKER, IN_PROGRESS);
+ if (TempSummon* volunteer = me->SummonCreature(NPC_TWILIGHT_VOLUNTEER, posPair.first, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000))
+ {
+ volunteer->GetMotionMaster()->MovePoint(POINT_INITIAL_POSITION, posPair.second);
+ _volunteerGUIDS.push_back(volunteer->GetGUID());
+ }
}
+ }
- void AttackStart(Unit* who) override
- {
- if (!who || (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_JEDOGA_CONTROLLER))
- return;
-
- ScriptedAI::AttackStart(who);
- }
+ void EnterEvadeMode(EvadeReason /*why*/) override
+ {
+ summons.DespawnAll();
+ _EnterEvadeMode();
+ _DespawnAtEvade(Seconds(15));
+ }
- void KilledUnit(Unit* Victim) override
- {
- if (!Victim || Victim->GetTypeId() != TYPEID_PLAYER)
- return;
+ void KilledUnit(Unit* Victim) override
+ {
+ if (Victim->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_SLAY);
+ }
- Talk(TEXT_SLAY);
- }
+ void JustDied(Unit* /*killer*/) override
+ {
+ _JustDied();
+ Talk(SAY_DEATH);
+ }
- void JustDied(Unit* /*killer*/) override
- {
- Talk(TEXT_DEATH);
- instance->SetBossState(DATA_JEDOGA_SHADOWSEEKER, DONE);
- }
+ uint32 GetData(uint32 type) const override
+ {
+ if (type == DATA_VOLUNTEER_WORK)
+ return _volunteerWork ? 1 : 0;
- void DoAction(int32 action) override
- {
- if (action == ACTION_INITIAND_KILLED)
- volunteerWork = false;
- }
+ return 0;
+ }
- uint32 GetData(uint32 type) const override
+ void DamageTaken(Unit* /*done_by*/, uint32& /*damage*/) override
+ {
+ if (HealthBelowPct(55) && events.IsInPhase(PHASE_ONE))
{
- if (type == DATA_VOLUNTEER_WORK)
- return volunteerWork ? 1 : 0;
-
- return 0;
+ events.Reset();
+ events.SetPhase(PHASE_TWO);
+ events.ScheduleEvent(EVENT_START_PHASE_TWO, Seconds(1));
}
+ }
- void MoveInLineOfSight(Unit* who) override
+ void DoAction(int32 action) override
+ {
+ if (action == ACTION_SACRIFICE)
{
- if (!instance || !who || (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_JEDOGA_CONTROLLER))
- return;
-
- if (!bPreDone && who->GetTypeId() == TYPEID_PLAYER && me->GetDistance(who) < 100.0f)
- {
- Talk(TEXT_PREACHING);
- bPreDone = true;
- }
-
- if (instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) != IN_PROGRESS || !bOnGround)
- return;
-
- if (!me->GetVictim() && me->CanCreatureAttack(who))
- {
- float attackRadius = me->GetAttackDistance(who);
- if (me->IsWithinDistInMap(who, attackRadius) && me->IsWithinLOSInMap(who))
- {
- if (!me->GetVictim())
- {
- who->RemoveAurasByType(SPELL_AURA_MOD_STEALTH);
- AttackStart(who);
- }
- else
- {
- who->SetInCombatWith(me);
- AddThreat(who, 0.0f);
- }
- }
- }
+ Talk(SAY_SACRIFICE);
+ DoCastAOE(SPELL_SACRIFICE_BEAM);
+ events.ScheduleEvent(EVENT_END_PHASE_TWO, Seconds(3));
+ events.RescheduleEvent(EVENT_SUMMON_VOLUNTEER, Seconds(15));
}
+ }
- void MoveDown()
+ void JustSummoned(Creature* summon) override
+ {
+ if (summon->GetEntry() == NPC_TWILIGHT_WORSHIPPER)
{
- bOpFerokFail = false;
-
- instance->SetData(DATA_JEDOGA_TRIGGER_SWITCH, 0);
- me->GetMotionMaster()->MovePoint(1, JedogaPosition[1]);
- me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, false);
- me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, false);
- me->RemoveUnitFlag(UnitFlags(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE));
-
- me->RemoveAurasDueToSpell(SPELL_SPHERE_VISUAL);
-
- bOnGround = true;
-
- if (UpdateVictim())
- {
- AttackStart(me->GetVictim());
- me->GetMotionMaster()->MoveChase(me->GetVictim());
- }
- else
- {
- if (Unit* target = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_PL_JEDOGA_TARGET)))
- {
- AttackStart(target);
- instance->SetData(DATA_JEDOGA_RESET_INITIANDS, 0);
- if (instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) != IN_PROGRESS)
- EnterCombat(target);
- }
- else if (!me->IsInCombat())
- EnterEvadeMode();
- }
+ summon->SetStandState(UNIT_STAND_STATE_KNEEL);
+ summons.Summon(summon);
+ return;
}
- void MoveUp()
- {
- me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, true);
- me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, true);
- me->AddUnitFlag(UnitFlags(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE));
-
- me->AttackStop();
- me->RemoveAllAuras();
- me->LoadCreaturesAddon();
- me->GetMotionMaster()->MovePoint(0, JedogaPosition[0]);
-
- instance->SetData(DATA_JEDOGA_TRIGGER_SWITCH, 1);
- if (instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) == IN_PROGRESS)
- OpferRufen();
-
- bOnGround = false;
- uiOpFerTimer = urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS);
- }
+ BossAI::JustSummoned(summon);
+ }
- void OpferRufen()
+ void SummonedCreatureDies(Creature* summon, Unit* killer) override
+ {
+ if (summon->GetEntry() == NPC_TWILIGHT_INITIATE)
{
- ObjectGuid opfer = instance->GetGuidData(DATA_ADD_JEDOGA_INITIAND);
-
- if (!opfer.IsEmpty())
+ if (++_initiatesKilled == TWILIGHT_INITIATES_SIZE)
{
- Talk(TEXT_SACRIFICE_1);
- instance->SetGuidData(DATA_ADD_JEDOGA_OPFER, opfer);
+ DoCastSelf(SPELL_HOVER_FALL_1);
+ me->SetAnimTier(UNIT_BYTE1_FLAG_NONE, true);
+ events.ScheduleEvent(EVENT_START_FIGHT_1, Seconds(1));
}
- else
- bCanDown = true;
}
-
- void Opfern()
+ else if (summon->GetEntry() == NPC_TWILIGHT_VOLUNTEER)
{
- Talk(TEXT_SACRIFICE_2);
-
- me->InterruptNonMeleeSpells(false);
- DoCast(me, SPELL_GIFT_OF_THE_HERALD, false);
-
- bOpFerok = false;
- bCanDown = true;
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) != IN_PROGRESS && instance->GetData(DATA_ALL_INITIAND_DEAD))
- MoveDown();
-
- if (bOpFerok && !bOnGround && !bCanDown) Opfern();
+ _volunteerWork = false;
- if (bOpFerokFail && !bOnGround && !bCanDown)
- bCanDown = true;
-
- if (bCanDown)
+ if (events.IsInPhase(PHASE_TWO))
{
- MoveDown();
- bCanDown = false;
+ events.SetPhase(PHASE_THREE);
+ events.RescheduleEvent(EVENT_END_PHASE_TWO, Seconds(1));
}
- if (bOnGround)
- {
- if (!UpdateVictim())
- return;
-
- if (uiCycloneTimer <= diff)
- {
- DoCast(me, SPELL_CYCLONE_STRIKE, false);
- uiCycloneTimer = urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS);
- } else uiCycloneTimer -= diff;
-
- if (uiBoltTimer <= diff)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
- me->CastSpell(target, SPELL_LIGHTNING_BOLT, false);
-
- uiBoltTimer = urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS);
- } else uiBoltTimer -= diff;
-
- if (uiThunderTimer <= diff)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
- me->CastSpell(target, SPELL_THUNDERSHOCK, false);
-
- uiThunderTimer = urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS);
- } else uiThunderTimer -= diff;
-
- if (uiOpFerTimer <= diff)
- MoveUp();
- else
- uiOpFerTimer -= diff;
-
- DoMeleeAttackIfReady();
- }
+ events.RescheduleEvent(EVENT_SUMMON_VOLUNTEER, Seconds(10));
}
- };
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetAhnKahetAI<boss_jedoga_shadowseekerAI>(creature);
+ BossAI::SummonedCreatureDies(summon, killer);
}
-};
-
-class npc_jedoga_initiand : public CreatureScript
-{
-public:
- npc_jedoga_initiand() : CreatureScript("npc_jedoga_initiand") { }
- struct npc_jedoga_initiandAI : public ScriptedAI
+ void MovementInform(uint32 type, uint32 pointId) override
{
- npc_jedoga_initiandAI(Creature* creature) : ScriptedAI(creature)
- {
- Initialize();
- instance = creature->GetInstanceScript();
- }
+ if (type != POINT_MOTION_TYPE && type != EFFECT_MOTION_TYPE)
+ return;
- void Initialize()
+ switch (pointId)
{
- bWalking = false;
- bCheckTimer = 2 * IN_MILLISECONDS;
+ case POINT_GROUND:
+ me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
+ me->SetReactState(REACT_AGGRESSIVE);
+ DoZoneInCombat();
+ events.ScheduleEvent(EVENT_CYCLONE_STRIKE, Seconds(3));
+ events.ScheduleEvent(EVENT_LIGHTNING_BOLT, Seconds(7));
+ events.ScheduleEvent(EVENT_THUNDERSHOCK, Seconds(12));
+ break;
+ case POINT_PHASE_TWO:
+ events.ScheduleEvent(EVENT_FLY_DELAY, Seconds(2));
+ break;
+ case POINT_PHASE_TWO_FLY:
+ events.ScheduleEvent(EVENT_CHOOSE_VOLUNTEER, Seconds(2));
+ break;
+ default:
+ break;
}
+ }
- InstanceScript* instance;
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim() && !events.IsInPhase(PHASE_INTRO))
+ return;
- uint32 bCheckTimer;
+ events.Update(diff);
- bool bWalking;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- void Reset() override
+ while (uint32 eventId = events.ExecuteEvent())
{
- Initialize();
-
- if (instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) != IN_PROGRESS)
- {
- me->RemoveAurasDueToSpell(SPELL_SPHERE_VISUAL);
- me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, false);
- me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, false);
- me->RemoveUnitFlag(UnitFlags(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE));
- }
- else
+ switch (eventId)
{
- DoCast(me, SPELL_SPHERE_VISUAL, false);
- me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, true);
- me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, true);
- me->AddUnitFlag(UnitFlags(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE));
- }
- }
+ case EVENT_INTRO_SAY:
+ if (instance->GetBossState(DATA_PRINCE_TALDARAM) == DONE)
+ Talk(SAY_PREACHING);
+ events.Repeat(Minutes(2));
+ break;
+ case EVENT_START_FIGHT_1:
+ me->RemoveAurasDueToSpell(SPELL_BEAM_VISUAL_JEDOGA);
+ events.ScheduleEvent(EVENT_START_FIGHT_2, Seconds(1));
+ break;
+ case EVENT_START_FIGHT_2:
+ summons.DespawnEntry(NPC_JEDOGA_CONTROLLER);
+ me->SetDisableGravity(false);
+ me->SetAnimTier(UNIT_BYTE1_FLAG_NONE, true);
+ me->GetMotionMaster()->MoveLand(POINT_GROUND, JedogaGroundPosition);
+ break;
+ case EVENT_START_PHASE_TWO:
+ me->SetReactState(REACT_PASSIVE);
+ me->AttackStop();
+ me->InterruptNonMeleeSpells(true);
+ me->AddUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
+ me->GetMotionMaster()->MovePoint(POINT_PHASE_TWO, JedogaGroundPosition);
+ break;
+ case EVENT_FLY_DELAY:
+ me->SetDisableGravity(true);
+ me->SetAnimTier(UnitBytes1_Flags(UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER), true);
+ me->GetMotionMaster()->MoveTakeoff(POINT_PHASE_TWO_FLY, JedogaFlyPosition);
+ break;
+ case EVENT_CHOOSE_VOLUNTEER:
+ if (TempSummon* controller = me->SummonCreature(NPC_JEDOGA_CONTROLLER, JedogaControllerPositions[2], TEMPSUMMON_MANUAL_DESPAWN))
+ {
+ me->SetFacingToObject(controller);
+ controller->CastSpell(controller, SPELL_SACRIFICE_VISUAL);
+ }
- void JustDied(Unit* killer) override
- {
- if (!killer || !instance)
- return;
+ Talk(SAY_CHOOSE);
- if (bWalking)
- {
- if (Creature* boss = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_JEDOGA_SHADOWSEEKER)))
- {
- if (!ENSURE_AI(boss_jedoga_shadowseeker::boss_jedoga_shadowseekerAI, boss->AI())->bOpFerok)
- ENSURE_AI(boss_jedoga_shadowseeker::boss_jedoga_shadowseekerAI, boss->AI())->bOpFerokFail = true;
+ if (_volunteerGUIDS.empty())
+ break;
- if (killer->GetTypeId() == TYPEID_PLAYER)
- boss->AI()->DoAction(ACTION_INITIAND_KILLED);
+ _selectedVolunteerGUID = Trinity::Containers::SelectRandomContainerElement(_volunteerGUIDS);
+ if (Creature* volunteer = ObjectAccessor::GetCreature(*me, _selectedVolunteerGUID))
+ volunteer->AI()->DoAction(ACTION_CHOSEN);
+ break;
+ case EVENT_SUMMON_VOLUNTEER:
+ {
+ uint32 pos = std::distance(_volunteerGUIDS.begin(), std::find(_volunteerGUIDS.begin(), _volunteerGUIDS.end(), _selectedVolunteerGUID));
+ if (pos < VolunteerSpotPositions.size())
+ {
+ VolunteerPositionPair posPair = VolunteerSpotPositions.at(pos);
+ if (TempSummon* volunteer = me->SummonCreature(NPC_TWILIGHT_VOLUNTEER, posPair.first, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000))
+ volunteer->GetMotionMaster()->MovePoint(POINT_INITIAL_POSITION, posPair.second);
+ }
+ break;
}
-
- instance->SetGuidData(DATA_ADD_JEDOGA_OPFER, ObjectGuid::Empty);
-
- bWalking = false;
+ case EVENT_END_PHASE_TWO:
+ summons.DespawnEntry(NPC_JEDOGA_CONTROLLER);
+ DoCastSelf(SPELL_HOVER_FALL_2);
+ me->SetDisableGravity(false);
+ me->SetAnimTier(UNIT_BYTE1_FLAG_NONE, true);
+ me->GetMotionMaster()->MoveLand(POINT_GROUND, JedogaGroundPosition);
+ break;
+ case EVENT_CYCLONE_STRIKE:
+ DoCastSelf(SPELL_CYCLONE_STRIKE);
+ events.Repeat(Seconds(15), Seconds(30));
+ break;
+ case EVENT_LIGHTNING_BOLT:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
+ DoCast(target, SPELL_LIGHTNING_BOLT);
+ events.Repeat(Seconds(15), Seconds(30));
+ break;
+ case EVENT_THUNDERSHOCK:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
+ DoCast(target, SPELL_THUNDERSHOCK);
+ events.Repeat(Seconds(15), Seconds(30));
+ break;
+ default:
+ break;
}
- if (killer->GetTypeId() == TYPEID_PLAYER)
- instance->SetGuidData(DATA_PL_JEDOGA_TARGET, killer->GetGUID());
- }
-
- void EnterCombat(Unit* /*who*/) override
- {
- }
- void AttackStart(Unit* victim) override
- {
- if ((instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) == IN_PROGRESS) || !victim)
+ if (me->HasUnitState(UNIT_STATE_CASTING))
return;
-
- ScriptedAI::AttackStart(victim);
}
- void MoveInLineOfSight(Unit* who) override
+ DoMeleeAttackIfReady();
+ }
- {
- if ((instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) == IN_PROGRESS) || !who)
- return;
+private:
+ uint8 _initiatesKilled;
+ bool _volunteerWork;
+ GuidVector _volunteerGUIDS;
+ ObjectGuid _selectedVolunteerGUID;
+};
- ScriptedAI::MoveInLineOfSight(who);
- }
+struct npc_twilight_volunteer : public ScriptedAI
+{
+ npc_twilight_volunteer(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())
+ {
+ me->SetReactState(REACT_PASSIVE);
+ }
- void MovementInform(uint32 uiType, uint32 uiPointId) override
+ void DoAction(int32 action) override
+ {
+ if (action == ACTION_CHOSEN)
{
- if (uiType != POINT_MOTION_TYPE || !instance)
- return;
-
- switch (uiPointId)
- {
- case 1:
- {
- Creature* boss = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_JEDOGA_SHADOWSEEKER));
- if (boss)
- {
- ENSURE_AI(boss_jedoga_shadowseeker::boss_jedoga_shadowseekerAI, boss->AI())->bOpFerok = true;
- ENSURE_AI(boss_jedoga_shadowseeker::boss_jedoga_shadowseekerAI, boss->AI())->bOpFerokFail = false;
- me->KillSelf();
- }
- }
- break;
- }
+ DoCastSelf(SPELL_PILLAR_OF_LIGHTNING);
+ me->RemoveAurasDueToSpell(SPELL_SPHERE_VISUAL_VOLUNTEER);
+ Talk(SAY_CHOSEN);
+ me->SetStandState(UNIT_STAND_STATE_STAND);
+ me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
+ me->SetWalk(true);
+ me->GetMotionMaster()->MovePoint(POINT_SACRIFICE, SacrificePosition);
}
+ }
- void UpdateAI(uint32 diff) override
+ void MovementInform(uint32 type, uint32 pointId) override
+ {
+ if (type != POINT_MOTION_TYPE)
+ return;
+
+ switch (pointId)
{
- if (bCheckTimer <= diff)
- {
- if (me->GetGUID() == instance->GetGuidData(DATA_ADD_JEDOGA_OPFER) && !bWalking)
+ case POINT_INITIAL_POSITION:
+ if (Creature* jedoga = _instance->GetCreature(DATA_JEDOGA_SHADOWSEEKER))
+ me->SetFacingToObject(jedoga);
+
+ DoCastSelf(SPELL_SPHERE_VISUAL_VOLUNTEER);
+ me->SetStandState(UNIT_STAND_STATE_KNEEL);
+ break;
+ case POINT_SACRIFICE:
+ if (Creature* jedoga = _instance->GetCreature(DATA_JEDOGA_SHADOWSEEKER))
{
- me->RemoveAurasDueToSpell(SPELL_SPHERE_VISUAL);
- me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, false);
- me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, false);
- me->RemoveUnitFlag(UnitFlags(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE));
-
- float distance = me->GetDistance(JedogaPosition[1]);
-
- if (distance < 9.0f)
- me->SetSpeedRate(MOVE_WALK, 0.5f);
- else if (distance < 15.0f)
- me->SetSpeedRate(MOVE_WALK, 0.75f);
- else if (distance < 20.0f)
- me->SetSpeedRate(MOVE_WALK, 1.0f);
-
- me->GetMotionMaster()->Clear(false);
- me->GetMotionMaster()->MovePoint(1, JedogaPosition[1]);
- bWalking = true;
- }
- if (!bWalking)
- {
- if (instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) != IN_PROGRESS && me->HasAura(SPELL_SPHERE_VISUAL))
- {
- me->RemoveAurasDueToSpell(SPELL_SPHERE_VISUAL);
- me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, false);
- me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, false);
- me->RemoveUnitFlag(UnitFlags(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE));
- }
- if (instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) == IN_PROGRESS && !me->HasAura(SPELL_SPHERE_VISUAL))
+ me->SetStandState(UNIT_STAND_STATE_KNEEL);
+ jedoga->AI()->DoAction(ACTION_SACRIFICE);
+ Talk(SAY_SACRIFICED);
+
+ _scheduler.Schedule(Seconds(3), [this](TaskContext /*context*/)
{
- DoCast(me, SPELL_SPHERE_VISUAL, false);
- me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, true);
- me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, true);
- me->AddUnitFlag(UnitFlags(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE));
- }
+ me->SetStandState(UNIT_STAND_STATE_DEAD);
+ me->DespawnOrUnsummon(Seconds(5));
+ });
}
- bCheckTimer = 2*IN_MILLISECONDS;
- } else bCheckTimer -= diff;
-
- //Return since we have no target
- if (!UpdateVictim())
- return;
-
- DoMeleeAttackIfReady();
+ break;
+ default:
+ break;
}
- };
+ }
- CreatureAI* GetAI(Creature* creature) const override
+ void UpdateAI(uint32 diff) override
{
- return GetAhnKahetAI<npc_jedoga_initiandAI>(creature);
+ _scheduler.Update(diff);
}
-};
-// ------------------------------------------------------------------------------------------------------------
-// Jedogas Aufseher - Entry: 30181
-// ------------------------------------------------------------------------------------------------------------
-enum AufseherSpell
-{
- SPELL_BEAM_VISUAL_JEDOGAS_AUFSEHER_1 = 60342,
- SPELL_BEAM_VISUAL_JEDOGAS_AUFSEHER_2 = 56312
+private:
+ InstanceScript* _instance;
+ TaskScheduler _scheduler;
};
-class npc_jedogas_aufseher_trigger : public CreatureScript
+// 56328 - Random Lightning Visual Effect
+class spell_random_lightning_visual_effect : public SpellScript
{
-public:
- npc_jedogas_aufseher_trigger() : CreatureScript("npc_jedogas_aufseher_trigger") { }
+ PrepareSpellScript(spell_random_lightning_visual_effect);
- struct npc_jedogas_aufseher_triggerAI : public ScriptedAI
+ void ModDestHeight(SpellDestination& dest)
{
- npc_jedogas_aufseher_triggerAI(Creature* creature) : ScriptedAI(creature)
- {
- instance = creature->GetInstanceScript();
- bRemoved = false;
- bRemoved2 = false;
- bCast = false;
- bCast2 = false;
-
- SetCombatMovement(false);
- }
-
- InstanceScript* instance;
-
- bool bRemoved;
- bool bRemoved2;
- bool bCast;
- bool bCast2;
-
- void Reset() override { }
- void EnterCombat(Unit* /*who*/) override { }
- void AttackStart(Unit* /*victim*/) override { }
- void MoveInLineOfSight(Unit* /*who*/) override { }
-
-
- void UpdateAI(uint32 /*diff*/) override
- {
- if (!bRemoved && me->GetPositionX() > 440.0f)
- {
- if (instance->GetBossState(DATA_PRINCE_TALDARAM) == DONE)
- {
- me->InterruptNonMeleeSpells(true);
- bRemoved = true;
- return;
- }
- if (!bCast)
- {
- DoCast(me, SPELL_BEAM_VISUAL_JEDOGAS_AUFSEHER_1, false);
- bCast = true;
- }
- }
- if (!bRemoved2 && me->GetPositionX() < 440.0f)
- {
- if (!bCast2 && instance->GetData(DATA_JEDOGA_TRIGGER_SWITCH))
- {
- DoCast(me, SPELL_BEAM_VISUAL_JEDOGAS_AUFSEHER_2, false);
- bCast2 = true;
- }
- if (bCast2 && !instance->GetData(DATA_JEDOGA_TRIGGER_SWITCH))
- {
- me->InterruptNonMeleeSpells(true);
- bCast2 = false;
- }
- if (!bRemoved2 && instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) == DONE)
- {
- me->InterruptNonMeleeSpells(true);
- bRemoved2 = true;
- }
- }
- }
- };
+ Position const offset = { 0.0f, 0.0f, -19.0f, 0.0f };
+ dest.RelocateOffset(offset);
+ }
- CreatureAI* GetAI(Creature* creature) const override
+ void Register() override
{
- return GetAhnKahetAI<npc_jedogas_aufseher_triggerAI>(creature);
+ OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_random_lightning_visual_effect::ModDestHeight, EFFECT_0, TARGET_DEST_CASTER_RANDOM);
}
+
};
class achievement_volunteer_work : public AchievementCriteriaScript
{
public:
- achievement_volunteer_work() : AchievementCriteriaScript("achievement_volunteer_work")
- {
- }
+ achievement_volunteer_work() : AchievementCriteriaScript("achievement_volunteer_work") { }
bool OnCheck(Player* /*player*/, Unit* target) override
{
if (!target)
return false;
- if (Creature* Jedoga = target->ToCreature())
- if (Jedoga->AI()->GetData(DATA_VOLUNTEER_WORK))
+ if (Creature* jedoga = target->ToCreature())
+ if (jedoga->AI()->GetData(DATA_VOLUNTEER_WORK) == 1)
return true;
return false;
@@ -606,8 +501,8 @@ class achievement_volunteer_work : public AchievementCriteriaScript
void AddSC_boss_jedoga_shadowseeker()
{
- new boss_jedoga_shadowseeker();
- new npc_jedoga_initiand();
- new npc_jedogas_aufseher_trigger();
+ RegisterAhnKahetCreatureAI(boss_jedoga_shadowseeker);
+ RegisterAhnKahetCreatureAI(npc_twilight_volunteer);
+ RegisterSpellScript(spell_random_lightning_visual_effect);
new achievement_volunteer_work();
}
diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp
index 01ab221855d..27a9eae4216 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp
@@ -53,7 +53,8 @@ enum Spells
enum Misc
{
DATA_EMBRACE_DMG = 20000,
- H_DATA_EMBRACE_DMG = 40000
+ H_DATA_EMBRACE_DMG = 40000,
+ SUMMON_GROUP_CONTROLLERS = 1
};
#define DATA_SPHERE_DISTANCE 25.0f
@@ -104,6 +105,9 @@ class boss_prince_taldaram : public CreatureScript
_flameSphereTargetGUID.Clear();
_embraceTargetGUID.Clear();
_embraceTakenDamage = 0;
+
+ if (!CheckSpheres())
+ me->SummonCreatureGroup(SUMMON_GROUP_CONTROLLERS);
}
void EnterCombat(Unit* /*who*/) override
@@ -125,6 +129,10 @@ class boss_prince_taldaram : public CreatureScript
case NPC_FLAME_SPHERE_2:
case NPC_FLAME_SPHERE_3:
summon->AI()->SetGUID(_flameSphereTargetGUID);
+ break;
+ case NPC_JEDOGA_CONTROLLER:
+ summon->CastSpell(me, SPELL_BEAM_VISUAL);
+ break;
default:
return;
}
@@ -266,13 +274,15 @@ class boss_prince_taldaram : public CreatureScript
void RemovePrison()
{
me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
+ summons.DespawnEntry(NPC_JEDOGA_CONTROLLER);
me->RemoveAurasDueToSpell(SPELL_BEAM_VISUAL);
me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), DATA_GROUND_POSITION_Z, me->GetOrientation());
DoCast(SPELL_HOVER_FALL);
me->SetDisableGravity(false);
me->GetMotionMaster()->MoveLand(0, me->GetHomePosition());
Talk(SAY_WARNING);
- instance->HandleGameObject(instance->GetGuidData(DATA_PRINCE_TALDARAM_PLATFORM), true);
+ if (GameObject* platform = instance->GetGameObject(DATA_PRINCE_TALDARAM_PLATFORM))
+ instance->HandleGameObject(platform->GetGUID(), true);
}
private:
@@ -395,7 +405,7 @@ class go_prince_taldaram_sphere : public GameObjectScript
bool GossipHello(Player* /*player*/) override
{
- Creature* princeTaldaram = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_PRINCE_TALDARAM));
+ Creature* princeTaldaram = instance->GetCreature(DATA_PRINCE_TALDARAM);
if (princeTaldaram && princeTaldaram->IsAlive())
{
me->AddFlag(GO_FLAG_NOT_SELECTABLE);
diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp
index 41f941299bb..b9ff99c1cc4 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp
@@ -16,9 +16,9 @@
*/
#include "ScriptMgr.h"
+#include "AreaBoundary.h"
#include "ahnkahet.h"
#include "Creature.h"
-#include "CreatureAI.h"
#include "GameObject.h"
#include "InstanceScript.h"
#include "Map.h"
@@ -30,6 +30,27 @@ DoorData const doorData[] =
{ 0, 0, DOOR_TYPE_ROOM } // END
};
+ObjectData const creatureData[] =
+{
+ { NPC_ELDER_NADOX, DATA_ELDER_NADOX },
+ { NPC_PRINCE_TALDARAM, DATA_PRINCE_TALDARAM },
+ { NPC_JEDOGA_SHADOWSEEKER, DATA_JEDOGA_SHADOWSEEKER },
+ { NPC_AMANITAR, DATA_AMANITAR },
+ { NPC_HERALD_VOLAZJ, DATA_HERALD_VOLAZJ },
+ { 0, 0 }
+};
+
+ObjectData const gameObjectData[] =
+{
+ { GO_PRINCE_TALDARAM_PLATFORM, DATA_PRINCE_TALDARAM_PLATFORM },
+ { 0, 0 } //END
+};
+
+BossBoundaryData const boundaries =
+{
+ { DATA_JEDOGA_SHADOWSEEKER, new ParallelogramBoundary(Position(460.365f, -661.997f, -20.985f), Position(364.958f,-790.211f, -14.207f), Position(347.436f,-657.978f,14.478f)) }
+};
+
class instance_ahnkahet : public InstanceMapScript
{
public:
@@ -42,46 +63,20 @@ class instance_ahnkahet : public InstanceMapScript
SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadDoorData(doorData);
-
- SwitchTrigger = 0;
+ LoadObjectData(creatureData, gameObjectData);
+ LoadBossBoundaries(boundaries);
SpheresState[0] = 0;
SpheresState[1] = 0;
}
- void OnCreatureCreate(Creature* creature) override
- {
- switch (creature->GetEntry())
- {
- case NPC_ELDER_NADOX:
- ElderNadoxGUID = creature->GetGUID();
- break;
- case NPC_PRINCE_TALDARAM:
- PrinceTaldaramGUID = creature->GetGUID();
- break;
- case NPC_JEDOGA_SHADOWSEEKER:
- JedogaShadowseekerGUID = creature->GetGUID();
- break;
- case NPC_AMANITAR:
- AmanitarGUID = creature->GetGUID();
- break;
- case NPC_HERALD_VOLAZJ:
- HeraldVolazjGUID = creature->GetGUID();
- break;
- case NPC_INITIAND:
- InitiandGUIDs.insert(creature->GetGUID());
- break;
- default:
- break;
- }
- }
-
void OnGameObjectCreate(GameObject* go) override
{
+ InstanceScript::OnGameObjectCreate(go);
+
switch (go->GetEntry())
{
case GO_PRINCE_TALDARAM_PLATFORM:
- PrinceTaldaramPlatformGUID = go->GetGUID();
if (GetBossState(DATA_PRINCE_TALDARAM) == DONE)
HandleGameObject(ObjectGuid::Empty, true, go);
break;
@@ -103,21 +98,6 @@ class instance_ahnkahet : public InstanceMapScript
else
go->RemoveFlag(GO_FLAG_NOT_SELECTABLE);
break;
- case GO_PRINCE_TALDARAM_GATE:
- AddDoor(go, true);
- break;
- default:
- break;
- }
- }
-
- void OnGameObjectRemove(GameObject* go) override
- {
- switch (go->GetEntry())
- {
- case GO_PRINCE_TALDARAM_GATE:
- AddDoor(go, false);
- break;
default:
break;
}
@@ -131,20 +111,6 @@ class instance_ahnkahet : public InstanceMapScript
case DATA_SPHERE_2:
SpheresState[type - DATA_SPHERE_1] = data;
break;
- case DATA_JEDOGA_TRIGGER_SWITCH:
- SwitchTrigger = data;
- break;
- case DATA_JEDOGA_RESET_INITIANDS:
- for (ObjectGuid guid : InitiandGUIDs)
- {
- if (Creature* creature = instance->GetCreature(guid))
- {
- creature->Respawn();
- if (!creature->IsInEvadeMode())
- creature->AI()->EnterEvadeMode();
- }
- }
- break;
default:
break;
}
@@ -157,99 +123,12 @@ class instance_ahnkahet : public InstanceMapScript
case DATA_SPHERE_1:
case DATA_SPHERE_2:
return SpheresState[type - DATA_SPHERE_1];
- case DATA_ALL_INITIAND_DEAD:
- for (ObjectGuid guid : InitiandGUIDs)
- {
- Creature* cr = instance->GetCreature(guid);
- if (!cr || cr->IsAlive())
- return 0;
- }
- return 1;
- case DATA_JEDOGA_TRIGGER_SWITCH:
- return SwitchTrigger;
default:
break;
}
return 0;
}
- void SetGuidData(uint32 type, ObjectGuid data) override
- {
- switch (type)
- {
- case DATA_ADD_JEDOGA_OPFER:
- JedogaSacrifices = data;
- break;
- case DATA_PL_JEDOGA_TARGET:
- JedogaTarget = data;
- break;
- default:
- break;
- }
- }
-
- ObjectGuid GetGuidData(uint32 type) const override
- {
- switch (type)
- {
- case DATA_ELDER_NADOX:
- return ElderNadoxGUID;
- case DATA_PRINCE_TALDARAM:
- return PrinceTaldaramGUID;
- case DATA_JEDOGA_SHADOWSEEKER:
- return JedogaShadowseekerGUID;
- case DATA_AMANITAR:
- return AmanitarGUID;
- case DATA_HERALD_VOLAZJ:
- return HeraldVolazjGUID;
- case DATA_PRINCE_TALDARAM_PLATFORM:
- return PrinceTaldaramPlatformGUID;
- case DATA_ADD_JEDOGA_INITIAND:
- {
- GuidVector vInitiands;
- vInitiands.reserve(InitiandGUIDs.size());
- for (ObjectGuid guid : InitiandGUIDs)
- {
- Creature* cr = instance->GetCreature(guid);
- if (cr && cr->IsAlive())
- vInitiands.push_back(guid);
- }
- if (vInitiands.empty())
- return ObjectGuid::Empty;
-
- return Trinity::Containers::SelectRandomContainerElement(vInitiands);
- }
- case DATA_ADD_JEDOGA_OPFER:
- return JedogaSacrifices;
- case DATA_PL_JEDOGA_TARGET:
- return JedogaTarget;
- default:
- break;
- }
- return ObjectGuid::Empty;
- }
-
- bool SetBossState(uint32 type, EncounterState state) override
- {
- if (!InstanceScript::SetBossState(type, state))
- return false;
-
- switch (type)
- {
- case DATA_JEDOGA_SHADOWSEEKER:
- if (state == DONE)
- {
- for (ObjectGuid guid : InitiandGUIDs)
- if (Creature* cr = instance->GetCreature(guid))
- cr->DespawnOrUnsummon();
- }
- break;
- default:
- break;
- }
- return true;
- }
-
void WriteSaveDataMore(std::ostringstream& data) override
{
data << SpheresState[0] << ' ' << SpheresState[1];
@@ -262,20 +141,7 @@ class instance_ahnkahet : public InstanceMapScript
}
protected:
- ObjectGuid ElderNadoxGUID;
- ObjectGuid PrinceTaldaramGUID;
- ObjectGuid JedogaShadowseekerGUID;
- ObjectGuid AmanitarGUID;
- ObjectGuid HeraldVolazjGUID;
-
- ObjectGuid PrinceTaldaramPlatformGUID;
- ObjectGuid JedogaSacrifices;
- ObjectGuid JedogaTarget;
-
- GuidSet InitiandGUIDs;
-
uint32 SpheresState[2];
- uint8 SwitchTrigger;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const override