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