Fix MouseRotator on rotated grids (#29663)

* fix harm mode rotation

* cleanup

* -pi to pi
This commit is contained in:
slarticodefast
2024-07-02 15:04:15 +02:00
committed by GitHub
parent 763a25e934
commit daae8253c6
3 changed files with 12 additions and 33 deletions

View File

@@ -2,7 +2,6 @@
using Robust.Client.Graphics; using Robust.Client.Graphics;
using Robust.Client.Input; using Robust.Client.Input;
using Robust.Client.Player; using Robust.Client.Player;
using Robust.Client.Replays.Loading;
using Robust.Shared.Map; using Robust.Shared.Map;
using Robust.Shared.Timing; using Robust.Shared.Timing;
@@ -46,13 +45,19 @@ public sealed class MouseRotatorSystem : SharedMouseRotatorSystem
// only raise event if the cardinal direction has changed // only raise event if the cardinal direction has changed
if (rotator.Simple4DirMode) if (rotator.Simple4DirMode)
{ {
var angleDir = angle.GetCardinalDir(); var eyeRot = _eye.CurrentEye.Rotation; // camera rotation
if (angleDir == curRot.GetCardinalDir()) var angleDir = (angle + eyeRot).GetCardinalDir(); // apply GetCardinalDir in the camera frame, not in the world frame
if (angleDir == (curRot + eyeRot).GetCardinalDir())
return; return;
RaisePredictiveEvent(new RequestMouseRotatorRotationSimpleEvent() var rotation = angleDir.ToAngle() - eyeRot; // convert back to world frame
if (rotation >= Math.PI) // convert to [-PI, +PI)
rotation -= 2 * Math.PI;
else if (rotation < -Math.PI)
rotation += 2 * Math.PI;
RaisePredictiveEvent(new RequestMouseRotatorRotationEvent
{ {
Direction = angleDir, Rotation = rotation
}); });
return; return;

View File

@@ -30,8 +30,7 @@ public sealed partial class MouseRotatorComponent : Component
public double RotationSpeed = float.MaxValue; public double RotationSpeed = float.MaxValue;
/// <summary> /// <summary>
/// This one is important. If this is true, <see cref="AngleTolerance"/> does not apply, and the system will /// This one is important. If this is true, <see cref="AngleTolerance"/> does not apply. In this mode, the client will only send
/// use <see cref="RequestMouseRotatorRotationSimpleEvent"/> instead. In this mode, the client will only send
/// events when an entity should snap to a different cardinal direction, rather than for every angle change. /// events when an entity should snap to a different cardinal direction, rather than for every angle change.
/// ///
/// This is useful for cases like humans, where what really matters is the visual sprite direction, as opposed to something /// This is useful for cases like humans, where what really matters is the visual sprite direction, as opposed to something
@@ -50,13 +49,3 @@ public sealed class RequestMouseRotatorRotationEvent : EntityEventArgs
{ {
public Angle Rotation; public Angle Rotation;
} }
/// <summary>
/// Simpler version of <see cref="RequestMouseRotatorRotationEvent"/> for implementations
/// that only require snapping to 4-dir and not full angle rotation.
/// </summary>
[Serializable, NetSerializable]
public sealed class RequestMouseRotatorRotationSimpleEvent : EntityEventArgs
{
public Direction Direction;
}

View File

@@ -1,5 +1,4 @@
using Content.Shared.Interaction; using Content.Shared.Interaction;
using Robust.Shared.Timing;
namespace Content.Shared.MouseRotator; namespace Content.Shared.MouseRotator;
@@ -16,7 +15,6 @@ public abstract class SharedMouseRotatorSystem : EntitySystem
base.Initialize(); base.Initialize();
SubscribeAllEvent<RequestMouseRotatorRotationEvent>(OnRequestRotation); SubscribeAllEvent<RequestMouseRotatorRotationEvent>(OnRequestRotation);
SubscribeAllEvent<RequestMouseRotatorRotationSimpleEvent>(OnRequestSimpleRotation);
} }
public override void Update(float frameTime) public override void Update(float frameTime)
@@ -50,7 +48,7 @@ public abstract class SharedMouseRotatorSystem : EntitySystem
private void OnRequestRotation(RequestMouseRotatorRotationEvent msg, EntitySessionEventArgs args) private void OnRequestRotation(RequestMouseRotatorRotationEvent msg, EntitySessionEventArgs args)
{ {
if (args.SenderSession.AttachedEntity is not { } ent if (args.SenderSession.AttachedEntity is not { } ent
|| !TryComp<MouseRotatorComponent>(ent, out var rotator) || rotator.Simple4DirMode) || !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!"); Log.Error($"User {args.SenderSession.Name} ({args.SenderSession.UserId}) tried setting local rotation directly without a valid mouse rotator component attached!");
return; return;
@@ -59,17 +57,4 @@ public abstract class SharedMouseRotatorSystem : EntitySystem
rotator.GoalRotation = msg.Rotation; rotator.GoalRotation = msg.Rotation;
Dirty(ent, rotator); Dirty(ent, rotator);
} }
private void OnRequestSimpleRotation(RequestMouseRotatorRotationSimpleEvent ev, EntitySessionEventArgs args)
{
if (args.SenderSession.AttachedEntity is not { } ent
|| !TryComp<MouseRotatorComponent>(ent, out var rotator) || !rotator.Simple4DirMode)
{
Log.Error($"User {args.SenderSession.Name} ({args.SenderSession.UserId}) tried setting 4-dir rotation directly without a valid mouse rotator component attached!");
return;
}
rotator.GoalRotation = ev.Direction.ToAngle();
Dirty(ent, rotator);
}
} }