From a2d65f99217f2d4699e211dce852ae19425e3610 Mon Sep 17 00:00:00 2001 From: Sam Hill Date: Sat, 9 Aug 2025 09:26:13 -0400 Subject: [PATCH] Fix projectile collision crash: defer free and disable monitoring on hit; prevent self-collision; harden laser/projectile _on_body_entered --- scripts/core/laser_projectile.gd | 9 +++++++-- scripts/core/projectile.gd | 10 ++++++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/scripts/core/laser_projectile.gd b/scripts/core/laser_projectile.gd index d8ccc3a..3b186bd 100644 --- a/scripts/core/laser_projectile.gd +++ b/scripts/core/laser_projectile.gd @@ -14,12 +14,17 @@ func _physics_process(delta): position += direction.normalized() * speed * delta func _on_body_entered(body): - if not is_instance_valid(body): + if not is_instance_valid(body) or body == self: return if body.has_method("take_damage"): body.take_damage(damage) - queue_free() # Destroy the laser after hitting + # Disable further monitoring and free safely after signal emission + set_deferred("monitoring", false) + var shape = get_node_or_null("CollisionShape2D") + if shape: + shape.set_deferred("disabled", true) + call_deferred("queue_free") func _on_Timer_timeout(): queue_free() diff --git a/scripts/core/projectile.gd b/scripts/core/projectile.gd index 30d8e9d..5672480 100644 --- a/scripts/core/projectile.gd +++ b/scripts/core/projectile.gd @@ -11,9 +11,15 @@ func _physics_process(delta): position += direction * speed * delta func _on_body_entered(body): - if not is_instance_valid(body): + if not is_instance_valid(body) or body == self: return + # Only interact with valid damage receivers (e.g., enemies) if body.has_method("take_damage"): body.take_damage(damage) - queue_free() + # Disable further monitoring to prevent re-entrancy during signal emission + set_deferred("monitoring", false) + var shape = get_node_or_null("CollisionShape2D") + if shape: + shape.set_deferred("disabled", true) + call_deferred("queue_free")