diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 398fa75f3..f2e07c735 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -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; } diff --git a/src/server/game/Entities/Creature/TemporarySummon.cpp b/src/server/game/Entities/Creature/TemporarySummon.cpp index 28b923d1e..a0c044a5d 100644 --- a/src/server/game/Entities/Creature/TemporarySummon.cpp +++ b/src/server/game/Entities/Creature/TemporarySummon.cpp @@ -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(); diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 0cacbccf3..fb13330f5 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -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); }); } diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index e753d841f..e6e10c26d 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -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(); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp index 2887192b6..f2640d9c5 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp @@ -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) { diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp index dd8e7ae95..a987a7c82 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp @@ -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