47 lines
1.7 KiB
GDScript
47 lines
1.7 KiB
GDScript
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 = Vector3(0, 1, -5)
|
|
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)
|