From fc76ec26be8b8a767236a79398c7d2b3ed0f82a3 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Thu, 15 Aug 2019 11:59:13 -0400 Subject: [PATCH] Core/Creature: Prevent boss creatures from ever respawning naturally. Port From (https://github.com/TrinityCore/TrinityCore/commit/cc020b2a0f36f91bf7fe6f3775c47c83305816bc) --- Source/Game/Entities/Creature/Creature.cs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/Source/Game/Entities/Creature/Creature.cs b/Source/Game/Entities/Creature/Creature.cs index ef7d9b7ad..deb63a47e 100644 --- a/Source/Game/Entities/Creature/Creature.cs +++ b/Source/Game/Entities/Creature/Creature.cs @@ -137,7 +137,7 @@ namespace Game.Entities // Should get removed later, just keep "compatibility" with scripts if (setSpawnTime) - m_respawnTime = Time.UnixTime + respawnDelay; + m_respawnTime = Math.Max(Time.UnixTime + respawnDelay, m_respawnTime); // if corpse was removed during falling, the falling will continue and override relocation to respawn position if (IsFalling()) @@ -773,6 +773,9 @@ namespace Game.Entities return false; cinfo = GetCreatureTemplate(); // might be different than initially requested + if (cinfo.FlagsExtra.HasAnyFlag(CreatureFlagsExtra.DungeonBoss) && map.IsDungeon()) + m_respawnDelay = 0; // special value, prevents respawn for dungeon bosses unless overridden + switch (cinfo.Rank) { case CreatureEliteType.Rare: @@ -1518,7 +1521,10 @@ namespace Game.Entities if (s == DeathState.JustDied) { m_corpseRemoveTime = Time.UnixTime + m_corpseDelay; - m_respawnTime = Time.UnixTime + m_respawnDelay + m_corpseDelay; + if (IsDungeonBoss() && m_respawnDelay == 0) + m_respawnTime = long.MaxValue; // never respawn in this instance + else + m_respawnTime = Time.UnixTime + m_respawnDelay + m_corpseDelay; // always save boss respawn time at death to prevent crash cheating if (WorldConfig.GetBoolValue(WorldCfg.SaveRespawnTimeImmediately) || isWorldBoss()) @@ -2299,7 +2305,7 @@ namespace Game.Entities else m_corpseRemoveTime = now + (uint)(m_corpseDelay * decayRate); - m_respawnTime = m_corpseRemoveTime + m_respawnDelay; + m_respawnTime = Math.Max(m_corpseRemoveTime + m_respawnDelay, m_respawnTime); } public bool HasScalableLevels() @@ -2932,15 +2938,14 @@ namespace Game.Entities m_spawnId = spawnId; m_creatureData = data; + m_respawnradius = data.spawndist; + m_respawnDelay = data.spawntimesecs; if (!Create(map.GenerateLowGuid(HighGuid.Creature), map, data.id, data.posX, data.posY, data.posZ, data.orientation, data, 0)) return false; //We should set first home position, because then AI calls home movement SetHomePosition(data.posX, data.posY, data.posZ, data.orientation); - m_respawnradius = data.spawndist; - - m_respawnDelay = data.spawntimesecs; m_deathState = DeathState.Alive; m_respawnTime = GetMap().GetCreatureRespawnTime(m_spawnId);