From 264d4e1d30debcf6feacee3d29982875672a7bbe Mon Sep 17 00:00:00 2001 From: Treeston Date: Wed, 14 Feb 2018 02:23:55 +0100 Subject: Entities/GO: Add forceRespawnTimer support to DespawnOrUnsummon. Use it in SAI. --- src/server/game/AI/SmartScripts/SmartScript.cpp | 18 +++++++----------- src/server/game/AI/SmartScripts/SmartScriptMgr.h | 1 + src/server/game/Entities/GameObject/GameObject.cpp | 14 +++++++++----- src/server/game/Entities/GameObject/GameObject.h | 3 ++- 4 files changed, 19 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index b3e7c9d5e5c..2bef3d3ef7b 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -1032,22 +1032,18 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u case SMART_ACTION_FORCE_DESPAWN: { // there should be at least a world update tick before despawn, to avoid breaking linked actions - int32 const respawnDelay = std::max(e.action.forceDespawn.delay, 1); + Milliseconds despawnDelay(e.action.forceDespawn.delay); + if (despawnDelay <= 0ms) + despawnDelay = 1ms; + + Seconds forceRespawnTimer(e.action.forceDespawn.forceRespawnTimer); for (WorldObject* target : targets) { if (Creature* creature = target->ToCreature()) - { - if (SmartAI* smartAI = CAST_AI(SmartAI, creature->AI())) - { - smartAI->SetDespawnTime(respawnDelay); - smartAI->StartDespawn(); - } - else - creature->DespawnOrUnsummon(respawnDelay); - } + creature->DespawnOrUnsummon(despawnDelay, forceRespawnTimer); else if (GameObject* goTarget = target->ToGameObject()) - goTarget->DespawnOrUnsummon(Milliseconds(respawnDelay)); + goTarget->DespawnOrUnsummon(despawnDelay, forceRespawnTimer); } break; } diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index 15ca8f11f7f..2eeeece124c 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -776,6 +776,7 @@ struct SmartAction struct { uint32 delay; + uint32 forceRespawnTimer; } forceDespawn; struct diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 00e3e63ecff..7e55bb33c0c 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -411,7 +411,7 @@ void GameObject::Update(uint32 diff) if (m_despawnDelay > diff) m_despawnDelay -= diff; else - DespawnOrUnsummon(); + DespawnOrUnsummon(0ms, m_despawnRespawnTime); } switch (m_lootState) @@ -826,17 +826,21 @@ void GameObject::AddUniqueUse(Player* player) m_unique_users.insert(player->GetGUID()); } -void GameObject::DespawnOrUnsummon(Milliseconds const& delay) +void GameObject::DespawnOrUnsummon(Milliseconds const& delay, Seconds const& forceRespawnTime) { - if (delay > Milliseconds::zero()) + if (delay > 0ms) { if (!m_despawnDelay || m_despawnDelay > delay.count()) + { m_despawnDelay = delay.count(); + m_despawnRespawnTime = forceRespawnTime; + } } else { - if (m_goData && m_respawnDelayTime) - SaveRespawnTime(m_respawnDelayTime); + uint32 const respawnDelay = (forceRespawnTime > 0s) ? forceRespawnTime.count() : m_respawnDelayTime; + if (m_goData && respawnDelay) + SaveRespawnTime(respawnDelay); Delete(); } } diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h index 840d19a3510..e28f8973535 100644 --- a/src/server/game/Entities/GameObject/GameObject.h +++ b/src/server/game/Entities/GameObject/GameObject.h @@ -151,7 +151,7 @@ class TC_GAME_API GameObject : public WorldObject, public GridObject void SetSpawnedByDefault(bool b) { m_spawnedByDefault = b; } uint32 GetRespawnDelay() const { return m_respawnDelayTime; } void Refresh(); - void DespawnOrUnsummon(Milliseconds const& delay = 0ms); + void DespawnOrUnsummon(Milliseconds const& delay = 0ms, Seconds const& forceRespawnTime = 0s); void Delete(); void getFishLoot(Loot* loot, Player* loot_owner); void getFishLootJunk(Loot* loot, Player* loot_owner); @@ -293,6 +293,7 @@ class TC_GAME_API GameObject : public WorldObject, public GridObject time_t m_respawnTime; // (secs) time of next respawn (or despawn if GO have owner()), uint32 m_respawnDelayTime; // (secs) if 0 then current GO state no dependent from timer uint32 m_despawnDelay; + Seconds 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; -- cgit v1.2.3