From 8aa331b432f04334ba2745fd1ce807efc4b458ef Mon Sep 17 00:00:00 2001 From: Skjalf <47818697+Nyeriah@users.noreply.github.com> Date: Sat, 4 Feb 2023 15:35:53 -0300 Subject: [PATCH] =?UTF-8?q?fix(Core/Creature):=20Fix=20bosses=20with=20har?= =?UTF-8?q?d=20reset=20flag=20not=20respawning=20an=E2=80=A6=20(#14862)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/AI/ScriptedAI/ScriptedCreature.cpp | 13 +++++++++++++ src/server/game/AI/ScriptedAI/ScriptedCreature.h | 2 ++ src/server/game/Entities/Creature/Creature.cpp | 9 ++++++++- 3 files changed, 23 insertions(+), 1 deletion(-) 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 } }