diff --git a/Content.Client/Weapons/Melee/Components/WeaponArcVisualsComponent.cs b/Content.Client/Weapons/Melee/Components/WeaponArcVisualsComponent.cs
index d0f95f7069..6d3d4d40d4 100644
--- a/Content.Client/Weapons/Melee/Components/WeaponArcVisualsComponent.cs
+++ b/Content.Client/Weapons/Melee/Components/WeaponArcVisualsComponent.cs
@@ -6,6 +6,8 @@ namespace Content.Client.Weapons.Melee.Components;
[RegisterComponent]
public sealed partial class WeaponArcVisualsComponent : Component
{
+ public EntityUid? User;
+
[DataField("animation")]
public WeaponArcAnimation Animation = WeaponArcAnimation.None;
diff --git a/Content.Client/Weapons/Melee/MeleeWeaponSystem.Effects.cs b/Content.Client/Weapons/Melee/MeleeWeaponSystem.Effects.cs
index 0f2f98e764..c33bc913d3 100644
--- a/Content.Client/Weapons/Melee/MeleeWeaponSystem.Effects.cs
+++ b/Content.Client/Weapons/Melee/MeleeWeaponSystem.Effects.cs
@@ -55,7 +55,6 @@ public sealed partial class MeleeWeaponSystem
if (meleeWeaponComponent.SwingLeft)
angle *= -1;
}
- sprite.NoRotation = true;
sprite.Rotation = localPos.ToWorldAngle();
var distance = Math.Clamp(localPos.Length() / 2f, 0.2f, 1f);
@@ -64,23 +63,22 @@ public sealed partial class MeleeWeaponSystem
switch (arcComponent.Animation)
{
case WeaponArcAnimation.Slash:
+ arcComponent.User = user;
_animation.Play(animationUid, GetSlashAnimation(sprite, angle, spriteRotation), SlashAnimationKey);
- TransformSystem.SetParent(animationUid, xform, user, userXform);
if (arcComponent.Fadeout)
_animation.Play(animationUid, GetFadeAnimation(sprite, 0.065f, 0.065f + 0.05f), FadeAnimationKey);
break;
case WeaponArcAnimation.Thrust:
+ arcComponent.User = user;
_animation.Play(animationUid, GetThrustAnimation(sprite, distance, spriteRotation), ThrustAnimationKey);
- TransformSystem.SetParent(animationUid, xform, user, userXform);
if (arcComponent.Fadeout)
_animation.Play(animationUid, GetFadeAnimation(sprite, 0.05f, 0.15f), FadeAnimationKey);
break;
case WeaponArcAnimation.None:
var (mapPos, mapRot) = TransformSystem.GetWorldPositionRotation(userXform);
- TransformSystem.AttachToGridOrMap(animationUid, xform);
var worldPos = mapPos + (mapRot - userXform.LocalRotation).RotateVec(localPos);
var newLocalPos = TransformSystem.GetInvWorldMatrix(xform.ParentUid).Transform(worldPos);
- TransformSystem.SetLocalPositionNoLerp(xform, newLocalPos);
+ TransformSystem.SetLocalPositionNoLerp(animationUid, newLocalPos, xform);
if (arcComponent.Fadeout)
_animation.Play(animationUid, GetFadeAnimation(sprite, 0f, 0.15f), FadeAnimationKey);
break;
@@ -98,7 +96,6 @@ public sealed partial class MeleeWeaponSystem
var endRotationOffset = endRotation.RotateVec(new Vector2(0f, -1f));
startRotation += spriteRotation;
endRotation += spriteRotation;
- sprite.NoRotation = true;
return new Animation()
{
@@ -205,4 +202,19 @@ public sealed partial class MeleeWeaponSystem
}
};
}
+
+ ///
+ /// Updates the effect positions to follow the user
+ ///
+ void UpdateEffects(float frameTime)
+ {
+ var arcQuery = EntityQueryEnumerator();
+ 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);
+ }
+ }
}
diff --git a/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs b/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs
index 641d56d3d1..95de207471 100644
--- a/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs
+++ b/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs
@@ -46,6 +46,7 @@ public sealed partial class MeleeWeaponSystem : SharedMeleeWeaponSystem
public override void Update(float frameTime)
{
base.Update(frameTime);
+ UpdateEffects(frameTime);
if (!Timing.IsFirstTimePredicted)
return;