diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp index 67df38905..75f1c3995 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp @@ -554,6 +554,19 @@ BossAI::BossAI(Creature* creature, uint32 bossId) : ScriptedAI(creature), SetBoundary(instance->GetBossBoundary(bossId)); } +bool BossAI::CanRespawn() +{ + if (instance) + { + if (instance->GetBossState(_bossId) == DONE) + { + return false; + } + } + + return true; +} + void BossAI::_Reset() { if (!me->IsAlive()) diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.h b/src/server/game/AI/ScriptedAI/ScriptedCreature.h index 3040ede20..86a2fd34e 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.h +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.h @@ -438,6 +438,8 @@ public: InstanceScript* const instance; + bool CanRespawn() override; + void JustSummoned(Creature* summon) override; void SummonedCreatureDespawn(Creature* summon) override; void SummonedCreatureDespawnAll() override; diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 16818b76a..fbb36033a 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -648,15 +648,22 @@ void Creature::Update(uint32 diff) ObjectGuid dbtableHighGuid = ObjectGuid::Create(m_creatureData ? m_creatureData->id1 : GetEntry(), m_spawnId); time_t linkedRespawntime = GetMap()->GetLinkedRespawnTime(dbtableHighGuid); - if (!linkedRespawntime) // Can respawn + + CreatureTemplate const* cInfo = sObjectMgr->GetCreatureTemplate(GetEntry()); + + if (!linkedRespawntime || (cInfo && cInfo->HasFlagsExtra(CREATURE_FLAG_EXTRA_HARD_RESET))) // Can respawn Respawn(); else // the master is dead { ObjectGuid targetGuid = sObjectMgr->GetLinkedRespawnGuid(dbtableHighGuid); if (targetGuid == dbtableHighGuid) // if linking self, never respawn (check delayed to next day) + { SetRespawnTime(DAY); + } else + { m_respawnTime = (now > linkedRespawntime ? now : linkedRespawntime) + urand(5, MINUTE); // else copy time from master and add a little + } SaveRespawnTime(); // also save to DB immediately } }