mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-21 12:47:07 +00:00
feat(Core/Instances): Implement SummonData (#20582)
This commit is contained in:
@@ -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())
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user