Follow mouse rotation in combat mode (#20433)

This commit is contained in:
Kara
2023-09-24 14:22:44 -07:00
committed by GitHub
parent 19a977e805
commit 2e481be694
6 changed files with 94 additions and 8 deletions

View File

@@ -14,22 +14,31 @@ public sealed partial class MouseRotatorComponent : Component
/// <summary>
/// How much the desired angle needs to change before a predictive event is sent
/// </summary>
[DataField]
[ViewVariables(VVAccess.ReadWrite)]
public Angle AngleTolerance = Angle.FromDegrees(5.0);
[DataField, AutoNetworkedField]
public Angle AngleTolerance = Angle.FromDegrees(20.0);
/// <summary>
/// The angle that will be lerped to
/// </summary>
[AutoNetworkedField, DataField]
[DataField, AutoNetworkedField]
public Angle? GoalRotation;
/// <summary>
/// Max degrees the entity can rotate per second
/// </summary>
[DataField]
[ViewVariables(VVAccess.ReadWrite)]
[DataField, AutoNetworkedField]
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
/// 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
/// like turrets or ship guns, which have finer range of movement.
/// </summary>
[DataField, AutoNetworkedField]
public bool Simple4DirMode = true;
}
/// <summary>
@@ -41,3 +50,13 @@ public sealed class RequestMouseRotatorRotationEvent : EntityEventArgs
{
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

@@ -16,6 +16,7 @@ public abstract class SharedMouseRotatorSystem : EntitySystem
base.Initialize();
SubscribeAllEvent<RequestMouseRotatorRotationEvent>(OnRequestRotation);
SubscribeAllEvent<RequestMouseRotatorRotationSimpleEvent>(OnRequestSimpleRotation);
}
public override void Update(float frameTime)
@@ -48,13 +49,27 @@ public abstract class SharedMouseRotatorSystem : EntitySystem
private void OnRequestRotation(RequestMouseRotatorRotationEvent msg, EntitySessionEventArgs args)
{
if (args.SenderSession.AttachedEntity is not { } ent || !TryComp<MouseRotatorComponent>(ent, out var rotator))
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 local rotation without a 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;
}
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);
}
}