dynamic alert sprites (#25452)

* dynamic alert sprite

* fix fat cooldowns
This commit is contained in:
Nemanja
2024-03-28 02:32:56 -04:00
committed by GitHub
parent 6863a7cc26
commit d576f5cbbb
38 changed files with 154 additions and 84 deletions

View File

@@ -3,6 +3,8 @@ using Content.Client.Gameplay;
using Content.Client.UserInterface.Systems.Alerts.Widgets;
using Content.Client.UserInterface.Systems.Gameplay;
using Content.Shared.Alert;
using Robust.Client.GameObjects;
using Robust.Client.Player;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controllers;
@@ -10,6 +12,8 @@ namespace Content.Client.UserInterface.Systems.Alerts;
public sealed class AlertsUIController : UIController, IOnStateEntered<GameplayState>, IOnSystemChanged<ClientAlertsSystem>
{
[Dependency] private readonly IPlayerManager _player = default!;
[UISystemDependency] private readonly ClientAlertsSystem? _alertsSystem = default;
private AlertsUI? UI => UIManager.GetActiveUIWidgetOrNull<AlertsUI>();
@@ -84,4 +88,16 @@ public sealed class AlertsUIController : UIController, IOnStateEntered<GameplayS
SystemOnSyncAlerts(_alertsSystem, alerts);
}
}
public void UpdateAlertSpriteEntity(EntityUid spriteViewEnt, AlertPrototype alert)
{
if (_player.LocalEntity is not { } player)
return;
if (!EntityManager.TryGetComponent<SpriteComponent>(spriteViewEnt, out var sprite))
return;
var ev = new UpdateAlertSpriteEvent((spriteViewEnt, sprite), alert);
EntityManager.EventBus.RaiseLocalEvent(player, ref ev);
}
}

View File

@@ -2,6 +2,8 @@
using Content.Client.Actions.UI;
using Content.Client.Cooldown;
using Content.Shared.Alert;
using Robust.Client.GameObjects;
using Robust.Client.Graphics;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controls;
using Robust.Shared.Timing;
@@ -33,9 +35,12 @@ namespace Content.Client.UserInterface.Systems.Alerts.Controls
private short? _severity;
private readonly IGameTiming _gameTiming;
private readonly AnimatedTextureRect _icon;
private readonly IEntityManager _entityManager;
private readonly SpriteView _icon;
private readonly CooldownGraphic _cooldownGraphic;
private EntityUid _spriteViewEntity;
/// <summary>
/// Creates an alert control reflecting the indicated alert + state
/// </summary>
@@ -44,19 +49,30 @@ namespace Content.Client.UserInterface.Systems.Alerts.Controls
public AlertControl(AlertPrototype alert, short? severity)
{
_gameTiming = IoCManager.Resolve<IGameTiming>();
_entityManager = IoCManager.Resolve<IEntityManager>();
TooltipSupplier = SupplyTooltip;
Alert = alert;
_severity = severity;
var specifier = alert.GetIcon(_severity);
_icon = new AnimatedTextureRect
{
DisplayRect = {TextureScale = new Vector2(2, 2)}
};
_icon.SetFromSpriteSpecifier(specifier);
_spriteViewEntity = _entityManager.Spawn(Alert.AlertViewEntity);
if (_entityManager.TryGetComponent<SpriteComponent>(_spriteViewEntity, out var sprite))
{
var icon = Alert.GetIcon(_severity);
if (sprite.LayerMapTryGet(AlertVisualLayers.Base, out var layer))
sprite.LayerSetSprite(layer, icon);
}
_icon = new SpriteView
{
Scale = new Vector2(2, 2)
};
_icon.SetEntity(_spriteViewEntity);
Children.Add(_icon);
_cooldownGraphic = new CooldownGraphic();
_cooldownGraphic = new CooldownGraphic
{
MaxSize = new Vector2(64, 64)
};
Children.Add(_cooldownGraphic);
}
@@ -72,16 +88,22 @@ namespace Content.Client.UserInterface.Systems.Alerts.Controls
/// </summary>
public void SetSeverity(short? severity)
{
if (_severity != severity)
{
_severity = severity;
_icon.SetFromSpriteSpecifier(Alert.GetIcon(_severity));
}
if (_severity == severity)
return;
_severity = severity;
if (!_entityManager.TryGetComponent<SpriteComponent>(_spriteViewEntity, out var sprite))
return;
var icon = Alert.GetIcon(_severity);
if (sprite.LayerMapTryGet(AlertVisualLayers.Base, out var layer))
sprite.LayerSetSprite(layer, icon);
}
protected override void FrameUpdate(FrameEventArgs args)
{
base.FrameUpdate(args);
UserInterfaceManager.GetUIController<AlertsUIController>().UpdateAlertSpriteEntity(_spriteViewEntity, Alert);
if (!Cooldown.HasValue)
{
_cooldownGraphic.Visible = false;
@@ -91,5 +113,17 @@ namespace Content.Client.UserInterface.Systems.Alerts.Controls
_cooldownGraphic.FromTime(Cooldown.Value.Start, Cooldown.Value.End);
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
_entityManager.DeleteEntity(_spriteViewEntity);
}
}
public enum AlertVisualLayers : byte
{
Base
}
}