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