summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew <47818697+Nyeriah@users.noreply.github.com>2024-11-15 10:49:02 -0300
committerGitHub <noreply@github.com>2024-11-15 10:49:02 -0300
commite1d0cf9a15b6c2e54c90f1f8716f588d7005147b (patch)
treed026da038b997efcb79527108fabf05b401bc301 /src
parentc9665aa69b67d70027e0f61bb9125679bbc16c91 (diff)
feat(Core/Instances): Implement SummonData (#20582)
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Instances/InstanceScript.cpp22
-rw-r--r--src/server/game/Instances/InstanceScript.h6
-rw-r--r--src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp24
3 files changed, 36 insertions, 16 deletions
diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp
index bbc160c010..0509054165 100644
--- a/src/server/game/Instances/InstanceScript.cpp
+++ b/src/server/game/Instances/InstanceScript.cpp
@@ -59,6 +59,9 @@ void InstanceScript::OnCreatureCreate(Creature* creature)
{
AddObject(creature);
AddMinion(creature);
+
+ if (creature->IsSummon())
+ SetSummoner(creature);
}
void InstanceScript::OnCreatureRemove(Creature* creature)
@@ -194,6 +197,15 @@ void InstanceScript::LoadObjectData(ObjectData const* data, ObjectInfoMap& objec
}
}
+void InstanceScript::LoadSummonData(ObjectData const* data)
+{
+ while (data->entry)
+ {
+ _summonInfo[data->entry] = data->type;
+ ++data;
+ }
+}
+
void InstanceScript::UpdateMinionState(Creature* minion, EncounterState state)
{
switch (state)
@@ -348,6 +360,16 @@ void InstanceScript::RemoveMinion(Creature* minion)
AddMinion(minion, false);
}
+void InstanceScript::SetSummoner(Creature* creature)
+{
+ auto const& summonData = _summonInfo.find(creature->GetEntry());
+
+ if (summonData != _summonInfo.end())
+ if (Creature* summoner = GetCreature(summonData->second))
+ if (summoner->IsAIEnabled)
+ summoner->AI()->JustSummoned(creature);
+}
+
bool InstanceScript::SetBossState(uint32 id, EncounterState state)
{
if (id < bosses.size())
diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h
index c5add7eb20..8e6f83c1ff 100644
--- a/src/server/game/Instances/InstanceScript.h
+++ b/src/server/game/Instances/InstanceScript.h
@@ -288,6 +288,11 @@ protected:
void LoadDoorData(DoorData const* data);
void LoadMinionData(MinionData const* data);
void LoadObjectData(ObjectData const* creatureData, ObjectData const* gameObjectData);
+ // Allows setting another creature as summoner for a creature.
+ // This is used to handle summons that are not directly controlled by the summoner.
+ // Summoner creature must be loaded in the instance data (LoadObjectData).
+ void LoadSummonData(ObjectData const* data);
+ void SetSummoner(Creature* creature);
void AddObject(Creature* obj, bool add = true);
void RemoveObject(Creature* obj);
@@ -324,6 +329,7 @@ private:
MinionInfoMap minions;
ObjectInfoMap _creatureInfo;
ObjectInfoMap _gameObjectInfo;
+ ObjectInfoMap _summonInfo;
ObjectGuidMap _objectGuids;
ObjectStateMap _objectStateMap;
uint32 completedEncounters; // completed encounter mask, bit indexes are DungeonEncounter.dbc boss numbers, used for packets
diff --git a/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp b/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp
index ed520d5c3a..93a482721b 100644
--- a/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp
+++ b/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp
@@ -66,8 +66,13 @@ ObjectData const creatureData[] =
{ 0, 0 }
};
-ObjectData const objectData[] =
+ObjectData const summonData[] =
{
+ { NPC_BLADE_OF_AZZINOTH, DATA_ILLIDAN_STORMRAGE },
+ { NPC_FLAME_OF_AZZINOTH, DATA_ILLIDAN_STORMRAGE },
+ { NPC_PARASITIC_SHADOWFIEND, DATA_ILLIDAN_STORMRAGE },
+ { NPC_SHADOWY_CONSTRUCT, DATA_TERON_GOREFIEND },
+ { NPC_ENSLAVED_SOUL, DATA_RELIQUARY_OF_SOULS },
{ 0, 0 }
};
@@ -99,7 +104,8 @@ public:
SetBossNumber(MAX_ENCOUNTERS);
LoadDoorData(doorData);
LoadBossBoundaries(boundaries);
- LoadObjectData(creatureData, objectData);
+ LoadObjectData(creatureData, nullptr);
+ LoadSummonData(summonData);
ashtongueGUIDs.clear();
}
@@ -108,20 +114,6 @@ public:
{
switch (creature->GetEntry())
{
- case NPC_SHADOWY_CONSTRUCT:
- if (Creature* teron = GetCreature(DATA_TERON_GOREFIEND))
- teron->AI()->JustSummoned(creature);
- break;
- case NPC_ENSLAVED_SOUL:
- if (Creature* reliquary = GetCreature(DATA_RELIQUARY_OF_SOULS))
- reliquary->AI()->JustSummoned(creature);
- break;
- case NPC_PARASITIC_SHADOWFIEND:
- case NPC_BLADE_OF_AZZINOTH:
- case NPC_FLAME_OF_AZZINOTH:
- if (Creature* illidan = GetCreature(DATA_ILLIDAN_STORMRAGE))
- illidan->AI()->JustSummoned(creature);
- break;
case NPC_ANGERED_SOUL_FRAGMENT:
case NPC_HUNGERING_SOUL_FRAGMENT:
case NPC_SUFFERING_SOUL_FRAGMENT: