From fda5093e592074ab889d611b2bb29c5ec97c12b1 Mon Sep 17 00:00:00 2001 From: sogladev Date: Sat, 14 Mar 2026 16:43:24 +0100 Subject: [PATCH] fix(Core/Unit): Keep Lightwell alive on player death (#24675) --- src/server/game/Entities/Totem/Totem.cpp | 10 +++++++++- src/server/game/Entities/Unit/Unit.cpp | 18 +++++++++++++++--- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/server/game/Entities/Totem/Totem.cpp b/src/server/game/Entities/Totem/Totem.cpp index f0e71d231..9f28ac743 100644 --- a/src/server/game/Entities/Totem/Totem.cpp +++ b/src/server/game/Entities/Totem/Totem.cpp @@ -34,12 +34,20 @@ Totem::Totem(SummonPropertiesEntry const* properties, ObjectGuid owner) : Minion void Totem::Update(uint32 time) { Unit* owner = GetOwner(); - if (!owner || !owner->IsAlive() || !IsAlive() || m_duration <= time) + + if (!owner || !IsAlive() || m_duration <= time) { UnSummon(); // remove self return; } + // If owner is dead and this is not a lightwell, despawn + if (!owner->IsAlive() && !(m_Properties && m_Properties->Type == SUMMON_TYPE_LIGHTWELL)) + { + UnSummon(); + return; + } + m_duration -= time; Creature::Update(time); } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index e06d15e3a..9bd465b4e 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -8077,24 +8077,36 @@ void Unit::RemoveAllControlled(bool onDeath /*= false*/) if (IsPlayer()) ToPlayer()->StopCastingCharm(); - while (!m_Controlled.empty()) + for (auto it = m_Controlled.begin(); it != m_Controlled.end();) { - Unit* target = *m_Controlled.begin(); - m_Controlled.erase(m_Controlled.begin()); + Unit* target = *it; + if (target->GetCharmerGUID() == GetGUID()) { + it = m_Controlled.erase(it); target->RemoveCharmAuras(); } else if (target->GetOwnerGUID() == GetGUID() && target->IsSummon()) { + // Keep Lightwell alive on owner death + if (onDeath) + if (TempSummon* ts = target->ToTempSummon()) + if (ts->m_Properties && ts->m_Properties->Type == SUMMON_TYPE_LIGHTWELL) + { + ++it; + continue; + } + if (!(onDeath && !IsPlayer() && target->IsGuardian())) { target->ToTempSummon()->UnSummon(); + it = m_Controlled.erase(it); } } else { LOG_ERROR("entities.unit", "Unit {} is trying to release unit {} which is neither charmed nor owned by it", GetEntry(), target->GetEntry()); + ++it; } } }