aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/FULL/world_script_texts.sql15
-rw-r--r--sql/FULL/world_scripts_full.sql6
-rw-r--r--sql/updates/4783_world_scripts.sql15
-rw-r--r--src/bindings/scripts/scripts/zone/ulduar/halls_of_lightning/boss_bjarngrim.cpp464
-rw-r--r--src/bindings/scripts/scripts/zone/ulduar/halls_of_lightning/def_halls_of_lightning.h30
-rw-r--r--src/bindings/scripts/scripts/zone/ulduar/halls_of_lightning/instance_halls_of_lightning.cpp181
6 files changed, 648 insertions, 63 deletions
diff --git a/sql/FULL/world_script_texts.sql b/sql/FULL/world_script_texts.sql
index 30fdd1066d8..ca0c020de21 100644
--- a/sql/FULL/world_script_texts.sql
+++ b/sql/FULL/world_script_texts.sql
@@ -1920,3 +1920,18 @@ REPLACE INTO `script_texts` (`entry`, `content_default`, `sound`, `type`, `langu
(-1576042,'Finish it! FINISH IT! Kill me, or I swear by the Dragonqueen you\'ll never see daylight again!',13452,1,0,0,'keristrasza SAY_ENRAGE'),
(-1576043,'Dragonqueen... Life-Binder... preserve... me.',13454,1,0,0,'keristrasza SAY_DEATH'),
(-1576044,'Stay. Enjoy your final moments.',13451,1,0,0,'keristrasza SAY_CRYSTAL_NOVA');
+
+-- boss_bjarngrim
+DELETE FROM script_texts where entry IN (-1602001,-1602000,-1602002,-1602003,-1602004,-1602005,-1602006,-1602007,-1602008,-1602009,-1602010);
+INSERT INTO script_texts (entry,content_default,sound,type,language,emote,comment) VALUES
+(-1602000,'I am the greatest of my father\'s sons! Your end has come!',14149,1,0,0,'bjarngrim SAY_AGGRO'),
+(-1602001,'So ends your curse!',14153,1,0,0,'bjarngrim SAY_SLAY_1'),
+(-1602002,'Flesh... is... weak!',14154,1,0,0,'bjarngrim SAY_SLAY_2'),
+(-1602003,'...',14155,1,0,0,'bjarngrim SAY_SLAY_3'),
+(-1602004,'How can it be...? Flesh is not... stronger!',14156,1,0,0,'bjarngrim SAY_DEATH'),
+(-1602005,'Defend yourself, for all the good it will do!',14151,1,0,0,'bjarngrim SAY_BATTLE_STANCE'),
+(-1602006,'%s switches to Battle Stance!',0,3,0,0,'bjarngrim EMOTE_BATTLE_STANCE'),
+(-1602007,'GRAAAAAH! Behold the fury of iron and steel!',14152,1,0,0,'bjarngrim SAY_BERSEKER_STANCE'),
+(-1602008,'%s switches to Berserker Stance!',0,3,0,0,'bjarngrim EMOTE_BERSEKER_STANCE'),
+(-1602009,'Give me your worst!',14150,1,0,0,'bjarngrim SAY_DEFENSIVE_STANCE'),
+(-1602010,'%s switches to Defensive Stance!',0,3,0,0,'bjarngrim EMOTE_DEFENSIVE_STANCE');
diff --git a/sql/FULL/world_scripts_full.sql b/sql/FULL/world_scripts_full.sql
index 6ed6c2e20c6..12afe7bdad2 100644
--- a/sql/FULL/world_scripts_full.sql
+++ b/sql/FULL/world_scripts_full.sql
@@ -1172,4 +1172,8 @@ INSERT INTO `creature_ai_scripts` VALUES
-- Desecration
( 3375001, 33750, 11, 0, 100, 0, 0, 0, 0, 0, 11, 55741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Desecration'),
( 3375000, 33750, 1, 0, 100, 0, 1, 1, 0, 0, 11, 63587, 0, 2, 11, 63583, 0, 2, 0, 0, 0, 0, 'Desecration');
-/* EOF */ \ No newline at end of file
+/* EOF */
+
+UPDATE creature_template set ScriptName = 'boss_bjarngrim' where entry =28586;
+UPDATE creature_template set ScriptName = 'mob_stormforged_lieutenant' where entry =29240;
+
diff --git a/sql/updates/4783_world_scripts.sql b/sql/updates/4783_world_scripts.sql
new file mode 100644
index 00000000000..e2103469595
--- /dev/null
+++ b/sql/updates/4783_world_scripts.sql
@@ -0,0 +1,15 @@
+UPDATE creature_template set ScriptName = 'boss_bjarngrim' where entry =28586;
+UPDATE creature_template set ScriptName = 'mob_stormforged_lieutenant' where entry =29240;
+DELETE FROM script_texts where entry IN (-1602001,-1602000,-1602002,-1602003,-1602004,-1602005,-1602006,-1602007,-1602008,-1602009,-1602010);
+INSERT INTO script_texts (entry,content_default,sound,type,language,emote,comment) VALUES
+(-1602000,'I am the greatest of my father\'s sons! Your end has come!',14149,1,0,0,'bjarngrim SAY_AGGRO'),
+(-1602001,'So ends your curse!',14153,1,0,0,'bjarngrim SAY_SLAY_1'),
+(-1602002,'Flesh... is... weak!',14154,1,0,0,'bjarngrim SAY_SLAY_2'),
+(-1602003,'...',14155,1,0,0,'bjarngrim SAY_SLAY_3'),
+(-1602004,'How can it be...? Flesh is not... stronger!',14156,1,0,0,'bjarngrim SAY_DEATH'),
+(-1602005,'Defend yourself, for all the good it will do!',14151,1,0,0,'bjarngrim SAY_BATTLE_STANCE'),
+(-1602006,'%s switches to Battle Stance!',0,3,0,0,'bjarngrim EMOTE_BATTLE_STANCE'),
+(-1602007,'GRAAAAAH! Behold the fury of iron and steel!',14152,1,0,0,'bjarngrim SAY_BERSEKER_STANCE'),
+(-1602008,'%s switches to Berserker Stance!',0,3,0,0,'bjarngrim EMOTE_BERSEKER_STANCE'),
+(-1602009,'Give me your worst!',14150,1,0,0,'bjarngrim SAY_DEFENSIVE_STANCE'),
+(-1602010,'%s switches to Defensive Stance!',0,3,0,0,'bjarngrim EMOTE_DEFENSIVE_STANCE');
diff --git a/src/bindings/scripts/scripts/zone/ulduar/halls_of_lightning/boss_bjarngrim.cpp b/src/bindings/scripts/scripts/zone/ulduar/halls_of_lightning/boss_bjarngrim.cpp
index b26c3d0853d..ec2c4995dc7 100644
--- a/src/bindings/scripts/scripts/zone/ulduar/halls_of_lightning/boss_bjarngrim.cpp
+++ b/src/bindings/scripts/scripts/zone/ulduar/halls_of_lightning/boss_bjarngrim.cpp
@@ -1,86 +1,429 @@
-/* Script Data Start
-SDName: Boss bjarngrim
-SDAuthor: LordVanMartin
-SD%Complete:
-SDComment:
-SDCategory:
-Script Data End */
-
-/*** SQL START ***
-update creature_template set scriptname = '' where entry = '';
-*** SQL END ***/
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/* ScriptData
+SDName: Boss General Bjarngrim
+SD%Complete: 70%
+SDComment: Waypoint needed, we expect boss to always have 2x Stormforged Lieutenant following
+SDCategory: Halls of Lightning
+EndScriptData */
+
#include "precompiled.h"
+#include "def_halls_of_lightning.h"
+
+enum
+{
+ //Yell
+ SAY_AGGRO = -1602000,
+ SAY_SLAY_1 = -1602001,
+ SAY_SLAY_2 = -1602002,
+ SAY_SLAY_3 = -1602003,
+ SAY_DEATH = -1602004,
+ SAY_BATTLE_STANCE = -1602005,
+ EMOTE_BATTLE_STANCE = -1602006,
+ SAY_BERSEKER_STANCE = -1602007,
+ EMOTE_BERSEKER_STANCE = -1602008,
+ SAY_DEFENSIVE_STANCE = -1602009,
+ EMOTE_DEFENSIVE_STANCE = -1602010,
+
+ SPELL_DEFENSIVE_STANCE = 53790,
+ //SPELL_DEFENSIVE_AURA = 41105,
+ SPELL_SPELL_REFLECTION = 36096,
+ SPELL_PUMMEL = 12555,
+ SPELL_KNOCK_AWAY = 52029,
+ SPELL_IRONFORM = 52022,
+
+ SPELL_BERSEKER_STANCE = 53791,
+ //SPELL_BERSEKER_AURA = 41107,
+ SPELL_INTERCEPT = 58769,
+ SPELL_WHIRLWIND = 52027,
+ SPELL_CLEAVE = 15284,
+
+ SPELL_BATTLE_STANCE = 53792,
+ //SPELL_BATTLE_AURA = 41106,
+ SPELL_MORTAL_STRIKE = 16856,
+ SPELL_SLAM = 52026,
-//AURAS AND STANCES
-#define BUFF_BATTLE_AURA 41106
-#define SPELL_BATTLE_STANCE 53792
-#define BUFF_BERSEKER_AURA 41107
-#define SPELL_BERSEKER_STANCE 53791
-#define BUFF_DEFENSIVE_AURA 41105
-#define SPELL_DEFENSIVE_STANCE 53790
-
-//OTHER SPELLS
-#define SPELL_CHARGE_UP 52098
-#define SPELL_CLEAVE 15284
-#define SPELL_INTERCEPT 58769
-#define SPELL_IRONFORM 52022
-#define SPELL_KNOCK_AWAY 52029
-#define SPELL_MORTAL_STRIKE 15708
-#define SPELL_SLAM 52026
-#define SPELL_SPELL_REFLECTION 36096
-#define SPELL_WHIRLWIND 52027
-
-//Yell
-#define SAY_AGGRO -1602000
-#define SAY_SLAY_1 -1602001
-#define SAY_SLAY_2 -1602002
-#define SAY_SLAY_3 -1602003
-#define SAY_DEATH -1602004
-#define SAY_BATTLE_STANCE -1602005
-#define SAY_BERSEKER_STANCE -1602006
-#define SAY_DEFENSIVE_STANCE -1602007
+ //OTHER SPELLS
+ //SPELL_CHARGE_UP = 52098, // only used when starting walk from one platform to the other
+ //SPELL_TEMPORARY_ELECTRICAL_CHARGE = 52092, // triggered part of above
+
+ NPC_STORMFORGED_LIEUTENANT = 29240,
+ SPELL_ARC_WELD = 59085,
+ SPELL_RENEW_STEEL_N = 52774,
+ SPELL_RENEW_STEEL_H = 59160,
+
+ EQUIP_SWORD = 37871,
+ EQUIP_SHIELD = 35642,
+ EQUIP_MACE = 43623,
+
+ STANCE_DEFENSIVE = 0,
+ STANCE_BERSERKER = 1,
+ STANCE_BATTLE = 2
+};
+
+/*######
+## boss_bjarngrim
+######*/
struct TRINITY_DLL_DECL boss_bjarngrimAI : public ScriptedAI
{
- boss_bjarngrimAI(Creature *c) : ScriptedAI(c) {}
+ boss_bjarngrimAI(Creature *pCreature) : ScriptedAI(pCreature)
+ {
+ m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData();
+ m_bIsHeroic = pCreature->GetMap()->IsHeroic();
+ m_uiStance = STANCE_DEFENSIVE;
+ Reset();
+ }
+
+ ScriptedInstance* m_pInstance;
+
+ bool m_bIsHeroic;
+ bool m_bIsChangingStance;
+
+ uint8 m_uiChargingStatus;
+ uint8 m_uiStance;
+
+ uint32 m_uiCharge_Timer;
+ uint32 m_uiChangeStance_Timer;
+
+ uint32 m_uiReflection_Timer;
+ uint32 m_uiKnockAway_Timer;
+ uint32 m_uiPummel_Timer;
+ uint32 m_uiIronform_Timer;
+
+ uint32 m_uiIntercept_Timer;
+ uint32 m_uiWhirlwind_Timer;
+ uint32 m_uiCleave_Timer;
+
+ uint32 m_uiMortalStrike_Timer;
+ uint32 m_uiSlam_Timer;
+
+ uint64 m_uiStormforgedLieutenantGUID[2];
+
+ void Reset()
+ {
+ m_bIsChangingStance = false;
+
+ m_uiChargingStatus = 0;
+ m_uiCharge_Timer = 1000;
+
+ m_uiChangeStance_Timer = 20000 + rand()%5000;
+
+ m_uiReflection_Timer = 8000;
+ m_uiKnockAway_Timer = 20000;
+ m_uiPummel_Timer = 10000;
+ m_uiIronform_Timer = 25000;
- uint32 whirlwind;
+ m_uiIntercept_Timer = 5000;
+ m_uiWhirlwind_Timer = 10000;
+ m_uiCleave_Timer = 8000;
- void Reset() {}
- void EnterCombat(Unit* who)
+ m_uiMortalStrike_Timer = 8000;
+ m_uiSlam_Timer = 10000;
+
+ for(uint8 i = 0; i < 2; ++i)
+ {
+ if (Creature* pStormforgedLieutenant = ((Creature*)Unit::GetUnit((*m_creature), m_uiStormforgedLieutenantGUID[i])))
+ {
+ if (!pStormforgedLieutenant->isAlive())
+ pStormforgedLieutenant->Respawn();
+ }
+ }
+
+ if (m_uiStance != STANCE_DEFENSIVE)
+ {
+ DoRemoveStanceAura(m_uiStance);
+ DoCast(m_creature, SPELL_DEFENSIVE_STANCE);
+ m_uiStance = STANCE_DEFENSIVE;
+ }
+
+ SetEquipmentSlots(false, EQUIP_SWORD, EQUIP_SHIELD, EQUIP_NO_CHANGE);
+
+ if (m_pInstance)
+ m_pInstance->SetData(TYPE_BJARNGRIM, NOT_STARTED);
+ }
+
+ void EnterCombat(Unit* pWho)
{
DoScriptText(SAY_AGGRO, m_creature);
+
+ //must get both lieutenants here and make sure they are with him
+ m_creature->CallForHelp(30.0f);
+
+ if (m_pInstance)
+ m_pInstance->SetData(TYPE_BJARNGRIM, IN_PROGRESS);
+ }
+
+ void KilledUnit(Unit* pVictim)
+ {
+ switch(rand()%3)
+ {
+ case 0: DoScriptText(SAY_SLAY_1, m_creature); break;
+ case 1: DoScriptText(SAY_SLAY_2, m_creature); break;
+ case 2: DoScriptText(SAY_SLAY_3, m_creature); break;
+ }
+ }
+
+ void JustDied(Unit* pKiller)
+ {
+ DoScriptText(SAY_DEATH, m_creature);
+
+ if (m_pInstance)
+ m_pInstance->SetData(TYPE_BJARNGRIM, DONE);
+ }
+
+ //TODO: remove when removal is done by mangos
+ void DoRemoveStanceAura(uint8 uiStance)
+ {
+ switch(uiStance)
+ {
+ case STANCE_DEFENSIVE:
+ m_creature->RemoveAurasDueToSpell(SPELL_DEFENSIVE_STANCE);
+ break;
+ case STANCE_BERSERKER:
+ m_creature->RemoveAurasDueToSpell(SPELL_BERSEKER_STANCE);
+ break;
+ case STANCE_BATTLE:
+ m_creature->RemoveAurasDueToSpell(SPELL_BATTLE_STANCE);
+ break;
+ }
}
- void AttackStart(Unit* who) {}
- void MoveInLineOfSight(Unit* who) {}
- void UpdateAI(const uint32 diff)
+
+ void UpdateAI(const uint32 uiDiff)
{
//Return since we have no target
- if(!UpdateVictim())
+ if (!UpdateVictim())
+ return;
+
+ // Change stance
+ if (m_uiChangeStance_Timer < uiDiff)
+ {
+ //wait for current spell to finish before change stance
+ if (m_creature->IsNonMeleeSpellCasted(false))
+ return;
+
+ DoRemoveStanceAura(m_uiStance);
+
+ int uiTempStance = rand()%(3-1);
+
+ if (uiTempStance >= m_uiStance)
+ ++uiTempStance;
+
+ m_uiStance = uiTempStance;
+
+ switch(m_uiStance)
+ {
+ case STANCE_DEFENSIVE:
+ DoScriptText(SAY_DEFENSIVE_STANCE, m_creature);
+ DoScriptText(EMOTE_DEFENSIVE_STANCE, m_creature);
+ DoCast(m_creature, SPELL_DEFENSIVE_STANCE);
+ SetEquipmentSlots(false, EQUIP_SWORD, EQUIP_SHIELD, EQUIP_NO_CHANGE);
+ break;
+ case STANCE_BERSERKER:
+ DoScriptText(SAY_BERSEKER_STANCE, m_creature);
+ DoScriptText(EMOTE_BERSEKER_STANCE, m_creature);
+ DoCast(m_creature, SPELL_BERSEKER_STANCE);
+ SetEquipmentSlots(false, EQUIP_SWORD, EQUIP_SWORD, EQUIP_NO_CHANGE);
+ break;
+ case STANCE_BATTLE:
+ DoScriptText(SAY_BATTLE_STANCE, m_creature);
+ DoScriptText(EMOTE_BATTLE_STANCE, m_creature);
+ DoCast(m_creature, SPELL_BATTLE_STANCE);
+ SetEquipmentSlots(false, EQUIP_MACE, EQUIP_UNEQUIP, EQUIP_NO_CHANGE);
+ break;
+ }
+
+ m_uiChangeStance_Timer = 20000 + rand()%5000;
return;
+ }
+ else
+ m_uiChangeStance_Timer -= uiDiff;
+
+ switch(m_uiStance)
+ {
+ case STANCE_DEFENSIVE:
+ {
+ if (m_uiReflection_Timer < uiDiff)
+ {
+ DoCast(m_creature, SPELL_SPELL_REFLECTION);
+ m_uiReflection_Timer = 8000 + rand()%1000;
+ }
+ else
+ m_uiReflection_Timer -= uiDiff;
+
+ if (m_uiKnockAway_Timer < uiDiff)
+ {
+ DoCast(m_creature, SPELL_KNOCK_AWAY);
+ m_uiKnockAway_Timer = 20000 + rand()%1000;
+ }
+ else
+ m_uiKnockAway_Timer -= uiDiff;
+
+ if (m_uiPummel_Timer < uiDiff)
+ {
+ DoCast(m_creature->getVictim(), SPELL_PUMMEL);
+ m_uiPummel_Timer = 10000 + rand()%1000;
+ }
+ else
+ m_uiPummel_Timer -= uiDiff;
+
+ if (m_uiIronform_Timer < uiDiff)
+ {
+ DoCast(m_creature, SPELL_IRONFORM);
+ m_uiIronform_Timer = 25000 + rand()%1000;
+ }
+ else
+ m_uiIronform_Timer -= uiDiff;
+
+ break;
+ }
+ case STANCE_BERSERKER:
+ {
+ if (m_uiIntercept_Timer < uiDiff)
+ {
+ //not much point is this, better random target and more often?
+ DoCast(m_creature->getVictim(), SPELL_INTERCEPT);
+ m_uiIntercept_Timer = 45000 + rand()%1000;
+ }
+ else
+ m_uiIntercept_Timer -= uiDiff;
+
+ if (m_uiWhirlwind_Timer < uiDiff)
+ {
+ DoCast(m_creature, SPELL_WHIRLWIND);
+ m_uiWhirlwind_Timer = 10000 + rand()%1000;
+ }
+ else
+ m_uiWhirlwind_Timer -= uiDiff;
+
+ if (m_uiCleave_Timer < uiDiff)
+ {
+ DoCast(m_creature->getVictim(), SPELL_CLEAVE);
+ m_uiCleave_Timer = 8000 + rand()%1000;
+ }
+ else
+ m_uiCleave_Timer -= uiDiff;
+
+ break;
+ }
+ case STANCE_BATTLE:
+ {
+ if (m_uiMortalStrike_Timer < uiDiff)
+ {
+ DoCast(m_creature->getVictim(), SPELL_MORTAL_STRIKE);
+ m_uiMortalStrike_Timer = 20000 + rand()%1000;
+ }
+ else
+ m_uiMortalStrike_Timer -= uiDiff;
+
+ if (m_uiSlam_Timer < uiDiff)
+ {
+ DoCast(m_creature->getVictim(), SPELL_SLAM);
+ m_uiSlam_Timer = 15000 + rand()%1000;
+ }
+ else
+ m_uiSlam_Timer -= uiDiff;
+
+ break;
+ }
+ }
DoMeleeAttackIfReady();
}
- void JustDied(Unit* killer)
+};
+
+/*######
+## mob_stormforged_lieutenant
+######*/
+
+struct TRINITY_DLL_DECL mob_stormforged_lieutenantAI : public ScriptedAI
+{
+ mob_stormforged_lieutenantAI(Creature *pCreature) : ScriptedAI(pCreature)
+ {
+ m_pInstance = ((ScriptedInstance*)pCreature->GetInstanceData());
+ m_bIsHeroic = pCreature->GetMap()->IsHeroic();
+ Reset();
+ }
+
+ ScriptedInstance* m_pInstance;
+ bool m_bIsHeroic;
+
+ uint32 m_uiArcWeld_Timer;
+ uint32 m_uiRenewSteel_Timer;
+
+ void Reset()
{
- DoScriptText(SAY_DEATH, m_creature);
+ m_uiArcWeld_Timer = 20000 + rand()%1000;
+ m_uiRenewSteel_Timer = 10000 + rand()%1000;
}
- void KilledUnit(Unit *victim)
+
+ void EnterCombat(Unit* pWho)
{
- if(victim == m_creature)
+ if (m_pInstance)
+ {
+ if (Creature* pBjarngrim = m_pInstance->instance->GetCreature(m_pInstance->GetData64(DATA_BJARNGRIM)))
+ {
+ if (pBjarngrim->isAlive() && !pBjarngrim->getVictim())
+ pBjarngrim->AI()->AttackStart(pWho);
+ }
+ }
+ }
+
+ void UpdateAI(const uint32 uiDiff)
+ {
+ //Return since we have no target
+ if (!UpdateVictim())
return;
- switch(rand()%3)
+
+ if (m_uiArcWeld_Timer < uiDiff)
{
- case 0: DoScriptText(SAY_SLAY_1, m_creature);break;
- case 1: DoScriptText(SAY_SLAY_2, m_creature);break;
- case 2: DoScriptText(SAY_SLAY_3, m_creature);break;
+ DoCast(m_creature->getVictim(), SPELL_ARC_WELD);
+ m_uiArcWeld_Timer = 20000 + rand()%1000;
}
+ else
+ m_uiArcWeld_Timer -= uiDiff;
+
+ if (m_uiRenewSteel_Timer < uiDiff)
+ {
+ if (m_pInstance)
+ {
+ if (Creature* pBjarngrim = m_pInstance->instance->GetCreature(m_pInstance->GetData64(DATA_BJARNGRIM)))
+ {
+ if (pBjarngrim->isAlive())
+ DoCast(pBjarngrim, m_bIsHeroic ? SPELL_RENEW_STEEL_H : SPELL_RENEW_STEEL_N);
+ }
+ }
+ m_uiRenewSteel_Timer = 10000 + rand()%4000;
+ }
+ else
+ m_uiRenewSteel_Timer -= uiDiff;
+
+ DoMeleeAttackIfReady();
}
};
-CreatureAI* GetAI_boss_bjarngrim(Creature *_Creature)
+CreatureAI* GetAI_boss_bjarngrim(Creature* pCreature)
{
- return new boss_bjarngrimAI (_Creature);
+ return new boss_bjarngrimAI(pCreature);
+}
+
+CreatureAI* GetAI_mob_stormforged_lieutenant(Creature* pCreature)
+{
+ return new mob_stormforged_lieutenantAI(pCreature);
}
void AddSC_boss_bjarngrim()
@@ -88,7 +431,12 @@ void AddSC_boss_bjarngrim()
Script *newscript;
newscript = new Script;
- newscript->Name="boss_bjarngrim";
+ newscript->Name = "boss_bjarngrim";
newscript->GetAI = &GetAI_boss_bjarngrim;
newscript->RegisterSelf();
+
+ newscript = new Script;
+ newscript->Name = "mob_stormforged_lieutenant";
+ newscript->GetAI = &GetAI_mob_stormforged_lieutenant;
+ newscript->RegisterSelf();
}
diff --git a/src/bindings/scripts/scripts/zone/ulduar/halls_of_lightning/def_halls_of_lightning.h b/src/bindings/scripts/scripts/zone/ulduar/halls_of_lightning/def_halls_of_lightning.h
index 134e32850ae..8790274e599 100644
--- a/src/bindings/scripts/scripts/zone/ulduar/halls_of_lightning/def_halls_of_lightning.h
+++ b/src/bindings/scripts/scripts/zone/ulduar/halls_of_lightning/def_halls_of_lightning.h
@@ -1,4 +1,34 @@
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+ * This program is free software licensed under GPL version 2
+ * Please see the included DOCS/LICENSE.TXT for more information */
+
#ifndef DEF_HALLS_OF_LIGHTNING_H
#define DEF_HALLS_OF_LIGHTNING_H
+enum
+{
+ MAX_ENCOUNTER = 4,
+
+ DATA_BJARNGRIM = 1,
+ DATA_IONAR = 2,
+ DATA_LOKEN = 3,
+ DATA_VOLKHAN = 4,
+
+ TYPE_BJARNGRIM = 10,
+ TYPE_IONAR = 11,
+ TYPE_LOKEN = 12,
+ TYPE_VOLKHAN = 13,
+
+ NPC_BJARNGRIM = 28586,
+ NPC_VOLKHAN = 28587,
+ NPC_IONAR = 28546,
+ NPC_LOKEN = 28923,
+
+ GO_BJARNGRIM_DOOR = 191416, //_doors10
+ GO_VOLKHAN_DOOR = 191325, //_doors07
+ GO_IONAR_DOOR = 191326, //_doors05
+ GO_LOKEN_DOOR = 191324, //_doors02
+ GO_LOKEN_THRONE = 192654
+};
+
#endif
diff --git a/src/bindings/scripts/scripts/zone/ulduar/halls_of_lightning/instance_halls_of_lightning.cpp b/src/bindings/scripts/scripts/zone/ulduar/halls_of_lightning/instance_halls_of_lightning.cpp
index 1c7983d3b69..5b7d7a9e939 100644
--- a/src/bindings/scripts/scripts/zone/ulduar/halls_of_lightning/instance_halls_of_lightning.cpp
+++ b/src/bindings/scripts/scripts/zone/ulduar/halls_of_lightning/instance_halls_of_lightning.cpp
@@ -1,14 +1,187 @@
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/* ScriptData
+SDName: Instance_Halls_of_Lightning
+SD%Complete: 90%
+SDComment: All ready.
+SDCategory: Halls of Lightning
+EndScriptData */
+
#include "precompiled.h"
#include "def_halls_of_lightning.h"
-struct TRINITY_DLL_DECL instance_halls_of_lightning : public ScriptedInstance
+/* Halls of Lightning encounters:
+0 - General Bjarngrim
+1 - Volkhan
+2 - Ionar
+3 - Loken
+*/
+
+struct MANGOS_DLL_DECL instance_halls_of_lightning : public ScriptedInstance
{
- instance_halls_of_lightning(Map *Map) : ScriptedInstance(Map) {Initialize();};
+ instance_halls_of_lightning(Map* pMap) : ScriptedInstance(pMap) {Initialize();};
+
+ uint32 m_auiEncounter[MAX_ENCOUNTER];
+
+ uint64 m_uiGeneralBjarngrimGUID;
+ uint64 m_uiIonarGUID;
+ uint64 m_uiLokenGUID;
+ uint64 m_uiVolkhanGUID;
+
+ uint64 m_uiBjarngrimDoorGUID;
+ uint64 m_uiVolkhanDoorGUID;
+ uint64 m_uiIonarDoorGUID;
+ uint64 m_uiLokenDoorGUID;
+ uint64 m_uiLokenGlobeGUID;
+
+ void Initialize()
+ {
+ memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
+
+ m_uiGeneralBjarngrimGUID = 0;
+ m_uiVolkhanGUID = 0;
+ m_uiIonarGUID = 0;
+ m_uiLokenGUID = 0;
+
+ m_uiBjarngrimDoorGUID = 0;
+ m_uiVolkhanDoorGUID = 0;
+ m_uiIonarDoorGUID = 0;
+ m_uiLokenDoorGUID = 0;
+ m_uiLokenGlobeGUID = 0;
+ }
+
+ void OnCreatureCreate(Creature* pCreature, bool add)
+ {
+ switch(pCreature->GetEntry())
+ {
+ case NPC_BJARNGRIM:
+ m_uiGeneralBjarngrimGUID = pCreature->GetGUID();
+ break;
+ case NPC_VOLKHAN:
+ m_uiVolkhanGUID = pCreature->GetGUID();
+ break;
+ case NPC_IONAR:
+ m_uiIonarGUID = pCreature->GetGUID();
+ break;
+ case NPC_LOKEN:
+ m_uiLokenGUID = pCreature->GetGUID();
+ break;
+ }
+ }
+
+ void OnGameObjectCreate(GameObject* pGo, bool add)
+ {
+ switch(pGo->GetEntry())
+ {
+ case GO_BJARNGRIM_DOOR:
+ m_uiBjarngrimDoorGUID = pGo->GetGUID();
+ if (m_auiEncounter[0] == DONE)
+ pGo->SetGoState(GO_STATE_ACTIVE);
+ break;
+ case GO_VOLKHAN_DOOR:
+ m_uiVolkhanDoorGUID = pGo->GetGUID();
+ if (m_auiEncounter[1] == DONE)
+ pGo->SetGoState(GO_STATE_ACTIVE);
+ break;
+ case GO_IONAR_DOOR:
+ m_uiIonarDoorGUID = pGo->GetGUID();
+ if (m_auiEncounter[2] == DONE)
+ pGo->SetGoState(GO_STATE_ACTIVE);
+ break;
+ case GO_LOKEN_DOOR:
+ m_uiLokenDoorGUID = pGo->GetGUID();
+ if (m_auiEncounter[3] == DONE)
+ pGo->SetGoState(GO_STATE_ACTIVE);
+ break;
+ case GO_LOKEN_THRONE:
+ m_uiLokenGlobeGUID = pGo->GetGUID();
+ break;
+ }
+ }
+
+ void SetData(uint32 uiType, uint32 uiData)
+ {
+ switch(uiType)
+ {
+ case TYPE_BJARNGRIM:
+ if (uiData == DONE)
+ DoUseDoorOrButton(m_uiBjarngrimDoorGUID);
+ m_auiEncounter[0] = uiData;
+ break;
+ case TYPE_VOLKHAN:
+ if (uiData == DONE)
+ DoUseDoorOrButton(m_uiVolkhanDoorGUID);
+ m_auiEncounter[1] = uiData;
+ break;
+ case TYPE_IONAR:
+ if (uiData == DONE)
+ DoUseDoorOrButton(m_uiIonarDoorGUID);
+ m_auiEncounter[2] = uiData;
+ break;
+ case TYPE_LOKEN:
+ if (uiData == DONE)
+ {
+ DoUseDoorOrButton(m_uiLokenDoorGUID);
+
+ //Appears to be type 5 GO with animation. Need to figure out how this work, code below only placeholder
+ if (GameObject* pGlobe = instance->GetGameObject(m_uiLokenGlobeGUID))
+ pGlobe->SetGoState(GO_STATE_ACTIVE);
+ }
+ m_auiEncounter[3] = uiData;
+ break;
+ }
+ }
+
+ uint32 GetData(uint32 uiType)
+ {
+ switch(uiType)
+ {
+ case TYPE_BJARNGRIM:
+ return m_auiEncounter[0];
+ case TYPE_VOLKHAN:
+ return m_auiEncounter[1];
+ case TYPE_IONAR:
+ return m_auiEncounter[2];
+ case TYPE_LOKEN:
+ return m_auiEncounter[3];
+ }
+ return 0;
+ }
+
+ uint64 GetData64(uint32 uiData)
+ {
+ switch(uiData)
+ {
+ case DATA_BJARNGRIM:
+ return m_uiGeneralBjarngrimGUID;
+ case DATA_VOLKHAN:
+ return m_uiVolkhanGUID;
+ case DATA_IONAR:
+ return m_uiIonarGUID;
+ case DATA_LOKEN:
+ return m_uiLokenGUID;
+ }
+ return 0;
+ }
};
-InstanceData* GetInstanceData_instance_halls_of_lightning(Map* map)
+InstanceData* GetInstanceData_instance_halls_of_lightning(Map* pMap)
{
- return new instance_halls_of_lightning(map);
+ return new instance_halls_of_lightning(pMap);
}
void AddSC_instance_halls_of_lightning()