mirror of
https://github.com/liyunfan1223/azerothcore-wotlk.git
synced 2026-08-08 07:48:02 +00:00
feat(Core/Creature): Actually despawn creatures on evade with Despawn… (#14786)
This commit is contained in:
@@ -29,21 +29,6 @@
|
|||||||
#include "Language.h"
|
#include "Language.h"
|
||||||
#include "ZoneScript.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
|
//Disable CreatureAI when charmed
|
||||||
void CreatureAI::OnCharmed(bool /*apply*/)
|
void CreatureAI::OnCharmed(bool /*apply*/)
|
||||||
{
|
{
|
||||||
@@ -226,7 +211,6 @@ void CreatureAI::EnterEvadeMode(EvadeReason why)
|
|||||||
if (cInfo && cInfo->HasFlagsExtra(CREATURE_FLAG_EXTRA_HARD_RESET))
|
if (cInfo && cInfo->HasFlagsExtra(CREATURE_FLAG_EXTRA_HARD_RESET))
|
||||||
{
|
{
|
||||||
me->DespawnOnEvade();
|
me->DespawnOnEvade();
|
||||||
me->m_Events.AddEvent(new PhasedRespawn(*me), me->m_Events.CalculateTime(20000));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sScriptMgr->OnUnitEnterEvadeMode(me, why);
|
sScriptMgr->OnUnitEnterEvadeMode(me, why);
|
||||||
|
|||||||
@@ -2097,22 +2097,24 @@ void Creature::DespawnOrUnsummon(Milliseconds msTimeToDespawn /*= 0*/, Seconds f
|
|||||||
ForcedDespawn(msTimeToDespawn.count(), forcedRespawnTimer);
|
ForcedDespawn(msTimeToDespawn.count(), forcedRespawnTimer);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Creature::DespawnOnEvade()
|
void Creature::DespawnOnEvade(Seconds respawnDelay)
|
||||||
{
|
{
|
||||||
SetVisible(false);
|
|
||||||
AI()->SummonedCreatureDespawnAll();
|
AI()->SummonedCreatureDespawnAll();
|
||||||
}
|
|
||||||
|
|
||||||
void Creature::RespawnOnEvade()
|
if (respawnDelay < 2s)
|
||||||
{
|
|
||||||
SetVisible(true);
|
|
||||||
UpdateMovementFlags();
|
|
||||||
AI()->Reset();
|
|
||||||
AI()->JustReachedHome();
|
|
||||||
if (IsVehicle()) // use the same sequence of addtoworld, aireset may remove all summons!
|
|
||||||
{
|
{
|
||||||
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()
|
void Creature::InitializeReactState()
|
||||||
|
|||||||
@@ -272,8 +272,7 @@ public:
|
|||||||
|
|
||||||
void DespawnOrUnsummon(Milliseconds msTimeToDespawn, Seconds forcedRespawnTimer);
|
void DespawnOrUnsummon(Milliseconds msTimeToDespawn, Seconds forcedRespawnTimer);
|
||||||
void DespawnOrUnsummon(uint32 msTimeToDespawn = 0) { DespawnOrUnsummon(Milliseconds(msTimeToDespawn), 0s); };
|
void DespawnOrUnsummon(uint32 msTimeToDespawn = 0) { DespawnOrUnsummon(Milliseconds(msTimeToDespawn), 0s); };
|
||||||
void DespawnOnEvade();
|
void DespawnOnEvade(Seconds respawnDelay = 20s);
|
||||||
void RespawnOnEvade();
|
|
||||||
|
|
||||||
[[nodiscard]] time_t const& GetRespawnTime() const { return m_respawnTime; }
|
[[nodiscard]] time_t const& GetRespawnTime() const { return m_respawnTime; }
|
||||||
[[nodiscard]] time_t GetRespawnTimeEx() const;
|
[[nodiscard]] time_t GetRespawnTimeEx() const;
|
||||||
|
|||||||
Reference in New Issue
Block a user