atal dazar full

This commit is contained in:
luis
2026-09-24 03:36:34 -03:00
parent cf2d9c103f
commit 463ec4cc72
3 changed files with 293 additions and 2 deletions
@@ -37,10 +37,10 @@ enum AtalDazarDataTypes
enum AtalDazarCreatureIds enum AtalDazarCreatureIds
{ {
// Bosses // Bosses
BOSS_PRIESTESS_ALUNZA = 129614, BOSS_PRIESTESS_ALUNZA = 122967,
BOSS_VOLKAAL = 122965, BOSS_VOLKAAL = 122965,
BOSS_REZAN = 122963, BOSS_REZAN = 122963,
BOSS_YAZMA = 129412 BOSS_YAZMA = 122968
}; };
enum AtalDazarGameObjectIds enum AtalDazarGameObjectIds
@@ -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<Player*> 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<Player*> 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);
}
@@ -22,6 +22,7 @@ void AddSC_instance_atal_dazar();
void AddSC_boss_rezan(); void AddSC_boss_rezan();
void AddSC_boss_volkaal(); void AddSC_boss_volkaal();
void AddSC_boss_priestess_alun_za(); void AddSC_boss_priestess_alun_za();
void AddSC_boss_yazma();
// Underrot // Underrot
void AddSC_instance_underrot(); void AddSC_instance_underrot();
@@ -46,6 +47,7 @@ void AddZandalarScripts()
AddSC_boss_rezan(); AddSC_boss_rezan();
AddSC_boss_volkaal(); AddSC_boss_volkaal();
AddSC_boss_priestess_alun_za(); AddSC_boss_priestess_alun_za();
AddSC_boss_yazma();
// Underrot // Underrot
AddSC_instance_underrot(); AddSC_instance_underrot();