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")