From 7402f1461a26a5e7bee3548fd2e73e3d40ea3a46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Bertelsen?= Date: Wed, 22 Jul 2026 03:38:03 +0200 Subject: [PATCH] fix(Core/Maps): don't block hard-reset and self-linked creatures from respawning (#26729) Co-authored-by: Claude Fable 5 --- src/server/game/Maps/Map.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index cb9056d0a..d5563c6b8 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -2792,14 +2792,20 @@ void Map::ProcessCreatureRespawn(ObjectGuid::LowType spawnId) } // Check linked_respawn: don't spawn if the master creature is still dead. - // This mirrors the check in Creature::Respawn() for compat-mode creatures. + // This mirrors the check in Creature::Respawn() for compat-mode creatures: + // hard-reset creatures bypass it (they despawn on evade and must always + // come back), and a creature linked to itself never auto-respawns. ObjectGuid dbtableHighGuid = ObjectGuid::Create(data->id, spawnId); time_t linkedRespawntime = GetLinkedRespawnTime(dbtableHighGuid); - if (linkedRespawntime) + CreatureTemplate const* cInfo = sObjectMgr->GetCreatureTemplate(data->id); + if (linkedRespawntime && !(cInfo && cInfo->HasFlagsExtra(CREATURE_FLAG_EXTRA_HARD_RESET))) { - // Master is still dead; re-queue at the master's respawn time + a small offset. time_t now = GameTime::GetGameTime().count(); - time_t newRespawnTime = (now > linkedRespawntime ? now : linkedRespawntime) + urand(5, MINUTE); + time_t newRespawnTime; + if (sObjectMgr->GetLinkedRespawnGuid(dbtableHighGuid) == dbtableHighGuid) + newRespawnTime = now + DAY; // if linking self, never respawn (check delayed to next day) + else + newRespawnTime = (now > linkedRespawntime ? now : linkedRespawntime) + urand(5, MINUTE); // master is still dead; re-queue at the master's respawn time + a small offset SaveCreatureRespawnTime(spawnId, newRespawnTime); return; }