diff --git a/Content.Client/Actions/ActionsSystem.cs b/Content.Client/Actions/ActionsSystem.cs index 8061d33ac7..ba282b187c 100644 --- a/Content.Client/Actions/ActionsSystem.cs +++ b/Content.Client/Actions/ActionsSystem.cs @@ -52,6 +52,29 @@ namespace Content.Client.Actions SubscribeLocalEvent(OnEntityWorldTargetHandleState); } + public override void FrameUpdate(float frameTime) + { + base.FrameUpdate(frameTime); + + var worldActionQuery = EntityQueryEnumerator(); + while (worldActionQuery.MoveNext(out var uid, out var action)) + { + UpdateAction(uid, action); + } + + var instantActionQuery = EntityQueryEnumerator(); + while (instantActionQuery.MoveNext(out var uid, out var action)) + { + UpdateAction(uid, action); + } + + var entityActionQuery = EntityQueryEnumerator(); + while (entityActionQuery.MoveNext(out var uid, out var action)) + { + UpdateAction(uid, action); + } + } + private void OnInstantHandleState(EntityUid uid, InstantActionComponent component, ref ComponentHandleState args) { if (args.Current is not InstantActionComponentState state) @@ -97,6 +120,8 @@ namespace Content.Client.Actions component.Icon = state.Icon; component.IconOn = state.IconOn; component.IconColor = state.IconColor; + component.OriginalIconColor = state.OriginalIconColor; + component.DisabledIconColor = state.DisabledIconColor; component.Keywords.Clear(); component.Keywords.UnionWith(state.Keywords); component.Enabled = state.Enabled; @@ -127,6 +152,8 @@ namespace Content.Client.Actions if (!ResolveActionData(actionId, ref action)) return; + action.IconColor = action.Charges < 1 ? action.DisabledIconColor : action.OriginalIconColor; + base.UpdateAction(actionId, action); if (_playerManager.LocalEntity != action.AttachedEntity) return; diff --git a/Content.Shared/Actions/BaseActionComponent.cs b/Content.Shared/Actions/BaseActionComponent.cs index 481c4e8075..5f9cd328b6 100644 --- a/Content.Shared/Actions/BaseActionComponent.cs +++ b/Content.Shared/Actions/BaseActionComponent.cs @@ -50,6 +50,16 @@ public abstract partial class BaseActionComponent : Component /// [DataField("iconColor")] public Color IconColor = Color.White; + /// + /// The original this action was. + /// + [DataField] public Color OriginalIconColor; + + /// + /// The color the action should turn to when disabled + /// + [DataField] public Color DisabledIconColor = Color.DimGray; + /// /// Keywords that can be used to search for this action in the action menu. /// @@ -194,6 +204,8 @@ public abstract class BaseActionComponentState : ComponentState public SpriteSpecifier? Icon; public SpriteSpecifier? IconOn; public Color IconColor; + public Color OriginalIconColor; + public Color DisabledIconColor; public HashSet Keywords; public bool Enabled; public bool Toggled; @@ -224,6 +236,8 @@ public abstract class BaseActionComponentState : ComponentState Icon = component.Icon; IconOn = component.IconOn; IconColor = component.IconColor; + OriginalIconColor = component.OriginalIconColor; + DisabledIconColor = component.DisabledIconColor; Keywords = component.Keywords; Enabled = component.Enabled; Toggled = component.Toggled; diff --git a/Content.Shared/Actions/SharedActionsSystem.cs b/Content.Shared/Actions/SharedActionsSystem.cs index 6c29776d1d..182f39c92d 100644 --- a/Content.Shared/Actions/SharedActionsSystem.cs +++ b/Content.Shared/Actions/SharedActionsSystem.cs @@ -1,5 +1,6 @@ using System.Diagnostics.CodeAnalysis; using System.Linq; +using Content.Shared._Shitmed.Antags.Abductor; using Content.Shared.ActionBlocker; using Content.Shared.Actions.Events; using Content.Shared.Administration.Logs; @@ -8,21 +9,19 @@ using Content.Shared.Hands; using Content.Shared.Interaction; using Content.Shared.Inventory.Events; using Content.Shared.Mind; +using Content.Shared.Popups; using Content.Shared.Rejuvenate; +using Content.Shared.Silicons.StationAi; using Content.Shared.Whitelist; using Robust.Shared.Audio.Systems; using Robust.Shared.GameStates; using Robust.Shared.Map; using Robust.Shared.Network; +using Robust.Shared.Prototypes; using Robust.Shared.Timing; using Robust.Shared.Utility; -namespace Content.Shared.Actions; -// Shitmed Change -using Content.Shared._Shitmed.Antags.Abductor; -using Content.Shared.Silicons.StationAi; -using Content.Shared.Popups; -using Robust.Shared.Prototypes; +namespace Content.Shared.Actions; public abstract class SharedActionsSystem : EntitySystem { @@ -79,8 +78,42 @@ public abstract class SharedActionsSystem : EntitySystem SubscribeAllEvent(OnActionRequest); } + public override void Update(float frameTime) + { + base.Update(frameTime); + + var worldActionQuery = EntityQueryEnumerator(); + while (worldActionQuery.MoveNext(out var uid, out var action)) + { + if (IsCooldownActive(action) || !ShouldResetCharges(action)) + continue; + + ResetCharges(uid, dirty: true); + } + + var instantActionQuery = EntityQueryEnumerator(); + while (instantActionQuery.MoveNext(out var uid, out var action)) + { + if (IsCooldownActive(action) || !ShouldResetCharges(action)) + continue; + + ResetCharges(uid, dirty: true); + } + + var entityActionQuery = EntityQueryEnumerator(); + while (entityActionQuery.MoveNext(out var uid, out var action)) + { + if (IsCooldownActive(action) || !ShouldResetCharges(action)) + continue; + + ResetCharges(uid, dirty: true); + } + } + private void OnActionMapInit(EntityUid uid, BaseActionComponent component, MapInitEvent args) { + component.OriginalIconColor = component.IconColor; + if (component.Charges == null) return; @@ -336,14 +369,18 @@ public abstract class SharedActionsSystem : EntitySystem Dirty(actionId.Value, action); } - public void ResetCharges(EntityUid? actionId) + public void ResetCharges(EntityUid? actionId, bool update = false, bool dirty = false) { if (!TryGetActionData(actionId, out var action)) return; action.Charges = action.MaxCharges; - UpdateAction(actionId, action); - Dirty(actionId.Value, action); + + if (update) + UpdateAction(actionId, action); + + if (dirty) + Dirty(actionId.Value, action); } public void SetMaxCharges(EntityUid? actionId, int? maxCharges) @@ -407,13 +444,12 @@ public abstract class SharedActionsSystem : EntitySystem return; var curTime = GameTiming.CurTime; - // TODO: Check for charge recovery timer - if (action.Cooldown.HasValue && action.Cooldown.Value.End > curTime) + if (IsCooldownActive(action, curTime)) return; // TODO: Replace with individual charge recovery when we have the visuals to aid it if (action is { Charges: < 1, RenewCharges: true }) - ResetCharges(actionEnt); + ResetCharges(actionEnt, true, true); BaseActionEvent? performEvent = null;