diff --git a/src/server/game/Combat/ThreatMgr.cpp b/src/server/game/Combat/ThreatMgr.cpp index 185ad3f9d..620556c5f 100644 --- a/src/server/game/Combat/ThreatMgr.cpp +++ b/src/server/game/Combat/ThreatMgr.cpp @@ -416,7 +416,7 @@ ThreatMgr::ThreatMgr(Unit* owner) : iCurrentVictim(nullptr), iOwner(owner), iUpd void ThreatMgr::ClearAllThreat() { - if (iOwner->CanHaveThreatList() && !isThreatListEmpty()) + if (iOwner->CanHaveThreatList(true) && !isThreatListEmpty()) iOwner->SendClearThreatListOpcode(); clearReferences(); } diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 83373b681..f52e4569b 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -1875,7 +1875,7 @@ bool Creature::IsInvisibleDueToDespawn() const if (Unit::IsInvisibleDueToDespawn()) return true; - if (IsAlive() || m_corpseRemoveTime > GameTime::GetGameTime().count()) + if (IsAlive() || isDying() || m_corpseRemoveTime > GameTime::GetGameTime().count()) return false; return true; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index aa14b9287..97a7ecde5 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -14518,6 +14518,7 @@ void Unit::setDeathState(DeathState s, bool despawn) { // death state needs to be updated before RemoveAllAurasOnDeath() calls HandleChannelDeathItem(..) so that // it can be used to check creation of death items (such as soul shards). + m_deathState = s; if (s != DeathState::Alive && s != DeathState::JustRespawned) { @@ -14567,8 +14568,6 @@ void Unit::setDeathState(DeathState s, bool despawn) { RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); // clear skinnable for creature and player (at battleground) } - - m_deathState = s; } /*######################################## @@ -14576,14 +14575,14 @@ void Unit::setDeathState(DeathState s, bool despawn) ######## AGGRO SYSTEM ######## ######## ######## ########################################*/ -bool Unit::CanHaveThreatList() const +bool Unit::CanHaveThreatList(bool skipAliveCheck) const { // only creatures can have threat list if (!IsCreature()) return false; // only alive units can have threat list - if (!IsAlive() || isDying()) + if (!skipAliveCheck && !IsAlive()) return false; // totems can not have threat list diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 165e8917e..7be0fbc88 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -831,7 +831,7 @@ public: void SetCombatTimer(uint32 timer) { m_CombatTimer = timer; } // Threat related methods - [[nodiscard]] bool CanHaveThreatList() const; + [[nodiscard]] bool CanHaveThreatList(bool skipAliveCheck = false) const; void AddThreat(Unit* victim, float fThreat, SpellSchoolMask schoolMask = SPELL_SCHOOL_MASK_NORMAL, SpellInfo const* threatSpell = nullptr); float ApplyTotalThreatModifier(float fThreat, SpellSchoolMask schoolMask = SPELL_SCHOOL_MASK_NORMAL); void TauntApply(Unit* victim);