r2mods/ilspy_dump/ror2_csproj/RoR2.UI/CrosshairController.cs

107 lines
2.7 KiB
C#

using System;
using RoR2.Skills;
using UnityEngine;
using UnityEngine.UI;
namespace RoR2.UI;
[RequireComponent(typeof(RectTransform))]
[RequireComponent(typeof(HudElement))]
public class CrosshairController : MonoBehaviour
{
[Serializable]
public struct SpritePosition
{
public RectTransform target;
public Vector3 zeroPosition;
public Vector3 onePosition;
}
[Serializable]
public struct SkillStockSpriteDisplay
{
public GameObject target;
public SkillSlot skillSlot;
public SkillDef requiredSkillDef;
public int minimumStockCountToBeValid;
public int maximumStockCountToBeValid;
}
public SpritePosition[] spriteSpreadPositions;
public SkillStockSpriteDisplay[] skillStockSpriteDisplays;
public RawImage[] remapSprites;
public float minSpreadAlpha;
public float maxSpreadAlpha;
[Tooltip("The angle the crosshair represents when alpha = 1")]
public float maxSpreadAngle;
private MaterialPropertyBlock _propBlock;
public RectTransform rectTransform { get; private set; }
public HudElement hudElement { get; private set; }
private void Awake()
{
rectTransform = GetComponent<RectTransform>();
hudElement = GetComponent<HudElement>();
SetCrosshairSpread();
SetSkillStockDisplays();
}
private void SetCrosshairSpread()
{
float num = 0f;
if ((bool)hudElement.targetCharacterBody)
{
num = hudElement.targetCharacterBody.spreadBloomAngle;
}
for (int i = 0; i < spriteSpreadPositions.Length; i++)
{
SpritePosition spritePosition = spriteSpreadPositions[i];
spritePosition.target.localPosition = Vector3.Lerp(spritePosition.zeroPosition, spritePosition.onePosition, num / maxSpreadAngle);
}
for (int j = 0; j < remapSprites.Length; j++)
{
remapSprites[j].color = new Color(1f, 1f, 1f, Util.Remap(num / maxSpreadAngle, 0f, 1f, minSpreadAlpha, maxSpreadAlpha));
}
}
private void SetSkillStockDisplays()
{
if (!hudElement.targetCharacterBody)
{
return;
}
SkillLocator component = hudElement.targetCharacterBody.GetComponent<SkillLocator>();
for (int i = 0; i < skillStockSpriteDisplays.Length; i++)
{
bool active = false;
SkillStockSpriteDisplay skillStockSpriteDisplay = skillStockSpriteDisplays[i];
GenericSkill skill = component.GetSkill(skillStockSpriteDisplay.skillSlot);
if ((bool)skill && skill.stock >= skillStockSpriteDisplay.minimumStockCountToBeValid && (skill.stock <= skillStockSpriteDisplay.maximumStockCountToBeValid || skillStockSpriteDisplay.maximumStockCountToBeValid < 0) && (skillStockSpriteDisplay.requiredSkillDef == null || skill.skillDef == skillStockSpriteDisplay.requiredSkillDef))
{
active = true;
}
skillStockSpriteDisplay.target.SetActive(active);
}
}
private void LateUpdate()
{
SetCrosshairSpread();
SetSkillStockDisplays();
}
}