Fix MouseRotator on rotated grids (#29663)
* fix harm mode rotation * cleanup * -pi to pi
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user