aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGustavo <sirikfoll@hotmail.com>2017-10-16 23:32:30 -0200
committerGitHub <noreply@github.com>2017-10-16 23:32:30 -0200
commit5a90251ea28bb9b0be376d7b6110b4e93458cbea (patch)
tree3f8e5734c166fb515eda8cce5114e77a648537c9 /src
parent5558bd27c6a7ae3aa13773eee7d048e31f676738 (diff)
Core/Scripts: Update boss Toravon the Ice Watcher (#20395)
* Core/Scripts: Update boss Toravon the Ice Watcher Frozen Orbs: Fixed summon delay, removed old hack, aggro behavior implemented(every 10sec they reset threat and change target) Remove no longer needed script for the orb stalker All timers adjusted Update instance model Update script register model Fix Frostbite proc
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp325
-rw-r--r--src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp43
-rw-r--r--src/server/scripts/Northrend/VaultOfArchavon/vault_of_archavon.h8
3 files changed, 128 insertions, 248 deletions
diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp
index 0f785817e9b..d093bb65fa8 100644
--- a/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp
+++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp
@@ -17,28 +17,26 @@
#include "ScriptMgr.h"
#include "InstanceScript.h"
-#include "ObjectAccessor.h"
#include "ScriptedCreature.h"
+#include "SpellScript.h"
#include "vault_of_archavon.h"
enum Spells
{
// Toravon
- SPELL_FREEZING_GROUND = 72090, // don't know cd... using 20 secs.
+ SPELL_FREEZING_GROUND = 72090,
SPELL_FROZEN_ORB = 72091,
- SPELL_WHITEOUT = 72034, // Every 38 sec. cast. (after SPELL_FROZEN_ORB)
+ SPELL_WHITEOUT = 72034,
SPELL_FROZEN_MALLET = 71993,
- // Frost Warder
- SPELL_FROST_BLAST = 72123, // don't know cd... using 20 secs.
- SPELL_FROZEN_MALLET_2 = 72122,
-
// Frozen Orb
- SPELL_FROZEN_ORB_DMG = 72081, // priodic dmg aura
- SPELL_FROZEN_ORB_AURA = 72067, // make visible
+ SPELL_FROZEN_ORB_DMG = 72081,
+ SPELL_FROZEN_ORB_AURA = 72067,
+ SPELL_RANDOM_AGGRO = 72084,
- // Frozen Orb Stalker
- SPELL_FROZEN_ORB_SUMMON = 72093, // summon orb
+ // Frost Warder
+ SPELL_FROST_BLAST = 72123, // don't know cd... using 20 secs.
+ SPELL_FROZEN_MALLET_2 = 72122
};
enum Events
@@ -47,256 +45,159 @@ enum Events
EVENT_FROZEN_ORB = 2,
EVENT_WHITEOUT = 3,
- EVENT_FROST_BLAST = 4,
+ EVENT_FROST_BLAST = 4
};
-enum Creatures
+struct boss_toravon : public BossAI
{
- NPC_FROZEN_ORB = 38456 // 1 in 10 mode and 3 in 25 mode
+ boss_toravon(Creature* creature) : BossAI(creature, DATA_TORAVON) { }
-};
+ void EnterCombat(Unit* /*who*/) override
+ {
+ DoCastSelf(SPELL_FROZEN_MALLET);
-class boss_toravon : public CreatureScript
-{
- public:
- boss_toravon() : CreatureScript("boss_toravon") { }
+ events.ScheduleEvent(EVENT_FROZEN_ORB, Seconds(12));
+ events.ScheduleEvent(EVENT_WHITEOUT, Seconds(25));
+ events.ScheduleEvent(EVENT_FREEZING_GROUND, Seconds(7));
- struct boss_toravonAI : public BossAI
- {
- boss_toravonAI(Creature* creature) : BossAI(creature, DATA_TORAVON)
- {
- }
+ _EnterCombat();
+ }
- void EnterCombat(Unit* /*who*/) override
- {
- DoCast(me, SPELL_FROZEN_MALLET);
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
- events.ScheduleEvent(EVENT_FROZEN_ORB, 11000);
- events.ScheduleEvent(EVENT_WHITEOUT, 13000);
- events.ScheduleEvent(EVENT_FREEZING_GROUND, 15000);
+ events.Update(diff);
- _EnterCombat();
- }
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- void UpdateAI(uint32 diff) override
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
{
- if (!UpdateVictim())
- return;
-
- events.Update(diff);
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_FROZEN_ORB:
- me->CastCustomSpell(SPELL_FROZEN_ORB, SPELLVALUE_MAX_TARGETS, 1, me);
- events.ScheduleEvent(EVENT_FROZEN_ORB, 38000);
- break;
- case EVENT_WHITEOUT:
- DoCast(me, SPELL_WHITEOUT);
- events.ScheduleEvent(EVENT_WHITEOUT, 38000);
- break;
- case EVENT_FREEZING_GROUND:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1))
- DoCast(target, SPELL_FREEZING_GROUND);
- events.ScheduleEvent(EVENT_FREEZING_GROUND, 20000);
- break;
- default:
- break;
- }
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
- }
-
- DoMeleeAttackIfReady();
+ case EVENT_FROZEN_ORB:
+ me->CastCustomSpell(SPELL_FROZEN_ORB, SPELLVALUE_MAX_TARGETS, RAID_MODE(1, 3), me);
+ events.Repeat(Seconds(32));
+ break;
+ case EVENT_WHITEOUT:
+ DoCastSelf(SPELL_WHITEOUT);
+ events.Repeat(Seconds(38));
+ break;
+ case EVENT_FREEZING_GROUND:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1))
+ DoCast(target, SPELL_FREEZING_GROUND);
+ events.Repeat(Seconds(38));
+ break;
+ default:
+ break;
}
- };
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetVaultOfArchavonAI<boss_toravonAI>(creature);
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
}
+
+ DoMeleeAttackIfReady();
+ }
};
-/*######
-## Mob Frost Warder
-######*/
-class npc_frost_warder : public CreatureScript
+struct npc_frost_warder : public ScriptedAI
{
- public:
- npc_frost_warder() : CreatureScript("npc_frost_warder") { }
-
- struct npc_frost_warderAI : public ScriptedAI
- {
- npc_frost_warderAI(Creature* creature) : ScriptedAI(creature) { }
-
- void Reset() override
- {
- events.Reset();
- }
-
- void EnterCombat(Unit* /*who*/) override
- {
- DoZoneInCombat();
-
- DoCast(me, SPELL_FROZEN_MALLET_2);
+ npc_frost_warder(Creature* creature) : ScriptedAI(creature) { }
- events.ScheduleEvent(EVENT_FROST_BLAST, 5000);
- }
+ void Reset() override
+ {
+ _events.Reset();
+ }
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
+ void EnterCombat(Unit* /*who*/) override
+ {
+ DoZoneInCombat();
- events.Update(diff);
+ DoCastSelf(SPELL_FROZEN_MALLET_2);
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
+ _events.ScheduleEvent(EVENT_FROST_BLAST, 5000);
+ }
- if (events.ExecuteEvent() == EVENT_FROST_BLAST)
- {
- DoCastVictim(SPELL_FROST_BLAST);
- events.ScheduleEvent(EVENT_FROST_BLAST, 20000);
- }
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
- DoMeleeAttackIfReady();
- }
+ _events.Update(diff);
- private:
- EventMap events;
- };
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- CreatureAI* GetAI(Creature* creature) const override
+ if (_events.ExecuteEvent() == EVENT_FROST_BLAST)
{
- return GetVaultOfArchavonAI<npc_frost_warderAI>(creature);
+ DoCastVictim(SPELL_FROST_BLAST);
+ _events.ScheduleEvent(EVENT_FROST_BLAST, 20000);
}
+
+ DoMeleeAttackIfReady();
+ }
+
+private:
+ EventMap _events;
};
-/*######
-## Mob Frozen Orb
-######*/
-class npc_frozen_orb : public CreatureScript
+struct npc_frozen_orb : public ScriptedAI
{
-public:
- npc_frozen_orb() : CreatureScript("npc_frozen_orb") { }
+ npc_frozen_orb(Creature* creature) : ScriptedAI(creature) { }
- struct npc_frozen_orbAI : public ScriptedAI
+ void IsSummonedBy(Unit* /*summoner*/) override
{
- npc_frozen_orbAI(Creature* creature) : ScriptedAI(creature)
- {
- Initialize();
- }
+ DoCastSelf(SPELL_FROZEN_ORB_AURA, true);
+ DoCastSelf(SPELL_FROZEN_ORB_DMG, true);
+ DoCastSelf(SPELL_RANDOM_AGGRO, true);
- void Initialize()
+ if (Creature* toravon = me->GetInstanceScript()->GetCreature(DATA_TORAVON))
{
- done = false;
- killTimer = 60000; // if after this time there is no victim -> destroy!
- }
-
- void Reset() override
- {
- Initialize();
- }
-
- void EnterCombat(Unit* /*who*/) override
- {
- DoZoneInCombat();
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (!done)
- {
- DoCast(me, SPELL_FROZEN_ORB_AURA, true);
- DoCast(me, SPELL_FROZEN_ORB_DMG, true);
- done = true;
- }
-
- if (killTimer <= diff)
+ if (toravon->IsInCombat())
{
- if (!UpdateVictim())
- me->DespawnOrUnsummon();
- killTimer = 10000;
+ toravon->AI()->JustSummoned(me);
+ me->SetInCombatWithZone();
}
else
- killTimer -= diff;
+ me->DespawnOrUnsummon();
}
-
- private:
- uint32 killTimer;
- bool done;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetVaultOfArchavonAI<npc_frozen_orbAI>(creature);
}
};
-/*######
-## Mob Frozen Orb Stalker
-######*/
-class npc_frozen_orb_stalker : public CreatureScript
+// 46523 - Random Aggro
+class spell_toravon_random_aggro : public SpellScript
{
- public:
- npc_frozen_orb_stalker() : CreatureScript("npc_frozen_orb_stalker") { }
+ PrepareSpellScript(spell_toravon_random_aggro);
- struct npc_frozen_orb_stalkerAI : public ScriptedAI
- {
- npc_frozen_orb_stalkerAI(Creature* creature) : ScriptedAI(creature)
- {
- creature->SetVisible(false);
- creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
- me->SetControlled(true, UNIT_STATE_ROOT);
- creature->SetReactState(REACT_PASSIVE);
-
- instance = creature->GetInstanceScript();
- spawned = false;
+ bool Load() override
+ {
+ return GetCaster()->GetTypeId() == TYPEID_UNIT;
+ }
- SetCombatMovement(false);
- }
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ Creature* caster = GetCaster()->ToCreature();
+ if (!caster->IsAIEnabled)
+ return;
- void UpdateAI(uint32 /*diff*/) override
- {
- if (spawned)
- return;
-
- spawned = true;
- Unit* toravon = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_TORAVON));
- if (!toravon)
- return;
-
- uint8 num_orbs = RAID_MODE(1, 3);
- for (uint8 i = 0; i < num_orbs; ++i)
- {
- Position pos;
- me->GetNearPoint(toravon, pos.m_positionX, pos.m_positionY, pos.m_positionZ, 0.0f, 10.0f, 0.0f);
- me->UpdatePosition(pos);
- DoCast(me, SPELL_FROZEN_ORB_SUMMON);
- }
- }
+ caster->GetThreatManager().resetAllAggro();
- private:
- InstanceScript* instance;
- bool spawned;
- };
+ if (Unit* target = caster->AI()->SelectTarget(SELECT_TARGET_RANDOM, 1))
+ caster->GetThreatManager().AddThreat(target, 1000000);
+ }
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetVaultOfArchavonAI<npc_frozen_orb_stalkerAI>(creature);
- }
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_toravon_random_aggro::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
};
void AddSC_boss_toravon()
{
- new boss_toravon();
- new npc_frost_warder();
- new npc_frozen_orb();
- new npc_frozen_orb_stalker();
+ RegisterVaultOfArchavonCreatureAI(boss_toravon);
+ RegisterVaultOfArchavonCreatureAI(npc_frost_warder);
+ RegisterVaultOfArchavonCreatureAI(npc_frozen_orb);
+ RegisterSpellScript(spell_toravon_random_aggro);
}
diff --git a/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp
index f399449932f..df562d81546 100644
--- a/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp
+++ b/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp
@@ -16,7 +16,6 @@
*/
#include "ScriptMgr.h"
-#include "Creature.h"
#include "InstanceScript.h"
#include "Map.h"
#include "vault_of_archavon.h"
@@ -28,6 +27,15 @@
4 - Toravon the Ice Watcher event
*/
+ObjectData const creatureData[] =
+{
+ { NPC_ARCHAVON, DATA_ARCHAVON },
+ { NPC_EMALON, DATA_EMALON },
+ { NPC_KORALON, DATA_KORALON },
+ { NPC_TORAVON, DATA_TORAVON },
+ { 0, 0, }
+};
+
class instance_vault_of_archavon : public InstanceMapScript
{
public:
@@ -39,42 +47,13 @@ class instance_vault_of_archavon : public InstanceMapScript
{
SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
+ LoadObjectData(creatureData, nullptr);
ArchavonDeath = 0;
EmalonDeath = 0;
KoralonDeath = 0;
}
- void OnCreatureCreate(Creature* creature) override
- {
- switch (creature->GetEntry())
- {
- case NPC_EMALON:
- EmalonGUID = creature->GetGUID();
- break;
- case NPC_TORAVON:
- ToravonGUID = creature->GetGUID();
- break;
- default:
- break;
- }
- }
-
- ObjectGuid GetGuidData(uint32 identifier) const override
- {
- switch (identifier)
- {
- case DATA_EMALON:
- return EmalonGUID;
- case DATA_TORAVON:
- return ToravonGUID;
- default:
- break;
- }
-
- return ObjectGuid::Empty;
- }
-
bool SetBossState(uint32 type, EncounterState state) override
{
if (!InstanceScript::SetBossState(type, state))
@@ -127,8 +106,6 @@ class instance_vault_of_archavon : public InstanceMapScript
}
private:
- ObjectGuid EmalonGUID;
- ObjectGuid ToravonGUID;
time_t ArchavonDeath;
time_t EmalonDeath;
time_t KoralonDeath;
diff --git a/src/server/scripts/Northrend/VaultOfArchavon/vault_of_archavon.h b/src/server/scripts/Northrend/VaultOfArchavon/vault_of_archavon.h
index d4f252d3715..491ef5dd82d 100644
--- a/src/server/scripts/Northrend/VaultOfArchavon/vault_of_archavon.h
+++ b/src/server/scripts/Northrend/VaultOfArchavon/vault_of_archavon.h
@@ -30,7 +30,7 @@ enum VAData
DATA_ARCHAVON = 0,
DATA_EMALON = 1,
DATA_KORALON = 2,
- DATA_TORAVON = 3,
+ DATA_TORAVON = 3
};
enum VACreatureIds
@@ -44,12 +44,12 @@ enum VACreatureIds
enum VAAchievementCriteriaIds
{
CRITERIA_EARTH_WIND_FIRE_10 = 12018,
- CRITERIA_EARTH_WIND_FIRE_25 = 12019,
+ CRITERIA_EARTH_WIND_FIRE_25 = 12019
};
enum VAAchievementSpells
{
- SPELL_EARTH_WIND_FIRE_ACHIEVEMENT_CHECK = 68308,
+ SPELL_EARTH_WIND_FIRE_ACHIEVEMENT_CHECK = 68308
};
template <class AI, class T>
@@ -58,4 +58,6 @@ inline AI* GetVaultOfArchavonAI(T* obj)
return GetInstanceAI<AI>(obj, VoAScriptName);
}
+#define RegisterVaultOfArchavonCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetVaultOfArchavonAI)
+
#endif