@@ -8843,10 +8843,10 @@ void Unit::RegisterSummon(SummonInfo* summon)
88438843 // causes them to interact with the summoner in some way (e.g. despawning when the summoner died)
88448844 if (slot == SummonPropertiesSlot::None)
88458845 {
8846- if (advstd::ranges::contains(_wildSummons , summon))
8846+ if (advstd::ranges::contains(_unslottedSummons , summon))
88478847 return;
88488848
8849- _wildSummons .push_back(summon);
8849+ _unslottedSummons .push_back(summon);
88508850 return;
88518851 }
88528852
@@ -8867,7 +8867,7 @@ void Unit::UnregisterSummon(SummonInfo* summon)
88678867 SummonPropertiesSlot slot = summon->GetSummonSlot();
88688868 if (slot == SummonPropertiesSlot::None)
88698869 {
8870- std::erase(_wildSummons , summon);
8870+ std::erase(_unslottedSummons , summon);
88718871 return;
88728872 }
88738873
@@ -8877,30 +8877,38 @@ void Unit::UnregisterSummon(SummonInfo* summon)
88778877
88788878void Unit::DespawnSummonsOnSummonerLogout()
88798879{
8880- // Summons which are stored in a summon slot will always despawn
8881- std::vector<SummonInfo*> slottedSummons = _slottedSummons;
8882- for (SummonInfo* summon : slottedSummons)
8883- if (summon)
8880+ std::vector<SummonInfo*> unslottedSummons = _unslottedSummons;
8881+ for (SummonInfo* summon : unslottedSummons)
8882+ if (summon->DespawnsOnSummonerLogout())
88848883 summon->GetSummonedCreature()->DespawnOrUnsummon();
88858884
8886- // Wild summons on the other hand only despawn when the according flag is set
8887- std::vector<SummonInfo*> wildSummons = _wildSummons;
8888- for (SummonInfo* summon : wildSummons)
8889- if (summon->DespawnsOnSummonerLogout())
8885+ std::vector<SummonInfo*> slottedSummons = _slottedSummons;
8886+ for (SummonInfo* summon : slottedSummons)
8887+ if (summon && summon->DespawnsOnSummonerLogout())
88908888 summon->GetSummonedCreature()->DespawnOrUnsummon();
88918889}
88928890
88938891void Unit::DespawnSummonsOnSummonerDeath()
88948892{
8893+ std::vector<SummonInfo*> unslottedSummons = _unslottedSummons;
8894+ for (SummonInfo* summon : unslottedSummons)
8895+ if (summon->DespawnsOnSummonerDeath())
8896+ summon->GetSummonedCreature()->DespawnOrUnsummon();
8897+
88958898 std::vector<SummonInfo*> slottedSummons = _slottedSummons;
88968899 for (SummonInfo* summon : slottedSummons)
88978900 if (summon && summon->DespawnsOnSummonerDeath())
88988901 summon->GetSummonedCreature()->DespawnOrUnsummon();
88998902
8900- std::vector<SummonInfo*> wildSummons = _wildSummons;
8901- for (SummonInfo* summon : wildSummons)
8902- if (summon->DespawnsOnSummonerDeath())
8903- summon->GetSummonedCreature()->DespawnOrUnsummon();
8903+ }
8904+
8905+ void Unit::DismissPet()
8906+ {
8907+ if (!GetMinionGUID())
8908+ return;
8909+
8910+ for (SummonInfo* summonInfo : GetSummonsByControlType(SummonPropertiesControl::Pet))
8911+ summonInfo->GetSummonedCreature()->DespawnOrUnsummon();
89048912}
89058913
89068914SummonInfo* Unit::GetSummonInSlot(SummonPropertiesSlot slot) const
@@ -8921,14 +8929,14 @@ std::vector<SummonInfo*> Unit::GetSummonsByCreatureId(uint32 creatureId)
89218929 std::vector<SummonInfo*> summons;
89228930
89238931
8924- std::ranges::copy_if(_wildSummons , std::back_inserter(summons), [creatureId](SummonInfo const* summon)
8932+ std::ranges::copy_if(_unslottedSummons , std::back_inserter(summons), [creatureId](SummonInfo const* summon)
89258933 {
89268934 return summon->GetSummonedCreature()->GetEntry() == creatureId;
89278935 });
89288936
89298937 std::ranges::copy_if(_slottedSummons, std::back_inserter(summons), [creatureId](SummonInfo const* summon)
89308938 {
8931- return summon->GetSummonedCreature()->GetEntry() == creatureId;
8939+ return summon && summon ->GetSummonedCreature()->GetEntry() == creatureId;
89328940 });
89338941
89348942 return summons;
@@ -8941,14 +8949,31 @@ std::vector<SummonInfo*> Unit::GetSummonsBySpellId(uint32 spellId)
89418949
89428950 std::vector<SummonInfo*> summons;
89438951
8944- std::ranges::copy_if(_wildSummons , std::back_inserter(summons), [spellId](SummonInfo const* summon)
8952+ std::ranges::copy_if(_unslottedSummons , std::back_inserter(summons), [spellId](SummonInfo const* summon)
89458953 {
89468954 return summon->GetSummonedCreature()->GetUInt32Value(UNIT_CREATED_BY_SPELL) == spellId;
89478955 });
89488956
89498957 std::ranges::copy_if(_slottedSummons, std::back_inserter(summons), [spellId](SummonInfo const* summon)
89508958 {
8951- return summon->GetSummonedCreature()->GetUInt32Value(UNIT_CREATED_BY_SPELL) == spellId;
8959+ return summon && summon->GetSummonedCreature()->GetUInt32Value(UNIT_CREATED_BY_SPELL) == spellId;
8960+ });
8961+
8962+ return summons;
8963+ }
8964+
8965+ std::vector<SummonInfo*> Unit::GetSummonsByControlType(SummonPropertiesControl control)
8966+ {
8967+ std::vector<SummonInfo*> summons;
8968+
8969+ std::ranges::copy_if(_unslottedSummons, std::back_inserter(summons), [control](SummonInfo const* summon)
8970+ {
8971+ return summon->GetControl() == control;
8972+ });
8973+
8974+ std::ranges::copy_if(_slottedSummons, std::back_inserter(summons), [control](SummonInfo const* summon)
8975+ {
8976+ return summon && summon->GetControl() == control;
89528977 });
89538978
89548979 return summons;
@@ -9744,7 +9769,7 @@ void Unit::RemoveFromWorld()
97449769 }
97459770
97469771 // Clear all active summon references. If we are about to switch map instances, we want to make sure that we leave all summons behind so we won't do threadunsafe operations
9747- _wildSummons .clear();
9772+ _unslottedSummons .clear();
97489773 _slottedSummons.clear();
97499774
97509775 WorldObject::RemoveFromWorld();
0 commit comments