aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bindings/scripts/scripts/zone/blackrock_depths/boss_tomb_of_seven.cpp177
-rw-r--r--src/bindings/scripts/scripts/zone/blackrock_depths/def_blackrock_depths.h9
-rw-r--r--src/bindings/scripts/scripts/zone/blackrock_depths/instance_blackrock_depths.cpp143
3 files changed, 309 insertions, 20 deletions
diff --git a/src/bindings/scripts/scripts/zone/blackrock_depths/boss_tomb_of_seven.cpp b/src/bindings/scripts/scripts/zone/blackrock_depths/boss_tomb_of_seven.cpp
index e793b2bf85d..321952f2e60 100644
--- a/src/bindings/scripts/scripts/zone/blackrock_depths/boss_tomb_of_seven.cpp
+++ b/src/bindings/scripts/scripts/zone/blackrock_depths/boss_tomb_of_seven.cpp
@@ -24,17 +24,15 @@ EndScriptData */
#include "precompiled.h"
#include "def_blackrock_depths.h"
-#define FACTION_NEUTRAL 734
-#define FACTION_HOSTILE 754
-
#define SPELL_SUNDERARMOR 24317
#define SPELL_SHIELDBLOCK 12169
#define SPELL_STRIKE 15580
struct TRINITY_DLL_DECL boss_angerrelAI : public ScriptedAI
{
- boss_angerrelAI(Creature *c) : ScriptedAI(c) {}
+ boss_angerrelAI(Creature *c) : ScriptedAI(c) {pInstance = c->GetInstanceData();}
+ ScriptedInstance* pInstance;
uint32 SunderArmor_Timer;
uint32 ShieldBlock_Timer;
uint32 Strike_Timer;
@@ -43,13 +41,32 @@ struct TRINITY_DLL_DECL boss_angerrelAI : public ScriptedAI
{
SunderArmor_Timer = 8000;
ShieldBlock_Timer = 15000;
- Strike_Timer = 12000;
+ Strike_Timer = 12000;
}
void EnterCombat(Unit *who)
{
}
+ void EnterEvadeMode()
+ {
+ m_creature->RemoveAllAuras();
+ m_creature->DeleteThreatList();
+ m_creature->CombatStop(true);
+ m_creature->LoadCreaturesAddon();
+ if(m_creature->isAlive())
+ m_creature->GetMotionMaster()->MoveTargetedHome();
+ m_creature->SetLootRecipient(NULL);
+ if(pInstance)
+ pInstance->SetData64(DATA_EVENSTARTER, 0);
+ }
+
+ void JustDied(Unit *who)
+ {
+ if(pInstance)
+ pInstance->SetData(DATA_GHOSTKILL, 1);
+ }
+
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
@@ -91,8 +108,9 @@ CreatureAI* GetAI_boss_angerrel(Creature *_Creature)
struct TRINITY_DLL_DECL boss_doperelAI : public ScriptedAI
{
- boss_doperelAI(Creature *c) : ScriptedAI(c) {}
-
+ boss_doperelAI(Creature *c) : ScriptedAI(c) {pInstance = c->GetInstanceData();}
+
+ ScriptedInstance* pInstance;
uint32 SinisterStrike_Timer;
uint32 BackStab_Timer;
uint32 Gouge_Timer;
@@ -108,6 +126,25 @@ struct TRINITY_DLL_DECL boss_doperelAI : public ScriptedAI
{
}
+ void EnterEvadeMode()
+ {
+ m_creature->RemoveAllAuras();
+ m_creature->DeleteThreatList();
+ m_creature->CombatStop(true);
+ m_creature->LoadCreaturesAddon();
+ if(m_creature->isAlive())
+ m_creature->GetMotionMaster()->MoveTargetedHome();
+ m_creature->SetLootRecipient(NULL);
+ if(pInstance)
+ pInstance->SetData64(DATA_EVENSTARTER, 0);
+ }
+
+ void JustDied(Unit *who)
+ {
+ if(pInstance)
+ pInstance->SetData(DATA_GHOSTKILL, 1);
+ }
+
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
@@ -149,8 +186,9 @@ CreatureAI* GetAI_boss_doperel(Creature *_Creature)
struct TRINITY_DLL_DECL boss_haterelAI : public ScriptedAI
{
- boss_haterelAI(Creature *c) : ScriptedAI(c) {}
+ boss_haterelAI(Creature *c) : ScriptedAI(c) {pInstance = c->GetInstanceData();}
+ ScriptedInstance* pInstance;
uint32 ShadowBolt_Timer;
uint32 ManaBurn_Timer;
uint32 ShadowShield_Timer;
@@ -168,6 +206,25 @@ struct TRINITY_DLL_DECL boss_haterelAI : public ScriptedAI
{
}
+ void EnterEvadeMode()
+ {
+ m_creature->RemoveAllAuras();
+ m_creature->DeleteThreatList();
+ m_creature->CombatStop(true);
+ m_creature->LoadCreaturesAddon();
+ if(m_creature->isAlive())
+ m_creature->GetMotionMaster()->MoveTargetedHome();
+ m_creature->SetLootRecipient(NULL);
+ if(pInstance)
+ pInstance->SetData64(DATA_EVENSTARTER, 0);
+ }
+
+ void JustDied(Unit *who)
+ {
+ if(pInstance)
+ pInstance->SetData(DATA_GHOSTKILL, 1);
+ }
+
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
@@ -221,8 +278,9 @@ CreatureAI* GetAI_boss_haterel(Creature *_Creature)
struct TRINITY_DLL_DECL boss_vilerelAI : public ScriptedAI
{
- boss_vilerelAI(Creature *c) : ScriptedAI(c) {}
+ boss_vilerelAI(Creature *c) : ScriptedAI(c) {pInstance = c->GetInstanceData();}
+ ScriptedInstance* pInstance;
uint32 MindBlast_Timer;
uint32 Heal_Timer;
uint32 PrayerOfHealing_Timer;
@@ -240,6 +298,25 @@ struct TRINITY_DLL_DECL boss_vilerelAI : public ScriptedAI
{
}
+ void EnterEvadeMode()
+ {
+ m_creature->RemoveAllAuras();
+ m_creature->DeleteThreatList();
+ m_creature->CombatStop(true);
+ m_creature->LoadCreaturesAddon();
+ if(m_creature->isAlive())
+ m_creature->GetMotionMaster()->MoveTargetedHome();
+ m_creature->SetLootRecipient(NULL);
+ if(pInstance)
+ pInstance->SetData64(DATA_EVENSTARTER, 0);
+ }
+
+ void JustDied(Unit *who)
+ {
+ if(pInstance)
+ pInstance->SetData(DATA_GHOSTKILL, 1);
+ }
+
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
@@ -290,8 +367,9 @@ CreatureAI* GetAI_boss_vilerel(Creature *_Creature)
struct TRINITY_DLL_DECL boss_seethrelAI : public ScriptedAI
{
- boss_seethrelAI(Creature *c) : ScriptedAI(c) {}
+ boss_seethrelAI(Creature *c) : ScriptedAI(c) {pInstance = c->GetInstanceData();}
+ ScriptedInstance* pInstance;
uint32 FrostArmor_Timer;
uint32 Frostbolt_Timer;
uint32 Blizzard_Timer;
@@ -313,6 +391,25 @@ struct TRINITY_DLL_DECL boss_seethrelAI : public ScriptedAI
{
}
+ void EnterEvadeMode()
+ {
+ m_creature->RemoveAllAuras();
+ m_creature->DeleteThreatList();
+ m_creature->CombatStop(true);
+ m_creature->LoadCreaturesAddon();
+ if(m_creature->isAlive())
+ m_creature->GetMotionMaster()->MoveTargetedHome();
+ m_creature->SetLootRecipient(NULL);
+ if(pInstance)
+ pInstance->SetData64(DATA_EVENSTARTER, 0);
+ }
+
+ void JustDied(Unit *who)
+ {
+ if(pInstance)
+ pInstance->SetData(DATA_GHOSTKILL, 1);
+ }
+
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
@@ -370,8 +467,9 @@ CreatureAI* GetAI_boss_seethrel(Creature *_Creature)
struct TRINITY_DLL_DECL boss_gloomrelAI : public ScriptedAI
{
- boss_gloomrelAI(Creature *c) : ScriptedAI(c) {}
+ boss_gloomrelAI(Creature *c) : ScriptedAI(c) {pInstance = c->GetInstanceData();}
+ ScriptedInstance* pInstance;
uint32 Hamstring_Timer;
uint32 Cleave_Timer;
uint32 MortalStrike_Timer;
@@ -382,13 +480,32 @@ struct TRINITY_DLL_DECL boss_gloomrelAI : public ScriptedAI
Cleave_Timer = 6000;
MortalStrike_Timer = 10000;
- m_creature->setFaction(FACTION_NEUTRAL);
+ m_creature->setFaction(FACTION_FRIEND);
}
void EnterCombat(Unit *who)
{
}
+ void EnterEvadeMode()
+ {
+ m_creature->RemoveAllAuras();
+ m_creature->DeleteThreatList();
+ m_creature->CombatStop(true);
+ m_creature->LoadCreaturesAddon();
+ if(m_creature->isAlive())
+ m_creature->GetMotionMaster()->MoveTargetedHome();
+ m_creature->SetLootRecipient(NULL);
+ if(pInstance)
+ pInstance->SetData64(DATA_EVENSTARTER, 0);
+ }
+
+ void JustDied(Unit *who)
+ {
+ if(pInstance)
+ pInstance->SetData(DATA_GHOSTKILL, 1);
+ }
+
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim() )
@@ -475,8 +592,9 @@ bool GossipSelect_boss_gloomrel(Player *player, Creature *_Creature, uint32 send
struct TRINITY_DLL_DECL boss_doomrelAI : public ScriptedAI
{
- boss_doomrelAI(Creature *c) : ScriptedAI(c) {}
+ boss_doomrelAI(Creature *c) : ScriptedAI(c) {pInstance = c->GetInstanceData();}
+ ScriptedInstance* pInstance;
uint32 ShadowVolley_Timer;
uint32 Immolate_Timer;
uint32 CurseOfWeakness_Timer;
@@ -495,13 +613,37 @@ struct TRINITY_DLL_DECL boss_doomrelAI : public ScriptedAI
DemonArmor_Timer = 16000;
Voidwalkers = false;
- m_creature->setFaction(FACTION_NEUTRAL);
+ m_creature->setFaction(FACTION_FRIEND);
+ if(pInstance)
+ if(pInstance->GetData(DATA_GHOSTKILL) >= 7)
+ m_creature->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE);
+ else
+ m_creature->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
}
void EnterCombat(Unit *who)
{
}
+ void EnterEvadeMode()
+ {
+ m_creature->RemoveAllAuras();
+ m_creature->DeleteThreatList();
+ m_creature->CombatStop(true);
+ m_creature->LoadCreaturesAddon();
+ if(m_creature->isAlive())
+ m_creature->GetMotionMaster()->MoveTargetedHome();
+ m_creature->SetLootRecipient(NULL);
+ if(pInstance)
+ pInstance->SetData64(DATA_EVENSTARTER, 0);
+ }
+
+ void JustDied(Unit *who)
+ {
+ if(pInstance)
+ pInstance->SetData(DATA_GHOSTKILL, 1);
+ }
+
void SummonVoidwalkers(Unit* victim)
{
Rand = rand()%5;
@@ -596,8 +738,13 @@ bool GossipSelect_boss_doomrel(Player *player, Creature *_Creature, uint32 sende
break;
case GOSSIP_ACTION_INFO_DEF+2:
player->CLOSE_GOSSIP_MENU();
- //start event here, below code just temporary
+ //start event here
_Creature->setFaction(FACTION_HOSTILE);
+ _Creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
+ _Creature->AI()->AttackStart(player);
+ ScriptedInstance* pInstance = _Creature->GetInstanceData();
+ if(pInstance)
+ pInstance->SetData64(DATA_EVENSTARTER,player->GetGUID());
break;
}
return true;
diff --git a/src/bindings/scripts/scripts/zone/blackrock_depths/def_blackrock_depths.h b/src/bindings/scripts/scripts/zone/blackrock_depths/def_blackrock_depths.h
index 8c3a04a16df..6ce124a7c3e 100644
--- a/src/bindings/scripts/scripts/zone/blackrock_depths/def_blackrock_depths.h
+++ b/src/bindings/scripts/scripts/zone/blackrock_depths/def_blackrock_depths.h
@@ -5,6 +5,10 @@
#ifndef DEF_BRD_H
#define DEF_BRD_H
+#define FACTION_NEUTRAL 734
+#define FACTION_HOSTILE 754
+#define FACTION_FRIEND 35
+
enum
{
TYPE_RING_OF_LAW = 1,
@@ -25,7 +29,10 @@ enum
DATA_GO_BAR_KEG = 16,
DATA_GO_BAR_KEG_TRAP = 17,
DATA_GO_BAR_DOOR = 18,
- DATA_GO_CHALICE = 19
+ DATA_GO_CHALICE = 19,
+
+ DATA_GHOSTKILL = 20,
+ DATA_EVENSTARTER = 21
};
#endif
diff --git a/src/bindings/scripts/scripts/zone/blackrock_depths/instance_blackrock_depths.cpp b/src/bindings/scripts/scripts/zone/blackrock_depths/instance_blackrock_depths.cpp
index 3d77ced9d94..8f2afcbe926 100644
--- a/src/bindings/scripts/scripts/zone/blackrock_depths/instance_blackrock_depths.cpp
+++ b/src/bindings/scripts/scripts/zone/blackrock_depths/instance_blackrock_depths.cpp
@@ -32,12 +32,21 @@ update `instance_template` set `script`='instance_blackrock_depths' where `map`=
#include "precompiled.h"
#include "def_blackrock_depths.h"
+#define TIMER_TOMBOFTHESEVEN 15000
+
enum
{
ENCOUNTERS = 6,
NPC_EMPEROR = 9019,
NPC_PHALANX = 9502,
+ NPC_ANGERREL = 9035,
+ NPC_DOPEREL = 9040,
+ NPC_HATEREL = 9034,
+ NPC_VILEREL = 9036,
+ NPC_SEETHREL = 9038,
+ NPC_GLOOMREL = 9037,
+ NPC_DOOMREL = 9039,
GO_ARENA1 = 161525,
GO_ARENA2 = 161522,
@@ -88,8 +97,14 @@ struct TRINITY_DLL_DECL instance_blackrock_depths : public ScriptedInstance
uint64 GoGolemNGUID;
uint64 GoGolemSGUID;
uint64 GoThoneGUID;
+ uint64 GoChestGUID;
uint32 BarAleCount;
+ uint32 GhostKillCount;
+ uint64 TombBossGUIDs[7];
+ uint64 TombEventStarterGUID;
+ uint32 TombTimer;
+ uint32 TombEventCounter;
void Initialize()
{
@@ -113,11 +128,18 @@ struct TRINITY_DLL_DECL instance_blackrock_depths : public ScriptedInstance
GoGolemNGUID = 0;
GoGolemSGUID = 0;
GoThoneGUID = 0;
+ GoChestGUID = 0;
BarAleCount = 0;
+ GhostKillCount = 0;
+ TombEventStarterGUID = 0;
+ TombTimer = TIMER_TOMBOFTHESEVEN;
+ TombEventCounter = 0;
for(uint8 i = 0; i < ENCOUNTERS; i++)
Encounter[i] = NOT_STARTED;
+ for(uint8 i = 0; i < 7; i++)
+ TombBossGUIDs[i] = 0;
}
void OnCreatureCreate(Creature *creature, bool add)
@@ -126,6 +148,13 @@ struct TRINITY_DLL_DECL instance_blackrock_depths : public ScriptedInstance
{
case NPC_EMPEROR: EmperorGUID = creature->GetGUID(); break;
case NPC_PHALANX: PhalanxGUID = creature->GetGUID(); break;
+ case NPC_DOOMREL: TombBossGUIDs[0] = creature->GetGUID(); break;
+ case NPC_DOPEREL: TombBossGUIDs[1] = creature->GetGUID(); break;
+ case NPC_HATEREL: TombBossGUIDs[2] = creature->GetGUID(); break;
+ case NPC_VILEREL: TombBossGUIDs[3] = creature->GetGUID(); break;
+ case NPC_SEETHREL: TombBossGUIDs[4] = creature->GetGUID(); break;
+ case NPC_GLOOMREL: TombBossGUIDs[5] = creature->GetGUID(); break;
+ case NPC_ANGERREL: TombBossGUIDs[6] = creature->GetGUID(); break;
}
}
@@ -145,11 +174,34 @@ struct TRINITY_DLL_DECL instance_blackrock_depths : public ScriptedInstance
case GO_BAR_KEG_TRAP: GoBarKegTrapGUID = go->GetGUID(); break;
case GO_BAR_DOOR: GoBarDoorGUID = go->GetGUID(); break;
case GO_TOMB_ENTER: GoTombEnterGUID = go->GetGUID(); break;
- case GO_TOMB_EXIT: GoTombExitGUID = go->GetGUID(); break;
+ case GO_TOMB_EXIT:
+ GoTombExitGUID = go->GetGUID();
+ if(GhostKillCount >= 7)
+ HandleGameObject(0, true, go);
+ else
+ HandleGameObject(0, false, go);
+ break;
case GO_LYCEUM: GoLyceumGUID = go->GetGUID(); break;
case GO_GOLEM_ROOM_N: GoGolemNGUID = go->GetGUID(); break;
case GO_GOLEM_ROOM_S: GoGolemSGUID = go->GetGUID(); break;
case GO_THONE_ROOM: GoThoneGUID = go->GetGUID(); break;
+ case GO_CHEST_SEVEN: GoChestGUID = go->GetGUID(); break;
+ }
+ }
+
+ void SetData64(uint32 type, uint64 data)
+ {
+ debug_log("TSCR: Instance Blackrock Depths: SetData64 update (Type: %u Data %u)", type, data);
+
+ switch(type)
+ {
+ case DATA_EVENSTARTER:
+ TombEventStarterGUID = data;
+ if(!TombEventStarterGUID)
+ TombOfSevenReset();//reset
+ else
+ TombOfSevenStart();//start
+ break;
}
}
@@ -180,15 +232,18 @@ struct TRINITY_DLL_DECL instance_blackrock_depths : public ScriptedInstance
case TYPE_IRON_HALL:
Encounter[5] = data;
break;
+ case DATA_GHOSTKILL:
+ GhostKillCount += data;
+ break;
}
- if (data == DONE)
+ if (data == DONE || GhostKillCount >= 7)
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << Encounter[0] << " " << Encounter[1] << " " << Encounter[2] << " "
- << Encounter[3] << " " << Encounter[4] << " " << Encounter[5];
+ << Encounter[3] << " " << Encounter[4] << " " << Encounter[5] << " " << GhostKillCount;
str_data = saveStream.str();
@@ -216,6 +271,8 @@ struct TRINITY_DLL_DECL instance_blackrock_depths : public ScriptedInstance
return Encounter[4];
case TYPE_IRON_HALL:
return Encounter[5];
+ case DATA_GHOSTKILL:
+ return GhostKillCount;
}
return 0;
}
@@ -242,6 +299,8 @@ struct TRINITY_DLL_DECL instance_blackrock_depths : public ScriptedInstance
return GoBarKegTrapGUID;
case DATA_GO_BAR_DOOR:
return GoBarDoorGUID;
+ case DATA_EVENSTARTER:
+ return TombEventStarterGUID;
}
return 0;
}
@@ -263,14 +322,90 @@ struct TRINITY_DLL_DECL instance_blackrock_depths : public ScriptedInstance
std::istringstream loadStream(in);
loadStream >> Encounter[0] >> Encounter[1] >> Encounter[2] >> Encounter[3]
- >> Encounter[4] >> Encounter[5];
+ >> Encounter[4] >> Encounter[5] >> GhostKillCount;
for(uint8 i = 0; i < ENCOUNTERS; ++i)
if (Encounter[i] == IN_PROGRESS)
Encounter[i] = NOT_STARTED;
+ if(GhostKillCount > 0 && GhostKillCount < 7)
+ GhostKillCount = 0;//reset tomb of seven event
+ if(GhostKillCount > 7)
+ GhostKillCount = 7;
OUT_LOAD_INST_DATA_COMPLETE;
}
+
+ void TombOfSevenEvent()
+ {
+ if(GhostKillCount < 7 && TombBossGUIDs[TombEventCounter])
+ {
+ if(Creature* boss = instance->GetCreature(TombBossGUIDs[TombEventCounter]))
+ {
+ boss->setFaction(FACTION_HOSTILE);
+ boss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
+ if(Unit* target = boss->SelectNearestTarget(500))
+ boss->AI()->AttackStart(target);
+ }
+ }
+ }
+
+ void TombOfSevenReset()
+ {
+ HandleGameObject(GoTombExitGUID,false);//event reseted, close exit door
+ HandleGameObject(GoTombEnterGUID,true);//event reseted, open entrance door
+ for(uint8 i = 0; i < 7; i++)
+ {
+ if(Creature* boss = instance->GetCreature(TombBossGUIDs[i]))
+ {
+ if(!boss->isAlive())
+ {//do not call EnterEvadeMode(), it will create infinit loops
+ boss->Respawn();
+ boss->RemoveAllAuras();
+ boss->DeleteThreatList();
+ boss->CombatStop(true);
+ boss->LoadCreaturesAddon();
+ boss->GetMotionMaster()->MoveTargetedHome();
+ boss->SetLootRecipient(NULL);
+ }
+ boss->setFaction(FACTION_FRIEND);
+ }
+ }
+ GhostKillCount = 0;
+ TombEventStarterGUID = 0;
+ TombEventCounter = 0;
+ TombTimer = TIMER_TOMBOFTHESEVEN;
+ SetData(TYPE_TOMB_OF_SEVEN, NOT_STARTED);
+ }
+
+ void TombOfSevenStart()
+ {
+ HandleGameObject(GoTombExitGUID,false);//event started, close exit door
+ HandleGameObject(GoTombEnterGUID,false);//event started, close entrance door
+ SetData(TYPE_TOMB_OF_SEVEN, IN_PROGRESS);
+ }
+
+ void TombOfSevenEnd()
+ {
+ DoRespawnGameObject(GoChestGUID,DAY);
+ HandleGameObject(GoTombExitGUID,true);//event done, open exit door
+ HandleGameObject(GoTombEnterGUID,true);//event done, open entrance door
+ TombEventStarterGUID = 0;
+ SetData(TYPE_TOMB_OF_SEVEN, DONE);
+ }
+ void Update(uint32 diff)
+ {
+ if(TombEventStarterGUID && GhostKillCount < 7)
+ {
+ if(TombTimer <= diff)
+ {
+ TombTimer = TIMER_TOMBOFTHESEVEN;
+ TombEventCounter++;
+ TombOfSevenEvent();
+ }else TombTimer -= diff;
+ }
+ if(GhostKillCount >= 7 && TombEventStarterGUID)
+ TombOfSevenEnd();
+ }
};
InstanceData* GetInstanceData_instance_blackrock_depths(Map* map)