diff options
author | joschiwald <joschiwald.trinity@gmail.com> | 2015-06-14 16:03:17 +0200 |
---|---|---|
committer | joschiwald <joschiwald.trinity@gmail.com> | 2015-06-14 16:03:17 +0200 |
commit | 34a721ba84643cf468f63e5c375949aaa3e15cac (patch) | |
tree | 3e12801cf6b485a07969d7eb93df5f51c0348294 /src | |
parent | 6af3bc69970d3009a8e193fd2d3041232fbbd3e7 (diff) |
Scripts/VioletHold: picked some things from pull request #11399 (thx MitchedD for initial work)
Diffstat (limited to 'src')
10 files changed, 453 insertions, 638 deletions
diff --git a/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp b/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp index 36d2c5f8ed3..dc923e534b0 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp @@ -23,12 +23,9 @@ enum Spells { SPELL_ARCANE_VACUUM = 58694, SPELL_BLIZZARD = 58693, - H_SPELL_BLIZZARD = 59369, SPELL_MANA_DESTRUCTION = 59374, SPELL_TAIL_SWEEP = 58690, - H_SPELL_TAIL_SWEEP = 59283, SPELL_UNCONTROLLABLE_ENERGY = 58688, - H_SPELL_UNCONTROLLABLE_ENERGY = 59281, SPELL_TRANSFORM = 58668 }; @@ -48,17 +45,11 @@ class boss_cyanigosa : public CreatureScript public: boss_cyanigosa() : CreatureScript("boss_cyanigosa") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<boss_cyanigosaAI>(creature); - } - - struct boss_cyanigosaAI : public ScriptedAI + struct boss_cyanigosaAI : public BossAI { - boss_cyanigosaAI(Creature* creature) : ScriptedAI(creature) + boss_cyanigosaAI(Creature* creature) : BossAI(creature, DATA_CYANIGOSA) { Initialize(); - instance = creature->GetInstanceScript(); } void Initialize() @@ -76,24 +67,20 @@ public: uint32 uiTailSweepTimer; uint32 uiUncontrollableEnergyTimer; - InstanceScript* instance; - void Reset() override { Initialize(); - instance->SetData(DATA_CYANIGOSA_EVENT, NOT_STARTED); + BossAI::Reset(); } - void EnterCombat(Unit* /*who*/) override + void EnterCombat(Unit* who) override { + BossAI::EnterCombat(who); Talk(SAY_AGGRO); - - instance->SetData(DATA_CYANIGOSA_EVENT, IN_PROGRESS); } void MoveInLineOfSight(Unit* /*who*/) override { } - void UpdateAI(uint32 diff) override { if (instance->GetData(DATA_REMOVE_NPC) == 1) @@ -102,13 +89,12 @@ public: instance->SetData(DATA_REMOVE_NPC, 0); } - //Return since we have no target if (!UpdateVictim()) return; if (uiArcaneVacuumTimer <= diff) { - DoCast(SPELL_ARCANE_VACUUM); + DoCastAOE(SPELL_ARCANE_VACUUM); uiArcaneVacuumTimer = 10000; } else uiArcaneVacuumTimer -= diff; @@ -121,7 +107,7 @@ public: if (uiTailSweepTimer <= diff) { - DoCast(SPELL_TAIL_SWEEP); + DoCastVictim(SPELL_TAIL_SWEEP); uiTailSweepTimer = 20000; } else uiTailSweepTimer -= diff; @@ -144,22 +130,23 @@ public: DoMeleeAttackIfReady(); } - void JustDied(Unit* /*killer*/) override + void JustDied(Unit* killer) override { + BossAI::JustDied(killer); Talk(SAY_DEATH); - - instance->SetData(DATA_CYANIGOSA_EVENT, DONE); } void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER) - return; - - Talk(SAY_SLAY); + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); } }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<boss_cyanigosaAI>(creature); + } }; class achievement_defenseless : public AchievementCriteriaScript diff --git a/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp b/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp index e990b8796de..5c8d4b8691a 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp @@ -24,9 +24,7 @@ enum Spells SPELL_BLOODLUST = 54516, SPELL_BREAK_BONDS = 59463, SPELL_CHAIN_HEAL = 54481, - H_SPELL_CHAIN_HEAL = 59473, SPELL_EARTH_SHIELD = 54479, - H_SPELL_EARTH_SHIELD = 59471, SPELL_EARTH_SHOCK = 54511, SPELL_LIGHTNING_BOLT = 53044, SPELL_STORMSTRIKE = 51876 @@ -47,11 +45,6 @@ class boss_erekem : public CreatureScript public: boss_erekem() : CreatureScript("boss_erekem") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<boss_erekemAI>(creature); - } - struct boss_erekemAI : public ScriptedAI { boss_erekemAI(Creature* creature) : ScriptedAI(creature) @@ -81,9 +74,9 @@ public: { Initialize(); if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetData(DATA_1ST_BOSS_EVENT, NOT_STARTED); + instance->SetBossState(DATA_1ST_BOSS_EVENT, NOT_STARTED); else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetData(DATA_2ND_BOSS_EVENT, NOT_STARTED); + instance->SetBossState(DATA_2ND_BOSS_EVENT, NOT_STARTED); if (Creature* pGuard1 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_1))) { @@ -129,25 +122,23 @@ public: Talk(SAY_AGGRO); DoCast(me, SPELL_EARTH_SHIELD); - if (GameObject* pDoor = instance->instance->GetGameObject(instance->GetGuidData(DATA_EREKEM_CELL))) - if (pDoor->GetGoState() == GO_STATE_READY) + if (GameObject* door = instance->GetGameObject(DATA_EREKEM_CELL)) + if (door->GetGoState() == GO_STATE_READY) { EnterEvadeMode(); return; } if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetData(DATA_1ST_BOSS_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_1ST_BOSS_EVENT, IN_PROGRESS); else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetData(DATA_2ND_BOSS_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_2ND_BOSS_EVENT, IN_PROGRESS); } void MoveInLineOfSight(Unit* /*who*/) override { } - void UpdateAI(uint32 diff) override { - //Return since we have no target if (!UpdateVictim()) return; @@ -212,22 +203,20 @@ public: if (instance->GetData(DATA_WAVE_COUNT) == 6) { - instance->SetData(DATA_1ST_BOSS_EVENT, DONE); + instance->SetBossState(DATA_1ST_BOSS_EVENT, DONE); instance->SetData(DATA_WAVE_COUNT, 7); } else if (instance->GetData(DATA_WAVE_COUNT) == 12) { - instance->SetData(DATA_2ND_BOSS_EVENT, DONE); + instance->SetBossState(DATA_2ND_BOSS_EVENT, DONE); instance->SetData(DATA_WAVE_COUNT, 13); } } void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER) - return; - - Talk(SAY_SLAY); + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); } ObjectGuid GetChainHealTargetGUID() @@ -247,6 +236,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<boss_erekemAI>(creature); + } }; enum GuardSpells @@ -261,11 +254,6 @@ class npc_erekem_guard : public CreatureScript public: npc_erekem_guard() : CreatureScript("npc_erekem_guard") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_erekem_guardAI>(creature); - } - struct npc_erekem_guardAI : public ScriptedAI { npc_erekem_guardAI(Creature* creature) : ScriptedAI(creature) @@ -308,7 +296,6 @@ public: void MoveInLineOfSight(Unit* /*who*/) override { } - void UpdateAI(uint32 diff) override { if (!UpdateVictim()) @@ -336,6 +323,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<npc_erekem_guardAI>(creature); + } }; void AddSC_boss_erekem() diff --git a/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp b/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp index 48fe8049d19..9be73febd52 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp @@ -23,19 +23,16 @@ enum Spells { SPELL_DRAINED = 59820, SPELL_FRENZY = 54312, - SPELL_FRENZY_H = 59522, SPELL_PROTECTIVE_BUBBLE = 54306, SPELL_WATER_BLAST = 54237, - SPELL_WATER_BLAST_H = 59520, SPELL_WATER_BOLT_VOLLEY = 54241, - SPELL_WATER_BOLT_VOLLEY_H = 59521, SPELL_SPLASH = 59516, SPELL_WATER_GLOBULE = 54268 }; enum IchoronCreatures { - NPC_ICHOR_GLOBULE = 29321, + NPC_ICHOR_GLOBULE = 29321 }; enum Yells @@ -52,18 +49,18 @@ enum Yells enum Actions { ACTION_WATER_ELEMENT_HIT = 1, - ACTION_WATER_ELEMENT_KILLED = 2, + ACTION_WATER_ELEMENT_KILLED = 2 }; /// @todo get those positions from spawn of creature 29326 #define MAX_SPAWN_LOC 5 -static Position SpawnLoc[MAX_SPAWN_LOC]= +static Position const SpawnLoc[MAX_SPAWN_LOC]= { {1840.64f, 795.407f, 44.079f, 1.676f}, {1886.24f, 757.733f, 47.750f, 5.201f}, {1877.91f, 845.915f, 43.417f, 3.560f}, {1918.97f, 850.645f, 47.225f, 4.136f}, - {1935.50f, 796.224f, 52.492f, 4.224f}, + {1935.50f, 796.224f, 52.492f, 4.224f} }; enum Misc @@ -76,11 +73,6 @@ class boss_ichoron : public CreatureScript public: boss_ichoron() : CreatureScript("boss_ichoron") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<boss_ichoronAI>(creature); - } - struct boss_ichoronAI : public ScriptedAI { boss_ichoronAI(Creature* creature) : ScriptedAI(creature), m_waterElements(creature) @@ -117,9 +109,9 @@ public: DespawnWaterElements(); if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetData(DATA_1ST_BOSS_EVENT, NOT_STARTED); + instance->SetBossState(DATA_1ST_BOSS_EVENT, NOT_STARTED); else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetData(DATA_2ND_BOSS_EVENT, NOT_STARTED); + instance->SetBossState(DATA_2ND_BOSS_EVENT, NOT_STARTED); } void EnterCombat(Unit* /*who*/) override @@ -128,16 +120,17 @@ public: DoCast(me, SPELL_PROTECTIVE_BUBBLE); - if (GameObject* pDoor = instance->instance->GetGameObject(instance->GetGuidData(DATA_ICHORON_CELL))) - if (pDoor->GetGoState() == GO_STATE_READY) + if (GameObject* door = instance->GetGameObject(DATA_ICHORON_CELL)) + if (door->GetGoState() == GO_STATE_READY) { EnterEvadeMode(); return; } + if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetData(DATA_1ST_BOSS_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_1ST_BOSS_EVENT, IN_PROGRESS); else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetData(DATA_2ND_BOSS_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_2ND_BOSS_EVENT, IN_PROGRESS); } void AttackStart(Unit* who) override @@ -208,7 +201,6 @@ public: void MoveInLineOfSight(Unit* /*who*/) override { } - void UpdateAI(uint32 uiDiff) override { if (!UpdateVictim()) @@ -230,7 +222,7 @@ public: if (!me->HasAura(SPELL_PROTECTIVE_BUBBLE)) { Talk(SAY_SHATTER); - DoCast(me, SPELL_WATER_BLAST); + DoCast(me, SPELL_WATER_BLAST); // wrong target DoCast(me, SPELL_DRAINED); bIsExploded = true; me->AttackStop(); @@ -291,12 +283,12 @@ public: if (instance->GetData(DATA_WAVE_COUNT) == 6) { - instance->SetData(DATA_1ST_BOSS_EVENT, DONE); + instance->SetBossState(DATA_1ST_BOSS_EVENT, DONE); instance->SetData(DATA_WAVE_COUNT, 7); } else if (instance->GetData(DATA_WAVE_COUNT) == 12) { - instance->SetData(DATA_2ND_BOSS_EVENT, DONE); + instance->SetBossState(DATA_2ND_BOSS_EVENT, DONE); instance->SetData(DATA_WAVE_COUNT, 13); } } @@ -323,13 +315,15 @@ public: void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER) - return; - - Talk(SAY_SLAY); + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); } }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<boss_ichoronAI>(creature); + } }; class npc_ichor_globule : public CreatureScript @@ -337,11 +331,6 @@ class npc_ichor_globule : public CreatureScript public: npc_ichor_globule() : CreatureScript("npc_ichor_globule") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_ichor_globuleAI>(creature); - } - struct npc_ichor_globuleAI : public ScriptedAI { npc_ichor_globuleAI(Creature* creature) : ScriptedAI(creature) @@ -367,19 +356,18 @@ public: void AttackStart(Unit* /*who*/) override { - return; } void UpdateAI(uint32 uiDiff) override { if (uiRangeCheck_Timer < uiDiff) { - if (Creature* pIchoron = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ICHORON))) + if (Creature* ichoron = instance->GetCreature(DATA_ICHORON)) { - if (me->IsWithinDist(pIchoron, 2.0f, false)) + if (me->IsWithinDist(ichoron, 2.0f, false)) { - if (pIchoron->AI()) - pIchoron->AI()->DoAction(ACTION_WATER_ELEMENT_HIT); + if (ichoron->AI()) + ichoron->AI()->DoAction(ACTION_WATER_ELEMENT_HIT); me->DespawnOrUnsummon(); } } @@ -391,12 +379,16 @@ public: void JustDied(Unit* /*killer*/) override { DoCast(me, SPELL_SPLASH); - if (Creature* pIchoron = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ICHORON))) - if (pIchoron->AI()) - pIchoron->AI()->DoAction(ACTION_WATER_ELEMENT_KILLED); + if (Creature* ichoron = instance->GetCreature(DATA_ICHORON)) + if (ichoron->AI()) + ichoron->AI()->DoAction(ACTION_WATER_ELEMENT_KILLED); } }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<npc_ichor_globuleAI>(creature); + } }; class achievement_dehydration : public AchievementCriteriaScript diff --git a/src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp b/src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp index c3df7b71b83..5040dccfa36 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp @@ -21,13 +21,10 @@ enum Spells { - SPELL_CAUTERIZING_FLAMES = 59466, //Only in heroic - SPELL_FIREBOLT = 54235, - H_SPELL_FIREBOLT = 59468, - SPELL_FLAME_BREATH = 54282, - H_SPELL_FLAME_BREATH = 59469, - SPELL_LAVA_BURN = 54249, - H_SPELL_LAVA_BURN = 59594 + SPELL_CAUTERIZING_FLAMES = 59466, // Only in heroic + SPELL_FIREBOLT = 54235, + SPELL_FLAME_BREATH = 54282, + SPELL_LAVA_BURN = 54249 }; class boss_lavanthor : public CreatureScript @@ -35,11 +32,6 @@ class boss_lavanthor : public CreatureScript public: boss_lavanthor() : CreatureScript("boss_lavanthor") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<boss_lavanthorAI>(creature); - } - struct boss_lavanthorAI : public ScriptedAI { boss_lavanthorAI(Creature* creature) : ScriptedAI(creature) @@ -67,23 +59,24 @@ public: { Initialize(); if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetData(DATA_1ST_BOSS_EVENT, NOT_STARTED); + instance->SetBossState(DATA_1ST_BOSS_EVENT, NOT_STARTED); else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetData(DATA_2ND_BOSS_EVENT, NOT_STARTED); + instance->SetBossState(DATA_2ND_BOSS_EVENT, NOT_STARTED); } void EnterCombat(Unit* /*who*/) override { - if (GameObject* pDoor = instance->instance->GetGameObject(instance->GetGuidData(DATA_LAVANTHOR_CELL))) - if (pDoor->GetGoState() == GO_STATE_READY) - { - EnterEvadeMode(); - return; - } - if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetData(DATA_1ST_BOSS_EVENT, IN_PROGRESS); - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetData(DATA_2ND_BOSS_EVENT, IN_PROGRESS); + if (GameObject* door = instance->GetGameObject(DATA_LAVANTHOR_CELL)) + if (door->GetGoState() == GO_STATE_READY) + { + EnterEvadeMode(); + return; + } + + if (instance->GetData(DATA_WAVE_COUNT) == 6) + instance->SetBossState(DATA_1ST_BOSS_EVENT, IN_PROGRESS); + else if (instance->GetData(DATA_WAVE_COUNT) == 12) + instance->SetBossState(DATA_2ND_BOSS_EVENT, IN_PROGRESS); } void AttackStart(Unit* who) override @@ -102,10 +95,8 @@ public: void MoveInLineOfSight(Unit* /*who*/) override { } - void UpdateAI(uint32 diff) override { - //Return since we have no target if (!UpdateVictim()) return; @@ -123,9 +114,10 @@ public: if (uiLavaBurnTimer <= diff) { - DoCastVictim(SPELL_LAVA_BURN); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true)) + DoCast(target, SPELL_LAVA_BURN); uiLavaBurnTimer = urand(15000, 23000); - } + } else uiLavaBurnTimer -= diff; if (IsHeroic()) { @@ -143,17 +135,21 @@ public: { if (instance->GetData(DATA_WAVE_COUNT) == 6) { - instance->SetData(DATA_1ST_BOSS_EVENT, DONE); + instance->SetBossState(DATA_1ST_BOSS_EVENT, DONE); instance->SetData(DATA_WAVE_COUNT, 7); } else if (instance->GetData(DATA_WAVE_COUNT) == 12) { - instance->SetData(DATA_2ND_BOSS_EVENT, DONE); + instance->SetBossState(DATA_2ND_BOSS_EVENT, DONE); instance->SetData(DATA_WAVE_COUNT, 13); } } }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<boss_lavanthorAI>(creature); + } }; void AddSC_boss_lavanthor() diff --git a/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp b/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp index 9a6422dec32..1c98806b127 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp @@ -19,11 +19,12 @@ #include "ScriptedCreature.h" #include "violet_hold.h" -//Spells enum Spells { SPELL_CORROSIVE_SALIVA = 54527, - SPELL_OPTIC_LINK = 54396 + SPELL_OPTIC_LINK = 54396, + SPELL_RAY_OF_PAIN = 54438, // NYI missing spelldifficulty + SPELL_RAY_OF_SUFFERING = 54442 // NYI missing spelldifficulty }; class boss_moragg : public CreatureScript @@ -31,11 +32,6 @@ class boss_moragg : public CreatureScript public: boss_moragg() : CreatureScript("boss_moragg") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<boss_moraggAI>(creature); - } - struct boss_moraggAI : public ScriptedAI { boss_moraggAI(Creature* creature) : ScriptedAI(creature) @@ -60,23 +56,24 @@ public: Initialize(); if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetData(DATA_1ST_BOSS_EVENT, NOT_STARTED); + instance->SetBossState(DATA_1ST_BOSS_EVENT, NOT_STARTED); else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetData(DATA_2ND_BOSS_EVENT, NOT_STARTED); + instance->SetBossState(DATA_2ND_BOSS_EVENT, NOT_STARTED); } void EnterCombat(Unit* /*who*/) override { - if (GameObject* pDoor = instance->instance->GetGameObject(instance->GetGuidData(DATA_MORAGG_CELL))) - if (pDoor->GetGoState() == GO_STATE_READY) + if (GameObject* door = instance->GetGameObject(DATA_MORAGG_CELL)) + if (door->GetGoState() == GO_STATE_READY) { EnterEvadeMode(); return; } + if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetData(DATA_1ST_BOSS_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_1ST_BOSS_EVENT, IN_PROGRESS); else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetData(DATA_2ND_BOSS_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_2ND_BOSS_EVENT, IN_PROGRESS); } void AttackStart(Unit* who) override @@ -95,10 +92,8 @@ public: void MoveInLineOfSight(Unit* /*who*/) override { } - void UpdateAI(uint32 diff) override { - //Return since we have no target if (!UpdateVictim()) return; @@ -117,21 +112,26 @@ public: DoMeleeAttackIfReady(); } + void JustDied(Unit* /*killer*/) override { if (instance->GetData(DATA_WAVE_COUNT) == 6) { - instance->SetData(DATA_1ST_BOSS_EVENT, DONE); + instance->SetBossState(DATA_1ST_BOSS_EVENT, DONE); instance->SetData(DATA_WAVE_COUNT, 7); } else if (instance->GetData(DATA_WAVE_COUNT) == 12) { - instance->SetData(DATA_2ND_BOSS_EVENT, DONE); + instance->SetBossState(DATA_2ND_BOSS_EVENT, DONE); instance->SetData(DATA_WAVE_COUNT, 13); } } }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<boss_moraggAI>(creature); + } }; void AddSC_boss_moragg() diff --git a/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp b/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp index 833b06cfbff..d1efcb8ca7a 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp @@ -23,9 +23,7 @@ enum Spells { SPELL_ARCANE_BARRAGE_VOLLEY = 54202, - SPELL_ARCANE_BARRAGE_VOLLEY_H = 59483, SPELL_ARCANE_BUFFET = 54226, - SPELL_ARCANE_BUFFET_H = 59485, SPELL_SUMMON_ETHEREAL_SPHERE_1 = 54102, SPELL_SUMMON_ETHEREAL_SPHERE_2 = 54137, SPELL_SUMMON_ETHEREAL_SPHERE_3 = 54138 @@ -40,7 +38,6 @@ enum NPCs enum CreatureSpells { SPELL_ARCANE_POWER = 54160, - H_SPELL_ARCANE_POWER = 59474, SPELL_SUMMON_PLAYERS = 54164, SPELL_POWER_BALL_VISUAL = 54141 }; @@ -61,11 +58,6 @@ class boss_xevozz : public CreatureScript public: boss_xevozz() : CreatureScript("boss_xevozz") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<boss_xevozzAI>(creature); - } - struct boss_xevozzAI : public ScriptedAI { boss_xevozzAI(Creature* creature) : ScriptedAI(creature) @@ -90,9 +82,9 @@ public: void Reset() override { if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetData(DATA_1ST_BOSS_EVENT, NOT_STARTED); + instance->SetBossState(DATA_1ST_BOSS_EVENT, NOT_STARTED); else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetData(DATA_2ND_BOSS_EVENT, NOT_STARTED); + instance->SetBossState(DATA_2ND_BOSS_EVENT, NOT_STARTED); Initialize(); DespawnSphere(); @@ -139,46 +131,46 @@ public: void EnterCombat(Unit* /*who*/) override { - Talk(SAY_AGGRO); - if (GameObject* pDoor = instance->instance->GetGameObject(instance->GetGuidData(DATA_XEVOZZ_CELL))) - if (pDoor->GetGoState() == GO_STATE_READY) + if (GameObject* door = instance->GetGameObject(DATA_XEVOZZ_CELL)) + if (door->GetGoState() == GO_STATE_READY) { EnterEvadeMode(); return; } + + Talk(SAY_AGGRO); + if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetData(DATA_1ST_BOSS_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_1ST_BOSS_EVENT, IN_PROGRESS); else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetData(DATA_2ND_BOSS_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_2ND_BOSS_EVENT, IN_PROGRESS); } void MoveInLineOfSight(Unit* /*who*/) override { } - - void UpdateAI(uint32 uiDiff) override + void UpdateAI(uint32 diff) override { - //Return since we have no target if (!UpdateVictim()) return; - if (uiArcaneBarrageVolley_Timer < uiDiff) + if (uiArcaneBarrageVolley_Timer < diff) { DoCast(me, SPELL_ARCANE_BARRAGE_VOLLEY); uiArcaneBarrageVolley_Timer = urand(20000, 22000); } - else uiArcaneBarrageVolley_Timer -= uiDiff; + else uiArcaneBarrageVolley_Timer -= diff; if (uiArcaneBuffet_Timer) { - if (uiArcaneBuffet_Timer < uiDiff) + if (uiArcaneBuffet_Timer < diff) { DoCastVictim(SPELL_ARCANE_BUFFET); uiArcaneBuffet_Timer = 0; } - else uiArcaneBuffet_Timer -= uiDiff; + else uiArcaneBuffet_Timer -= diff; } - if (uiSummonEtherealSphere_Timer < uiDiff) + if (uiSummonEtherealSphere_Timer < diff) { Talk(SAY_SPAWN); DoCast(me, SPELL_SUMMON_ETHEREAL_SPHERE_1); @@ -188,7 +180,7 @@ public: uiSummonEtherealSphere_Timer = urand(45000, 47000); uiArcaneBuffet_Timer = urand(5000, 6000); } - else uiSummonEtherealSphere_Timer -= uiDiff; + else uiSummonEtherealSphere_Timer -= diff; DoMeleeAttackIfReady(); } @@ -201,24 +193,27 @@ public: if (instance->GetData(DATA_WAVE_COUNT) == 6) { - instance->SetData(DATA_1ST_BOSS_EVENT, DONE); + instance->SetBossState(DATA_1ST_BOSS_EVENT, DONE); instance->SetData(DATA_WAVE_COUNT, 7); } else if (instance->GetData(DATA_WAVE_COUNT) == 12) { - instance->SetData(DATA_2ND_BOSS_EVENT, NOT_STARTED); + instance->SetBossState(DATA_2ND_BOSS_EVENT, NOT_STARTED); instance->SetData(DATA_WAVE_COUNT, 13); } } + void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER) - return; - - Talk(SAY_SLAY); + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); } }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<boss_xevozzAI>(creature); + } }; class npc_ethereal_sphere : public CreatureScript @@ -226,11 +221,6 @@ class npc_ethereal_sphere : public CreatureScript public: npc_ethereal_sphere() : CreatureScript("npc_ethereal_sphere") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_ethereal_sphereAI>(creature); - } - struct npc_ethereal_sphereAI : public ScriptedAI { npc_ethereal_sphereAI(Creature* creature) : ScriptedAI(creature) @@ -255,16 +245,15 @@ public: Initialize(); } - void UpdateAI(uint32 uiDiff) override + void UpdateAI(uint32 diff) override { - //Return since we have no target if (!UpdateVictim()) return; if (!me->HasAura(SPELL_POWER_BALL_VISUAL)) DoCast(me, SPELL_POWER_BALL_VISUAL); - if (uiRangeCheck_Timer < uiDiff) + if (uiRangeCheck_Timer < diff) { if (Creature* pXevozz = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_XEVOZZ))) { @@ -276,9 +265,9 @@ public: } uiRangeCheck_Timer = 1000; } - else uiRangeCheck_Timer -= uiDiff; + else uiRangeCheck_Timer -= diff; - if (uiSummonPlayers_Timer < uiDiff) + if (uiSummonPlayers_Timer < diff) { DoCast(me, SPELL_SUMMON_PLAYERS); // not working right @@ -295,10 +284,14 @@ public: uiSummonPlayers_Timer = urand(33000, 35000); } - else uiSummonPlayers_Timer -= uiDiff; + else uiSummonPlayers_Timer -= diff; } }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<npc_ethereal_sphereAI>(creature); + } }; void AddSC_boss_xevozz() diff --git a/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp b/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp index 90fd936e853..c29861f08a4 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp @@ -22,15 +22,13 @@ enum Spells { SPELL_SHROUD_OF_DARKNESS = 54524, - H_SPELL_SHROUD_OF_DARKNESS = 59745, SPELL_SUMMON_VOID_SENTRY = 54369, - SPELL_VOID_SHIFT = 54361, - H_SPELL_VOID_SHIFT = 59743, + SPELL_VOID_SHIFT = 54361 }; enum Creatures { - NPC_VOID_SENTRY = 29364 + NPC_VOID_SENTRY = 29364 }; enum Yells @@ -53,11 +51,6 @@ class boss_zuramat : public CreatureScript public: boss_zuramat() : CreatureScript("boss_zuramat") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<boss_zuramatAI>(creature); - } - struct boss_zuramatAI : public ScriptedAI { boss_zuramatAI(Creature* creature) : ScriptedAI(creature) @@ -107,25 +100,25 @@ public: void EnterCombat(Unit* /*who*/) override { - Talk(SAY_AGGRO); - if (GameObject* pDoor = instance->instance->GetGameObject(instance->GetGuidData(DATA_ZURAMAT_CELL))) - if (pDoor->GetGoState() == GO_STATE_READY) + if (GameObject* door = instance->GetGameObject(DATA_ZURAMAT_CELL)) + if (door->GetGoState() == GO_STATE_READY) { EnterEvadeMode(); return; } + + Talk(SAY_AGGRO); + if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetData(DATA_1ST_BOSS_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_1ST_BOSS_EVENT, IN_PROGRESS); else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetData(DATA_2ND_BOSS_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_2ND_BOSS_EVENT, IN_PROGRESS); } void MoveInLineOfSight(Unit* /*who*/) override { } - void UpdateAI(uint32 diff) override { - //Return since we have no target if (!UpdateVictim()) return; @@ -171,26 +164,27 @@ public: if (instance->GetData(DATA_WAVE_COUNT) == 6) { - instance->SetData(DATA_1ST_BOSS_EVENT, DONE); + instance->SetBossState(DATA_1ST_BOSS_EVENT, DONE); instance->SetData(DATA_WAVE_COUNT, 7); } else if (instance->GetData(DATA_WAVE_COUNT) == 12) { - instance->SetData(DATA_2ND_BOSS_EVENT, DONE); + instance->SetBossState(DATA_2ND_BOSS_EVENT, DONE); instance->SetData(DATA_WAVE_COUNT, 13); } } void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER) - return; - - Talk(SAY_SLAY); + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); } - }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<boss_zuramatAI>(creature); + } }; class achievement_void_dance : public AchievementCriteriaScript diff --git a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp index ef9ad806c89..28c56a02255 100644 --- a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp +++ b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp @@ -22,8 +22,6 @@ #include "Player.h" #include "TemporarySummon.h" -#define MAX_ENCOUNTER 3 - /* Violet Hold encounters: 0 - First boss 1 - Second boss @@ -38,21 +36,6 @@ 6 - Zuramat 7 - Cyanigosa */ -enum GameObjects -{ - GO_MAIN_DOOR = 191723, - GO_XEVOZZ_DOOR = 191556, - GO_LAVANTHOR_DOOR = 191566, - GO_ICHORON_DOOR = 191722, - GO_ZURAMAT_DOOR = 191565, - GO_EREKEM_DOOR = 191564, - GO_EREKEM_GUARD_1_DOOR = 191563, - GO_EREKEM_GUARD_2_DOOR = 191562, - GO_MORAGG_DOOR = 191606, - GO_INTRO_ACTIVATION_CRYSTAL = 193615, - GO_ACTIVATION_CRYSTAL = 193611 -}; - enum AzureSaboteurSpells { SABOTEUR_SHIELD_DISRUPTION = 58291, @@ -64,7 +47,7 @@ enum CrystalSpells SPELL_ARCANE_LIGHTNING = 57930 }; -const Position PortalLocation[] = +Position const PortalLocation[] = { {1877.51f, 850.104f, 44.6599f, 4.7822f }, // WP 1 {1918.37f, 853.437f, 47.1624f, 4.12294f}, // WP 2 @@ -74,21 +57,21 @@ const Position PortalLocation[] = {1908.31f, 809.657f, 38.7037f, 3.08701f} // WP 6 }; -const Position ArcaneSphere = {1887.060059f, 806.151001f, 61.321602f, 0.0f}; -const Position BossStartMove1 = {1894.684448f, 739.390503f, 47.668003f, 0.0f}; -const Position BossStartMove2 = {1875.173950f, 860.832703f, 43.333565f, 0.0f}; -const Position BossStartMove21 = {1858.854614f, 855.071411f, 43.333565f, 0.0f}; -const Position BossStartMove22 = {1891.926636f, 863.388977f, 43.333565f, 0.0f}; -const Position BossStartMove3 = {1916.138062f, 778.152222f, 35.772308f, 0.0f}; -const Position BossStartMove4 = {1853.618286f, 758.557617f, 38.657505f, 0.0f}; -const Position BossStartMove5 = {1906.683960f, 842.348022f, 38.637459f, 0.0f}; -const Position BossStartMove6 = {1928.207031f, 852.864441f, 47.200813f, 0.0f}; - -const Position CyanigosasSpawnLocation = {1930.281250f, 804.407715f, 52.410946f, 3.139621f}; -const Position MiddleRoomLocation = {1892.291260f, 805.696838f, 38.438862f, 3.139621f}; -const Position MiddleRoomPortalSaboLocation = {1896.622925f, 804.854126f, 38.504772f, 3.139621f}; - -//Cyanigosa's prefight event data +Position const ArcaneSphere = {1887.060059f, 806.151001f, 61.321602f, 0.0f}; +Position const BossStartMove1 = {1894.684448f, 739.390503f, 47.668003f, 0.0f}; +Position const BossStartMove2 = {1875.173950f, 860.832703f, 43.333565f, 0.0f}; +Position const BossStartMove21 = {1858.854614f, 855.071411f, 43.333565f, 0.0f}; +Position const BossStartMove22 = {1891.926636f, 863.388977f, 43.333565f, 0.0f}; +Position const BossStartMove3 = {1916.138062f, 778.152222f, 35.772308f, 0.0f}; +Position const BossStartMove4 = {1853.618286f, 758.557617f, 38.657505f, 0.0f}; +Position const BossStartMove5 = {1906.683960f, 842.348022f, 38.637459f, 0.0f}; +Position const BossStartMove6 = {1928.207031f, 852.864441f, 47.200813f, 0.0f}; + +Position const CyanigosasSpawnLocation = {1930.281250f, 804.407715f, 52.410946f, 3.139621f}; +Position const MiddleRoomLocation = {1892.291260f, 805.696838f, 38.438862f, 3.139621f}; +Position const MiddleRoomPortalSaboLocation = {1896.622925f, 804.854126f, 38.504772f, 3.139621f}; + +// Cyanigosa's prefight event data enum Yells { CYANIGOSA_SAY_SPAWN = 0 @@ -100,21 +83,45 @@ enum Spells CYANIGOSA_BLUE_AURA = 47759, }; +ObjectData const creatureData[] = +{ + { NPC_XEVOZZ, DATA_XEVOZZ }, + { NPC_LAVANTHOR, DATA_LAVANTHOR }, + { NPC_ICHORON, DATA_ICHORON }, + { NPC_ZURAMAT, DATA_ZURAMAT }, + { NPC_EREKEM, DATA_EREKEM }, + { NPC_MORAGG, DATA_MORAGG }, + { NPC_CYANIGOSA, DATA_CYANIGOSA }, + { NPC_SINCLARI, DATA_SINCLARI }, + { 0, 0 } // END +}; + +ObjectData const gameObjectData[] = +{ + { GO_EREKEM_GUARD_1_DOOR, DATA_EREKEM_LEFT_GUARD_CELL }, + { GO_EREKEM_GUARD_2_DOOR, DATA_EREKEM_RIGHT_GUARD_CELL }, + { GO_EREKEM_DOOR, DATA_EREKEM_CELL }, + { GO_ZURAMAT_DOOR, DATA_ZURAMAT_CELL }, + { GO_LAVANTHOR_DOOR, DATA_LAVANTHOR_CELL }, + { GO_MORAGG_DOOR, DATA_MORAGG_CELL }, + { GO_ICHORON_DOOR, DATA_ICHORON_CELL }, + { GO_XEVOZZ_DOOR, DATA_XEVOZZ_CELL }, + { GO_MAIN_DOOR, DATA_MAIN_DOOR }, + { 0, 0 } // END +}; + class instance_violet_hold : public InstanceMapScript { public: instance_violet_hold() : InstanceMapScript("instance_violet_hold", 608) { } - InstanceScript* GetInstanceScript(InstanceMap* map) const override - { - return new instance_violet_hold_InstanceMapScript(map); - } - struct instance_violet_hold_InstanceMapScript : public InstanceScript { instance_violet_hold_InstanceMapScript(Map* map) : InstanceScript(map) { SetHeaders(DataHeader); + SetBossNumber(EncounterCount); + LoadObjectData(creatureData, gameObjectData); uiRemoveNpc = 0; @@ -138,29 +145,10 @@ public: bCrystalActivated = false; defenseless = true; uiMainEventPhase = NOT_STARTED; - - memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); } - ObjectGuid uiMoragg; - ObjectGuid uiErekem; ObjectGuid uiErekemGuard[2]; - ObjectGuid uiIchoron; - ObjectGuid uiLavanthor; - ObjectGuid uiXevozz; - ObjectGuid uiZuramat; - ObjectGuid uiCyanigosa; - ObjectGuid uiSinclari; - - ObjectGuid uiMoraggCell; - ObjectGuid uiErekemCell; - ObjectGuid uiErekemLeftGuardCell; - ObjectGuid uiErekemRightGuardCell; - ObjectGuid uiIchoronCell; - ObjectGuid uiLavanthorCell; - ObjectGuid uiXevozzCell; - ObjectGuid uiZuramatCell; - ObjectGuid uiMainDoor; + ObjectGuid uiTeleportationPortal; ObjectGuid uiSaboteurPortal; @@ -180,7 +168,6 @@ public: uint8 uiDoorIntegrity; - uint16 m_auiEncounter[MAX_ENCOUNTER]; uint8 uiCountErekemGuards; uint8 uiCountActivationCrystals; uint8 uiCyanigosaEventPhase; @@ -194,52 +181,23 @@ public: std::list<uint8> NpcAtDoorCastingList; - std::string str_data; - - bool IsEncounterInProgress() const override - { - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) - return true; - - return false; - } - void OnCreatureCreate(Creature* creature) override { + InstanceScript::OnCreatureCreate(creature); + switch (creature->GetEntry()) { - case CREATURE_XEVOZZ: - uiXevozz = creature->GetGUID(); - break; - case CREATURE_LAVANTHOR: - uiLavanthor = creature->GetGUID(); - break; - case CREATURE_ICHORON: - uiIchoron = creature->GetGUID(); - break; - case CREATURE_ZURAMAT: - uiZuramat = creature->GetGUID(); - break; - case CREATURE_EREKEM: - uiErekem = creature->GetGUID(); - break; - case CREATURE_EREKEM_GUARD: + case NPC_EREKEM_GUARD: if (uiCountErekemGuards < 2) { uiErekemGuard[uiCountErekemGuards++] = creature->GetGUID(); - creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); + creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NON_ATTACKABLE); } break; - case CREATURE_MORAGG: - uiMoragg = creature->GetGUID(); + case NPC_CYANIGOSA: + creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NON_ATTACKABLE); break; - case CREATURE_CYANIGOSA: - uiCyanigosa = creature->GetGUID(); - creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); - break; - case CREATURE_SINCLARI: - uiSinclari = creature->GetGUID(); + default: break; } @@ -255,68 +213,53 @@ public: void OnGameObjectCreate(GameObject* go) override { + InstanceScript::OnGameObjectCreate(go); + switch (go->GetEntry()) { - case GO_EREKEM_GUARD_1_DOOR: - uiErekemLeftGuardCell = go->GetGUID(); - break; - case GO_EREKEM_GUARD_2_DOOR: - uiErekemRightGuardCell = go->GetGUID(); - break; - case GO_EREKEM_DOOR: - uiErekemCell = go->GetGUID(); - break; - case GO_ZURAMAT_DOOR: - uiZuramatCell = go->GetGUID(); - break; - case GO_LAVANTHOR_DOOR: - uiLavanthorCell = go->GetGUID(); - break; - case GO_MORAGG_DOOR: - uiMoraggCell = go->GetGUID(); - break; - case GO_ICHORON_DOOR: - uiIchoronCell = go->GetGUID(); - break; - case GO_XEVOZZ_DOOR: - uiXevozzCell = go->GetGUID(); - break; - case GO_MAIN_DOOR: - uiMainDoor = go->GetGUID(); - break; case GO_ACTIVATION_CRYSTAL: if (uiCountActivationCrystals < 4) uiActivationCrystal[uiCountActivationCrystals++] = go->GetGUID(); break; + default: + break; } } - void SetData(uint32 type, uint32 data) override + bool SetBossState(uint32 type, EncounterState state) override { + if (!InstanceScript::SetBossState(type, state)) + return false; + switch (type) { case DATA_1ST_BOSS_EVENT: - UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, CREATURE_EREKEM, NULL); - m_auiEncounter[0] = data; - if (data == DONE) - SaveToDB(); + if (state == DONE) + UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, NPC_EREKEM, nullptr); break; case DATA_2ND_BOSS_EVENT: - UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, CREATURE_MORAGG, NULL); - m_auiEncounter[1] = data; - if (data == DONE) - SaveToDB(); - break; - case DATA_CYANIGOSA_EVENT: - m_auiEncounter[2] = data; - if (data == DONE) + if (state == DONE) + UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, NPC_MORAGG, nullptr); + break; + case DATA_CYANIGOSA: + if (state == DONE) { - SaveToDB(); uiMainEventPhase = DONE; - if (GameObject* pMainDoor = instance->GetGameObject(uiMainDoor)) - pMainDoor->SetGoState(GO_STATE_ACTIVE); + if (GameObject* mainDoor = GetGameObject(DATA_MAIN_DOOR)) + mainDoor->SetGoState(GO_STATE_ACTIVE); } break; + default: + break; + } + + return true; + } + + void SetData(uint32 type, uint32 data) override + { + switch (type) + { case DATA_WAVE_COUNT: uiWaveCount = data; bActive = true; @@ -340,21 +283,8 @@ public: NpcAtDoorCastingList.pop_back(); break; case DATA_MAIN_DOOR: - if (GameObject* pMainDoor = instance->GetGameObject(uiMainDoor)) - { - switch (data) - { - case GO_STATE_ACTIVE: - pMainDoor->SetGoState(GO_STATE_ACTIVE); - break; - case GO_STATE_READY: - pMainDoor->SetGoState(GO_STATE_READY); - break; - case GO_STATE_ACTIVE_ALTERNATIVE: - pMainDoor->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); - break; - } - } + if (GameObject* mainDoor = GetGameObject(type)) + mainDoor->SetGoState(GOState(data)); break; case DATA_START_BOSS_ENCOUNTER: switch (uiWaveCount) @@ -374,7 +304,7 @@ public: uiMainEventPhase = data; if (data == IN_PROGRESS) // Start event { - if (GameObject* mainDoor = instance->GetGameObject(uiMainDoor)) + if (GameObject* mainDoor = GetGameObject(DATA_MAIN_DOOR)) mainDoor->SetGoState(GO_STATE_READY); uiWaveCount = 1; bActive = true; @@ -404,9 +334,6 @@ public: { switch (type) { - case DATA_1ST_BOSS_EVENT: return m_auiEncounter[0]; - case DATA_2ND_BOSS_EVENT: return m_auiEncounter[1]; - case DATA_CYANIGOSA_EVENT: return m_auiEncounter[2]; case DATA_WAVE_COUNT: return uiWaveCount; case DATA_REMOVE_NPC: return uiRemoveNpc; case DATA_PORTAL_LOCATION: return uiLocation; @@ -421,125 +348,107 @@ public: return 0; } - ObjectGuid GetGuidData(uint32 identifier) const override + ObjectGuid GetGuidData(uint32 type) const override { - switch (identifier) + switch (type) { - case DATA_MORAGG: return uiMoragg; - case DATA_EREKEM: return uiErekem; case DATA_EREKEM_GUARD_1: return uiErekemGuard[0]; case DATA_EREKEM_GUARD_2: return uiErekemGuard[1]; - case DATA_ICHORON: return uiIchoron; - case DATA_LAVANTHOR: return uiLavanthor; - case DATA_XEVOZZ: return uiXevozz; - case DATA_ZURAMAT: return uiZuramat; - case DATA_CYANIGOSA: return uiCyanigosa; - case DATA_MORAGG_CELL: return uiMoraggCell; - case DATA_EREKEM_CELL: return uiErekemCell; - case DATA_EREKEM_RIGHT_GUARD_CELL: return uiErekemRightGuardCell; - case DATA_EREKEM_LEFT_GUARD_CELL: return uiErekemLeftGuardCell; - case DATA_ICHORON_CELL: return uiIchoronCell; - case DATA_LAVANTHOR_CELL: return uiLavanthorCell; - case DATA_XEVOZZ_CELL: return uiXevozzCell; - case DATA_ZURAMAT_CELL: return uiZuramatCell; - case DATA_MAIN_DOOR: return uiMainDoor; - case DATA_SINCLARI: return uiSinclari; case DATA_TELEPORTATION_PORTAL: return uiTeleportationPortal; case DATA_SABOTEUR_PORTAL: return uiSaboteurPortal; } - return ObjectGuid::Empty; + return InstanceScript::GetGuidData(type); } void SpawnPortal() { SetData(DATA_PORTAL_LOCATION, (GetData(DATA_PORTAL_LOCATION) + urand(1, 5))%6); - if (Creature* pSinclari = instance->GetCreature(uiSinclari)) - if (Creature* portal = pSinclari->SummonCreature(CREATURE_TELEPORTATION_PORTAL, PortalLocation[GetData(DATA_PORTAL_LOCATION)], TEMPSUMMON_CORPSE_DESPAWN)) + if (Creature* sinclari = GetCreature(DATA_SINCLARI)) + if (Creature* portal = sinclari->SummonCreature(NPC_TELEPORTATION_PORTAL, PortalLocation[GetData(DATA_PORTAL_LOCATION)], TEMPSUMMON_CORPSE_DESPAWN)) uiTeleportationPortal = portal->GetGUID(); } void StartBossEncounter(uint8 uiBoss, bool bForceRespawn = true) { - Creature* pBoss = NULL; + Creature* boss = nullptr; switch (uiBoss) { case BOSS_MORAGG: - HandleGameObject(uiMoraggCell, bForceRespawn); - pBoss = instance->GetCreature(uiMoragg); - if (pBoss) - pBoss->GetMotionMaster()->MovePoint(0, BossStartMove1); + HandleGameObject(GetObjectGuid(DATA_MORAGG_CELL), bForceRespawn); + boss = GetCreature(DATA_MORAGG); + if (boss) + boss->GetMotionMaster()->MovePoint(0, BossStartMove1); break; case BOSS_EREKEM: - HandleGameObject(uiErekemCell, bForceRespawn); - HandleGameObject(uiErekemRightGuardCell, bForceRespawn); - HandleGameObject(uiErekemLeftGuardCell, bForceRespawn); - - pBoss = instance->GetCreature(uiErekem); + HandleGameObject(GetObjectGuid(DATA_EREKEM_CELL), bForceRespawn); + HandleGameObject(GetObjectGuid(DATA_EREKEM_LEFT_GUARD_CELL), bForceRespawn); + HandleGameObject(GetObjectGuid(DATA_EREKEM_RIGHT_GUARD_CELL), bForceRespawn); - if (pBoss) - pBoss->GetMotionMaster()->MovePoint(0, BossStartMove2); + boss = GetCreature(DATA_EREKEM); + if (boss) + boss->GetMotionMaster()->MovePoint(0, BossStartMove2); if (Creature* pGuard1 = instance->GetCreature(uiErekemGuard[0])) { if (bForceRespawn) - pGuard1->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); + pGuard1->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NON_ATTACKABLE); else - pGuard1->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); + pGuard1->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NON_ATTACKABLE); pGuard1->GetMotionMaster()->MovePoint(0, BossStartMove21); } if (Creature* pGuard2 = instance->GetCreature(uiErekemGuard[1])) { if (bForceRespawn) - pGuard2->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); + pGuard2->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NON_ATTACKABLE); else - pGuard2->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); + pGuard2->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NON_ATTACKABLE); pGuard2->GetMotionMaster()->MovePoint(0, BossStartMove22); } break; case BOSS_ICHORON: - HandleGameObject(uiIchoronCell, bForceRespawn); - pBoss = instance->GetCreature(uiIchoron); - if (pBoss) - pBoss->GetMotionMaster()->MovePoint(0, BossStartMove3); + HandleGameObject(GetObjectGuid(DATA_ICHORON_CELL), bForceRespawn); + boss = GetCreature(DATA_ICHORON); + if (boss) + boss->GetMotionMaster()->MovePoint(0, BossStartMove3); break; case BOSS_LAVANTHOR: - HandleGameObject(uiLavanthorCell, bForceRespawn); - pBoss = instance->GetCreature(uiLavanthor); - if (pBoss) - pBoss->GetMotionMaster()->MovePoint(0, BossStartMove4); + HandleGameObject(GetObjectGuid(DATA_LAVANTHOR_CELL), bForceRespawn); + boss = GetCreature(DATA_LAVANTHOR); + if (boss) + boss->GetMotionMaster()->MovePoint(0, BossStartMove4); break; case BOSS_XEVOZZ: - HandleGameObject(uiXevozzCell, bForceRespawn); - pBoss = instance->GetCreature(uiXevozz); - if (pBoss) - pBoss->GetMotionMaster()->MovePoint(0, BossStartMove5); + HandleGameObject(GetObjectGuid(DATA_XEVOZZ_CELL), bForceRespawn); + boss = GetCreature(DATA_XEVOZZ); + if (boss) + boss->GetMotionMaster()->MovePoint(0, BossStartMove5); break; case BOSS_ZURAMAT: - HandleGameObject(uiZuramatCell, bForceRespawn); - pBoss = instance->GetCreature(uiZuramat); - if (pBoss) - pBoss->GetMotionMaster()->MovePoint(0, BossStartMove6); + HandleGameObject(GetObjectGuid(DATA_ZURAMAT_CELL), bForceRespawn); + boss = GetCreature(DATA_ZURAMAT); + if (boss) + boss->GetMotionMaster()->MovePoint(0, BossStartMove6); break; } // generic boss state changes - if (pBoss) + if (boss) { - pBoss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); - pBoss->SetReactState(REACT_AGGRESSIVE); + boss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); + boss->SetReactState(REACT_AGGRESSIVE); if (!bForceRespawn) { - if (pBoss->isDead()) + if (boss->isDead()) { // respawn but avoid to be looted again - pBoss->Respawn(); - pBoss->RemoveLootMode(1); + boss->Respawn(); + boss->RemoveLootMode(1); } - pBoss->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); + boss->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); uiWaveCount = 0; } } @@ -555,12 +464,12 @@ public: case 6: if (uiFirstBoss == 0) uiFirstBoss = urand(1, 6); - if (Creature* pSinclari = instance->GetCreature(uiSinclari)) + if (Creature* sinclari = GetCreature(DATA_SINCLARI)) { - if (Creature* pPortal = pSinclari->SummonCreature(CREATURE_TELEPORTATION_PORTAL, MiddleRoomPortalSaboLocation, TEMPSUMMON_CORPSE_DESPAWN)) - uiSaboteurPortal = pPortal->GetGUID(); - if (Creature* pAzureSaboteur = pSinclari->SummonCreature(CREATURE_SABOTEOUR, MiddleRoomLocation, TEMPSUMMON_DEAD_DESPAWN)) - pAzureSaboteur->CastSpell(pAzureSaboteur, SABOTEUR_SHIELD_EFFECT, false); + if (Creature* portal = sinclari->SummonCreature(NPC_TELEPORTATION_PORTAL, MiddleRoomPortalSaboLocation, TEMPSUMMON_CORPSE_DESPAWN)) + uiSaboteurPortal = portal->GetGUID(); + if (Creature* azureSaboteur = sinclari->SummonCreature(NPC_SABOTEOUR, MiddleRoomLocation, TEMPSUMMON_DEAD_DESPAWN)) + azureSaboteur->CastSpell(azureSaboteur, SABOTEUR_SHIELD_EFFECT, false); } break; case 12: @@ -569,25 +478,22 @@ public: { uiSecondBoss = urand(1, 6); } while (uiSecondBoss == uiFirstBoss); - if (Creature* pSinclari = instance->GetCreature(uiSinclari)) + if (Creature* sinclari = GetCreature(DATA_SINCLARI)) { - if (Creature* pPortal = pSinclari->SummonCreature(CREATURE_TELEPORTATION_PORTAL, MiddleRoomPortalSaboLocation, TEMPSUMMON_CORPSE_DESPAWN)) + if (Creature* pPortal = sinclari->SummonCreature(NPC_TELEPORTATION_PORTAL, MiddleRoomPortalSaboLocation, TEMPSUMMON_CORPSE_DESPAWN)) uiSaboteurPortal = pPortal->GetGUID(); - if (Creature* pAzureSaboteur = pSinclari->SummonCreature(CREATURE_SABOTEOUR, MiddleRoomLocation, TEMPSUMMON_DEAD_DESPAWN)) + if (Creature* pAzureSaboteur = sinclari->SummonCreature(NPC_SABOTEOUR, MiddleRoomLocation, TEMPSUMMON_DEAD_DESPAWN)) pAzureSaboteur->CastSpell(pAzureSaboteur, SABOTEUR_SHIELD_EFFECT, false); } break; case 18: - { - Creature* pSinclari = instance->GetCreature(uiSinclari); - if (pSinclari) - pSinclari->SummonCreature(CREATURE_CYANIGOSA, CyanigosasSpawnLocation, TEMPSUMMON_DEAD_DESPAWN); + if (Creature* sinclari = GetCreature(DATA_SINCLARI)) + sinclari->SummonCreature(NPC_CYANIGOSA, CyanigosasSpawnLocation, TEMPSUMMON_DEAD_DESPAWN); break; - } case 1: { - if (GameObject* pMainDoor = instance->GetGameObject(uiMainDoor)) - pMainDoor->SetGoState(GO_STATE_READY); + if (GameObject* mainDoor = GetGameObject(DATA_MAIN_DOOR)) + mainDoor->SetGoState(GO_STATE_READY); DoUpdateWorldState(WORLD_STATE_VH_PRISON_STATE, 100); // no break } @@ -597,54 +503,15 @@ public: } } - std::string GetSaveData() override + void WriteSaveDataMore(std::ostringstream& data) override { - OUT_SAVE_INST_DATA; - - std::ostringstream saveStream; - saveStream << "V H " << (uint16)m_auiEncounter[0] - << ' ' << (uint16)m_auiEncounter[1] - << ' ' << (uint16)m_auiEncounter[2] - << ' ' << (uint16)uiFirstBoss - << ' ' << (uint16)uiSecondBoss; - - str_data = saveStream.str(); - - OUT_SAVE_INST_DATA_COMPLETE; - return str_data; + data << uiFirstBoss << ' ' << uiSecondBoss; } - void Load(const char* in) override + void ReadSaveDataMore(std::istringstream& data) override { - if (!in) - { - OUT_LOAD_INST_DATA_FAIL; - return; - } - - OUT_LOAD_INST_DATA(in); - - char dataHead1, dataHead2; - uint16 data0, data1, data2, data3, data4; - - std::istringstream loadStream(in); - loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3 >> data4; - - if (dataHead1 == 'V' && dataHead2 == 'H') - { - m_auiEncounter[0] = data0; - m_auiEncounter[1] = data1; - m_auiEncounter[2] = data2; - - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) - m_auiEncounter[i] = NOT_STARTED; - - uiFirstBoss = uint8(data3); - uiSecondBoss = uint8(data4); - } else OUT_LOAD_INST_DATA_FAIL; - - OUT_LOAD_INST_DATA_COMPLETE; + data >> uiFirstBoss; + data >> uiSecondBoss; } bool CheckWipe() @@ -695,54 +562,51 @@ public: if (GameObject* crystal = instance->GetGameObject(uiActivationCrystal[i])) crystal->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - if (Creature* pSinclari = instance->GetCreature(uiSinclari)) + if (Creature* sinclari = GetCreature(DATA_SINCLARI)) { - pSinclari->SetVisible(true); + sinclari->SetVisible(true); std::list<Creature*> GuardList; - pSinclari->GetCreatureListWithEntryInGrid(GuardList, NPC_VIOLET_HOLD_GUARD, 40.0f); + sinclari->GetCreatureListWithEntryInGrid(GuardList, NPC_VIOLET_HOLD_GUARD, 40.0f); if (!GuardList.empty()) { - for (std::list<Creature*>::const_iterator itr = GuardList.begin(); itr != GuardList.end(); ++itr) + for (Creature* guard : GuardList) { - if (Creature* pGuard = *itr) - { - pGuard->SetVisible(true); - pGuard->SetReactState(REACT_AGGRESSIVE); - pGuard->GetMotionMaster()->MovePoint(1, pGuard->GetHomePosition()); - } + guard->SetVisible(true); + guard->SetReactState(REACT_AGGRESSIVE); + guard->GetMotionMaster()->MovePoint(1, guard->GetHomePosition()); } } - pSinclari->GetMotionMaster()->MovePoint(1, pSinclari->GetHomePosition()); - pSinclari->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + sinclari->GetMotionMaster()->MovePoint(1, sinclari->GetHomePosition()); + sinclari->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } } // Cyanigosa is spawned but not tranformed, prefight event - Creature* pCyanigosa = instance->GetCreature(uiCyanigosa); - if (pCyanigosa && !pCyanigosa->HasAura(CYANIGOSA_SPELL_TRANSFORM)) + Creature* cyanigosa = GetCreature(DATA_CYANIGOSA); + if (cyanigosa && !cyanigosa->HasAura(CYANIGOSA_SPELL_TRANSFORM)) { if (uiCyanigosaEventTimer <= diff) { switch (uiCyanigosaEventPhase) { case 1: - pCyanigosa->CastSpell(pCyanigosa, CYANIGOSA_BLUE_AURA, false); - pCyanigosa->AI()->Talk(CYANIGOSA_SAY_SPAWN); + cyanigosa->CastSpell(cyanigosa, CYANIGOSA_BLUE_AURA, false); + cyanigosa->AI()->Talk(CYANIGOSA_SAY_SPAWN); uiCyanigosaEventTimer = 7*IN_MILLISECONDS; ++uiCyanigosaEventPhase; break; case 2: - pCyanigosa->GetMotionMaster()->MoveJump(MiddleRoomLocation.GetPositionX(), MiddleRoomLocation.GetPositionY(), MiddleRoomLocation.GetPositionZ(), 10.0f, 20.0f); - pCyanigosa->CastSpell(pCyanigosa, CYANIGOSA_BLUE_AURA, false); + cyanigosa->GetMotionMaster()->MoveJump(MiddleRoomLocation.GetPositionX(), MiddleRoomLocation.GetPositionY(), MiddleRoomLocation.GetPositionZ(), 10.0f, 20.0f); + cyanigosa->CastSpell(cyanigosa, CYANIGOSA_BLUE_AURA, false); uiCyanigosaEventTimer = 7*IN_MILLISECONDS; ++uiCyanigosaEventPhase; break; case 3: - pCyanigosa->RemoveAurasDueToSpell(CYANIGOSA_BLUE_AURA); - pCyanigosa->CastSpell(pCyanigosa, CYANIGOSA_SPELL_TRANSFORM, 0); - pCyanigosa->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); - pCyanigosa->SetReactState(REACT_AGGRESSIVE); + cyanigosa->RemoveAurasDueToSpell(CYANIGOSA_BLUE_AURA); + cyanigosa->CastSpell(cyanigosa, CYANIGOSA_SPELL_TRANSFORM, 0); + cyanigosa->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); + cyanigosa->SetReactState(REACT_AGGRESSIVE); uiCyanigosaEventTimer = 2*IN_MILLISECONDS; ++uiCyanigosaEventPhase; break; @@ -815,6 +679,11 @@ public: } } }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const override + { + return new instance_violet_hold_InstanceMapScript(map); + } }; void AddSC_instance_violet_hold() diff --git a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp index 645a9da4764..8bcc80b5a84 100644 --- a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp +++ b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp @@ -32,18 +32,18 @@ enum PortalCreatures { - CREATURE_AZURE_INVADER_1 = 30661, - CREATURE_AZURE_INVADER_2 = 30961, - CREATURE_AZURE_SPELLBREAKER_1 = 30662, - CREATURE_AZURE_SPELLBREAKER_2 = 30962, - CREATURE_AZURE_BINDER_1 = 30663, - CREATURE_AZURE_BINDER_2 = 30918, - CREATURE_AZURE_MAGE_SLAYER_1 = 30664, - CREATURE_AZURE_MAGE_SLAYER_2 = 30963, - CREATURE_AZURE_CAPTAIN = 30666, - CREATURE_AZURE_SORCEROR = 30667, - CREATURE_AZURE_RAIDER = 30668, - CREATURE_AZURE_STALKER = 32191 + NPC_AZURE_INVADER_1 = 30661, + NPC_AZURE_INVADER_2 = 30961, + NPC_AZURE_SPELLBREAKER_1 = 30662, + NPC_AZURE_SPELLBREAKER_2 = 30962, + NPC_AZURE_BINDER_1 = 30663, + NPC_AZURE_BINDER_2 = 30918, + NPC_AZURE_MAGE_SLAYER_1 = 30664, + NPC_AZURE_MAGE_SLAYER_2 = 30963, + NPC_AZURE_CAPTAIN = 30666, + NPC_AZURE_SORCEROR = 30667, + NPC_AZURE_RAIDER = 30668, + NPC_AZURE_STALKER = 32191 }; enum AzureInvaderSpells @@ -258,7 +258,7 @@ public: { case GOSSIP_ACTION_INFO_DEF+1: player->CLOSE_GOSSIP_MENU(); - ENSURE_AI(npc_sinclari_vh::npc_sinclariAI, (creature->AI()))->uiPhase = 1; + ENSURE_AI(npc_sinclari_vh::npc_sinclariAI, creature->AI())->uiPhase = 1; if (InstanceScript* instance = creature->GetInstanceScript()) instance->SetData(DATA_MAIN_EVENT_PHASE, SPECIAL); break; @@ -296,17 +296,12 @@ public: return true; } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_sinclariAI>(creature); - } - struct npc_sinclariAI : public ScriptedAI { npc_sinclariAI(Creature* creature) : ScriptedAI(creature) { Initialize(); - instance = creature->GetInstanceScript(); + instance = creature->GetInstanceScript(); } void Initialize() @@ -345,8 +340,6 @@ public: void UpdateAI(uint32 uiDiff) override { - ScriptedAI::UpdateAI(uiDiff); - if (uiPhase) { if (uiTimer <= uiDiff) @@ -415,6 +408,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<npc_sinclariAI>(creature); + } }; class npc_azure_saboteur : public CreatureScript @@ -422,14 +419,9 @@ class npc_azure_saboteur : public CreatureScript public: npc_azure_saboteur() : CreatureScript("npc_azure_saboteur") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_azure_saboteurAI>(creature); - } - struct npc_azure_saboteurAI : public npc_escortAI { - npc_azure_saboteurAI(Creature* creature):npc_escortAI(creature) + npc_azure_saboteurAI(Creature* creature) : npc_escortAI(creature) { instance = creature->GetInstanceScript(); bHasGotMovingPoints = false; @@ -532,13 +524,16 @@ public: { me->CastSpell(me, SABOTEUR_SHIELD_DISRUPTION, false); me->DisappearAndDie(); - Creature* pSaboPort = ObjectAccessor::GetCreature((*me), instance->GetGuidData(DATA_SABOTEUR_PORTAL)); - if (pSaboPort) + if (Creature* pSaboPort = ObjectAccessor::GetCreature((*me), instance->GetGuidData(DATA_SABOTEUR_PORTAL))) pSaboPort->DisappearAndDie(); instance->SetData(DATA_START_BOSS_ENCOUNTER, 1); } }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<npc_azure_saboteurAI>(creature); + } }; class npc_teleportation_portal_vh : public CreatureScript @@ -546,11 +541,6 @@ class npc_teleportation_portal_vh : public CreatureScript public: npc_teleportation_portal_vh() : CreatureScript("npc_teleportation_portal_vh") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_teleportation_portalAI>(creature); - } - struct npc_teleportation_portalAI : public ScriptedAI { npc_teleportation_portalAI(Creature* creature) : ScriptedAI(creature), listOfMobs(me) @@ -583,7 +573,6 @@ public: void MoveInLineOfSight(Unit* /*who*/) override { } - void UpdateAI(uint32 diff) override { if (instance->GetData(DATA_REMOVE_NPC) == 1) @@ -608,7 +597,7 @@ public: uint8 k = uiWaveCount < 12 ? 2 : 3; for (uint8 i = 0; i < k; ++i) { - uint32 entry = RAND(CREATURE_AZURE_CAPTAIN, CREATURE_AZURE_RAIDER, CREATURE_AZURE_STALKER, CREATURE_AZURE_SORCEROR); + uint32 entry = RAND(NPC_AZURE_CAPTAIN, NPC_AZURE_RAIDER, NPC_AZURE_STALKER, NPC_AZURE_SORCEROR); DoSummon(entry, me, 2.0f, 20000, TEMPSUMMON_DEAD_DESPAWN); } me->SetVisible(false); @@ -633,14 +622,14 @@ public: uint8 k = instance->GetData(DATA_WAVE_COUNT) < 12 ? 3 : 4; for (uint8 i = 0; i < k; ++i) { - uint32 entry = RAND(CREATURE_AZURE_INVADER_1, CREATURE_AZURE_INVADER_2, CREATURE_AZURE_SPELLBREAKER_1, CREATURE_AZURE_SPELLBREAKER_2, CREATURE_AZURE_MAGE_SLAYER_1, CREATURE_AZURE_MAGE_SLAYER_2, CREATURE_AZURE_BINDER_1, CREATURE_AZURE_BINDER_2); + uint32 entry = RAND(NPC_AZURE_INVADER_1, NPC_AZURE_INVADER_2, NPC_AZURE_SPELLBREAKER_1, NPC_AZURE_SPELLBREAKER_2, NPC_AZURE_MAGE_SLAYER_1, NPC_AZURE_MAGE_SLAYER_2, NPC_AZURE_BINDER_1, NPC_AZURE_BINDER_2); DoSummon(entry, me, 2.0f, 20000, TEMPSUMMON_DEAD_DESPAWN); } } else { bPortalGuardianOrKeeperOrEliteSpawn = true; - uint32 entry = RAND(CREATURE_PORTAL_GUARDIAN, CREATURE_PORTAL_KEEPER); + uint32 entry = RAND(NPC_PORTAL_GUARDIAN, NPC_PORTAL_KEEPER); if (Creature* pPortalKeeper = DoSummon(entry, me, 2.0f, 0, TEMPSUMMON_DEAD_DESPAWN)) me->CastSpell(pPortalKeeper, SPELL_PORTAL_CHANNEL, false); } @@ -674,11 +663,15 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<npc_teleportation_portalAI>(creature); + } }; struct violet_hold_trashAI : public npc_escortAI { - violet_hold_trashAI(Creature* creature):npc_escortAI(creature) + violet_hold_trashAI(Creature* creature) : npc_escortAI(creature) { instance = creature->GetInstanceScript(); bHasGotMovingPoints = false; @@ -723,7 +716,7 @@ struct violet_hold_trashAI : public npc_escortAI } } - void UpdateAI(uint32) override + void UpdateAI(uint32 diff) override { if (instance->GetData(DATA_MAIN_EVENT_PHASE) != IN_PROGRESS) me->CastStop(); @@ -778,6 +771,8 @@ struct violet_hold_trashAI : public npc_escortAI SetDespawnAtEnd(false); Start(true, true); } + + npc_escortAI::UpdateAI(diff); } void JustDied(Unit* /*killer*/) override @@ -791,7 +786,6 @@ struct violet_hold_trashAI : public npc_escortAI DoCast(SPELL_DESTROY_DOOR_SEAL); instance->SetData(DATA_NPC_PRESENCE_AT_DOOR_ADD, 1); } - }; class npc_azure_invader : public CreatureScript @@ -799,11 +793,6 @@ class npc_azure_invader : public CreatureScript public: npc_azure_invader() : CreatureScript("npc_azure_invader") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_azure_invaderAI>(creature); - } - struct npc_azure_invaderAI : public violet_hold_trashAI { npc_azure_invaderAI(Creature* creature) : violet_hold_trashAI(creature) @@ -833,12 +822,11 @@ public: void UpdateAI(uint32 diff) override { violet_hold_trashAI::UpdateAI(diff); - npc_escortAI::UpdateAI(diff); if (!UpdateVictim()) return; - if (me->GetEntry() == CREATURE_AZURE_INVADER_1) + if (me->GetEntry() == NPC_AZURE_INVADER_1) { if (uiCleaveTimer <= diff) { @@ -848,14 +836,13 @@ public: if (uiImpaleTimer <= diff) { - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); - if (target) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_IMPALE); uiImpaleTimer = 4000; } else uiImpaleTimer -= diff; } - if (me->GetEntry() == CREATURE_AZURE_INVADER_2) + if (me->GetEntry() == NPC_AZURE_INVADER_2) { if (uiBrutalStrikeTimer <= diff) { @@ -876,6 +863,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<npc_azure_invaderAI>(creature); + } }; class npc_azure_binder : public CreatureScript @@ -883,11 +874,6 @@ class npc_azure_binder : public CreatureScript public: npc_azure_binder() : CreatureScript("npc_azure_binder") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_azure_binderAI>(creature); - } - struct npc_azure_binderAI : public violet_hold_trashAI { npc_azure_binderAI(Creature* creature) : violet_hold_trashAI(creature) @@ -917,12 +903,11 @@ public: void UpdateAI(uint32 diff) override { violet_hold_trashAI::UpdateAI(diff); - npc_escortAI::UpdateAI(diff); if (!UpdateVictim()) return; - if (me->GetEntry() == CREATURE_AZURE_BINDER_1) + if (me->GetEntry() == NPC_AZURE_BINDER_1) { if (uiArcaneExplosionTimer <= diff) { @@ -930,16 +915,15 @@ public: uiArcaneExplosionTimer = 5000; } else uiArcaneExplosionTimer -= diff; - if (uiArcainBarrageTimer <= diff) + if (uiArcainBarrageTimer <= diff) { - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); - if (target) - DoCast(target, SPELL_ARCANE_BARRAGE); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) + DoCast(target, SPELL_ARCANE_BARRAGE); uiArcainBarrageTimer = 6000; } else uiArcainBarrageTimer -= diff; } - if (me->GetEntry() == CREATURE_AZURE_BINDER_2) + if (me->GetEntry() == NPC_AZURE_BINDER_2) { if (uiFrostNovaTimer <= diff) { @@ -949,8 +933,7 @@ public: if (uiFrostboltTimer <= diff) { - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); - if (target) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_FROSTBOLT); uiFrostboltTimer = 6000; } else uiFrostboltTimer -= diff; @@ -960,6 +943,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<npc_azure_binderAI>(creature); + } }; class npc_azure_mage_slayer : public CreatureScript @@ -967,11 +954,6 @@ class npc_azure_mage_slayer : public CreatureScript public: npc_azure_mage_slayer() : CreatureScript("npc_azure_mage_slayer") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_azure_mage_slayerAI>(creature); - } - struct npc_azure_mage_slayerAI : public violet_hold_trashAI { npc_azure_mage_slayerAI(Creature* creature) : violet_hold_trashAI(creature) @@ -997,12 +979,11 @@ public: void UpdateAI(uint32 diff) override { violet_hold_trashAI::UpdateAI(diff); - npc_escortAI::UpdateAI(diff); if (!UpdateVictim()) return; - if (me->GetEntry() == CREATURE_AZURE_MAGE_SLAYER_1) + if (me->GetEntry() == NPC_AZURE_MAGE_SLAYER_1) { if (uiArcaneEmpowermentTimer <= diff) { @@ -1011,12 +992,11 @@ public: } else uiArcaneEmpowermentTimer -= diff; } - if (me->GetEntry() == CREATURE_AZURE_MAGE_SLAYER_2) + if (me->GetEntry() == NPC_AZURE_MAGE_SLAYER_2) { if (uiSpellLockTimer <= diff) { - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); - if (target) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_SPELL_LOCK); uiSpellLockTimer = 9000; } else uiSpellLockTimer -= diff; @@ -1026,6 +1006,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<npc_azure_mage_slayerAI>(creature); + } }; class npc_azure_raider : public CreatureScript @@ -1033,11 +1017,6 @@ class npc_azure_raider : public CreatureScript public: npc_azure_raider() : CreatureScript("npc_azure_raider") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_azure_raiderAI>(creature); - } - struct npc_azure_raiderAI : public violet_hold_trashAI { npc_azure_raiderAI(Creature* creature) : violet_hold_trashAI(creature) @@ -1063,7 +1042,6 @@ public: void UpdateAI(uint32 diff) override { violet_hold_trashAI::UpdateAI(diff); - npc_escortAI::UpdateAI(diff); if (!UpdateVictim()) return; @@ -1084,6 +1062,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<npc_azure_raiderAI>(creature); + } }; class npc_azure_stalker : public CreatureScript @@ -1114,7 +1096,6 @@ public: void UpdateAI(uint32 diff) override { violet_hold_trashAI::UpdateAI(diff); - npc_escortAI::UpdateAI(diff); if (!UpdateVictim()) return; @@ -1123,8 +1104,7 @@ public: { if (_tacticalBlinkTimer <= diff) { - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40, true); - if (target) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40, true)) DoCast(target, SPELL_TACTICAL_BLINK); _tacticalBlinkTimer = 6000; _tacticalBlinkCast = true; @@ -1135,8 +1115,8 @@ public: { if (_backstabTimer <= diff) { - Unit* target = SelectTarget(SELECT_TARGET_NEAREST, 0, 10, true); - DoCast(target, SPELL_BACKSTAB); + if (Unit* target = SelectTarget(SELECT_TARGET_NEAREST, 0, 10, true)) + DoCast(target, SPELL_BACKSTAB); _tacticalBlinkCast = false; _backstabTimer =1300; } else _backstabTimer -= diff; @@ -1191,36 +1171,32 @@ public: void UpdateAI(uint32 diff) override { violet_hold_trashAI::UpdateAI(diff); - npc_escortAI::UpdateAI(diff); if (!UpdateVictim()) return; - if (me->GetEntry() == CREATURE_AZURE_SPELLBREAKER_1) + if (me->GetEntry() == NPC_AZURE_SPELLBREAKER_1) { if (uiArcaneBlastTimer <= diff) { - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); - if (target) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_ARCANE_BLAST); uiArcaneBlastTimer = 6000; } else uiArcaneBlastTimer -= diff; if (uiSlowTimer <= diff) { - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); - if (target) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_SLOW); uiSlowTimer = 5000; } else uiSlowTimer -= diff; } - if (me->GetEntry() == CREATURE_AZURE_SPELLBREAKER_2) + if (me->GetEntry() == NPC_AZURE_SPELLBREAKER_2) { if (uiChainsOfIceTimer <= diff) { - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); - if (target) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_CHAINS_OF_ICE); uiChainsOfIceTimer = 7000; } else uiChainsOfIceTimer -= diff; @@ -1247,11 +1223,6 @@ class npc_azure_captain : public CreatureScript public: npc_azure_captain() : CreatureScript("npc_azure_captain") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_azure_captainAI>(creature); - } - struct npc_azure_captainAI : public violet_hold_trashAI { npc_azure_captainAI(Creature* creature) : violet_hold_trashAI(creature) @@ -1277,7 +1248,6 @@ public: void UpdateAI(uint32 diff) override { violet_hold_trashAI::UpdateAI(diff); - npc_escortAI::UpdateAI(diff); if (!UpdateVictim()) return; @@ -1298,6 +1268,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<npc_azure_captainAI>(creature); + } }; class npc_azure_sorceror : public CreatureScript @@ -1305,11 +1279,6 @@ class npc_azure_sorceror : public CreatureScript public: npc_azure_sorceror() : CreatureScript("npc_azure_sorceror") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_azure_sorcerorAI>(creature); - } - struct npc_azure_sorcerorAI : public violet_hold_trashAI { npc_azure_sorcerorAI(Creature* creature) : violet_hold_trashAI(creature) @@ -1337,15 +1306,13 @@ public: void UpdateAI(uint32 diff) override { violet_hold_trashAI::UpdateAI(diff); - npc_escortAI::UpdateAI(diff); if (!UpdateVictim()) return; if (uiArcaneStreamTimer <= diff) { - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); - if (target) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_ARCANE_STREAM); uiArcaneStreamTimer = urand(0, 5000)+5000; uiArcaneStreamTimerStartingValueHolder = uiArcaneStreamTimer; @@ -1360,6 +1327,11 @@ public: DoMeleeAttackIfReady(); } }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<npc_azure_sorcerorAI>(creature); + } }; diff --git a/src/server/scripts/Northrend/VioletHold/violet_hold.h b/src/server/scripts/Northrend/VioletHold/violet_hold.h index 404d1f493e6..275a7467d83 100644 --- a/src/server/scripts/Northrend/VioletHold/violet_hold.h +++ b/src/server/scripts/Northrend/VioletHold/violet_hold.h @@ -18,13 +18,18 @@ #ifndef DEF_VIOLET_HOLD_H #define DEF_VIOLET_HOLD_H -#define DataHeader "VIO" +#define DataHeader "VH" + +uint32 const EncounterCount = 3; enum Data { + // Main encounters DATA_1ST_BOSS_EVENT, DATA_2ND_BOSS_EVENT, - DATA_CYANIGOSA_EVENT, + DATA_CYANIGOSA, + + // Misc DATA_WAVE_COUNT, DATA_REMOVE_NPC, DATA_PORTAL_LOCATION, @@ -38,10 +43,8 @@ enum Data DATA_ACTIVATE_CRYSTAL, DATA_MAIN_EVENT_PHASE, DATA_DEFENSELESS, -}; -enum Data64 -{ + // Bosses DATA_MORAGG, DATA_EREKEM, DATA_EREKEM_GUARD_1, @@ -50,7 +53,8 @@ enum Data64 DATA_LAVANTHOR, DATA_XEVOZZ, DATA_ZURAMAT, - DATA_CYANIGOSA, + + // Cells DATA_MORAGG_CELL, DATA_EREKEM_CELL, DATA_EREKEM_LEFT_GUARD_CELL, @@ -59,6 +63,8 @@ enum Data64 DATA_LAVANTHOR_CELL, DATA_XEVOZZ_CELL, DATA_ZURAMAT_CELL, + + // Misc DATA_MAIN_DOOR, DATA_SINCLARI, DATA_TELEPORTATION_PORTAL, @@ -81,33 +87,48 @@ enum Bosses enum CreaturesIds { - CREATURE_TELEPORTATION_PORTAL = 31011, - CREATURE_PORTAL_GUARDIAN = 30660, - CREATURE_PORTAL_KEEPER = 30695, - CREATURE_XEVOZZ = 29266, - CREATURE_LAVANTHOR = 29312, - CREATURE_ICHORON = 29313, - CREATURE_ZURAMAT = 29314, - CREATURE_EREKEM = 29315, - CREATURE_EREKEM_GUARD = 29395, - CREATURE_MORAGG = 29316, - CREATURE_CYANIGOSA = 31134, - CREATURE_SINCLARI = 30658, - CREATURE_SABOTEOUR = 31079, - NPC_VIOLET_HOLD_GUARD = 30659, - NPC_DEFENSE_SYSTEM = 30837 + NPC_TELEPORTATION_PORTAL = 31011, + NPC_PORTAL_GUARDIAN = 30660, + NPC_PORTAL_KEEPER = 30695, + NPC_XEVOZZ = 29266, + NPC_LAVANTHOR = 29312, + NPC_ICHORON = 29313, + NPC_ZURAMAT = 29314, + NPC_EREKEM = 29315, + NPC_EREKEM_GUARD = 29395, + NPC_MORAGG = 29316, + NPC_CYANIGOSA = 31134, + NPC_SINCLARI = 30658, + NPC_SABOTEOUR = 31079, + NPC_VIOLET_HOLD_GUARD = 30659, + NPC_DEFENSE_SYSTEM = 30837 +}; + +enum GameObjectIds +{ + GO_MAIN_DOOR = 191723, + GO_XEVOZZ_DOOR = 191556, + GO_LAVANTHOR_DOOR = 191566, + GO_ICHORON_DOOR = 191722, + GO_ZURAMAT_DOOR = 191565, + GO_EREKEM_DOOR = 191564, + GO_EREKEM_GUARD_1_DOOR = 191563, + GO_EREKEM_GUARD_2_DOOR = 191562, + GO_MORAGG_DOOR = 191606, + GO_INTRO_ACTIVATION_CRYSTAL = 193615, + GO_ACTIVATION_CRYSTAL = 193611 }; enum WorldStateIds { - WORLD_STATE_VH = 3816, - WORLD_STATE_VH_PRISON_STATE = 3815, - WORLD_STATE_VH_WAVE_COUNT = 3810, + WORLD_STATE_VH = 3816, + WORLD_STATE_VH_PRISON_STATE = 3815, + WORLD_STATE_VH_WAVE_COUNT = 3810, }; enum Events { - EVENT_ACTIVATE_CRYSTAL = 20001 + EVENT_ACTIVATE_CRYSTAL = 20001 }; #endif |