Alerts System and UI (#2529)
* #272 add bordered panel for effects bar * #272 avoid mouse overlapping tooltip when near edges, change tooltip colors to match mockups * #272 WIP defining status effect states as YML and sending them as encoded integers * #272 refactor to use new alert system * #272 refactor to use new alert system * #272 fix various bugs with new alert system and update alerts to have color * #272 WIP * #272 rename status effects to alerts * #272 WIP reworking alert internals to avoid code dup and eliminate enum * #272 refactor alerts to use categories and fix various bugs * #272 more alert bugfixes * #272 alert ordering * #272 callback-based approach for alert clicks * #272 add debug commands for alerts * #272 utilize new GridContainer capabilities for sizing of alerts tab * #272 scale alerts height based on window size * #272 fix tooltip flicker * #272 transparent alert panel * #272 adjust styles to match injazz mockups more, add cooldown info in tooltip * #272 adjust styles to match injazz mockups more, add cooldown info in tooltip * #272 alert prototype tests * #272 alert manager tests * #272 alert order tests * #272 simple unit test for alerts component * #272 integration test for alerts * #272 rework alerts to use enums instead of id / category * #272 various cleanups for PR * #272 use byte for more compact alert messages * #272 rename StatusEffects folder to Alerts, add missing NetSerializable
This commit is contained in:
93
Content.Client/GameObjects/Components/Mobs/AlertControl.cs
Normal file
93
Content.Client/GameObjects/Components/Mobs/AlertControl.cs
Normal file
@@ -0,0 +1,93 @@
|
||||
#nullable enable
|
||||
using System;
|
||||
using Content.Client.UserInterface;
|
||||
using Content.Client.Utility;
|
||||
using Content.Shared.Alert;
|
||||
using OpenToolkit.Mathematics;
|
||||
using Robust.Client.Interfaces.ResourceManagement;
|
||||
using Robust.Client.UserInterface.Controls;
|
||||
|
||||
namespace Content.Client.GameObjects.Components.Mobs
|
||||
{
|
||||
public class AlertControl : BaseButton
|
||||
{
|
||||
public AlertPrototype Alert { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Total duration of the cooldown in seconds. Null if no duration / cooldown.
|
||||
/// </summary>
|
||||
public int? TotalDuration { get; set; }
|
||||
|
||||
private short? _severity;
|
||||
private readonly TextureRect _icon;
|
||||
private CooldownGraphic _cooldownGraphic;
|
||||
|
||||
private readonly IResourceCache _resourceCache;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Creates an alert control reflecting the indicated alert + state
|
||||
/// </summary>
|
||||
/// <param name="alert">alert to display</param>
|
||||
/// <param name="severity">severity of alert, null if alert doesn't have severity levels</param>
|
||||
/// <param name="resourceCache">resourceCache to use to load alert icon textures</param>
|
||||
public AlertControl(AlertPrototype alert, short? severity, IResourceCache resourceCache)
|
||||
{
|
||||
_resourceCache = resourceCache;
|
||||
Alert = alert;
|
||||
_severity = severity;
|
||||
var texture = _resourceCache.GetTexture(alert.GetIconPath(_severity));
|
||||
_icon = new TextureRect
|
||||
{
|
||||
TextureScale = (2, 2),
|
||||
Texture = texture
|
||||
};
|
||||
|
||||
Children.Add(_icon);
|
||||
_cooldownGraphic = new CooldownGraphic();
|
||||
Children.Add(_cooldownGraphic);
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Change the alert severity, changing the displayed icon
|
||||
/// </summary>
|
||||
public void SetSeverity(short? severity)
|
||||
{
|
||||
if (_severity != severity)
|
||||
{
|
||||
_severity = severity;
|
||||
_icon.Texture = _resourceCache.GetTexture(Alert.GetIconPath(_severity));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Updates the displayed cooldown amount, doing nothing if alertCooldown is null
|
||||
/// </summary>
|
||||
/// <param name="alertCooldown">cooldown start and end</param>
|
||||
/// <param name="curTime">current game time</param>
|
||||
public void UpdateCooldown((TimeSpan Start, TimeSpan End)? alertCooldown, in TimeSpan curTime)
|
||||
{
|
||||
if (!alertCooldown.HasValue)
|
||||
{
|
||||
_cooldownGraphic.Progress = 0;
|
||||
_cooldownGraphic.Visible = false;
|
||||
TotalDuration = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
var start = alertCooldown.Value.Start;
|
||||
var end = alertCooldown.Value.End;
|
||||
|
||||
var length = (end - start).TotalSeconds;
|
||||
var progress = (curTime - start).TotalSeconds / length;
|
||||
var ratio = (progress <= 1 ? (1 - progress) : (curTime - end).TotalSeconds * -5);
|
||||
|
||||
TotalDuration = (int?) Math.Round(length);
|
||||
_cooldownGraphic.Progress = MathHelper.Clamp((float)ratio, -1, 1);
|
||||
_cooldownGraphic.Visible = ratio > -1f;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user