Use ECS prototype-reload events (#22613)
* Use ECS prototype-reload events * better constructors * Maybe this fixes tests?
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
using System.Collections.Frozen;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using Robust.Shared.Player;
|
||||
using Robust.Shared.Prototypes;
|
||||
@@ -7,7 +8,8 @@ namespace Content.Shared.Alert;
|
||||
public abstract class AlertsSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
||||
private readonly Dictionary<AlertType, AlertPrototype> _typeToAlert = new();
|
||||
|
||||
private FrozenDictionary<AlertType, AlertPrototype> _typeToAlert = default!;
|
||||
|
||||
public IReadOnlyDictionary<AlertKey, AlertState>? GetActiveAlerts(EntityUid euid)
|
||||
{
|
||||
@@ -170,9 +172,8 @@ public abstract class AlertsSystem : EntitySystem
|
||||
SubscribeLocalEvent<AlertsComponent, PlayerAttachedEvent>(OnPlayerAttached);
|
||||
|
||||
SubscribeNetworkEvent<ClickAlertEvent>(HandleClickAlert);
|
||||
|
||||
SubscribeLocalEvent<PrototypesReloadedEventArgs>(HandlePrototypesReloaded);
|
||||
LoadPrototypes();
|
||||
_prototypeManager.PrototypesReloaded += HandlePrototypesReloaded;
|
||||
}
|
||||
|
||||
protected virtual void HandleComponentShutdown(EntityUid uid, AlertsComponent component, ComponentShutdown args)
|
||||
@@ -185,29 +186,25 @@ public abstract class AlertsSystem : EntitySystem
|
||||
RaiseLocalEvent(uid, new AlertSyncEvent(uid), true);
|
||||
}
|
||||
|
||||
public override void Shutdown()
|
||||
{
|
||||
_prototypeManager.PrototypesReloaded -= HandlePrototypesReloaded;
|
||||
|
||||
base.Shutdown();
|
||||
}
|
||||
|
||||
private void HandlePrototypesReloaded(PrototypesReloadedEventArgs obj)
|
||||
{
|
||||
LoadPrototypes();
|
||||
if (obj.WasModified<AlertPrototype>())
|
||||
LoadPrototypes();
|
||||
}
|
||||
|
||||
protected virtual void LoadPrototypes()
|
||||
{
|
||||
_typeToAlert.Clear();
|
||||
var dict = new Dictionary<AlertType, AlertPrototype>();
|
||||
foreach (var alert in _prototypeManager.EnumeratePrototypes<AlertPrototype>())
|
||||
{
|
||||
if (!_typeToAlert.TryAdd(alert.AlertType, alert))
|
||||
if (!dict.TryAdd(alert.AlertType, alert))
|
||||
{
|
||||
Log.Error("Found alert with duplicate alertType {0} - all alerts must have" +
|
||||
" a unique alerttype, this one will be skipped", alert.AlertType);
|
||||
}
|
||||
}
|
||||
|
||||
_typeToAlert = dict.ToFrozenDictionary();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
Reference in New Issue
Block a user