Polish melee effects (#11653)
* Polish melee effects * adjustments * Animation changes * Fix fist
This commit is contained in:
@@ -197,14 +197,13 @@ public sealed partial class MeleeWeaponSystem : SharedMeleeWeaponSystem
|
||||
target = screen.GetEntityUnderPosition(mousePos);
|
||||
}
|
||||
|
||||
EntityManager.RaisePredictiveEvent(new LightAttackEvent(target, weapon.Owner, coordinates));
|
||||
|
||||
RaisePredictiveEvent(new LightAttackEvent(target, weapon.Owner, coordinates));
|
||||
return;
|
||||
}
|
||||
|
||||
if (weapon.Attacking)
|
||||
{
|
||||
EntityManager.RaisePredictiveEvent(new StopAttackEvent(weapon.Owner));
|
||||
RaisePredictiveEvent(new StopAttackEvent(weapon.Owner));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -245,189 +244,4 @@ public sealed partial class MeleeWeaponSystem : SharedMeleeWeaponSystem
|
||||
if (Exists(ev.Entity))
|
||||
DoLunge(ev.Entity, ev.Angle, ev.LocalPos, ev.Animation);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Does all of the melee effects for a player that are predicted, i.e. character lunge and weapon animation.
|
||||
/// </summary>
|
||||
public override void DoLunge(EntityUid user, Angle angle, Vector2 localPos, string? animation)
|
||||
{
|
||||
if (!Timing.IsFirstTimePredicted)
|
||||
return;
|
||||
|
||||
var lunge = GetLungeAnimation(localPos);
|
||||
|
||||
// Stop any existing lunges on the user.
|
||||
_animation.Stop(user, MeleeLungeKey);
|
||||
_animation.Play(user, lunge, MeleeLungeKey);
|
||||
|
||||
// Clientside entity to spawn
|
||||
if (animation != null)
|
||||
{
|
||||
var animationUid = Spawn(animation, new EntityCoordinates(user, Vector2.Zero));
|
||||
|
||||
if (localPos != Vector2.Zero && TryComp<SpriteComponent>(animationUid, out var sprite))
|
||||
{
|
||||
sprite[0].AutoAnimated = false;
|
||||
|
||||
if (TryComp<WeaponArcVisualsComponent>(animationUid, out var arcComponent))
|
||||
{
|
||||
sprite.NoRotation = true;
|
||||
sprite.Rotation = localPos.ToWorldAngle();
|
||||
var distance = Math.Clamp(localPos.Length / 2f, 0.2f, 1f);
|
||||
|
||||
switch (arcComponent.Animation)
|
||||
{
|
||||
case WeaponArcAnimation.Slash:
|
||||
_animation.Play(animationUid, GetSlashAnimation(sprite, angle), "melee-slash");
|
||||
break;
|
||||
case WeaponArcAnimation.Thrust:
|
||||
_animation.Play(animationUid, GetThrustAnimation(sprite, distance), "melee-thrust");
|
||||
break;
|
||||
case WeaponArcAnimation.None:
|
||||
sprite.Offset = localPos.Normalized * distance;
|
||||
_animation.Play(animationUid, GetStaticAnimation(sprite), "melee-fade");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Animation GetSlashAnimation(SpriteComponent sprite, Angle arc)
|
||||
{
|
||||
var slashStart = 0.03f;
|
||||
var slashEnd = 0.065f;
|
||||
var length = slashEnd + 0.05f;
|
||||
var startRotation = sprite.Rotation - arc / 2;
|
||||
var endRotation = sprite.Rotation + arc / 2;
|
||||
sprite.NoRotation = true;
|
||||
|
||||
return new Animation()
|
||||
{
|
||||
Length = TimeSpan.FromSeconds(length),
|
||||
AnimationTracks =
|
||||
{
|
||||
new AnimationTrackComponentProperty()
|
||||
{
|
||||
ComponentType = typeof(SpriteComponent),
|
||||
Property = nameof(SpriteComponent.Rotation),
|
||||
KeyFrames =
|
||||
{
|
||||
new AnimationTrackProperty.KeyFrame(startRotation, 0f),
|
||||
new AnimationTrackProperty.KeyFrame(startRotation, slashStart),
|
||||
new AnimationTrackProperty.KeyFrame(endRotation, slashEnd)
|
||||
}
|
||||
},
|
||||
new AnimationTrackComponentProperty()
|
||||
{
|
||||
ComponentType = typeof(SpriteComponent),
|
||||
Property = nameof(SpriteComponent.Offset),
|
||||
KeyFrames =
|
||||
{
|
||||
new AnimationTrackProperty.KeyFrame(startRotation.RotateVec(new Vector2(0f, -1f)), 0f),
|
||||
new AnimationTrackProperty.KeyFrame(startRotation.RotateVec(new Vector2(0f, -1f)), slashStart),
|
||||
new AnimationTrackProperty.KeyFrame(endRotation.RotateVec(new Vector2(0f, -1f)), slashEnd)
|
||||
}
|
||||
},
|
||||
new AnimationTrackComponentProperty()
|
||||
{
|
||||
ComponentType = typeof(SpriteComponent),
|
||||
Property = nameof(SpriteComponent.Color),
|
||||
KeyFrames =
|
||||
{
|
||||
new AnimationTrackProperty.KeyFrame(sprite.Color, slashEnd),
|
||||
new AnimationTrackProperty.KeyFrame(sprite.Color.WithAlpha(0f), length),
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private Animation GetThrustAnimation(SpriteComponent sprite, float distance)
|
||||
{
|
||||
var length = 0.15f;
|
||||
var thrustEnd = 0.05f;
|
||||
|
||||
return new Animation()
|
||||
{
|
||||
Length = TimeSpan.FromSeconds(length),
|
||||
AnimationTracks =
|
||||
{
|
||||
new AnimationTrackComponentProperty()
|
||||
{
|
||||
ComponentType = typeof(SpriteComponent),
|
||||
Property = nameof(SpriteComponent.Offset),
|
||||
KeyFrames =
|
||||
{
|
||||
new AnimationTrackProperty.KeyFrame(sprite.Rotation.RotateVec(new Vector2(0f, -distance / 5f)), 0f),
|
||||
new AnimationTrackProperty.KeyFrame(sprite.Rotation.RotateVec(new Vector2(0f, -distance)), thrustEnd),
|
||||
new AnimationTrackProperty.KeyFrame(sprite.Rotation.RotateVec(new Vector2(0f, -distance)), length),
|
||||
}
|
||||
},
|
||||
new AnimationTrackComponentProperty()
|
||||
{
|
||||
ComponentType = typeof(SpriteComponent),
|
||||
Property = nameof(SpriteComponent.Color),
|
||||
KeyFrames =
|
||||
{
|
||||
new AnimationTrackProperty.KeyFrame(sprite.Color, thrustEnd),
|
||||
new AnimationTrackProperty.KeyFrame(sprite.Color.WithAlpha(0f), length),
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the fadeout for static weapon arcs.
|
||||
/// </summary>
|
||||
private Animation GetStaticAnimation(SpriteComponent sprite)
|
||||
{
|
||||
var length = 0.15f;
|
||||
|
||||
return new()
|
||||
{
|
||||
Length = TimeSpan.FromSeconds(length),
|
||||
AnimationTracks =
|
||||
{
|
||||
new AnimationTrackComponentProperty()
|
||||
{
|
||||
ComponentType = typeof(SpriteComponent),
|
||||
Property = nameof(SpriteComponent.Color),
|
||||
KeyFrames =
|
||||
{
|
||||
new AnimationTrackProperty.KeyFrame(sprite.Color, 0f),
|
||||
new AnimationTrackProperty.KeyFrame(sprite.Color.WithAlpha(0f), length)
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the sprite offset animation to use for mob lunges.
|
||||
/// </summary>
|
||||
private Animation GetLungeAnimation(Vector2 direction)
|
||||
{
|
||||
var length = 0.1f;
|
||||
|
||||
return new Animation
|
||||
{
|
||||
Length = TimeSpan.FromSeconds(length),
|
||||
AnimationTracks =
|
||||
{
|
||||
new AnimationTrackComponentProperty()
|
||||
{
|
||||
ComponentType = typeof(SpriteComponent),
|
||||
Property = nameof(SpriteComponent.Offset),
|
||||
InterpolationMode = AnimationInterpolationMode.Linear,
|
||||
KeyFrames =
|
||||
{
|
||||
new AnimationTrackProperty.KeyFrame(direction.Normalized * 0.15f, 0f),
|
||||
new AnimationTrackProperty.KeyFrame(Vector2.Zero, length)
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user