From e878cedb7f20719f9911198d57e961270847ceff Mon Sep 17 00:00:00 2001 From: Kitzunu <24550914+Kitzunu@users.noreply.github.com> Date: Thu, 4 Jul 2024 19:20:41 +0200 Subject: [PATCH] =?UTF-8?q?feat(Core/SAI):=20implement=20new=20removeObjec?= =?UTF-8?q?tFromWorld=20param=20for=20SMART=5FA=E2=80=A6=20(#19275)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feat(Core/SAI): implement new removeObjectFromWorld param for SMART_ACTION_FORCE_DESPAWN --- .../game/AI/SmartScripts/SmartScript.cpp | 33 +++++++++++-------- .../game/AI/SmartScripts/SmartScriptMgr.h | 1 + 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index cabedbe4a..f7f31fd40 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -1272,22 +1272,29 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u { for (WorldObject* target : targets) { - Milliseconds despawnDelay(e.action.forceDespawn.delay); + if (e.action.forceDespawn.removeObjectFromWorld) + { + if (e.action.forceDespawn.delay || e.action.forceDespawn.forceRespawnTimer) + LOG_ERROR("sql.sql", "SmartScript: SMART_ACTION_FORCE_DESPAWN has removeObjectFromWorld set. delay and forceRespawnTimer ignored."); - // Wait at least one world update tick before despawn, so it doesn't break linked actions. - if (despawnDelay <= 0ms) - { - despawnDelay = 1ms; + if (Creature* creature = target->ToCreature()) + creature->AddObjectToRemoveList(); + else if (GameObject* go = target->ToGameObject()) + go->AddObjectToRemoveList(); } + else + { + Milliseconds despawnDelay(e.action.forceDespawn.delay); - Seconds forceRespawnTimer(e.action.forceDespawn.forceRespawnTimer); - if (Creature* creature = target->ToCreature()) - { - creature->DespawnOrUnsummon(despawnDelay, forceRespawnTimer); - } - else if (GameObject* go = target->ToGameObject()) - { - go->DespawnOrUnsummon(despawnDelay, forceRespawnTimer); + // Wait at least one world update tick before despawn, so it doesn't break linked actions. + if (despawnDelay <= 0ms) + despawnDelay = 1ms; + + Seconds forceRespawnTimer(e.action.forceDespawn.forceRespawnTimer); + if (Creature* creature = target->ToCreature()) + creature->DespawnOrUnsummon(despawnDelay, forceRespawnTimer); + else if (GameObject* go = target->ToGameObject()) + go->DespawnOrUnsummon(despawnDelay, forceRespawnTimer); } } diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index 66d0deaa9..554863690 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -978,6 +978,7 @@ struct SmartAction { uint32 delay; uint32 forceRespawnTimer; + SAIBool removeObjectFromWorld; } forceDespawn; struct