Feat/10 adding multiplayer fundamentals #14

Merged
Dotts merged 16 commits from feat/10-adding-multiplayer-fundamentals into main 2026-06-06 19:31:25 -07:00
Showing only changes of commit eb9344c0bb - Show all commits
+52 -2
View File
@@ -466,7 +466,16 @@ func rpc_take_damage(amount: float, hit_pos: Vector3, attacker_id: int, weapon_n
# Show damage number for the attacker # Show damage number for the attacker
if not multiplayer.has_multiplayer_peer() or attacker_id == multiplayer.get_unique_id(): if not multiplayer.has_multiplayer_peer() or attacker_id == multiplayer.get_unique_id():
if is_multiplayer_authority():
spawn_damage_number(amount, hit_pos) spawn_damage_number(amount, hit_pos)
else:
var my_node = get_parent().get_node_or_null(str(attacker_id))
if my_node and my_node.has_method("spawn_damage_number"):
my_node.spawn_damage_number(amount, hit_pos)
# Show damage indicator and screen shake for the victim
if is_multiplayer_authority() and amount > 0.0 and (not multiplayer.has_multiplayer_peer() or attacker_id != multiplayer.get_unique_id()):
_show_damage_indicator(hit_pos)
if attacker_id != 0: if attacker_id != 0:
recent_attackers[attacker_id] = Time.get_ticks_msec() / 1000.0 recent_attackers[attacker_id] = Time.get_ticks_msec() / 1000.0
@@ -488,7 +497,8 @@ func rpc_take_damage(amount: float, hit_pos: Vector3, attacker_id: int, weapon_n
die(impulse) die(impulse)
if multiplayer.is_server(): if multiplayer.is_server():
if get_node_or_null("/root/NetworkManager") and multiplayer.has_multiplayer_peer(): var nm = get_node_or_null("/root/NetworkManager")
if nm and multiplayer.has_multiplayer_peer():
var victim_id = multiplayer.get_unique_id() var victim_id = multiplayer.get_unique_id()
var killer_id = attacker_id var killer_id = attacker_id
@@ -498,7 +508,47 @@ func rpc_take_damage(amount: float, hit_pos: Vector3, attacker_id: int, weapon_n
if aid != killer_id and now - recent_attackers[aid] <= 10.0: if aid != killer_id and now - recent_attackers[aid] <= 10.0:
assist_ids.append(aid) assist_ids.append(aid)
get_node("/root/NetworkManager").register_kill.rpc(victim_id, killer_id, weapon_name, "", assist_ids) if nm.has_method("register_kill"):
nm.register_kill.rpc(-1, killer_id, weapon_name, self.name, assist_ids)
func _show_damage_indicator(hit_pos: Vector3) -> void:
if not _damage_layer: return
var indicator = Polygon2D.new()
indicator.polygon = PackedVector2Array([
Vector2(0, -100),
Vector2(-20, -75),
Vector2(20, -75)
])
indicator.color = Color(1.0, 0.0, 0.0, 0.8)
indicator.position = get_viewport().get_visible_rect().size / 2.0
var forward = -global_transform.basis.z
forward.y = 0.0
if forward.length_squared() > 0.01:
forward = forward.normalized()
var right = global_transform.basis.x
right.y = 0.0
right = right.normalized()
var dir_to_hit = (hit_pos - global_position)
dir_to_hit.y = 0.0
if dir_to_hit.length_squared() > 0.01:
dir_to_hit = dir_to_hit.normalized()
var angle = atan2(dir_to_hit.dot(right), dir_to_hit.dot(forward))
indicator.rotation = angle
_damage_layer.add_child(indicator)
var tween = create_tween()
tween.tween_property(indicator, "color:a", 0.0, 1.0)
tween.tween_callback(indicator.queue_free)
if camera:
var shake_tween = create_tween()
shake_tween.tween_property(camera, "h_offset", randf_range(-0.2, 0.2), 0.05)
shake_tween.parallel().tween_property(camera, "v_offset", randf_range(-0.2, 0.2), 0.05)
shake_tween.chain().tween_property(camera, "h_offset", 0.0, 0.05)
shake_tween.parallel().tween_property(camera, "v_offset", 0.0, 0.05)
func get_weapon_name() -> String: func get_weapon_name() -> String:
if camera: if camera: