Files
tbd-station-14/Content.Shared/MouseRotator/SharedMouseRotatorSystem.cs
Tayrtahn cfb0a95035 Fix mouse rotator error spam (#39071)
Ignore mouse rotation requests when the player is switching controlled entity
2025-07-20 01:16:40 +02:00

66 lines
2.2 KiB
C#

using Content.Shared.Interaction;
namespace Content.Shared.MouseRotator;
/// <summary>
/// This handles rotating an entity based on mouse location
/// </summary>
/// <see cref="MouseRotatorComponent"/>
public abstract class SharedMouseRotatorSystem : EntitySystem
{
[Dependency] private readonly RotateToFaceSystem _rotate = default!;
public override void Initialize()
{
base.Initialize();
SubscribeAllEvent<RequestMouseRotatorRotationEvent>(OnRequestRotation);
}
public override void Update(float frameTime)
{
base.Update(frameTime);
// TODO maybe `ActiveMouseRotatorComponent` to avoid querying over more entities than we need?
// (if this is added to players)
// (but arch makes these fast anyway, so)
var query = EntityQueryEnumerator<MouseRotatorComponent, TransformComponent>();
while (query.MoveNext(out var uid, out var rotator, out var xform))
{
if (rotator.GoalRotation == null)
continue;
if (_rotate.TryRotateTo(
uid,
rotator.GoalRotation.Value,
frameTime,
rotator.AngleTolerance,
MathHelper.DegreesToRadians(rotator.RotationSpeed),
xform))
{
// Stop rotating if we finished
rotator.GoalRotation = null;
Dirty(uid, rotator);
}
}
}
private void OnRequestRotation(RequestMouseRotatorRotationEvent msg, EntitySessionEventArgs args)
{
// Ignore the request if the requested entity is not the user's attached entity.
// This can happen when a player switches controlled entities while rotating.
if (args.SenderSession.AttachedEntity != GetEntity(msg.User))
return;
if (args.SenderSession.AttachedEntity is not { } ent
|| !TryComp<MouseRotatorComponent>(ent, out var rotator))
{
Log.Error($"User {args.SenderSession.Name} ({args.SenderSession.UserId}) tried setting local rotation directly without a valid mouse rotator component attached!");
return;
}
rotator.GoalRotation = msg.Rotation;
Dirty(ent, rotator);
}
}