vrp-gruppe-sechs/escape-room/kill_zone.gd

41 lines
1.2 KiB
GDScript

# KillZone.gd
extends Area3D
# Position, an der gefallene Objekte wieder erscheinen sollen
@export var respawn_position: Vector3 = Vector3(5, 1, 5)
# Optional: minimale Y-Grenze zum Sicherheitscheck (z. B. falls Physik aussetzt)
@export var y_limit: float = -20.0
func _on_body_entered(body: Node) -> void:
# Nur bewegliche oder greifbare Objekte behandeln
if body is RigidBody3D or body is CharacterBody3D or body.is_in_group("pickable"):
_reset_body_position(body)
func _physics_process(_delta: float) -> void:
# Fallback: falls ein Objekt unter y_limit fällt, respawnen
for body in get_tree().get_nodes_in_group("pickable"):
if body.global_position.y < y_limit:
_reset_body_position(body)
func _reset_body_position(body: Node) -> void:
# Falls Objekt ein XRToolsPickable ist
if body.has_method("is_picked_up") and body.is_picked_up():
# Objekt aus der Hand lösen
if body.has_method("drop"):
body.drop()
# Bewegung stoppen, falls RigidBody
if body is RigidBody3D:
body.linear_velocity = Vector3.ZERO
body.angular_velocity = Vector3.ZERO
# Position zurücksetzen
body.global_position = respawn_position
# Optional leicht anheben, um Kollision mit Boden zu vermeiden
body.translate(Vector3(0, 0.05, 0))