55 lines
1.6 KiB
C#
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;
|
|
}
|
|
}
|