Sword animations now sync

main
Twirpytherobot 2 weeks ago
parent b1f1016475
commit 2ec7d56511
  1. 1
      level/resources/weapon_applecorer.tres
  2. 7
      level/scripts/base_weapon.gd
  3. 15
      level/scripts/lilguy_body.gd
  4. 12
      level/scripts/player.gd

@ -10,6 +10,7 @@ description = "yum"
damage = 20.0 damage = 20.0
attack_range = 3.5 attack_range = 3.5
attack_cooldown = 0.6 attack_cooldown = 0.6
attack_animation = "Attack_TwoHandSwing"
knockback_force = 12.0 knockback_force = 12.0
mesh_scene = ExtResource("1_1ytxi") mesh_scene = ExtResource("1_1ytxi")
weight = 2.0 weight = 2.0

@ -48,9 +48,12 @@ func perform_attack() -> bool:
if owner_character and owner_character.is_multiplayer_authority(): if owner_character and owner_character.is_multiplayer_authority():
owner_character._attack_timer = weapon_data.attack_cooldown owner_character._attack_timer = weapon_data.attack_cooldown
# Play attack animation on owner # Play attack animation on owner (use weapon's animation)
if owner_character._body: if owner_character._body:
owner_character._body.play_attack() var anim_name = weapon_data.attack_animation if weapon_data.attack_animation else "Attack_OneHand"
owner_character._body.play_attack(anim_name)
# Sync animation to other clients
owner_character._sync_attack_animation.rpc(anim_name)
# Delay damage until animation hits (roughly 70% through the animation) # Delay damage until animation hits (roughly 70% through the animation)
# This makes the damage apply when the swing actually connects # This makes the damage apply when the swing actually connects

@ -16,7 +16,7 @@ func animate(_velocity: Vector3) -> void:
return return
# Don't override attack animation if it's playing # Don't override attack animation if it's playing
if animation_player.is_playing() and animation_player.current_animation == "Attack_OneHand": if animation_player.is_playing() and animation_player.current_animation.begins_with("Attack"):
return return
# Check if we're dashing # Check if we're dashing
@ -54,9 +54,14 @@ func _play_animation(anim_name: String):
animation_player.play(anim_name) animation_player.play(anim_name)
# Silently ignore if animation doesn't exist # Silently ignore if animation doesn't exist
func play_attack() -> void: func play_attack(anim_name: String = "Attack_OneHand") -> void:
if animation_player: if animation_player:
# Play attack animation once (don't loop) # Play attack animation once (don't loop)
animation_player.play("Attack_OneHand", -1, 1.0) if animation_player.has_animation(anim_name):
# Ensure it doesn't loop animation_player.play(anim_name, -1, 1.0)
animation_player.animation_set_next("Attack_OneHand", "") animation_player.animation_set_next(anim_name, "")
else:
# Fallback to default if animation doesn't exist
push_warning("Animation '%s' not found, using Attack_OneHand" % anim_name)
animation_player.play("Attack_OneHand", -1, 1.0)
animation_player.animation_set_next("Attack_OneHand", "")

@ -392,7 +392,7 @@ func _perform_attack():
# Fallback to default unarmed attack # Fallback to default unarmed attack
# Don't attack if already attacking # Don't attack if already attacking
if _body and _body.animation_player and _body.animation_player.current_animation == "Attack1": if _body and _body.animation_player and _body.animation_player.current_animation.begins_with("Attack"):
return return
if _attack_timer > 0: if _attack_timer > 0:
@ -402,7 +402,9 @@ func _perform_attack():
# Play attack animation once # Play attack animation once
if _body: if _body:
_body.play_attack() _body.play_attack("Attack_OneHand")
# Sync animation to other clients
_sync_attack_animation.rpc("Attack_OneHand")
# Find nearest enemy in range # Find nearest enemy in range
var space_state = get_world_3d().direct_space_state var space_state = get_world_3d().direct_space_state
@ -524,6 +526,12 @@ func _perform_dash():
# Animation is handled by the Body's animate function (Jump animation plays during dash) # Animation is handled by the Body's animate function (Jump animation plays during dash)
## Sync attack animation to all clients
@rpc("any_peer", "call_remote", "unreliable")
func _sync_attack_animation(anim_name: String):
if _body:
_body.play_attack(anim_name)
## Override hurt animation from BaseUnit ## Override hurt animation from BaseUnit
func _play_hurt_animation(): func _play_hurt_animation():
if _body and _body.animation_player: if _body and _body.animation_player:

Loading…
Cancel
Save