atal dazar full
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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_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();
|
||||
|
||||
Reference in New Issue
Block a user