using Robust.Client.Graphics;
using Robust.Client.Input;
using Robust.Client.Player;
-using Robust.Client.Replays.Loading;
using Robust.Shared.Map;
using Robust.Shared.Timing;
// only raise event if the cardinal direction has changed
if (rotator.Simple4DirMode)
{
- var angleDir = angle.GetCardinalDir();
- if (angleDir == curRot.GetCardinalDir())
+ var eyeRot = _eye.CurrentEye.Rotation; // camera rotation
+ var angleDir = (angle + eyeRot).GetCardinalDir(); // apply GetCardinalDir in the camera frame, not in the world frame
+ if (angleDir == (curRot + eyeRot).GetCardinalDir())
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;
public double RotationSpeed = float.MaxValue;
/// <summary>
- /// This one is important. If this is true, <see cref="AngleTolerance"/> does not apply, and the system will
- /// use <see cref="RequestMouseRotatorRotationSimpleEvent"/> instead. In this mode, the client will only send
+ /// This one is important. If this is true, <see cref="AngleTolerance"/> does not apply. 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.
///
/// This is useful for cases like humans, where what really matters is the visual sprite direction, as opposed to something
{
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;
-}
using Content.Shared.Interaction;
-using Robust.Shared.Timing;
namespace Content.Shared.MouseRotator;
base.Initialize();
SubscribeAllEvent<RequestMouseRotatorRotationEvent>(OnRequestRotation);
- SubscribeAllEvent<RequestMouseRotatorRotationSimpleEvent>(OnRequestSimpleRotation);
}
public override void Update(float frameTime)
private void OnRequestRotation(RequestMouseRotatorRotationEvent msg, EntitySessionEventArgs args)
{
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!");
return;
rotator.GoalRotation = msg.Rotation;
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);
- }
}