worldbox-observer-mod/IdleSpectator/FocusRelationshipArrows.cs
2026-07-14 18:35:06 -05:00

55 lines
1.6 KiB
C#

namespace IdleSpectator;
/// <summary>
/// While Idle Spectator focuses a unit, reuse vanilla destination / lover / attack
/// cursor arrows by pinning <see cref="UnitSelectionEffect.last_actor"/>.
/// Arrow visibility follows the player's existing PlayerConfig toggles
/// (<c>cursor_arrow_destination</c>, <c>cursor_arrow_lover</c>,
/// <c>cursor_arrow_attack_target</c>) - idle does not force them on or off.
/// </summary>
internal static class FocusRelationshipArrows
{
public static void OnSpectatorEnabled()
{
PinFocusActor();
}
public static void OnSpectatorDisabled()
{
UnitSelectionEffect.setLastActor(null);
}
/// <summary>
/// Keep the focused unit as the vanilla "hovered" actor so relationship arrows draw
/// when the matching cursor-arrow options are already enabled.
/// Safe to call every frame; no-op when idle is off or there is no focus.
/// </summary>
public static void PinFocusActor()
{
if (!SpectatorMode.Active || !MoveCamera.hasFocusUnit())
{
return;
}
Actor focus = MoveCamera._focus_unit;
if (focus == null || !focus.isAlive())
{
return;
}
UnitSelectionEffect.setLastActor(focus);
}
public static bool IsPinnedToFocus()
{
if (!SpectatorMode.Active || !MoveCamera.hasFocusUnit())
{
return false;
}
Actor focus = MoveCamera._focus_unit;
return focus != null
&& focus.isAlive()
&& UnitSelectionEffect.last_actor == focus;
}
}