From 504da24dd0faa89105c676d788c22694032a5cf9 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Sat, 28 May 2022 17:49:41 -0400 Subject: [PATCH] Core/Pools: Fix pools with 1 member never spawning anything anymore Port From (https://github.com/TrinityCore/TrinityCore/commit/9c3dc31a3764681ae641e24ab61cd5256cc3331e) --- Source/Game/Entities/Creature/Creature.cs | 7 +++++-- Source/Game/Maps/Map.cs | 3 +++ Source/Game/Pools/PoolManager.cs | 19 +++++++++++++------ 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/Source/Game/Entities/Creature/Creature.cs b/Source/Game/Entities/Creature/Creature.cs index 33466eb0e..d3be11e79 100644 --- a/Source/Game/Entities/Creature/Creature.cs +++ b/Source/Game/Entities/Creature/Creature.cs @@ -3277,9 +3277,12 @@ namespace Game.Entities return false; } } + else + { + // compatibility mode creatures will be respawned in ::Update() + m_deathState = DeathState.Dead; + } - // compatibility mode creatures will be respawned in ::Update() - m_deathState = DeathState.Dead; if (CanFly()) { float tz = map.GetHeight(GetPhaseShift(), data.SpawnPoint, true, MapConst.MaxFallDistance); diff --git a/Source/Game/Maps/Map.cs b/Source/Game/Maps/Map.cs index 8f27fd908..0a5437b84 100644 --- a/Source/Game/Maps/Map.cs +++ b/Source/Game/Maps/Map.cs @@ -2646,6 +2646,7 @@ namespace Game.Maps Global.PoolMgr.UpdatePool(poolId, next.type, next.spawnId); // step 3: get rid of the actual entry + RemoveRespawnTime(next.type, next.spawnId, null, true); GetRespawnMapForType(next.type).Remove(next.spawnId); } else if (CheckRespawn(next)) // see if we're allowed to respawn @@ -2657,12 +2658,14 @@ namespace Game.Maps DoRespawn(next.type, next.spawnId, next.gridId); // step 3: get rid of the actual entry + RemoveRespawnTime(next.type, next.spawnId, null, true); GetRespawnMapForType(next.type).Remove(next.spawnId); } else if (next.respawnTime == 0) { // just remove this respawn entry without rescheduling _respawnTimes.Remove(next); GetRespawnMapForType(next.type).Remove(next.spawnId); + RemoveRespawnTime(next.type, next.spawnId, null, true); } else { // new respawn time, update heap position diff --git a/Source/Game/Pools/PoolManager.cs b/Source/Game/Pools/PoolManager.cs index fa315c1e6..d05f48fab 100644 --- a/Source/Game/Pools/PoolManager.cs +++ b/Source/Game/Pools/PoolManager.cs @@ -490,7 +490,7 @@ namespace Game } } - void Despawn1Object(ulong guid, bool alwaysDeleteRespawnTime = false) + void Despawn1Object(ulong guid, bool alwaysDeleteRespawnTime = false, bool saveRespawnTime = true) { switch (typeof(T).Name) { @@ -507,7 +507,7 @@ namespace Game foreach (var creature in creatureBounds) { // For dynamic spawns, save respawn time here - if (!creature.GetRespawnCompatibilityMode()) + if (saveRespawnTime && !creature.GetRespawnCompatibilityMode()) creature.SaveRespawnTime(); creature.AddObjectToRemoveList(); @@ -532,7 +532,7 @@ namespace Game foreach (var go in gameobjectBounds) { // For dynamic spawns, save respawn time here - if (!go.GetRespawnCompatibilityMode()) + if (saveRespawnTime && !go.GetRespawnCompatibilityMode()) go.SaveRespawnTime(); go.AddObjectToRemoveList(); @@ -598,7 +598,7 @@ namespace Game roll -= obj.chance; // Triggering object is marked as spawned at this time and can be also rolled (respawn case) // so this need explicit check for this case - if (roll < 0 && (/*obj.guid == triggerFrom ||*/ !spawns.IsActiveObject(obj.guid))) + if (roll < 0 && (obj.guid == triggerFrom || !spawns.IsActiveObject(obj.guid))) { rolledObjects.Add(obj); break; @@ -608,7 +608,7 @@ namespace Game if (!EqualChanced.Empty() && rolledObjects.Empty()) { - rolledObjects.AddRange(EqualChanced.Where(obj => /*obj.guid == triggerFrom ||*/ !spawns.IsActiveObject(obj.guid))); + rolledObjects.AddRange(EqualChanced.Where(obj => obj.guid == triggerFrom || !spawns.IsActiveObject(obj.guid))); rolledObjects.RandomResize((uint)count); } @@ -682,7 +682,14 @@ namespace Game void ReSpawn1Object(PoolObject obj) { - // GameObject/Creature is still on map, nothing to do + switch (typeof(T).Name) + { + case "Creature": + case "GameObject": + Despawn1Object(obj.guid, false, false); + Spawn1Object(obj); + break; + } } void RemoveRespawnTimeFromDB(ulong guid)