Files
mmo/scripts/systems/respawn_system.gd
Marek Lenczewski e76c66eda6 update
2026-04-01 22:53:28 +02:00

49 lines
1.8 KiB
GDScript

extends Node
var dead_players: Dictionary = {}
func _ready() -> void:
EventBus.entity_died.connect(_on_entity_died)
func _process(delta: float) -> void:
for player in dead_players.keys():
if not is_instance_valid(player):
dead_players.erase(player)
continue
dead_players[player] -= delta
EventBus.respawn_tick.emit(dead_players[player])
if dead_players[player] <= 0:
_respawn(player)
func _on_entity_died(entity: Node) -> void:
if not entity.is_in_group("player"):
return
if entity in dead_players:
return
var base: BaseStats = Stats.get_base(entity)
var respawn_time: float = base.respawn_time if base is PlayerStats else 3.0
dead_players[entity] = respawn_time
entity.velocity = Vector3.ZERO
entity.get_node("Mesh").visible = false
entity.get_node("CollisionShape3D").disabled = true
entity.get_node("Movement").set_physics_process(false)
entity.get_node("Combat").set_process_unhandled_input(false)
entity.get_node("Targeting").set_process_unhandled_input(false)
func _respawn(player: Node) -> void:
dead_players.erase(player)
player.global_position = Vector3(0, 1, -5)
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 max_health: float = Stats.get_stat(player, "max_health")
var max_shield: float = Stats.get_stat(player, "max_shield")
Stats.set_stat(player, "health", max_health)
Stats.set_stat(player, "shield", max_shield)
Stats.set_stat(player, "alive", true)
EventBus.health_changed.emit(player, max_health, max_health)
EventBus.shield_changed.emit(player, max_shield, max_shield)
EventBus.player_respawned.emit(player)