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;