55 lines
1.9 KiB
GDScript
55 lines
1.9 KiB
GDScript
extends Node
|
|
|
|
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 _physics_process(delta: float) -> void:
|
|
if not multiplayer.is_server() and multiplayer.multiplayer_peer != null:
|
|
return
|
|
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 not is_instance_valid(entity):
|
|
return
|
|
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_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)
|