refactor
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user