feat(Core/Instances): Implement SummonData (#20582)
This commit is contained in:
@@ -59,6 +59,9 @@ void InstanceScript::OnCreatureCreate(Creature* creature)
|
|||||||
{
|
{
|
||||||
AddObject(creature);
|
AddObject(creature);
|
||||||
AddMinion(creature);
|
AddMinion(creature);
|
||||||
|
|
||||||
|
if (creature->IsSummon())
|
||||||
|
SetSummoner(creature);
|
||||||
}
|
}
|
||||||
|
|
||||||
void InstanceScript::OnCreatureRemove(Creature* 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)
|
void InstanceScript::UpdateMinionState(Creature* minion, EncounterState state)
|
||||||
{
|
{
|
||||||
switch (state)
|
switch (state)
|
||||||
@@ -348,6 +360,16 @@ void InstanceScript::RemoveMinion(Creature* minion)
|
|||||||
AddMinion(minion, false);
|
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)
|
bool InstanceScript::SetBossState(uint32 id, EncounterState state)
|
||||||
{
|
{
|
||||||
if (id < bosses.size())
|
if (id < bosses.size())
|
||||||
|
|||||||
@@ -288,6 +288,11 @@ protected:
|
|||||||
void LoadDoorData(DoorData const* data);
|
void LoadDoorData(DoorData const* data);
|
||||||
void LoadMinionData(MinionData const* data);
|
void LoadMinionData(MinionData const* data);
|
||||||
void LoadObjectData(ObjectData const* creatureData, ObjectData const* gameObjectData);
|
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 AddObject(Creature* obj, bool add = true);
|
||||||
void RemoveObject(Creature* obj);
|
void RemoveObject(Creature* obj);
|
||||||
@@ -324,6 +329,7 @@ private:
|
|||||||
MinionInfoMap minions;
|
MinionInfoMap minions;
|
||||||
ObjectInfoMap _creatureInfo;
|
ObjectInfoMap _creatureInfo;
|
||||||
ObjectInfoMap _gameObjectInfo;
|
ObjectInfoMap _gameObjectInfo;
|
||||||
|
ObjectInfoMap _summonInfo;
|
||||||
ObjectGuidMap _objectGuids;
|
ObjectGuidMap _objectGuids;
|
||||||
ObjectStateMap _objectStateMap;
|
ObjectStateMap _objectStateMap;
|
||||||
uint32 completedEncounters; // completed encounter mask, bit indexes are DungeonEncounter.dbc boss numbers, used for packets
|
uint32 completedEncounters; // completed encounter mask, bit indexes are DungeonEncounter.dbc boss numbers, used for packets
|
||||||
|
|||||||
@@ -66,8 +66,13 @@ ObjectData const creatureData[] =
|
|||||||
{ 0, 0 }
|
{ 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 }
|
{ 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -99,7 +104,8 @@ public:
|
|||||||
SetBossNumber(MAX_ENCOUNTERS);
|
SetBossNumber(MAX_ENCOUNTERS);
|
||||||
LoadDoorData(doorData);
|
LoadDoorData(doorData);
|
||||||
LoadBossBoundaries(boundaries);
|
LoadBossBoundaries(boundaries);
|
||||||
LoadObjectData(creatureData, objectData);
|
LoadObjectData(creatureData, nullptr);
|
||||||
|
LoadSummonData(summonData);
|
||||||
|
|
||||||
ashtongueGUIDs.clear();
|
ashtongueGUIDs.clear();
|
||||||
}
|
}
|
||||||
@@ -108,20 +114,6 @@ public:
|
|||||||
{
|
{
|
||||||
switch (creature->GetEntry())
|
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_ANGERED_SOUL_FRAGMENT:
|
||||||
case NPC_HUNGERING_SOUL_FRAGMENT:
|
case NPC_HUNGERING_SOUL_FRAGMENT:
|
||||||
case NPC_SUFFERING_SOUL_FRAGMENT:
|
case NPC_SUFFERING_SOUL_FRAGMENT:
|
||||||
|
|||||||
Reference in New Issue
Block a user