Fix Melee swing effect rotation (#27494)

* Melee swing effect: Allow rotation

* Make melee weapon effects follow the user
This commit is contained in:
Magnus Larsen
2024-04-30 11:56:41 +00:00
committed by GitHub
parent bf3e9fe3b4
commit f1c36af0a5
3 changed files with 21 additions and 6 deletions

View File

@@ -6,6 +6,8 @@ namespace Content.Client.Weapons.Melee.Components;
[RegisterComponent] [RegisterComponent]
public sealed partial class WeaponArcVisualsComponent : Component public sealed partial class WeaponArcVisualsComponent : Component
{ {
public EntityUid? User;
[DataField("animation")] [DataField("animation")]
public WeaponArcAnimation Animation = WeaponArcAnimation.None; public WeaponArcAnimation Animation = WeaponArcAnimation.None;

View File

@@ -55,7 +55,6 @@ public sealed partial class MeleeWeaponSystem
if (meleeWeaponComponent.SwingLeft) if (meleeWeaponComponent.SwingLeft)
angle *= -1; angle *= -1;
} }
sprite.NoRotation = true;
sprite.Rotation = localPos.ToWorldAngle(); sprite.Rotation = localPos.ToWorldAngle();
var distance = Math.Clamp(localPos.Length() / 2f, 0.2f, 1f); var distance = Math.Clamp(localPos.Length() / 2f, 0.2f, 1f);
@@ -64,23 +63,22 @@ public sealed partial class MeleeWeaponSystem
switch (arcComponent.Animation) switch (arcComponent.Animation)
{ {
case WeaponArcAnimation.Slash: case WeaponArcAnimation.Slash:
arcComponent.User = user;
_animation.Play(animationUid, GetSlashAnimation(sprite, angle, spriteRotation), SlashAnimationKey); _animation.Play(animationUid, GetSlashAnimation(sprite, angle, spriteRotation), SlashAnimationKey);
TransformSystem.SetParent(animationUid, xform, user, userXform);
if (arcComponent.Fadeout) if (arcComponent.Fadeout)
_animation.Play(animationUid, GetFadeAnimation(sprite, 0.065f, 0.065f + 0.05f), FadeAnimationKey); _animation.Play(animationUid, GetFadeAnimation(sprite, 0.065f, 0.065f + 0.05f), FadeAnimationKey);
break; break;
case WeaponArcAnimation.Thrust: case WeaponArcAnimation.Thrust:
arcComponent.User = user;
_animation.Play(animationUid, GetThrustAnimation(sprite, distance, spriteRotation), ThrustAnimationKey); _animation.Play(animationUid, GetThrustAnimation(sprite, distance, spriteRotation), ThrustAnimationKey);
TransformSystem.SetParent(animationUid, xform, user, userXform);
if (arcComponent.Fadeout) if (arcComponent.Fadeout)
_animation.Play(animationUid, GetFadeAnimation(sprite, 0.05f, 0.15f), FadeAnimationKey); _animation.Play(animationUid, GetFadeAnimation(sprite, 0.05f, 0.15f), FadeAnimationKey);
break; break;
case WeaponArcAnimation.None: case WeaponArcAnimation.None:
var (mapPos, mapRot) = TransformSystem.GetWorldPositionRotation(userXform); var (mapPos, mapRot) = TransformSystem.GetWorldPositionRotation(userXform);
TransformSystem.AttachToGridOrMap(animationUid, xform);
var worldPos = mapPos + (mapRot - userXform.LocalRotation).RotateVec(localPos); var worldPos = mapPos + (mapRot - userXform.LocalRotation).RotateVec(localPos);
var newLocalPos = TransformSystem.GetInvWorldMatrix(xform.ParentUid).Transform(worldPos); var newLocalPos = TransformSystem.GetInvWorldMatrix(xform.ParentUid).Transform(worldPos);
TransformSystem.SetLocalPositionNoLerp(xform, newLocalPos); TransformSystem.SetLocalPositionNoLerp(animationUid, newLocalPos, xform);
if (arcComponent.Fadeout) if (arcComponent.Fadeout)
_animation.Play(animationUid, GetFadeAnimation(sprite, 0f, 0.15f), FadeAnimationKey); _animation.Play(animationUid, GetFadeAnimation(sprite, 0f, 0.15f), FadeAnimationKey);
break; break;
@@ -98,7 +96,6 @@ public sealed partial class MeleeWeaponSystem
var endRotationOffset = endRotation.RotateVec(new Vector2(0f, -1f)); var endRotationOffset = endRotation.RotateVec(new Vector2(0f, -1f));
startRotation += spriteRotation; startRotation += spriteRotation;
endRotation += spriteRotation; endRotation += spriteRotation;
sprite.NoRotation = true;
return new Animation() return new Animation()
{ {
@@ -205,4 +202,19 @@ public sealed partial class MeleeWeaponSystem
} }
}; };
} }
/// <summary>
/// Updates the effect positions to follow the user
/// </summary>
void UpdateEffects(float frameTime)
{
var arcQuery = EntityQueryEnumerator<TransformComponent, WeaponArcVisualsComponent>();
while(arcQuery.MoveNext(out var uid, out var xform, out var arcComponent))
{
if (arcComponent.User == null)
continue;
var userPos = TransformSystem.GetWorldPosition(arcComponent.User.Value);
TransformSystem.SetWorldPosition(xform, userPos);
}
}
} }

View File

@@ -46,6 +46,7 @@ public sealed partial class MeleeWeaponSystem : SharedMeleeWeaponSystem
public override void Update(float frameTime) public override void Update(float frameTime)
{ {
base.Update(frameTime); base.Update(frameTime);
UpdateEffects(frameTime);
if (!Timing.IsFirstTimePredicted) if (!Timing.IsFirstTimePredicted)
return; return;