Core/Creatures: further refine react state initialization within SummonInfo API and fixed dismissing companions

This commit is contained in:
Ovahlord committed 2025-08-24 14:31:15 +02:00
1 parent 0e5489a9da
commit cf8bbd68b9
2 files changed
+37 -3

No files matched your search

@@ -126,9 +126,7 @@ void SummonInfo::HandlePreSummonActions()
if (IsControlledBySummoner()) if (IsControlledBySummoner())
_summonedCreature->SetCreatorGUID(summoner->GetGUID()); _summonedCreature->SetCreatorGUID(summoner->GetGUID());
// Pets are set to Assist by default (this does not apply for class pets which save their states) initializeReactState();
if (_control == SummonPropertiesControl::Pet)
_summonedCreature->SetReactState(REACT_ASSIST);
// Totem slot summons always send the TotemCreated packet. Some non-Shaman classes use this // Totem slot summons always send the TotemCreated packet. Some non-Shaman classes use this
// to display summon icons that can be canceled (Consecration, DK ghouls, Wild Mushrooms) // to display summon icons that can be canceled (Consecration, DK ghouls, Wild Mushrooms)
@@ -187,6 +185,10 @@ void SummonInfo::HandlePostSummonActions()
} }
} }
// Set the critter guid if the summoned creature is a companion
if (_summonSlot == SummonPropertiesSlot::Critter)
summoner->SetCritterGUID(_summonedCreature->GetGUID());
// Infoke JustSummoned and IsSummonedBy AI hooks // Infoke JustSummoned and IsSummonedBy AI hooks
if (summoner->IsCreature() && summoner->IsAIEnabled()) if (summoner->IsCreature() && summoner->IsAIEnabled())
summoner->ToCreature()->AI()->JustSummoned(_summonedCreature); summoner->ToCreature()->AI()->JustSummoned(_summonedCreature);
@@ -214,6 +216,10 @@ void SummonInfo::HandlePreUnsummonActions()
player->SendRemoveControlBar(); player->SendRemoveControlBar();
} }
// Clear the critter guid if the summoned creature was a companion
if (_summonSlot == SummonPropertiesSlot::Critter && summoner->GetCritterGUID() == _summonedCreature->GetGUID())
summoner->SetCritterGUID(ObjectGuid::Empty);
if (summoner->IsCreature() && summoner->IsAIEnabled()) if (summoner->IsCreature() && summoner->IsAIEnabled())
summoner->ToCreature()->AI()->SummonedCreatureDespawn(_summonedCreature); summoner->ToCreature()->AI()->SummonedCreatureDespawn(_summonedCreature);
} }
@@ -353,3 +359,29 @@ void SummonInfo::castPassiveSpells()
} }
} }
} }
void SummonInfo::initializeReactState()
{
switch (_control)
{
case SummonPropertiesControl::Guardian:
if (_flags.HasFlag(SummonPropertiesFlags::GuardianActsLikePet))
_summonedCreature->SetReactState(REACT_ASSIST);
else
_summonedCreature->SetReactState(REACT_AGGRESSIVE);
break;
case SummonPropertiesControl::Pet:
// Player pets default to assist while creature summons retain their original state
if (!_hasBeenSummonedByCreature)
_summonedCreature->SetReactState(REACT_ASSIST);
else if (CharmInfo* charmInfo = _summonedCreature->GetCharmInfo())
charmInfo->RestoreState();
break;
case SummonPropertiesControl::Possessed:
_summonedCreature->SetReactState(REACT_PASSIVE);
break;
default:
if (CharmInfo* charmInfo = _summonedCreature->GetCharmInfo())
charmInfo->RestoreState();
break;
}
}
@@ -104,6 +104,8 @@ public:
private: private:
// Looks up and casts all passive spells of the creature summon. Often used for scaling auras. // Looks up and casts all passive spells of the creature summon. Often used for scaling auras.
void castPassiveSpells(); void castPassiveSpells();
// Initializes the react state of the summon
void initializeReactState();
Creature* _summonedCreature; Creature* _summonedCreature;
ObjectGuid _summonerGUID; ObjectGuid _summonerGUID;