feat: implement multiplayer network manager and player movement controller with base game entities and UI

This commit is contained in:
DottsGit
2026-06-06 14:03:57 -04:00
parent 168bd8f1ce
commit 9adbff3968
6 changed files with 120 additions and 24 deletions
+29 -4
View File
@@ -26,10 +26,10 @@ var shield_label: Label
var death_screen: Control
var ragdoll_instance: Node3D
# Audio
var footstep_player: AudioStreamPlayer
var dash_player: AudioStreamPlayer
var recent_attackers: Dictionary = {} # attacker_id: timestamp
var hit_player: AudioStreamPlayer
var slide_player: AudioStreamPlayer
var wallrun_player: AudioStreamPlayer
@@ -227,6 +227,19 @@ func take_damage(amount: float, _hit_pos: Vector3, _source: Node3D = null, impul
# Show damage number for self-damage
spawn_damage_number(amount, _hit_pos)
# Handle damage tracking for assists
var attacker_id = 0
if _source:
if _source.has_method("get_multiplayer_authority"):
attacker_id = _source.get_multiplayer_authority()
elif "owner_player" in _source and _source.owner_player:
attacker_id = int(str(_source.owner_player.name))
elif _source is CharacterBody3D:
attacker_id = int(str(_source.name))
if attacker_id != 0:
recent_attackers[attacker_id] = Time.get_ticks_msec() / 1000.0
time_since_last_damage = 0.0
if shield > 0.0:
@@ -247,6 +260,13 @@ func take_damage(amount: float, _hit_pos: Vector3, _source: Node3D = null, impul
var victim_id = multiplayer.get_unique_id() if is_multiplayer_authority() else int(str(name))
var killer_id = 0
var weapon_name = "Killed"
var assist_ids: Array = []
var now = Time.get_ticks_msec() / 1000.0
for aid in recent_attackers.keys():
if aid != killer_id and now - recent_attackers[aid] <= 10.0:
assist_ids.append(aid)
if _source and _source is Node:
if _source.has_method("get_multiplayer_authority"):
killer_id = _source.get_multiplayer_authority()
@@ -257,7 +277,7 @@ func take_damage(amount: float, _hit_pos: Vector3, _source: Node3D = null, impul
if _source.has_method("get_weapon_name"):
weapon_name = _source.get_weapon_name()
get_node("/root/NetworkManager").register_kill.rpc(victim_id, killer_id, weapon_name, "")
get_node("/root/NetworkManager").register_kill.rpc(victim_id, killer_id, weapon_name, "", assist_ids)
func get_weapon_name() -> String:
if camera:
@@ -269,8 +289,13 @@ func get_weapon_name() -> String:
if w and w.has_method("get_weapon_name"):
return w.get_weapon_name()
elif w:
# Format "res://weapons/assault_rifle.tscn" -> "Assault Rifle"
var p = w.scene_file_path.get_file().get_basename()
var p = ""
if w.has_meta("script_path"):
p = w.get_meta("script_path").get_file().get_basename()
elif w.get_script():
p = w.get_script().resource_path.get_file().get_basename()
else:
p = "Killed"
return p.capitalize()
return "Killed"