diff options
author | Andrew <47818697+Nyeriah@users.noreply.github.com> | 2024-11-15 10:49:02 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-11-15 10:49:02 -0300 |
commit | e1d0cf9a15b6c2e54c90f1f8716f588d7005147b (patch) | |
tree | d026da038b997efcb79527108fabf05b401bc301 /src | |
parent | c9665aa69b67d70027e0f61bb9125679bbc16c91 (diff) |
feat(Core/Instances): Implement SummonData (#20582)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Instances/InstanceScript.cpp | 22 | ||||
-rw-r--r-- | src/server/game/Instances/InstanceScript.h | 6 | ||||
-rw-r--r-- | src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp | 24 |
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: |