feat: implement PlayerMovementController with support for movement states, multiplayer synchronization, and audio/UI systems
This commit is contained in:
@@ -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():
|
||||||
spawn_damage_number(amount, hit_pos)
|
if is_multiplayer_authority():
|
||||||
|
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:
|
||||||
|
|||||||
Reference in New Issue
Block a user