diff options
Diffstat (limited to 'src')
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) |
