diff --git a/assets/voxygen/voxel/weapon/sword/sword_rusty_2h.vox b/assets/voxygen/voxel/weapon/sword/sword_rusty_2h.vox index 83ef86199a..595a0282eb 100644 Binary files a/assets/voxygen/voxel/weapon/sword/sword_rusty_2h.vox and b/assets/voxygen/voxel/weapon/sword/sword_rusty_2h.vox differ diff --git a/common/src/sys/actions.rs b/common/src/sys/actions.rs index 05613761f4..cf81096320 100644 --- a/common/src/sys/actions.rs +++ b/common/src/sys/actions.rs @@ -31,7 +31,7 @@ impl<'a> System<'a> for Sys { let finished_attack = (&entities, &mut attackings) .join() .filter(|(e, a)| { - a.time > 0.5 // TODO: constant + a.time > 0.25 // TODO: constant }) .map(|(e, a)| e) .collect::>(); diff --git a/common/src/sys/inputs.rs b/common/src/sys/inputs.rs index 1f3c74abb3..426d2fd58c 100644 --- a/common/src/sys/inputs.rs +++ b/common/src/sys/inputs.rs @@ -115,6 +115,8 @@ impl<'a> System<'a> for Sys { let animation = if on_ground { if control.move_dir.magnitude() > 0.01 { Animation::Run + } else if attackings.get(entity).is_some() { + Animation::Attack } else { Animation::Idle } diff --git a/voxygen/src/anim/character/attack.rs b/voxygen/src/anim/character/attack.rs index 06ecf80b4c..9c9e8039bc 100644 --- a/voxygen/src/anim/character/attack.rs +++ b/voxygen/src/anim/character/attack.rs @@ -23,15 +23,19 @@ impl Animation for AttackAnimation { ) -> Self::Skeleton { let mut next = (*skeleton).clone(); - let wave = (anim_time as f32 * 1.0).sin(); + let wave = (anim_time as f32 * 4.0).sin(); + let wave_quicken = (1.0 - (anim_time as f32 * 16.0).cos()); + let wave_quicken_slow = (1.0 - (anim_time as f32 * 12.0).cos()); + let wave_quicken_double = (1.0 - (anim_time as f32 * 24.0).cos()); + let wave_quick = (anim_time as f32 * 0.5).sin(); let wave_cos = (anim_time as f32 * 12.0).cos(); - let wave_slow = (anim_time as f32 * 6.0 + PI).sin(); - let wave_slow_cos = (anim_time as f32 * 6.0 + PI).cos(); + let wave_slow = (anim_time as f32 * 10.0 + PI).cos(); + let wave_slow_cos = (anim_time as f32 * 12.0 + PI).cos(); let wave_ultra_slow = (anim_time as f32 * 1.0 + PI).sin(); let wave_ultra_slow_cos = (anim_time as f32 * 1.0 + PI).cos(); - let wave_stop = (anim_time as f32 * 3.0).min(PI / 2.0).sin(); + let wave_stop = (anim_time as f32 * 6.0).min(PI / 2.0).sin(); let wave_stop_alt = (anim_time as f32 * 28.0).min(PI / 2.0).sin(); - let wave_stop_quick = (anim_time as f32 * 8.0).min(PI / 2.0).sin(); + let wave_stop_quick = (anim_time as f32 * 16.0).min(PI / 2.0).sin(); let peakwave = 1.0 - (anim_time as f32 * 1.0).cos(); let head_look = Vec2::new( @@ -47,7 +51,9 @@ impl Animation for AttackAnimation { * 0.25, ); next.head.offset = Vec3::new(0.0, 2.0, 11.0); - next.head.ori = Quaternion::rotation_z(0.0); + next.head.ori = Quaternion::rotation_z(wave_stop_quick * -0.25) + * Quaternion::rotation_x(0.0 + wave_stop_quick * -0.1) + * Quaternion::rotation_y(wave_stop_quick * 0.1); next.head.scale = Vec3::one(); next.chest.offset = Vec3::new(0.0, 0.0, 7.0); @@ -62,26 +68,39 @@ impl Animation for AttackAnimation { next.shorts.ori = Quaternion::rotation_x(0.0); next.shorts.scale = Vec3::one(); - next.l_hand.offset = Vec3::new(-8.0, 4.0, 9.0) / 11.0; - next.l_hand.ori = - Quaternion::rotation_x(0.0 + wave * 2.0) * Quaternion::rotation_z(wave * 2.0); + next.l_hand.offset = Vec3::new( + -8.0 + wave_quicken_slow * 10.0, + 4.0 + wave_quicken_double * 3.0, + 9.0, + ) / 11.0; + next.l_hand.ori = Quaternion::rotation_z(-0.8) + * Quaternion::rotation_x(0.0 + wave_quicken * -0.8) + * Quaternion::rotation_y(0.0 + wave_quicken * -0.4); next.l_hand.scale = Vec3::one() / 11.0; - next.r_hand.offset = Vec3::new(8.0, 4.0, 6.5) / 11.0; + next.r_hand.offset = Vec3::new(0.0, -2.0, 6.5) / 11.0; next.r_hand.ori = Quaternion::rotation_x(0.0); - next.r_hand.scale = Vec3::one() / 11.0; + next.r_hand.scale = Vec3::one() * 0.0; - next.l_foot.offset = Vec3::new(-3.3, -0.1, 8.0); - next.l_foot.ori = Quaternion::identity(); + next.l_foot.offset = Vec3::new( + -3.4, + -0.1 + wave_stop_quick * 2.0, + 8.0 + wave_stop_quick * -4.0, + ); + next.l_foot.ori = Quaternion::rotation_x(wave_stop_quick * -1.2); next.l_foot.scale = Vec3::one(); - next.r_foot.offset = Vec3::new(4.1, -0.1, 8.0); - next.r_foot.ori = Quaternion::identity(); + next.r_foot.offset = Vec3::new( + 3.4, + -0.1 - wave_stop_quick * -2.0, + 8.0 + wave_stop_quick * -2.0, + ); + next.r_foot.ori = Quaternion::rotation_x(wave_stop_quick * 1.2); next.r_foot.scale = Vec3::one(); - next.weapon.offset = Vec3::new(-7.0, -5.0, 15.0); + next.weapon.offset = Vec3::new(-7.0, -2.0, 5.0); next.weapon.ori = Quaternion::rotation_y(2.5); - next.weapon.scale = Vec3::one(); + next.weapon.scale = Vec3::one() * 0.0; next.l_shoulder.offset = Vec3::new(-10.0, -3.2, 2.5); next.l_shoulder.ori = Quaternion::rotation_x(0.0); @@ -95,17 +114,30 @@ impl Animation for AttackAnimation { next.draw.ori = Quaternion::rotation_y(0.0); next.draw.scale = Vec3::one() * 0.0; - next.left_equip.offset = Vec3::new(-8.0, 4.0, 9.0) / 11.0; - next.left_equip.ori = - Quaternion::rotation_x(0.0 + wave * 2.0) * Quaternion::rotation_z(1.57 + wave * 2.0); + next.left_equip.offset = Vec3::new( + -8.0 + wave_quicken_slow * 10.0, + 4.0 + wave_quicken_double * 3.0, + 9.0, + ) / 11.0; + next.left_equip.ori = Quaternion::rotation_z(-0.8) + * Quaternion::rotation_x(0.0 + wave_quicken * -0.8) + * Quaternion::rotation_y(0.0 + wave_quicken * -0.4); next.left_equip.scale = Vec3::one() / 11.0; - next.right_equip.offset = Vec3::new(0.0, 0.0, 5.0) / 11.0; - next.right_equip.ori = Quaternion::rotation_x(0.0);; - next.right_equip.scale = Vec3::one() * 0.0; + next.right_equip.offset = Vec3::new( + -8.0 + wave_quicken_slow * 10.0, + 4.0 + wave_quicken_double * 3.0, + 9.0, + ) / 11.0; + next.right_equip.ori = Quaternion::rotation_z(-0.8) + * Quaternion::rotation_x(0.0 + wave_quicken * -0.8) + * Quaternion::rotation_y(0.0 + wave_quicken * -0.4); + next.right_equip.scale = Vec3::one() / 11.0; next.torso.offset = Vec3::new(0.0, -0.2, 0.1); - next.torso.ori = Quaternion::rotation_x(0.0); + next.torso.ori = Quaternion::rotation_z(wave_stop_quick * -0.2) + * Quaternion::rotation_x(0.0 + wave_stop_quick * -0.2) + * Quaternion::rotation_y(wave_stop_quick * 0.2); next.torso.scale = Vec3::one() / 11.0; next } diff --git a/voxygen/src/anim/character/gliding.rs b/voxygen/src/anim/character/gliding.rs index c3dfe78b54..cf5102d75c 100644 --- a/voxygen/src/anim/character/gliding.rs +++ b/voxygen/src/anim/character/gliding.rs @@ -92,7 +92,7 @@ impl Animation for GlidingAnimation { next.r_foot.scale = Vec3::one(); next.weapon.offset = Vec3::new(-7.0, -5.0, 15.0); - next.weapon.ori = Quaternion::rotation_y(2.5); + next.weapon.ori = Quaternion::rotation_y(2.5) * Quaternion::rotation_z(1.57); next.weapon.scale = Vec3::one(); next.l_shoulder.offset = Vec3::new(-10.0, -3.2, 2.5); diff --git a/voxygen/src/anim/character/idle.rs b/voxygen/src/anim/character/idle.rs index 85c7308a67..d3e09179d2 100644 --- a/voxygen/src/anim/character/idle.rs +++ b/voxygen/src/anim/character/idle.rs @@ -80,7 +80,7 @@ impl Animation for IdleAnimation { next.r_foot.scale = Vec3::one(); next.weapon.offset = Vec3::new(-7.0, -5.0, 15.0); - next.weapon.ori = Quaternion::rotation_y(2.5); + next.weapon.ori = Quaternion::rotation_y(2.5) * Quaternion::rotation_z(1.57); next.weapon.scale = Vec3::one(); next.l_shoulder.offset = Vec3::new(-10.0, -3.2, 2.5); diff --git a/voxygen/src/anim/character/jump.rs b/voxygen/src/anim/character/jump.rs index 1a3f997819..dbf915f1f8 100644 --- a/voxygen/src/anim/character/jump.rs +++ b/voxygen/src/anim/character/jump.rs @@ -65,7 +65,7 @@ impl Animation for JumpAnimation { next.r_foot.scale = Vec3::one(); next.weapon.offset = Vec3::new(-7.0, -5.0, 15.0); - next.weapon.ori = Quaternion::rotation_y(2.5); + next.weapon.ori = Quaternion::rotation_y(2.5) * Quaternion::rotation_z(1.57); next.weapon.scale = Vec3::one(); next.l_shoulder.offset = Vec3::new(-10.0, -3.2, 2.5); diff --git a/voxygen/src/anim/character/run.rs b/voxygen/src/anim/character/run.rs index d640b4f93e..6e1937380a 100644 --- a/voxygen/src/anim/character/run.rs +++ b/voxygen/src/anim/character/run.rs @@ -70,7 +70,7 @@ impl Animation for RunAnimation { next.r_foot.scale = Vec3::one(); next.weapon.offset = Vec3::new(-7.0, -5.0, 15.0); - next.weapon.ori = Quaternion::rotation_y(2.5); + next.weapon.ori = Quaternion::rotation_y(2.5) * Quaternion::rotation_z(1.57); next.weapon.scale = Vec3::one(); next.l_shoulder.offset = Vec3::new(-10.0, -3.2, 2.5); diff --git a/voxygen/src/scene/figure.rs b/voxygen/src/scene/figure.rs index 2824511ae4..313297a72e 100644 --- a/voxygen/src/scene/figure.rs +++ b/voxygen/src/scene/figure.rs @@ -244,7 +244,7 @@ impl FigureModelCache { // TODO actually match against other weapons and set the right model _ => "weapon/sword/sword_rusty_2h.vox", }, - Vec3::new(-6.5, -1.5, -4.0), + Vec3::new(-1.5, -6.5, -4.0), ) } @@ -281,7 +281,7 @@ impl FigureModelCache { Weapon::Sword => "weapon/sword/sword_rusty_2h.vox", _ => "weapon/sword/sword_rusty_2h.vox", }, - Vec3::new(-6.5, -1.5, -5.0), + Vec3::new(-1.5, -6.5, -4.5), ) } fn load_right_equip(hand: Hand) -> Mesh { @@ -289,7 +289,7 @@ impl FigureModelCache { match hand { Hand::Default => "figure/body/hand.vox", }, - Vec3::new(-2.0, -2.5, -2.0), + Vec3::new(-2.0, -2.5, -5.0), ) } /////////