From 751d397031c579f4fa5f81b39d404ec868c95081 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Wed, 23 Jun 2021 23:09:48 -0400 Subject: [PATCH] Entities/GO: Add forceRespawnTimer support to DespawnOrUnsummon. Use it in SAI. Port From (https://github.com/TrinityCore/TrinityCore/commit/168be492f5924d306a90e7f8dfd86a6c547da3d7) --- Source/Game/AI/SmartScripts/SmartAI.cs | 5 +---- Source/Game/AI/SmartScripts/SmartAIManager.cs | 2 +- Source/Game/AI/SmartScripts/SmartScript.cs | 19 +++++++------------ Source/Game/Entities/GameObject/GameObject.cs | 13 +++++++++---- 4 files changed, 18 insertions(+), 21 deletions(-) diff --git a/Source/Game/AI/SmartScripts/SmartAI.cs b/Source/Game/AI/SmartScripts/SmartAI.cs index eb45275e0..cd5467879 100644 --- a/Source/Game/AI/SmartScripts/SmartAI.cs +++ b/Source/Game/AI/SmartScripts/SmartAI.cs @@ -63,7 +63,6 @@ namespace Game.AI uint _invincibilityHpLevel; uint _despawnTime; - uint _respawnTime; uint _despawnState; // Vehicle conditions @@ -570,7 +569,6 @@ namespace Game.AI GetScript().OnInitialize(me); _despawnTime = 0; - _respawnTime = 0; _despawnState = 0; _escortState = SmartEscortState.None; @@ -1021,7 +1019,7 @@ namespace Game.AI _despawnState++; } else - me.DespawnOrUnsummon(0, TimeSpan.FromSeconds(_respawnTime)); + me.DespawnOrUnsummon(); } else _despawnTime -= diff; @@ -1048,7 +1046,6 @@ namespace Game.AI public void SetDespawnTime(uint t, uint r = 0) { _despawnTime = t; - _respawnTime = r; _despawnState = t != 0 ? 1 : 0u; } diff --git a/Source/Game/AI/SmartScripts/SmartAIManager.cs b/Source/Game/AI/SmartScripts/SmartAIManager.cs index b0cdd1283..bf869e137 100644 --- a/Source/Game/AI/SmartScripts/SmartAIManager.cs +++ b/Source/Game/AI/SmartScripts/SmartAIManager.cs @@ -2696,7 +2696,7 @@ namespace Game.AI public struct ForceDespawn { public uint delay; - public uint respawn; + public uint forceRespawnTimer; } public struct InvincHP { diff --git a/Source/Game/AI/SmartScripts/SmartScript.cs b/Source/Game/AI/SmartScripts/SmartScript.cs index ffeae5463..223bb4f34 100644 --- a/Source/Game/AI/SmartScripts/SmartScript.cs +++ b/Source/Game/AI/SmartScripts/SmartScript.cs @@ -968,27 +968,22 @@ namespace Game.AI case SmartActions.ForceDespawn: { // there should be at least a world update tick before despawn, to avoid breaking linked actions - uint respawnDelay = Math.Max(e.Action.forceDespawn.delay, 1u); + TimeSpan despawnDelay = TimeSpan.FromMilliseconds(e.Action.forceDespawn.delay); + if (despawnDelay <= TimeSpan.Zero) + despawnDelay = TimeSpan.FromMilliseconds(1); + + TimeSpan forceRespawnTimer = TimeSpan.FromSeconds(e.Action.forceDespawn.forceRespawnTimer); foreach (var target in targets) { Creature creature = target.ToCreature(); if (creature != null) - { - CreatureAI smartAI = creature.GetAI(); - if (smartAI != null && smartAI is SmartAI) - { - ((SmartAI)smartAI).SetDespawnTime(respawnDelay); - ((SmartAI)smartAI).StartDespawn(); - } - else - creature.DespawnOrUnsummon(TimeSpan.FromMilliseconds(respawnDelay)); - } + creature.DespawnOrUnsummon(despawnDelay, forceRespawnTimer); else { GameObject go = target.ToGameObject(); if (go != null) - go.SetRespawnTime((int)respawnDelay); + go.DespawnOrUnsummon(despawnDelay, forceRespawnTimer); } } break; diff --git a/Source/Game/Entities/GameObject/GameObject.cs b/Source/Game/Entities/GameObject/GameObject.cs index b8d8c23d5..53492cacf 100644 --- a/Source/Game/Entities/GameObject/GameObject.cs +++ b/Source/Game/Entities/GameObject/GameObject.cs @@ -429,7 +429,7 @@ namespace Game.Entities if (m_despawnDelay > diff) m_despawnDelay -= diff; else - DespawnOrUnsummon(); + DespawnOrUnsummon(TimeSpan.FromMilliseconds(0), m_despawnRespawnTime); } switch (m_lootState) @@ -870,17 +870,21 @@ namespace Game.Entities m_unique_users.Add(player.GetGUID()); } - void DespawnOrUnsummon(TimeSpan delay = default) + public void DespawnOrUnsummon(TimeSpan delay = default, TimeSpan forceRespawnTime = default) { if (delay > TimeSpan.Zero) { if (m_despawnDelay == 0 || m_despawnDelay > delay.TotalMilliseconds) + { m_despawnDelay = (uint)delay.TotalMilliseconds; + m_despawnRespawnTime = forceRespawnTime; + } } else { - if (m_goData != null && m_respawnDelayTime != 0) - SaveRespawnTime(m_respawnDelayTime); + uint respawnDelay = (uint)((forceRespawnTime > TimeSpan.Zero) ? forceRespawnTime.TotalSeconds : m_respawnDelayTime); + if (m_goData != null && respawnDelay != 0) + SaveRespawnTime(respawnDelay); Delete(); } } @@ -2883,6 +2887,7 @@ namespace Game.Entities long m_respawnTime; // (secs) time of next respawn (or despawn if GO have owner()), uint m_respawnDelayTime; // (secs) if 0 then current GO state no dependent from timer uint m_despawnDelay; + TimeSpan m_despawnRespawnTime; // override respawn time after delayed despawn LootState m_lootState; ObjectGuid m_lootStateUnitGUID; // GUID of the unit passed with SetLootState(LootState, Unit*) bool m_spawnedByDefault;