]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Mind Action Container (#21336)
authorkeronshb <54602815+keronshb@users.noreply.github.com>
Fri, 3 Nov 2023 23:55:32 +0000 (19:55 -0400)
committerGitHub <noreply@github.com>
Fri, 3 Nov 2023 23:55:32 +0000 (19:55 -0400)
Content.Client/Actions/ActionsSystem.cs
Content.Shared/Actions/ActionContainerSystem.cs
Content.Shared/Actions/BaseActionComponent.cs
Content.Shared/Actions/SharedActionsSystem.cs
Content.Shared/Mind/MindComponent.cs

index a487e5d8d8ab969c720cab19fc5edd51e5d0c3a7..d9fc20d78ce72b9a4a53cc0a36df7473d12afb03 100644 (file)
@@ -92,6 +92,7 @@ namespace Content.Client.Actions
             component.ClientExclusive = state.ClientExclusive;
             component.Priority = state.Priority;
             component.AttachedEntity = EnsureEntity<T>(state.AttachedEntity, uid);
+            component.RaiseOnUser = state.RaiseOnUser;
             component.AutoPopulate = state.AutoPopulate;
             component.Temporary = state.Temporary;
             component.ItemIconStyle = state.ItemIconStyle;
index d7c02ffd6328ae3d0548e324503f7d516df6ad6c..21e3f79f2ba4a2fc10607f73afa9dfe6092c790f 100644 (file)
@@ -1,5 +1,8 @@
 using System.Diagnostics.CodeAnalysis;
 using System.Linq;
+using Content.Shared.Ghost;
+using Content.Shared.Mind;
+using Content.Shared.Mind.Components;
 using Robust.Shared.Containers;
 using Robust.Shared.Network;
 using Robust.Shared.Timing;
@@ -17,6 +20,7 @@ public sealed class ActionContainerSystem : EntitySystem
     [Dependency] private readonly SharedActionsSystem _actions = default!;
     [Dependency] private readonly INetManager _netMan = default!;
     [Dependency] private readonly SharedTransformSystem _transform = default!;
+    [Dependency] private readonly SharedMindSystem _mind = default!;
 
     public override void Initialize()
     {
@@ -26,6 +30,25 @@ public sealed class ActionContainerSystem : EntitySystem
         SubscribeLocalEvent<ActionsContainerComponent, ComponentShutdown>(OnShutdown);
         SubscribeLocalEvent<ActionsContainerComponent, EntRemovedFromContainerMessage>(OnEntityRemoved);
         SubscribeLocalEvent<ActionsContainerComponent, EntInsertedIntoContainerMessage>(OnEntityInserted);
+        SubscribeLocalEvent<ActionsContainerComponent, MindAddedMessage>(OnMindAdded);
+        SubscribeLocalEvent<ActionsContainerComponent, MindRemovedMessage>(OnMindRemoved);
+    }
+
+    private void OnMindAdded(EntityUid uid, ActionsContainerComponent component, MindAddedMessage args)
+    {
+        if(!_mind.TryGetMind(uid, out var mindId, out _))
+            return;
+
+        if (!TryComp<ActionsContainerComponent>(mindId, out var mindActionContainerComp))
+            return;
+
+        if (!HasComp<GhostComponent>(uid) && mindActionContainerComp.Container.ContainedEntities.Count > 0 )
+            _actions.GrantContainedActions(uid, mindId);
+    }
+
+    private void OnMindRemoved(EntityUid uid, ActionsContainerComponent component, MindRemovedMessage args)
+    {
+        _actions.RemoveProvidedActions(uid, args.Mind);
     }
 
     /// <summary>
index a21b801d3cc9a27b008c3e3364d0841803a31933..0eccdddc4c246e10dc2228ff76d3c9beb36112fd 100644 (file)
@@ -120,6 +120,12 @@ public abstract partial class BaseActionComponent : Component
     /// </summary>
     [ViewVariables] public EntityUid? AttachedEntity;
 
+    /// <summary>
+    ///     If true, this will cause the the action event to always be raised directed at the action performer/user instead of the action's container/provider.
+    /// </summary>
+    [DataField]
+    public bool RaiseOnUser;
+
     /// <summary>
     ///     Whether or not to automatically add this action to the action bar when it becomes available.
     /// </summary>
@@ -159,6 +165,7 @@ public abstract class BaseActionComponentState : ComponentState
     public bool ClientExclusive;
     public int Priority;
     public NetEntity? AttachedEntity;
+    public bool RaiseOnUser;
     public bool AutoPopulate;
     public bool Temporary;
     public ItemActionIconStyle ItemIconStyle;
@@ -169,6 +176,7 @@ public abstract class BaseActionComponentState : ComponentState
         Container = entManager.GetNetEntity(component.Container);
         EntityIcon = entManager.GetNetEntity(component.EntIcon);
         AttachedEntity = entManager.GetNetEntity(component.AttachedEntity);
+        RaiseOnUser = component.RaiseOnUser;
         Icon = component.Icon;
         IconOn = component.IconOn;
         IconColor = component.IconColor;
index 7384ab30b17092c916483b5512f2a0fe9466645d..d035e6ccfbf6cdb24272d6635e742e79ea7beb35 100644 (file)
@@ -7,6 +7,7 @@ using Content.Shared.Database;
 using Content.Shared.Hands;
 using Content.Shared.Interaction;
 using Content.Shared.Inventory.Events;
+using Content.Shared.Mind;
 using Robust.Shared.Containers;
 using Robust.Shared.GameStates;
 using Robust.Shared.Map;
@@ -221,7 +222,6 @@ public abstract class SharedActionsSystem : EntitySystem
             return;
 
         DebugTools.Assert(action.AttachedEntity == user);
-
         if (!action.Enabled)
             return;
 
@@ -369,7 +369,7 @@ public abstract class SharedActionsSystem : EntitySystem
 
         var toggledBefore = action.Toggled;
 
-        // Note that attached entity is allowed to be null here.
+        // Note that attached entity and attached container are allowed to be null here.
         if (action.AttachedEntity != null && action.AttachedEntity != performer)
         {
             Log.Error($"{ToPrettyString(performer)} is attempting to perform an action {ToPrettyString(actionId)} that is attached to another entity {ToPrettyString(action.AttachedEntity.Value)}");
@@ -380,7 +380,12 @@ public abstract class SharedActionsSystem : EntitySystem
         {
             // This here is required because of client-side prediction (RaisePredictiveEvent results in event re-use).
             actionEvent.Handled = false;
-            RaiseLocalEvent(action.Container ?? performer, (object) actionEvent, broadcast: true);
+            var target = performer;
+
+            if (!action.RaiseOnUser && action.Container != null && !HasComp<MindComponent>(action.Container))
+                target = action.Container.Value;
+
+            RaiseLocalEvent(target, (object) actionEvent, broadcast: true);
             handled = actionEvent.Handled;
         }
 
index b147a2dbbe7e1099d3157b3b71f2a48a130f6868..51a174c8465c86f70875810f7c7dee20efdd9e3d 100644 (file)
@@ -1,4 +1,5 @@
-using Content.Shared.GameTicking;
+using Content.Shared.Actions;
+using Content.Shared.GameTicking;
 using Content.Shared.Mind.Components;
 using Robust.Shared.GameStates;
 using Robust.Shared.Network;