feat(Core/SAI): implement new removeObjectFromWorld param for SMART_A… (#19275)

feat(Core/SAI): implement new removeObjectFromWorld param for SMART_ACTION_FORCE_DESPAWN
This commit is contained in:
Kitzunu
2024-07-04 19:20:41 +02:00
committed by GitHub
parent cf1185551d
commit e878cedb7f
2 changed files with 21 additions and 13 deletions
@@ -1271,22 +1271,29 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
case SMART_ACTION_FORCE_DESPAWN: case SMART_ACTION_FORCE_DESPAWN:
{ {
for (WorldObject* target : targets) for (WorldObject* target : targets)
{
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.");
if (Creature* creature = target->ToCreature())
creature->AddObjectToRemoveList();
else if (GameObject* go = target->ToGameObject())
go->AddObjectToRemoveList();
}
else
{ {
Milliseconds despawnDelay(e.action.forceDespawn.delay); Milliseconds despawnDelay(e.action.forceDespawn.delay);
// Wait at least one world update tick before despawn, so it doesn't break linked actions. // Wait at least one world update tick before despawn, so it doesn't break linked actions.
if (despawnDelay <= 0ms) if (despawnDelay <= 0ms)
{
despawnDelay = 1ms; despawnDelay = 1ms;
}
Seconds forceRespawnTimer(e.action.forceDespawn.forceRespawnTimer); Seconds forceRespawnTimer(e.action.forceDespawn.forceRespawnTimer);
if (Creature* creature = target->ToCreature()) if (Creature* creature = target->ToCreature())
{
creature->DespawnOrUnsummon(despawnDelay, forceRespawnTimer); creature->DespawnOrUnsummon(despawnDelay, forceRespawnTimer);
}
else if (GameObject* go = target->ToGameObject()) else if (GameObject* go = target->ToGameObject())
{
go->DespawnOrUnsummon(despawnDelay, forceRespawnTimer); go->DespawnOrUnsummon(despawnDelay, forceRespawnTimer);
} }
} }
@@ -978,6 +978,7 @@ struct SmartAction
{ {
uint32 delay; uint32 delay;
uint32 forceRespawnTimer; uint32 forceRespawnTimer;
SAIBool removeObjectFromWorld;
} forceDespawn; } forceDespawn;
struct struct