fix(Core/Creature): Allow temp summons to respawn when despawning on … (#21363)

This commit is contained in:
Andrew 2025-02-10 04:46:31 -03:00 committed by GitHub
parent b0a45c98c2
commit 7e29e023e8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 9 additions and 30 deletions

View File

@ -2198,7 +2198,7 @@ void Creature::DespawnOnEvade(Seconds respawnDelay)
if (TempSummon* whoSummon = ToTempSummon())
{
LOG_WARN("entities.unit", "DespawnOnEvade called on a temporary summon.");
GetMap()->ScheduleCreatureRespawn(GetGUID(), respawnDelay, GetHomePosition());
whoSummon->UnSummon();
return;
}

View File

@ -310,13 +310,9 @@ void TempSummon::UnSummon(uint32 msTime)
if (WorldObject* owner = GetSummoner())
{
if (owner->IsCreature() && owner->ToCreature()->IsAIEnabled)
{
owner->ToCreature()->AI()->SummonedCreatureDespawn(this);
}
else if (owner->IsGameObject() && owner->ToGameObject()->AI())
{
owner->ToGameObject()->AI()->SummonedCreatureDespawn(this);
}
}
AddObjectToRemoveList();

View File

@ -3718,12 +3718,14 @@ void Map::RemoveOldCorpses()
}
}
void Map::ScheduleCreatureRespawn(ObjectGuid creatureGuid, Milliseconds respawnTimer)
void Map::ScheduleCreatureRespawn(ObjectGuid creatureGuid, Milliseconds respawnTimer, Position pos)
{
_creatureRespawnScheduler.Schedule(respawnTimer, [this, creatureGuid](TaskContext)
_creatureRespawnScheduler.Schedule(respawnTimer, [this, creatureGuid, pos](TaskContext)
{
if (Creature* creature = GetCreature(creatureGuid))
creature->Respawn();
else
SummonCreature(creatureGuid.GetEntry(), pos);
});
}

View File

@ -596,7 +596,7 @@ public:
TaskScheduler _creatureRespawnScheduler;
void ScheduleCreatureRespawn(ObjectGuid /*creatureGuid*/, Milliseconds /*respawnTimer*/);
void ScheduleCreatureRespawn(ObjectGuid /*creatureGuid*/, Milliseconds /*respawnTimer*/, Position pos = Position());
void LoadCorpseData();
void DeleteCorpseData();

View File

@ -1161,17 +1161,6 @@ public:
{
IsSindragosaIntroDone = true;
HandleDropAttempt();
if (instance->IsHeroic())
{
if (HeroicAttempts)
{
Events.ScheduleEvent(EVENT_RESPAWN_SINDRAGOSA, 30s);
}
}
else
{
Events.ScheduleEvent(EVENT_RESPAWN_SINDRAGOSA, 30s);
}
}
if (state == DONE && !instance->IsHeroic() && LichKingHeroicAvailable)
{

View File

@ -369,6 +369,9 @@ public:
break;
case NPC_ALGALON:
m_uiAlgalonGUID = creature->GetGUID();
if (!m_algalonTimer)
creature->DespawnOrUnsummon();
break;
case NPC_HARPOON_FIRE_STATE:
{
@ -811,17 +814,6 @@ public:
go->EnableCollision(false);
}
if (data == FAIL)
{
scheduler.Schedule(5s, [this](TaskContext)
{
if (m_algalonTimer && (m_algalonTimer <= 60 || m_algalonTimer == TIMER_ALGALON_TO_SUMMON))
{
instance->SummonCreature(NPC_ALGALON, AlgalonLandPos);
}
});
}
break;
// Achievement