6
2026-01-18 12:53:36 +03:00

80 lines
2.7 KiB
C#

using Content.Client.Alerts;
using Content.Shared.Pinpointer;
using Robust.Client.GameObjects;
using Robust.Client.Graphics;
namespace Content.Client.Pinpointer;
public sealed class PinpointerSystem : SharedPinpointerSystem
{
[Dependency] private readonly IEyeManager _eyeManager = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
// WD EDIT START
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<PinpointerComponent, UpdateAlertSpriteEvent>(OnUpdateAlertSprite);
}
private void OnUpdateAlertSprite(EntityUid uid, PinpointerComponent component, ref UpdateAlertSpriteEvent args)
{
if (args.Alert.ID != component.Alert)
return;
var sprite = args.SpriteViewEnt.Comp;
var eye = _eyeManager.CurrentEye;
var angle = component.DistanceToTarget switch
{
Distance.Close or Distance.Medium or Distance.Far => component.ArrowAngle + eye.Rotation,
_ => Angle.Zero
};
_sprite.LayerSetRotation((args.SpriteViewEnt, sprite), PinpointerLayers.Screen, angle);
sprite.LayerSetState(PinpointerLayers.Screen, component.DistanceToTarget.ToString().ToLower());
}
// WD EDIT END
public override void Update(float frameTime)
{
base.Update(frameTime);
// we want to show pinpointers arrow direction relative
// to players eye rotation (like it was in SS13)
// because eye can change it rotation anytime
// we need to update this arrow in a update loop
var query = EntityQueryEnumerator<PinpointerComponent, SpriteComponent>();
while (query.MoveNext(out var uid, out var pinpointer, out var sprite))
{
// WD EDIT START
if (!sprite.LayerExists(PinpointerLayers.Screen))
continue;
// WD EDIT END
if (!pinpointer.HasTarget)
{
sprite.LayerSetRotation(PinpointerLayers.Screen, Angle.Zero);
continue;
}
// End Frontier: ensure question mark is aligned with the screen
var eye = _eyeManager.CurrentEye;
var angle = pinpointer.ArrowAngle + eye.Rotation;
switch (pinpointer.DistanceToTarget)
{
case Distance.Close:
case Distance.Medium:
case Distance.Far:
_sprite.LayerSetRotation((uid, sprite), PinpointerLayers.Screen, angle);
break;
default:
_sprite.LayerSetRotation((uid, sprite), PinpointerLayers.Screen, Angle.Zero);
break;
}
}
}
}