From ff1f543a102bdfd12aa51f905f30f1f8a47df8f5 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sun, 26 Jul 2026 18:07:10 -0300 Subject: [PATCH] fix(Core/Creature): don't charge corpse decay time on forced despawn of a living creature (#26827) --- src/server/game/Entities/Creature/Creature.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index c2fd3c40b..9d388bb51 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -2172,14 +2172,17 @@ void Creature::ForcedDespawn(Milliseconds timeMSToDespawn, Seconds forceRespawnT if (forceRespawnTimer > 0s) m_respawnDelay = forceRespawnTimer.count(); - if (IsAlive()) + bool const wasAlive = IsAlive(); + + if (wasAlive) setDeathState(DeathState::JustDied, true); // Xinef: Set new respawn time, ignore corpse decay time... - // After setDeathState, m_respawnTime includes m_corpseDelay which we don't - // want for a forced respawn. Override it so RemoveCorpse's max() picks ours. - if (forceRespawnTimer > 0s) - m_respawnTime = GameTime::GetGameTime().count() + forceRespawnTimer.count(); + // setDeathState(JustDied) folds m_corpseDelay into m_respawnTime, but a creature + // despawned while alive never leaves a corpse, so the decay must not be charged. + // Recompute so RemoveCorpse's max() has nothing stale to pick up. + if (forceRespawnTimer > 0s || wasAlive) + m_respawnTime = GameTime::GetGameTime().count() + m_respawnDelay; RemoveCorpse(true);