165 lines
3.6 KiB
C#
165 lines
3.6 KiB
C#
using System.Text;
|
|
using HG;
|
|
using TMPro;
|
|
using UnityEngine;
|
|
|
|
namespace RoR2.UI;
|
|
|
|
public class ChargeIndicatorController : MonoBehaviour
|
|
{
|
|
[Header("Cached Values")]
|
|
public SpriteRenderer[] iconSprites;
|
|
|
|
public TextMeshPro chargingText;
|
|
|
|
public TextMeshPro pingText;
|
|
|
|
public HoldoutZoneController holdoutZoneController;
|
|
|
|
public ObjectScaleCurve pingBounceAnimation;
|
|
|
|
[Header("Color Values")]
|
|
public Color spriteBaseColor;
|
|
|
|
public Color spriteFlashColor;
|
|
|
|
public Color spriteChargingColor;
|
|
|
|
public Color spriteChargedColor;
|
|
|
|
public Color textBaseColor;
|
|
|
|
public Color textChargingColor;
|
|
|
|
public Color playerPingColor;
|
|
|
|
[Header("Options")]
|
|
public bool disableTextWhenNotCharging;
|
|
|
|
public bool disableTextWhenCharged;
|
|
|
|
public bool flashWhenNotCharging;
|
|
|
|
public float flashFrequency;
|
|
|
|
[Header("Control Values - Don't assign via inspector!")]
|
|
public bool isCharging;
|
|
|
|
public bool isCharged;
|
|
|
|
public bool isDiscovered;
|
|
|
|
public bool isActivated;
|
|
|
|
private float flashStopwatch;
|
|
|
|
public bool isPinged;
|
|
|
|
private UserProfile cachedUserProfile;
|
|
|
|
private bool showIndicatorWhenDiscovered;
|
|
|
|
public uint chargeValue { get; set; }
|
|
|
|
private void Awake()
|
|
{
|
|
UserProfile userProfile = LocalUserManager.GetFirstLocalUser()?.userProfile;
|
|
if (userProfile != null)
|
|
{
|
|
cachedUserProfile = userProfile;
|
|
}
|
|
}
|
|
|
|
public void TriggerPing(string pingOwnerName, bool triggerAnimation = true)
|
|
{
|
|
if (!isActivated || isCharged)
|
|
{
|
|
pingText.SetText(pingOwnerName);
|
|
isPinged = true;
|
|
if (triggerAnimation)
|
|
{
|
|
TriggerPingAnimation();
|
|
}
|
|
}
|
|
}
|
|
|
|
public void TriggerPingAnimation()
|
|
{
|
|
if (cachedUserProfile != null)
|
|
{
|
|
showIndicatorWhenDiscovered = cachedUserProfile.useTeleporterDiscoveryIndicator;
|
|
}
|
|
if ((bool)pingBounceAnimation && (!isActivated || isCharged) && (showIndicatorWhenDiscovered || isPinged))
|
|
{
|
|
pingBounceAnimation.enabled = true;
|
|
pingBounceAnimation.Reset();
|
|
}
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if ((bool)holdoutZoneController)
|
|
{
|
|
chargeValue = (uint)holdoutZoneController.displayChargePercent;
|
|
isCharging = holdoutZoneController.isAnyoneCharging;
|
|
}
|
|
if (cachedUserProfile != null)
|
|
{
|
|
showIndicatorWhenDiscovered = cachedUserProfile.useTeleporterDiscoveryIndicator;
|
|
}
|
|
Color color = spriteBaseColor;
|
|
Color color2 = textBaseColor;
|
|
if (!isActivated && (isPinged || (isDiscovered && showIndicatorWhenDiscovered)))
|
|
{
|
|
color = (isPinged ? playerPingColor : spriteChargedColor);
|
|
chargingText.enabled = false;
|
|
pingText.enabled = isPinged;
|
|
}
|
|
else if (!isCharged)
|
|
{
|
|
pingText.enabled = false;
|
|
if (flashWhenNotCharging)
|
|
{
|
|
flashStopwatch += Time.deltaTime;
|
|
color = (((int)(flashStopwatch * flashFrequency) % 2 == 0) ? spriteFlashColor : spriteBaseColor);
|
|
}
|
|
if (isCharging)
|
|
{
|
|
color = spriteChargingColor;
|
|
color2 = textChargingColor;
|
|
}
|
|
if (disableTextWhenNotCharging)
|
|
{
|
|
chargingText.enabled = isCharging;
|
|
}
|
|
else
|
|
{
|
|
chargingText.enabled = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
color = (isPinged ? playerPingColor : spriteChargedColor);
|
|
chargingText.enabled = !disableTextWhenCharged && !isPinged;
|
|
pingText.enabled = isPinged;
|
|
}
|
|
if (chargingText.enabled)
|
|
{
|
|
StringBuilder stringBuilder = HG.StringBuilderPool.RentStringBuilder();
|
|
stringBuilder.AppendUint(chargeValue, 1u, 3u).Append("%");
|
|
chargingText.SetText(stringBuilder);
|
|
HG.StringBuilderPool.ReturnStringBuilder(stringBuilder);
|
|
}
|
|
if (pingText.enabled)
|
|
{
|
|
pingText.color = playerPingColor;
|
|
}
|
|
SpriteRenderer[] array = iconSprites;
|
|
for (int i = 0; i < array.Length; i++)
|
|
{
|
|
array[i].color = color;
|
|
}
|
|
chargingText.color = color2;
|
|
}
|
|
}
|