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;
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;
[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()
{
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>
/// </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>
public bool ClientExclusive;
public int Priority;
public NetEntity? AttachedEntity;
+ public bool RaiseOnUser;
public bool AutoPopulate;
public bool Temporary;
public ItemActionIconStyle ItemIconStyle;
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;
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;
return;
DebugTools.Assert(action.AttachedEntity == user);
-
if (!action.Enabled)
return;
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)}");
{
// 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;
}
-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;