feat: implement multiplayer network manager and player movement controller with base game entities and UI
This commit is contained in:
@@ -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"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user