diff --git a/src/server/scripts/Zandalar/AtalDazar/atal_dazar.h b/src/server/scripts/Zandalar/AtalDazar/atal_dazar.h index afd5015ad..27cab10fe 100644 --- a/src/server/scripts/Zandalar/AtalDazar/atal_dazar.h +++ b/src/server/scripts/Zandalar/AtalDazar/atal_dazar.h @@ -37,10 +37,10 @@ enum AtalDazarDataTypes enum AtalDazarCreatureIds { // Bosses - BOSS_PRIESTESS_ALUNZA = 129614, + BOSS_PRIESTESS_ALUNZA = 122967, BOSS_VOLKAAL = 122965, BOSS_REZAN = 122963, - BOSS_YAZMA = 129412 + BOSS_YAZMA = 122968 }; enum AtalDazarGameObjectIds diff --git a/src/server/scripts/Zandalar/AtalDazar/boss_yazma.cpp b/src/server/scripts/Zandalar/AtalDazar/boss_yazma.cpp new file mode 100644 index 000000000..b50cc44e6 --- /dev/null +++ b/src/server/scripts/Zandalar/AtalDazar/boss_yazma.cpp @@ -0,0 +1,289 @@ +/* + * Copyright (C) WowCommunity Project + * + * This SourceCode is NOT free a software. Please hold everything Private + * and read our Terms + */ + +#include "ScriptMgr.h" +#include "SpellScript.h" +#include "SpellAuras.h" +#include "SpellAuraEffects.h" +#include "GameObject.h" +#include "InstanceScript.h" +#include "Map.h" +#include "MotionMaster.h" +#include "ObjectAccessor.h" +#include "Player.h" +#include "ScriptedCreature.h" +#include "TemporarySummon.h" +#include "atal_dazar.h" + +enum Spells { + //Soulrend + SPELL_SOULREND_TARGET_SELECTOR = 249921, + SPELL_SOULREND = 249923, + SPELL_SOULREND_EXPLODE = 256577, + SPELL_SOULREND_DAMAGE_HEROIC = 259191, + SPELL_SOULREND_DAMAGE = 259145, //The heroic vertion have this damage too, so i don't know why this spell but just in case + SPELL_SOULREND_PYROSHADOW_ON = 259186, + //Basic Spells + SPELL_WRACKING_PAIN = 250096, + SPELL_SKEWER = 249919, + //Echoes of Shadra + SPELL_TARGET_SELECTOR = 257066, //HITS ALL UNITS IN RANGE + SPELL_ECHOES_OF_SHADOW = 250050, + SPELL_ECHOES_OF_SHADOW_EMPOWERED = 258612, + SPELL_ECHOES_OF_SHADOW_EMPOWERED2 = 256036, + SPELL_ECHOES_OF_SHADOW_SPAWN = 257291, + SPELL_ECHOES_OF_SHADOW_SPAWN_SMALL = 263092, // ? + SPELL_ECHOES_OF_SHAODW_AREATRIGGER = 263096, // the spiders on the stairs + SPELL_ECHOES_OF_SHADOW_AREATRIGGER = 250022, //Bigger +}; + +enum Npcs { + NPC_YAZMA = BOSS_YAZMA, + NPC_SOULREND = 125828, +}; + + + +enum Events { + EVENT_SKEWER = 1, + EVENT_WRACKING_PAIN, + EVENT_ECHOES_OF_SHADOW, + EVENT_SHADOWY_REMAINS, + EVENT_SOULREND, + TALK_AGGRO, + TALK_DEATH, + EVENT_ECHOES_OF_SHADOW_SPAWN, + EVENT_SHADOW_EMPOWERED = 1, + EVENT_SHADOW_EMPOWERED_STOP = 2, +}; + +struct boss_ataldazar_yazma : public BossAI +{ + boss_ataldazar_yazma(Creature* creature) : BossAI(creature, DATA_YAZMA) { } + + void InitializeAI() override + { + BossAI::InitializeAI(); + } + + void SpellHitTarget(WorldObject* target, SpellInfo const* spell) override + { + if (spell->Id == SPELL_ECHOES_OF_SHADOW) + me->CastSpell(target, SPELL_ECHOES_OF_SHADOW_SPAWN); + if (spell->Id == SPELL_SOULREND) + me->SummonCreature(NPC_SOULREND, target->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s); + } + + void Reset() override + { + summons.DespawnAll(); + events.Reset(); + } + + void JustEngagedWith(Unit* who) override + { + + Talk(TALK_AGGRO); + // Events + events.ScheduleEvent(EVENT_WRACKING_PAIN, 3s); + events.ScheduleEvent(EVENT_SKEWER, 5s); + events.ScheduleEvent(EVENT_SOULREND, 10s); + events.ScheduleEvent(EVENT_ECHOES_OF_SHADOW, 16s); + + BossAI::JustEngagedWith(who); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + //TODO: This event is when yazma has 100 of mana, is made it in correct time but not blizzlike + case EVENT_SOULREND: + { + if (IsHeroic() || IsMythic()) + { + std::list playerList; + me->GetPlayerListInGrid(playerList, 100.0f); + for (auto player : playerList) + { + if (player != me->GetVictim()) + me->CastSpell(player, SPELL_SOULREND); + } + } + else + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, NonTankTargetSelector(me))) + me->CastSpell(target, SPELL_SOULREND); + events.ScheduleEvent(EVENT_SOULREND, 41s); + break; + } + case EVENT_WRACKING_PAIN: + { + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) + me->CastSpell(target, SPELL_WRACKING_PAIN); + events.ScheduleEvent(EVENT_WRACKING_PAIN, 23s); + break; + } + case EVENT_SKEWER: + { + me->CastSpell(me->GetVictim(), SPELL_SKEWER); + events.ScheduleEvent(EVENT_SKEWER, 32s); + break; + } + case EVENT_ECHOES_OF_SHADOW: + { + std::list playerList; + me->GetPlayerListInGrid(playerList, 100.0f); + int count = 0; + for (auto player : playerList) + { + if (count == 4) + break; + me->CastSpell(player, SPELL_ECHOES_OF_SHADOW); + count++; + } + events.ScheduleEvent(EVENT_ECHOES_OF_SHADOW, 12s); + break; + } + default: + break; + } + } + } + + + void JustDied(Unit* killer) override + { + Talk(TALK_DEATH); + summons.DespawnAll(); + BossAI::JustDied(killer); + } + +private: +}; + +//125828 +struct npc_ataldazar_soulspawn : public ScriptedAI +{ + npc_ataldazar_soulspawn(Creature* pCreature) : ScriptedAI(pCreature) { + if (Creature* yazma = me->FindNearestCreature(NPC_YAZMA, 100)) + me->GetMotionMaster()->MoveFollow(yazma, 0, 0); + if (Player* nearestPlayer = me->SelectNearestPlayer(10)) + me->SetDisplayId(nearestPlayer->GetDisplayId()); + } + + void Reset() override + { + events.Reset(); + me->setActive(false); + if (Creature* yazma = me->FindNearestCreature(NPC_YAZMA, 100)) + me->GetMotionMaster()->MoveFollow(yazma, 0, 0); + } + + void InitializeAI() override + { + me->SetReactState(REACT_PASSIVE); + SetCombatMovement(false); + + ScriptedAI::InitializeAI(); + } + + void UpdateAI(uint32 /*diff*/) override + { + if (Creature* yazma = me->FindNearestCreature(NPC_YAZMA, 100)) + if (me->GetDistance(yazma) < 1) + { + me->CastSpell(me, SPELL_SOULREND_EXPLODE); + me->DespawnOrUnsummon(); + } + } +}; + +struct npc_ataldazar_echo_of_shadra : public ScriptedAI +{ + npc_ataldazar_echo_of_shadra(Creature* creature) : ScriptedAI(creature) { + me->GetMotionMaster()->MoveRandom(urand(0, 15)); + } + + void Reset() override + { + events.Reset(); + me->setActive(false); + me->SetWalk(false); + me->GetMotionMaster()->MoveRandom(urand(0, 15)); + } + + void InitializeAI() override + { + me->SetReactState(REACT_PASSIVE); + } + + void IsSummonedBy(WorldObject* /*summoner*/) override + { + events.ScheduleEvent(EVENT_SHADOW_EMPOWERED, 5s); + } + + void MovementInform(uint32 /*type*/, uint32 /*id*/) override + { + me->GetMotionMaster()->MoveRandom(urand(5, 15)); + } + + void UpdateAI(uint32 diff) override + { + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + if (closestplayer && closestplayer != NULL) + if (me->GetDistance(closestplayer) < 1) + { + me->CastSpell(me, SPELL_ECHOES_OF_SHADOW_AREATRIGGER); + me->KillSelf(); + } + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_SHADOW_EMPOWERED: + { + me->AddAura(SPELL_ECHOES_OF_SHADOW_EMPOWERED, me); + me->GetMotionMaster()->Clear(); + closestplayer = me->SelectNearestPlayer(100.0f); + me->GetMotionMaster()->MoveFollow(closestplayer, 0, 0); + events.ScheduleEvent(EVENT_SHADOW_EMPOWERED_STOP, 3s); + break; + } + case EVENT_SHADOW_EMPOWERED_STOP: + { + me->RemoveAura(SPELL_ECHOES_OF_SHADOW_EMPOWERED); + events.ScheduleEvent(EVENT_SHADOW_EMPOWERED, 6s); + me->GetMotionMaster()->Clear(); + me->GetMotionMaster()->MoveRandom(urand(5, 15)); + closestplayer = NULL; + } + } + } + } +private: + Player* closestplayer = NULL; + EventMap events; +}; + + +void AddSC_boss_yazma() +{ + RegisterAtalDazarCreatureAI(boss_ataldazar_yazma); + RegisterAtalDazarCreatureAI(npc_ataldazar_soulspawn); + RegisterAtalDazarCreatureAI(npc_ataldazar_echo_of_shadra); +} diff --git a/src/server/scripts/Zandalar/zandalar_script_loader.cpp b/src/server/scripts/Zandalar/zandalar_script_loader.cpp index 232097aad..c6f0b8c82 100644 --- a/src/server/scripts/Zandalar/zandalar_script_loader.cpp +++ b/src/server/scripts/Zandalar/zandalar_script_loader.cpp @@ -22,6 +22,7 @@ void AddSC_instance_atal_dazar(); void AddSC_boss_rezan(); void AddSC_boss_volkaal(); void AddSC_boss_priestess_alun_za(); +void AddSC_boss_yazma(); // Underrot void AddSC_instance_underrot(); @@ -46,6 +47,7 @@ void AddZandalarScripts() AddSC_boss_rezan(); AddSC_boss_volkaal(); AddSC_boss_priestess_alun_za(); + AddSC_boss_yazma(); // Underrot AddSC_instance_underrot();