A UI Razor component for the payload indicator on the player HUD. It generates a row of indicator elements showing distances and capture progress for payload-related players, updates visibility each tick, and forces rebuilds by hashing current time.
@using System;
@using Sandbox.UI;
@using KOTH.PlayerExp;
@namespace KOTH.UI
@inherits Panel
@attribute [StyleSheet]
<root class="flex absolute align-center justify-center">
@GeneratePlayerRow(CurrentData.OutData)
</root>
@code
{
private RenderFragment GeneratePlayerRow(List<(float Distance, float CaptureAmount)> OutData) => Builder =>
{
if (OutData == null || OutData.Count == 0)
{
return;
}
var Sequency = 0;
Builder.OpenElement(Sequency++, "div");
Builder.AddAttribute(Sequency++, "class", "indicator");
Builder.OpenElement(Sequency++, "div");
Builder.AddAttribute(Sequency++, "class", "point");
Builder.AddAttribute(Sequency++, "style", $"background-color: rgba(20, 150 ,10, 0.8);)");
Builder.CloseElement();
foreach ((float Distance, float CaptureAmount) in OutData)
{
Builder.OpenElement(Sequency++, "div");
Builder.AddAttribute(Sequency++, "class", "path");
Builder.AddAttribute(Sequency++, "style", $"width: {Distance.FloorToInt()}px;");
Builder.AddAttribute(Sequency++, "style", $"background-image: linear-gradient(to right, #FFFF00AA 100%, #FF0A0AAA {CaptureAmount * 100f}%);");
Builder.CloseElement();
Builder.OpenElement(Sequency++, "div");
Builder.AddAttribute(Sequency++, "class", "point");
Builder.AddAttribute(Sequency++, "class", "point");
var ColourString = CaptureAmount >= 1 ? "rgba(0, 50, 0, 0.8)" : "rgba(225, 0, 0, 0.95)";
Builder.AddAttribute(Sequency++, "style", $"background-color: {ColourString};)");
Builder.CloseElement();
}
Builder.CloseElement();
};
protected override int BuildHash()
{
return HashCode.Combine(Time.Now);
}
FPayloadUIData CurrentData;
public override void Tick()
{
if (!PayloadUI.QueryUIData(out CurrentData))
{
SetClass("hidden", true);
return;
}
SetClass("hidden", false);
}
}