From ea9b58292e9fe0df10f80f6d09d4169c69d5f9da Mon Sep 17 00:00:00 2001 From: Treeston Date: Fri, 21 Jul 2017 17:29:06 +0200 Subject: [PATCH] Scripts/Auchindoun: Last one, hopefully. Remove reliance on large grid searchers by integrating with instance script. # Conflicts: # src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp --- .../boss_blackheart_the_inciter.cpp | 26 ++++---- .../instance_shadow_labyrinth.cpp | 66 +++++++++++++++++++ .../ShadowLabyrinth/shadow_labyrinth.h | 9 +++ 3 files changed, 88 insertions(+), 13 deletions(-) diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp index 2b1ba271fad..de7e0d6ea91 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp @@ -26,7 +26,6 @@ enum BlackheartTheInciter { - NPC_BLACKHEART = 18667, SPELL_INCITE_CHAOS = 33676, SPELL_INCITE_CHAOS_B = 33684, //debuff applied to each member of party SPELL_CHARGE = 33709, @@ -79,7 +78,7 @@ class BlackheartCharmedPlayerAI : public SimpleCharmedPlayerAI void OnCharmed(bool apply) override { SimpleCharmedPlayerAI::OnCharmed(apply); - if (Creature* blackheart = me->FindNearestCreature(NPC_BLACKHEART, 50000.0f)) + if (Creature* blackheart = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetGuidData(DATA_BLACKHEART_THE_INCITER))) { blackheart->AI()->SetData(0, apply); blackheart->GetThreatManager().AddThreat(me, 0.0f); @@ -182,24 +181,25 @@ struct boss_blackheart_the_inciter_mc_dummy : public NullCreatureAI { using NullCreatureAI::NullCreatureAI; void InitializeAI() override { me->SetReactState(REACT_PASSIVE); } - static const uint32 FIRST_DUMMY = 19300, LAST_DUMMY = 19304; + static const uint32 FIRST_DUMMY = NPC_BLACKHEART_DUMMY1, LAST_DUMMY = NPC_BLACKHEART_DUMMY5; void IsSummonedBy(Unit* who) override { me->CastSpell(who, SPELL_INCITE_CHAOS_B, true); // ensure everyone is in combat with everyone - for (uint32 entry = FIRST_DUMMY; entry <= LAST_DUMMY; ++entry) - if (entry != me->GetEntry()) - if (Creature* trigger = me->FindNearestCreature(entry, 50000.0f)) - { - me->GetThreatManager().AddThreat(trigger, 0.0f); - trigger->GetThreatManager().AddThreat(who, 0.0f); - for (Unit* other : trigger->m_Controlled) + if (auto* dummies = GetBlackheartDummies(me->GetInstanceScript())) + for (ObjectGuid const& guid : *dummies) + if (Creature* trigger = ObjectAccessor::GetCreature(*me, guid)) + if (me->GetEntry() != trigger->GetEntry()) { - me->GetThreatManager().AddThreat(other, 0.0f); - other->GetThreatManager().AddThreat(who, 0.0f); + me->GetThreatManager().AddThreat(trigger, 0.0f); + trigger->GetThreatManager().AddThreat(who, 0.0f); + for (Unit* other : trigger->m_Controlled) + { + me->GetThreatManager().AddThreat(other, 0.0f); + other->GetThreatManager().AddThreat(who, 0.0f); + } } - } } void UpdateAI(uint32 /*diff*/) override { diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp index 5a8bdaade32..aff019e6e15 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp @@ -51,6 +51,16 @@ class instance_shadow_labyrinth : public InstanceMapScript case NPC_AMBASSADOR_HELLMAW: AmbassadorHellmawGUID = creature->GetGUID(); break; + case NPC_BLACKHEART: + BlackheartGUID = creature->GetGUID(); + break; + case NPC_BLACKHEART_DUMMY1: + case NPC_BLACKHEART_DUMMY2: + case NPC_BLACKHEART_DUMMY3: + case NPC_BLACKHEART_DUMMY4: + case NPC_BLACKHEART_DUMMY5: + BlackheartDummyGUIDs.insert(creature->GetGUID()); + break; case NPC_GRANDMASTER_VORPIL: GrandmasterVorpilGUID = creature->GetGUID(); break; @@ -67,6 +77,48 @@ class instance_shadow_labyrinth : public InstanceMapScript } } + void OnCreatureRemove(Creature* creature) override + { + switch (creature->GetEntry()) + { + case NPC_BLACKHEART_DUMMY1: + case NPC_BLACKHEART_DUMMY2: + case NPC_BLACKHEART_DUMMY3: + case NPC_BLACKHEART_DUMMY4: + case NPC_BLACKHEART_DUMMY5: + BlackheartDummyGUIDs.erase(creature->GetGUID()); + break; + default: + break; + } + } + + void OnGameObjectCreate(GameObject* go) override + { + switch (go->GetEntry()) + { + case GO_REFECTORY_DOOR: + case GO_SCREAMING_HALL_DOOR: + AddDoor(go, true); + break; + default: + break; + } + } + + void OnGameObjectRemove(GameObject* go) override + { + switch (go->GetEntry()) + { + case GO_REFECTORY_DOOR: + case GO_SCREAMING_HALL_DOOR: + AddDoor(go, false); + break; + default: + break; + } + } + void OnUnitDeath(Unit* unit) override { Creature* creature = unit->ToCreature(); @@ -100,6 +152,8 @@ class instance_shadow_labyrinth : public InstanceMapScript { switch (type) { + case DATA_BLACKHEART_THE_INCITER: + return BlackheartGUID; case DATA_GRANDMASTER_VORPIL: return GrandmasterVorpilGUID; default: @@ -108,8 +162,12 @@ class instance_shadow_labyrinth : public InstanceMapScript return ObjectGuid::Empty; } + GuidUnorderedSet const& GetBlackheartDummies() const { return BlackheartDummyGUIDs; } + protected: ObjectGuid AmbassadorHellmawGUID; + ObjectGuid BlackheartGUID; + GuidUnorderedSet BlackheartDummyGUIDs; ObjectGuid GrandmasterVorpilGUID; uint32 FelOverseerCount; }; @@ -120,6 +178,14 @@ class instance_shadow_labyrinth : public InstanceMapScript } }; +GuidUnorderedSet const* GetBlackheartDummies(InstanceScript const* s) +{ + if (auto* script = dynamic_cast(s)) + return &script->GetBlackheartDummies(); + return nullptr; + +} + void AddSC_instance_shadow_labyrinth() { new instance_shadow_labyrinth(); diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.h b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.h index df7fd9e892b..642ee116055 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.h +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.h @@ -19,6 +19,7 @@ #define SHADOW_LABYRINTH_H_ #include "CreatureAIImpl.h" +#include "ObjectGuid.h" #define SLScriptName "instance_shadow_labyrinth" #define DataHeader "SL" @@ -40,6 +41,12 @@ enum SLDataTypes enum SLCreatureIds { NPC_AMBASSADOR_HELLMAW = 18731, + NPC_BLACKHEART = 18667, + NPC_BLACKHEART_DUMMY1 = 19300, + NPC_BLACKHEART_DUMMY2 = 19301, + NPC_BLACKHEART_DUMMY3 = 19302, + NPC_BLACKHEART_DUMMY4 = 19303, + NPC_BLACKHEART_DUMMY5 = 19304, NPC_GRANDMASTER_VORPIL = 18732, NPC_FEL_OVERSEER = 18796 }; @@ -56,6 +63,8 @@ enum SLMisc ACTION_AMBASSADOR_HELLMAW_BANISH = 2, }; +GuidUnorderedSet const* GetBlackheartDummies(InstanceScript const* s); + template inline AI* GetShadowLabyrinthAI(T* obj) {