*Add script of General Bjarngrim, Halls of Lightning. Source: SD2. Thanks to manuel.

--HG--
branch : trunk
This commit is contained in:
megamage
2009-08-06 08:49:41 -05:00
parent 6941264b3d
commit 87c8df8f3a
6 changed files with 646 additions and 61 deletions
@@ -1,86 +1,429 @@
/* Script Data Start
SDName: Boss bjarngrim
SDAuthor: LordVanMartin
SD%Complete:
SDComment:
SDCategory:
Script Data 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 */
/*** SQL START ***
update creature_template set scriptname = '' where entry = '';
*** SQL END ***/
#include "precompiled.h"
#include "def_halls_of_lightning.h"
//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
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,
//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
SPELL_DEFENSIVE_STANCE = 53790,
//SPELL_DEFENSIVE_AURA = 41105,
SPELL_SPELL_REFLECTION = 36096,
SPELL_PUMMEL = 12555,
SPELL_KNOCK_AWAY = 52029,
SPELL_IRONFORM = 52022,
//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
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,
//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();
}
uint32 whirlwind;
ScriptedInstance* m_pInstance;
void Reset() {}
void EnterCombat(Unit* who)
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;
m_uiIntercept_Timer = 5000;
m_uiWhirlwind_Timer = 10000;
m_uiCleave_Timer = 8000;
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 AttackStart(Unit* who) {}
void MoveInLineOfSight(Unit* who) {}
void UpdateAI(const uint32 diff)
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 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)
{
DoScriptText(SAY_DEATH, m_creature);
m_pInstance = ((ScriptedInstance*)pCreature->GetInstanceData());
m_bIsHeroic = pCreature->GetMap()->IsHeroic();
Reset();
}
void KilledUnit(Unit *victim)
ScriptedInstance* m_pInstance;
bool m_bIsHeroic;
uint32 m_uiArcWeld_Timer;
uint32 m_uiRenewSteel_Timer;
void Reset()
{
if(victim == m_creature)
return;
switch(rand()%3)
m_uiArcWeld_Timer = 20000 + rand()%1000;
m_uiRenewSteel_Timer = 10000 + rand()%1000;
}
void EnterCombat(Unit* pWho)
{
if (m_pInstance)
{
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;
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;
if (m_uiArcWeld_Timer < uiDiff)
{
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();
}
@@ -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
@@ -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()