extends Node const RESPAWN_TIME := 3.0 var respawn_timer := 0.0 var is_dead := false var spawn_position: Vector3 @onready var player: CharacterBody3D = get_parent() func _ready() -> void: spawn_position = player.global_position EventBus.entity_died.connect(_on_entity_died) func _process(delta: float) -> void: if is_dead: respawn_timer -= delta EventBus.respawn_tick.emit(respawn_timer) if respawn_timer <= 0: _respawn() func _on_entity_died(entity: Node) -> void: if entity == player and not is_dead: is_dead = true respawn_timer = RESPAWN_TIME player.velocity = Vector3.ZERO player.get_node("Mesh").visible = false player.get_node("CollisionShape3D").disabled = true player.get_node("Movement").set_physics_process(false) player.get_node("Combat").set_process_unhandled_input(false) player.get_node("Targeting").set_process_unhandled_input(false) func _respawn() -> void: is_dead = false player.global_position = spawn_position player.get_node("Mesh").visible = true player.get_node("CollisionShape3D").disabled = false player.get_node("Movement").set_physics_process(true) player.get_node("Combat").set_process_unhandled_input(true) player.get_node("Targeting").set_process_unhandled_input(true) var health_node: Node = player.get_node("Health") var shield_node: Node = player.get_node("Shield") health_node.current_health = health_node.max_health shield_node.current_shield = shield_node.max_shield EventBus.health_changed.emit(player, health_node.current_health, health_node.max_health) EventBus.shield_changed.emit(player, shield_node.current_shield, shield_node.max_shield) EventBus.player_respawned.emit(player)