From f59ee4ef7cc455fc300ed0741ac635c8e1f03fe3 Mon Sep 17 00:00:00 2001 From: Skjalf <47818697+Nyeriah@users.noreply.github.com> Date: Sat, 28 Jan 2023 18:47:15 -0300 Subject: [PATCH] =?UTF-8?q?feat(Core/Creature):=20Actually=20despawn=20cre?= =?UTF-8?q?atures=20on=20evade=20with=20Despawn=E2=80=A6=20(#14786)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/AI/CreatureAI.cpp | 16 ------------- .../game/Entities/Creature/Creature.cpp | 24 ++++++++++--------- src/server/game/Entities/Creature/Creature.h | 3 +-- 3 files changed, 14 insertions(+), 29 deletions(-) diff --git a/src/server/game/AI/CreatureAI.cpp b/src/server/game/AI/CreatureAI.cpp index 14048b6f3..b1a101da7 100644 --- a/src/server/game/AI/CreatureAI.cpp +++ b/src/server/game/AI/CreatureAI.cpp @@ -29,21 +29,6 @@ #include "Language.h" #include "ZoneScript.h" -class PhasedRespawn : public BasicEvent -{ -public: - PhasedRespawn(Creature& owner) : BasicEvent(), _owner(owner) {} - - bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/) override - { - _owner.RespawnOnEvade(); - return true; - } - -private: - Creature& _owner; -}; - //Disable CreatureAI when charmed void CreatureAI::OnCharmed(bool /*apply*/) { @@ -226,7 +211,6 @@ void CreatureAI::EnterEvadeMode(EvadeReason why) if (cInfo && cInfo->HasFlagsExtra(CREATURE_FLAG_EXTRA_HARD_RESET)) { me->DespawnOnEvade(); - me->m_Events.AddEvent(new PhasedRespawn(*me), me->m_Events.CalculateTime(20000)); } sScriptMgr->OnUnitEnterEvadeMode(me, why); diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 65d18c6da..16818b76a 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -2097,22 +2097,24 @@ void Creature::DespawnOrUnsummon(Milliseconds msTimeToDespawn /*= 0*/, Seconds f ForcedDespawn(msTimeToDespawn.count(), forcedRespawnTimer); } -void Creature::DespawnOnEvade() +void Creature::DespawnOnEvade(Seconds respawnDelay) { - SetVisible(false); AI()->SummonedCreatureDespawnAll(); -} -void Creature::RespawnOnEvade() -{ - SetVisible(true); - UpdateMovementFlags(); - AI()->Reset(); - AI()->JustReachedHome(); - if (IsVehicle()) // use the same sequence of addtoworld, aireset may remove all summons! + if (respawnDelay < 2s) { - GetVehicleKit()->Reset(true); + LOG_WARN("entities.unit", "DespawnOnEvade called with delay of {} seconds, defaulting to 2.", respawnDelay.count()); + respawnDelay = 2s; } + + if (TempSummon* whoSummon = ToTempSummon()) + { + LOG_WARN("entities.unit", "DespawnOnEvade called on a temporary summon."); + whoSummon->UnSummon(); + return; + } + + DespawnOrUnsummon(Milliseconds(0), respawnDelay); } void Creature::InitializeReactState() diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index adf6bc68b..5ab1d1d07 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -272,8 +272,7 @@ public: void DespawnOrUnsummon(Milliseconds msTimeToDespawn, Seconds forcedRespawnTimer); void DespawnOrUnsummon(uint32 msTimeToDespawn = 0) { DespawnOrUnsummon(Milliseconds(msTimeToDespawn), 0s); }; - void DespawnOnEvade(); - void RespawnOnEvade(); + void DespawnOnEvade(Seconds respawnDelay = 20s); [[nodiscard]] time_t const& GetRespawnTime() const { return m_respawnTime; } [[nodiscard]] time_t GetRespawnTimeEx() const;