using Robust.Client.GameObjects;
using Robust.Shared.Animations;
using Robust.Shared.Random;
+using Robust.Shared.Timing;
namespace Content.Client.Orbit;
{
[Dependency] private readonly IRobustRandom _robustRandom = default!;
[Dependency] private readonly AnimationPlayerSystem _animations = default!;
+ [Dependency] private readonly IGameTiming _timing = default!;
- private readonly string _orbitAnimationKey = "orbiting";
private readonly string _orbitStopKey = "orbiting_stop";
public override void Initialize()
SubscribeLocalEvent<OrbitVisualsComponent, ComponentInit>(OnComponentInit);
SubscribeLocalEvent<OrbitVisualsComponent, ComponentRemove>(OnComponentRemove);
- SubscribeLocalEvent<OrbitVisualsComponent, AnimationCompletedEvent>(OnAnimationCompleted);
}
private void OnComponentInit(EntityUid uid, OrbitVisualsComponent component, ComponentInit args)
{
+ _robustRandom.SetSeed((int)_timing.CurTime.TotalMilliseconds);
component.OrbitDistance =
_robustRandom.NextFloat(0.75f * component.OrbitDistance, 1.25f * component.OrbitDistance);
}
var animationPlayer = EnsureComp<AnimationPlayerComponent>(uid);
- if (_animations.HasRunningAnimation(uid, animationPlayer, _orbitAnimationKey))
- return;
-
if (_animations.HasRunningAnimation(uid, animationPlayer, _orbitStopKey))
{
- _animations.Stop(uid, animationPlayer, _orbitStopKey);
+ _animations.Stop((uid, animationPlayer), _orbitStopKey);
}
-
- _animations.Play(uid, animationPlayer, GetOrbitAnimation(component), _orbitAnimationKey);
}
private void OnComponentRemove(EntityUid uid, OrbitVisualsComponent component, ComponentRemove args)
sprite.EnableDirectionOverride = false;
var animationPlayer = EnsureComp<AnimationPlayerComponent>(uid);
- if (_animations.HasRunningAnimation(uid, animationPlayer, _orbitAnimationKey))
- {
- _animations.Stop(uid, animationPlayer, _orbitAnimationKey);
- }
-
if (!_animations.HasRunningAnimation(uid, animationPlayer, _orbitStopKey))
{
- _animations.Play(uid, animationPlayer, GetStopAnimation(component, sprite), _orbitStopKey);
+ _animations.Play((uid, animationPlayer), GetStopAnimation(component, sprite), _orbitStopKey);
}
}
foreach (var (orbit, sprite) in EntityManager.EntityQuery<OrbitVisualsComponent, SpriteComponent>())
{
- var angle = new Angle(Math.PI * 2 * orbit.Orbit);
+ var progress = (float)(_timing.CurTime.TotalSeconds / orbit.OrbitLength) % 1;
+ var angle = new Angle(Math.PI * 2 * progress);
var vec = angle.RotateVec(new Vector2(orbit.OrbitDistance, 0));
sprite.Rotation = angle;
}
}
- private void OnAnimationCompleted(EntityUid uid, OrbitVisualsComponent component, AnimationCompletedEvent args)
- {
- if (args.Key == _orbitAnimationKey && TryComp(uid, out AnimationPlayerComponent? animationPlayer))
- {
- _animations.Play(uid, animationPlayer, GetOrbitAnimation(component), _orbitAnimationKey);
- }
- }
-
- private Animation GetOrbitAnimation(OrbitVisualsComponent component)
- {
- var length = component.OrbitLength;
-
- return new Animation()
- {
- Length = TimeSpan.FromSeconds(length),
- AnimationTracks =
- {
- new AnimationTrackComponentProperty()
- {
- ComponentType = typeof(OrbitVisualsComponent),
- Property = nameof(OrbitVisualsComponent.Orbit),
- KeyFrames =
- {
- new AnimationTrackProperty.KeyFrame(0.0f, 0f),
- new AnimationTrackProperty.KeyFrame(1.0f, length),
- },
- InterpolationMode = AnimationInterpolationMode.Linear
- }
- }
- };
- }
-
private Animation GetStopAnimation(OrbitVisualsComponent component, SpriteComponent sprite)
{
var length = component.OrbitStopLength;