diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index eb0f2da62..7b77c030b 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -10360,7 +10360,7 @@ Unit* Unit::GetFirstControlled() const return unit; } -void Unit::RemoveAllControlled() +void Unit::RemoveAllControlled(bool onDeath /*= false*/) { // possessed pet and vehicle if (GetTypeId() == TYPEID_PLAYER) @@ -10371,18 +10371,21 @@ void Unit::RemoveAllControlled() Unit* target = *m_Controlled.begin(); m_Controlled.erase(m_Controlled.begin()); if (target->GetCharmerGUID() == GetGUID()) + { target->RemoveCharmAuras(); + } else if (target->GetOwnerGUID() == GetGUID() && target->IsSummon()) - target->ToTempSummon()->UnSummon(); + { + if (!(onDeath && !IsPlayer() && target->IsGuardian())) + { + target->ToTempSummon()->UnSummon(); + } + } else + { LOG_ERROR("entities.unit", "Unit %u is trying to release unit %u which is neither charmed nor owned by it", GetEntry(), target->GetEntry()); + } } - if (GetPetGUID()) - LOG_FATAL("entities.unit", "Unit %u is not able to release its pet %s", GetEntry(), GetPetGUID().ToString().c_str()); - if (GetMinionGUID()) - LOG_FATAL("entities.unit", "Unit %u is not able to release its minion %s", GetEntry(), GetMinionGUID().ToString().c_str()); - if (GetCharmGUID()) - LOG_FATAL("entities.unit", "Unit %u is not able to release its charm %s", GetEntry(), GetCharmGUID().ToString().c_str()); } Unit* Unit::GetNextRandomRaidMemberOrPet(float radius) @@ -10476,16 +10479,25 @@ void Unit::RemoveCharmAuras() RemoveAurasByType(SPELL_AURA_AOE_CHARM); } -void Unit::UnsummonAllTotems() +void Unit::UnsummonAllTotems(bool onDeath /*= false*/) { for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i) { if (!m_SummonSlot[i]) + { continue; + } if (Creature* OldTotem = GetMap()->GetCreature(m_SummonSlot[i])) + { if (OldTotem->IsSummon()) - OldTotem->ToTempSummon()->UnSummon(); + { + if (!(onDeath && !IsPlayer() && OldTotem->IsGuardian())) + { + OldTotem->ToTempSummon()->UnSummon(); + } + } + } } } @@ -13571,8 +13583,8 @@ void Unit::setDeathState(DeathState s, bool despawn) if (IsNonMeleeSpellCast(false)) InterruptNonMeleeSpells(false); - UnsummonAllTotems(); - RemoveAllControlled(); + UnsummonAllTotems(true); + RemoveAllControlled(true); RemoveAllAurasOnDeath(); } diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 52c9abad2..d4cf9c550 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1918,7 +1918,7 @@ public: ControlSet m_Controlled; [[nodiscard]] Unit* GetFirstControlled() const; - void RemoveAllControlled(); + void RemoveAllControlled(bool onDeath = false); [[nodiscard]] bool IsCharmed() const { return GetCharmerGUID(); } [[nodiscard]] bool isPossessed() const { return HasUnitState(UNIT_STATE_POSSESSED); } @@ -2244,7 +2244,7 @@ public: void ModifyAuraState(AuraStateType flag, bool apply); uint32 BuildAuraStateUpdateForTarget(Unit* target) const; bool HasAuraState(AuraStateType flag, SpellInfo const* spellProto = nullptr, Unit const* Caster = nullptr) const; - void UnsummonAllTotems(); + void UnsummonAllTotems(bool onDeath = false); Unit* GetMagicHitRedirectTarget(Unit* victim, SpellInfo const* spellInfo); Unit* GetMeleeHitRedirectTarget(Unit* victim, SpellInfo const* spellInfo = nullptr);