This commit is contained in:
Marek Le
2026-05-09 23:37:26 +02:00
parent 6d28b04c12
commit 2d4002bd3f
263 changed files with 5250 additions and 4597 deletions

View File

@@ -1,45 +1,54 @@
extends Node
var respawn_timer := 0.0
var is_dead := false
var _dead: Dictionary = {}
func _ready() -> void:
EventBus.entity_died.connect(_on_entity_died)
if multiplayer.multiplayer_peer != null and not multiplayer.is_server() and not (multiplayer.multiplayer_peer is OfflineMultiplayerPeer):
set_physics_process(false)
else:
set_physics_process(true)
func _process(delta: float) -> void:
if not is_dead:
func _physics_process(delta: float) -> void:
if not multiplayer.is_server() and multiplayer.multiplayer_peer != null:
return
respawn_timer -= delta
EventBus.respawn_tick.emit(respawn_timer)
if respawn_timer <= 0:
_respawn()
var to_respawn: Array = []
for entity in _dead.keys():
if not is_instance_valid(entity):
to_respawn.append(entity)
continue
_dead[entity] -= delta
if _dead[entity] <= 0.0:
to_respawn.append(entity)
for e in to_respawn:
_dead.erase(e)
if is_instance_valid(e) and e.is_in_group("player"):
_respawn_player(e)
func _on_entity_died(entity: Node) -> void:
if entity != PlayerData:
if not is_instance_valid(entity):
return
if is_dead:
return
is_dead = true
respawn_timer = PlayerData.respawn_time
var player: Node = get_tree().get_first_node_in_group("player")
if not player:
return
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("Ability").set_process_unhandled_input(false)
player.get_node("Targeting").set_process_unhandled_input(false)
if entity.is_in_group("player"):
var t: float = float(Stats.get_stat(entity, "respawn_time", 3.0))
_dead[entity] = t
if entity.has_method("set_dead"):
entity.set_dead.rpc(true)
func _respawn() -> void:
is_dead = false
var player: Node = get_tree().get_first_node_in_group("player")
if not player:
return
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("Ability").set_process_unhandled_input(true)
player.get_node("Targeting").set_process_unhandled_input(true)
PlayerData.respawn()
func _respawn_player(entity: Node) -> void:
var max_hp: float = float(Stats.get_stat(entity, "max_health", 100.0))
var max_shield: float = float(Stats.get_stat(entity, "max_shield", 0.0))
Stats.set_stat(entity, "health", max_hp)
Stats.set_stat(entity, "shield", max_shield)
EventBus.health_changed.emit(entity, max_hp, max_hp)
EventBus.shield_changed.emit(entity, max_shield, max_shield)
EventBus.entity_respawned.emit(entity)
if entity.has_method("set_dead"):
entity.set_dead.rpc(false)
if entity.has_method("teleport_to"):
entity.teleport_to.rpc(_village_spawn_point())
func _village_spawn_point() -> Vector3:
var v: Variant = get_tree().get_first_node_in_group("village")
if v is Node3D:
return (v as Node3D).global_position + Vector3(0, 1, 0)
return Vector3(0, 1, 0)