diff options
author | Gustavo <sirikfoll@hotmail.com> | 2017-09-25 17:17:42 -0300 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2020-09-12 00:13:32 +0200 |
commit | e531beeb8312f393896e1975ea537827594bedb7 (patch) | |
tree | 657dc446711f02a70dda510df43205a17e4254d0 | |
parent | ed79d904e02d05144f8c5953249da9d5acf01218 (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)
5 files changed, 473 insertions, 642 deletions
diff --git a/sql/updates/world/master/2020_09_12_00_world_2017_09_25_00_world.sql b/sql/updates/world/master/2020_09_12_00_world_2017_09_25_00_world.sql new file mode 100644 index 00000000000..5836a7ff7be --- /dev/null +++ b/sql/updates/world/master/2020_09_12_00_world_2017_09_25_00_world.sql @@ -0,0 +1,62 @@ +UPDATE `creature_template` SET `unit_flags`=33587264, `InhabitType`=4 WHERE `entry` IN (29310,31465); -- Jedoga +UPDATE `creature` SET `MovementType`=0, `spawndist`=0 WHERE `guid`=131953; +UPDATE `creature_addon` SET `auras`='56075 56327' WHERE `guid`=131953; -- Jedoga +UPDATE `creature_template` SET `ScriptName`='npc_twilight_volunteer' WHERE `entry`=30385; +UPDATE `creature_template` SET `ScriptName`='' WHERE `entry` IN(30114,30181); +DELETE FROM `creature` WHERE `id` IN(30114,30181); +DELETE FROM `creature_addon` WHERE `guid` IN (132063,132066,132067,132068,132069,132070,132071,132072,132065); +DELETE FROM `linked_respawn` WHERE `guid` IN (131997,131998,131999,132000,132001,132002,132003,132004,132005,132006,132007,132008,132009,132010,132011); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry` IN (56312); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition` ,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(13,1,56312,0,0,31,0,3,29310,0,0,0,'','Spell \'Beam Visual\' targets Jedoga Shadowseeker'); + +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_random_lightning_visual_effect'; +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(56328,'spell_random_lightning_visual_effect'); + +DELETE FROM `creature_text` WHERE `CreatureID`=30385; +INSERT INTO `creature_text` (`CreatureID`,`GroupID`,`ID`,`Text`,`Type`,`Language`,`Probability`,`Emote`,`Duration`,`Sound`,`BroadcastTextId`,`TextRange`,`comment`) VALUES +(30385,0,0,'I have been chosen!',14,0,100,0,0,0,31179,0,'SAY_CHOSEN'), +(30385,1,0,'I give myself to the master!',14,0,100,0,0,0,30863,0,'SAY_SACRIFICED'); + +DELETE FROM `creature_summon_groups` WHERE `summonerId`=29310 AND `groupId`=1; +INSERT INTO `creature_summon_groups` (`summonerId`,`summonerType`,`groupId`,`entry`,`position_x`,`position_y`,`position_z`,`orientation`,`summonType`,`summonTime`) VALUES +(29310,0,1,30114, 362.458, -714.166, -16.0964, 0.977384,6,3000), +(29310,0,1,30114, 368.781, -713.932, -16.0964, 1.46608,6,3000), +(29310,0,1,30114, 364.937, -716.11, -16.0964, 1.25664,6,3000), +(29310,0,1,30114, 362.02, -719.828, -16.0964, 1.20428,6,3000), +(29310,0,1,30114, 368.151, -719.763, -16.0964, 1.53589,6,3000), +(29310,0,1,30114, 392.276, -695.895, -16.0964, 3.40339,6,3000), +(29310,0,1,30114, 387.224, -698.006, -16.0964, 3.36848,6,3000), +(29310,0,1,30114, 389.626, -702.3, -16.0964, 3.07178,6,3000), +(29310,0,1,30114, 383.812, -700.41, -16.0964, 3.15905,6,3000), +(29310,0,1,30114, 385.693, -694.376, -16.0964, 3.59538,6,3000), +(29310,0,1,30114, 379.204, -716.697, -16.0964, 2.1293,6,3000), +(29310,0,1,30114, 375.4, -711.434, -16.0964, 2.09439,6,3000), +(29310,0,1,30114, 382.583, -711.713, -16.0964, 2.53073,6,3000), +(29310,0,1,30114, 379.049, -712.899, -16.0964, 2.28638,6,3000), +(29310,0,1,30114, 378.424, -708.388, -16.0964, 2.58309,6,3000); + +DELETE FROM `creature_summon_groups` WHERE `summonerId`=29310 AND `groupId`=2; +INSERT INTO `creature_summon_groups` (`summonerId`,`summonerType`,`groupId`,`entry`,`position_x`,`position_y`,`position_z`,`orientation`,`summonType`,`summonTime`) VALUES +(29310,0,2,30111,427.3021,-717.3993,-17.95177,2.70526,7,0), +(29310,0,2,30111,429.7342,-712.1823,-17.95688,2.86234,7,0), +(29310,0,2,30111,434.4365,-709.4752,-17.96144,2.949606,7,0), +(29310,0,2,30111,434.0043,-702.8975,-17.95797,3.124139,7,0), +(29310,0,2,30111,439.9826,-699.0701,-17.95278,3.193953,7,0), +(29310,0,2,30111,381.8384,-773.3898,-17.95301,1.762783,7,0), +(29310,0,2,30111,387.0695,-770.9496,-17.95761,1.972222,7,0), +(29310,0,2,30111,392.5775,-765.6364,-17.95891,2.251475,7,0), +(29310,0,2,30111,394.3542,-760.8108,-17.95462,2.443461,7,0), +(29310,0,2,30111,388.3078,-766.784,-17.96076,2.094395,7,0); + +DELETE FROM `creature_summon_groups` WHERE `summonerId`=29308 AND `groupId`=1; +INSERT INTO `creature_summon_groups` (`summonerId`,`summonerType`,`groupId`,`entry`,`position_x`,`position_y`,`position_z`,`orientation`,`summonType`,`summonTime`) VALUES +(29308,0,1,30181,519.146,-792.274,49.4627,4.15388,8,0), +(29308,0,1,30181,542.994,-762.115,36.0509,1.32645,8,0), +(29308,0,1,30181,599.617,-762.315,35.3111,1.71042,8,0), +(29308,0,1,30181,506.573,-890.563,45.1763,3.35103,8,0), +(29308,0,1,30181,632.232,-774.304,34.0595,0.750492,8,0), +(29308,0,1,30181,489.944,-851.356,52.09,4.95674,8,0), +(29308,0,1,30181,655.409,-814.264,35.2257,0.436332,8,0); 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 |