using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; using Content.Shared.Actions.Prototypes; using Robust.Shared.IoC; using Robust.Shared.Log; using Robust.Shared.Prototypes; namespace Content.Shared.Actions { /// /// Provides access to all configured actions by action type. /// public sealed class ActionManager { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; private readonly Dictionary _typeToAction = new(); private readonly Dictionary _typeToItemAction = new(); public void Initialize() { foreach (var action in _prototypeManager.EnumeratePrototypes()) { if (!_typeToAction.TryAdd(action.ActionType, action)) { Logger.ErrorS("action", "Found action with duplicate actionType {0} - all actions must have" + " a unique actionType, this one will be skipped", action.ActionType); } } foreach (var action in _prototypeManager.EnumeratePrototypes()) { if (!_typeToItemAction.TryAdd(action.ActionType, action)) { Logger.ErrorS("action", "Found itemAction with duplicate actionType {0} - all actions must have" + " a unique actionType, this one will be skipped", action.ActionType); } } } /// all action prototypes of all types public IEnumerable EnumerateActions() { return _typeToAction.Values.Concat(_typeToItemAction.Values); } /// /// Tries to get the action of the indicated type /// /// true if found public bool TryGet(ActionType actionType, [NotNullWhen(true)] out ActionPrototype? action) { return _typeToAction.TryGetValue(actionType, out action); } /// /// Tries to get the item action of the indicated type /// /// true if found public bool TryGet(ItemActionType actionType, [NotNullWhen(true)] out ItemActionPrototype? action) { return _typeToItemAction.TryGetValue(actionType, out action); } } }