feat(Core/Instances): Implement SummonData (#20582)

This commit is contained in:
Andrew
2024-11-15 10:49:02 -03:00
committed by GitHub
parent c9665aa69b
commit e1d0cf9a15
3 changed files with 36 additions and 16 deletions

View File

@@ -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())

View File

@@ -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

View File

@@ -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: