Fix whatever the fuck is going on in storage system slightly (#28236)
* Fix whatever the fuck is going on in storage system slightly * Fix inverted check * h * Add silent bool * Silent
This commit is contained in:
@@ -0,0 +1,6 @@
|
|||||||
|
using Robust.Shared.GameStates;
|
||||||
|
|
||||||
|
namespace Content.Shared.Interaction.Components;
|
||||||
|
|
||||||
|
[RegisterComponent, NetworkedComponent]
|
||||||
|
public sealed partial class BypassInteractionChecksComponent : Component;
|
||||||
@@ -75,7 +75,7 @@ public partial class InventorySystem : EntitySystem
|
|||||||
|
|
||||||
if (TryGetSlotEntity(uid, ev.Slot, out var entityUid) && TryComp<StorageComponent>(entityUid, out var storageComponent))
|
if (TryGetSlotEntity(uid, ev.Slot, out var entityUid) && TryComp<StorageComponent>(entityUid, out var storageComponent))
|
||||||
{
|
{
|
||||||
_storageSystem.OpenStorageUI(entityUid.Value, uid, storageComponent);
|
_storageSystem.OpenStorageUI(entityUid.Value, uid, storageComponent, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ using Content.Shared.Hands.Components;
|
|||||||
using Content.Shared.IdentityManagement;
|
using Content.Shared.IdentityManagement;
|
||||||
using Content.Shared.Interaction;
|
using Content.Shared.Interaction;
|
||||||
using Content.Shared.Popups;
|
using Content.Shared.Popups;
|
||||||
|
using Content.Shared.Storage;
|
||||||
using Content.Shared.Storage.Components;
|
using Content.Shared.Storage.Components;
|
||||||
using Content.Shared.Verbs;
|
using Content.Shared.Verbs;
|
||||||
using Content.Shared.Wires;
|
using Content.Shared.Wires;
|
||||||
@@ -42,11 +43,13 @@ public sealed class LockSystem : EntitySystem
|
|||||||
SubscribeLocalEvent<LockComponent, GotEmaggedEvent>(OnEmagged);
|
SubscribeLocalEvent<LockComponent, GotEmaggedEvent>(OnEmagged);
|
||||||
SubscribeLocalEvent<LockComponent, LockDoAfter>(OnDoAfterLock);
|
SubscribeLocalEvent<LockComponent, LockDoAfter>(OnDoAfterLock);
|
||||||
SubscribeLocalEvent<LockComponent, UnlockDoAfter>(OnDoAfterUnlock);
|
SubscribeLocalEvent<LockComponent, UnlockDoAfter>(OnDoAfterUnlock);
|
||||||
|
SubscribeLocalEvent<LockComponent, StorageInteractAttemptEvent>(OnStorageInteractAttempt);
|
||||||
|
|
||||||
SubscribeLocalEvent<LockedWiresPanelComponent, LockToggleAttemptEvent>(OnLockToggleAttempt);
|
SubscribeLocalEvent<LockedWiresPanelComponent, LockToggleAttemptEvent>(OnLockToggleAttempt);
|
||||||
SubscribeLocalEvent<LockedWiresPanelComponent, AttemptChangePanelEvent>(OnAttemptChangePanel);
|
SubscribeLocalEvent<LockedWiresPanelComponent, AttemptChangePanelEvent>(OnAttemptChangePanel);
|
||||||
SubscribeLocalEvent<LockedAnchorableComponent, UnanchorAttemptEvent>(OnUnanchorAttempt);
|
SubscribeLocalEvent<LockedAnchorableComponent, UnanchorAttemptEvent>(OnUnanchorAttempt);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnStartup(EntityUid uid, LockComponent lockComp, ComponentStartup args)
|
private void OnStartup(EntityUid uid, LockComponent lockComp, ComponentStartup args)
|
||||||
{
|
{
|
||||||
_appearanceSystem.SetData(uid, LockVisuals.Locked, lockComp.Locked);
|
_appearanceSystem.SetData(uid, LockVisuals.Locked, lockComp.Locked);
|
||||||
@@ -293,6 +296,12 @@ public sealed class LockSystem : EntitySystem
|
|||||||
TryUnlock(uid, args.User, skipDoAfter: true);
|
TryUnlock(uid, args.User, skipDoAfter: true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnStorageInteractAttempt(Entity<LockComponent> ent, ref StorageInteractAttemptEvent args)
|
||||||
|
{
|
||||||
|
if (ent.Comp.Locked)
|
||||||
|
args.Cancelled = true;
|
||||||
|
}
|
||||||
|
|
||||||
private void OnLockToggleAttempt(Entity<LockedWiresPanelComponent> ent, ref LockToggleAttemptEvent args)
|
private void OnLockToggleAttempt(Entity<LockedWiresPanelComponent> ent, ref LockToggleAttemptEvent args)
|
||||||
{
|
{
|
||||||
if (args.Cancelled)
|
if (args.Cancelled)
|
||||||
|
|||||||
@@ -2,17 +2,15 @@ using System.Collections.Frozen;
|
|||||||
using System.Diagnostics.CodeAnalysis;
|
using System.Diagnostics.CodeAnalysis;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Content.Shared.ActionBlocker;
|
using Content.Shared.ActionBlocker;
|
||||||
using Content.Shared.Administration;
|
|
||||||
using Content.Shared.Administration.Managers;
|
|
||||||
using Content.Shared.Containers.ItemSlots;
|
using Content.Shared.Containers.ItemSlots;
|
||||||
using Content.Shared.Destructible;
|
using Content.Shared.Destructible;
|
||||||
using Content.Shared.DoAfter;
|
using Content.Shared.DoAfter;
|
||||||
using Content.Shared.Ghost;
|
|
||||||
using Content.Shared.Hands.Components;
|
using Content.Shared.Hands.Components;
|
||||||
using Content.Shared.Hands.EntitySystems;
|
using Content.Shared.Hands.EntitySystems;
|
||||||
using Content.Shared.Implants.Components;
|
using Content.Shared.Implants.Components;
|
||||||
using Content.Shared.Input;
|
using Content.Shared.Input;
|
||||||
using Content.Shared.Interaction;
|
using Content.Shared.Interaction;
|
||||||
|
using Content.Shared.Interaction.Components;
|
||||||
using Content.Shared.Inventory;
|
using Content.Shared.Inventory;
|
||||||
using Content.Shared.Item;
|
using Content.Shared.Item;
|
||||||
using Content.Shared.Lock;
|
using Content.Shared.Lock;
|
||||||
@@ -40,7 +38,6 @@ public abstract class SharedStorageSystem : EntitySystem
|
|||||||
{
|
{
|
||||||
[Dependency] private readonly IPrototypeManager _prototype = default!;
|
[Dependency] private readonly IPrototypeManager _prototype = default!;
|
||||||
[Dependency] protected readonly IRobustRandom Random = default!;
|
[Dependency] protected readonly IRobustRandom Random = default!;
|
||||||
[Dependency] private readonly ISharedAdminManager _admin = default!;
|
|
||||||
[Dependency] protected readonly ActionBlockerSystem ActionBlocker = default!;
|
[Dependency] protected readonly ActionBlockerSystem ActionBlocker = default!;
|
||||||
[Dependency] private readonly EntityLookupSystem _entityLookupSystem = default!;
|
[Dependency] private readonly EntityLookupSystem _entityLookupSystem = default!;
|
||||||
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
|
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
|
||||||
@@ -249,18 +246,9 @@ public abstract class SharedStorageSystem : EntitySystem
|
|||||||
|
|
||||||
private void AddUiVerb(EntityUid uid, StorageComponent component, GetVerbsEvent<ActivationVerb> args)
|
private void AddUiVerb(EntityUid uid, StorageComponent component, GetVerbsEvent<ActivationVerb> args)
|
||||||
{
|
{
|
||||||
var silent = false;
|
if (!CanInteract(args.User, (uid, component), args.CanAccess && args.CanInteract))
|
||||||
if (!args.CanAccess || !args.CanInteract || TryComp<LockComponent>(uid, out var lockComponent) && lockComponent.Locked)
|
|
||||||
{
|
|
||||||
// we allow admins to open the storage anyways
|
|
||||||
if (!_admin.HasAdminFlag(args.User, AdminFlags.Admin))
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
silent = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
silent |= HasComp<GhostComponent>(args.User);
|
|
||||||
|
|
||||||
// Does this player currently have the storage UI open?
|
// Does this player currently have the storage UI open?
|
||||||
var uiOpen = _ui.IsUiOpen(uid, StorageComponent.StorageUiKey.Key, args.User);
|
var uiOpen = _ui.IsUiOpen(uid, StorageComponent.StorageUiKey.Key, args.User);
|
||||||
|
|
||||||
@@ -274,7 +262,7 @@ public abstract class SharedStorageSystem : EntitySystem
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
OpenStorageUI(uid, args.User, component, silent);
|
OpenStorageUI(uid, args.User, component);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -298,13 +286,16 @@ public abstract class SharedStorageSystem : EntitySystem
|
|||||||
/// Opens the storage UI for an entity
|
/// Opens the storage UI for an entity
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="entity">The entity to open the UI for</param>
|
/// <param name="entity">The entity to open the UI for</param>
|
||||||
public void OpenStorageUI(EntityUid uid, EntityUid entity, StorageComponent? storageComp = null, bool silent = false)
|
public void OpenStorageUI(EntityUid uid, EntityUid entity, StorageComponent? storageComp = null, bool silent = true)
|
||||||
{
|
{
|
||||||
if (!Resolve(uid, ref storageComp, false))
|
if (!Resolve(uid, ref storageComp, false))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// prevent spamming bag open / honkerton honk sound
|
// prevent spamming bag open / honkerton honk sound
|
||||||
silent |= TryComp<UseDelayComponent>(uid, out var useDelay) && UseDelay.IsDelayed((uid, useDelay));
|
silent |= TryComp<UseDelayComponent>(uid, out var useDelay) && UseDelay.IsDelayed((uid, useDelay));
|
||||||
|
if (!CanInteract(entity, (uid, storageComp), silent: silent))
|
||||||
|
return;
|
||||||
|
|
||||||
if (!silent)
|
if (!silent)
|
||||||
{
|
{
|
||||||
if (!_ui.IsUiOpen(uid, StorageComponent.StorageUiKey.Key))
|
if (!_ui.IsUiOpen(uid, StorageComponent.StorageUiKey.Key))
|
||||||
@@ -326,7 +317,7 @@ public abstract class SharedStorageSystem : EntitySystem
|
|||||||
|
|
||||||
var entities = component.Container.ContainedEntities;
|
var entities = component.Container.ContainedEntities;
|
||||||
|
|
||||||
if (entities.Count == 0 || TryComp(uid, out LockComponent? lockComponent) && lockComponent.Locked)
|
if (entities.Count == 0 || !CanInteract(args.User, (uid, component)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// if the target is storage, add a verb to transfer storage.
|
// if the target is storage, add a verb to transfer storage.
|
||||||
@@ -337,7 +328,7 @@ public abstract class SharedStorageSystem : EntitySystem
|
|||||||
{
|
{
|
||||||
Text = Loc.GetString("storage-component-transfer-verb"),
|
Text = Loc.GetString("storage-component-transfer-verb"),
|
||||||
IconEntity = GetNetEntity(args.Using),
|
IconEntity = GetNetEntity(args.Using),
|
||||||
Act = () => TransferEntities(uid, args.Target, args.User, component, lockComponent, targetStorage, targetLock)
|
Act = () => TransferEntities(uid, args.Target, args.User, component, null, targetStorage, targetLock)
|
||||||
};
|
};
|
||||||
|
|
||||||
args.Verbs.Add(verb);
|
args.Verbs.Add(verb);
|
||||||
@@ -350,7 +341,7 @@ public abstract class SharedStorageSystem : EntitySystem
|
|||||||
/// <returns>true if inserted, false otherwise</returns>
|
/// <returns>true if inserted, false otherwise</returns>
|
||||||
private void OnInteractUsing(EntityUid uid, StorageComponent storageComp, InteractUsingEvent args)
|
private void OnInteractUsing(EntityUid uid, StorageComponent storageComp, InteractUsingEvent args)
|
||||||
{
|
{
|
||||||
if (args.Handled || !storageComp.ClickInsert || TryComp(uid, out LockComponent? lockComponent) && lockComponent.Locked)
|
if (args.Handled || !CanInteract(args.User, (uid, storageComp), storageComp.ClickInsert, false))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (HasComp<PlaceableSurfaceComponent>(uid))
|
if (HasComp<PlaceableSurfaceComponent>(uid))
|
||||||
@@ -368,7 +359,7 @@ public abstract class SharedStorageSystem : EntitySystem
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private void OnActivate(EntityUid uid, StorageComponent storageComp, ActivateInWorldEvent args)
|
private void OnActivate(EntityUid uid, StorageComponent storageComp, ActivateInWorldEvent args)
|
||||||
{
|
{
|
||||||
if (args.Handled || TryComp<LockComponent>(uid, out var lockComponent) && lockComponent.Locked)
|
if (args.Handled || !CanInteract(args.User, (uid, storageComp), storageComp.ClickInsert))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Toggle
|
// Toggle
|
||||||
@@ -378,7 +369,7 @@ public abstract class SharedStorageSystem : EntitySystem
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
OpenStorageUI(uid, args.User, storageComp);
|
OpenStorageUI(uid, args.User, storageComp, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
args.Handled = true;
|
args.Handled = true;
|
||||||
@@ -392,7 +383,7 @@ public abstract class SharedStorageSystem : EntitySystem
|
|||||||
if (args.Handled)
|
if (args.Handled)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
OpenStorageUI(uid, args.Performer, storageComp);
|
OpenStorageUI(uid, args.Performer, storageComp, false);
|
||||||
args.Handled = true;
|
args.Handled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1403,7 +1394,7 @@ public abstract class SharedStorageSystem : EntitySystem
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Checks if a storage's UI is open by anyone when locked, and closes it unless they're an admin.
|
/// Checks if a storage's UI is open by anyone when locked, and closes it.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void OnLockToggled(EntityUid uid, StorageComponent component, ref LockToggledEvent args)
|
private void OnLockToggled(EntityUid uid, StorageComponent component, ref LockToggledEvent args)
|
||||||
{
|
{
|
||||||
@@ -1413,10 +1404,7 @@ public abstract class SharedStorageSystem : EntitySystem
|
|||||||
// Gets everyone looking at the UI
|
// Gets everyone looking at the UI
|
||||||
foreach (var actor in _ui.GetActors(uid, StorageComponent.StorageUiKey.Key).ToList())
|
foreach (var actor in _ui.GetActors(uid, StorageComponent.StorageUiKey.Key).ToList())
|
||||||
{
|
{
|
||||||
if (_admin.HasAdminFlag(actor, AdminFlags.Admin))
|
if (!CanInteract(actor, (uid, component)))
|
||||||
continue;
|
|
||||||
|
|
||||||
// And closes it unless they're an admin
|
|
||||||
_ui.CloseUi(uid, StorageComponent.StorageUiKey.Key, actor);
|
_ui.CloseUi(uid, StorageComponent.StorageUiKey.Key, actor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1457,7 +1445,7 @@ public abstract class SharedStorageSystem : EntitySystem
|
|||||||
|
|
||||||
if (!_ui.IsUiOpen(storageEnt.Value, StorageComponent.StorageUiKey.Key, playerEnt))
|
if (!_ui.IsUiOpen(storageEnt.Value, StorageComponent.StorageUiKey.Key, playerEnt))
|
||||||
{
|
{
|
||||||
OpenStorageUI(storageEnt.Value, playerEnt);
|
OpenStorageUI(storageEnt.Value, playerEnt, silent: false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1472,6 +1460,20 @@ public abstract class SharedStorageSystem : EntitySystem
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private bool CanInteract(EntityUid user, Entity<StorageComponent> storage, bool canInteract = true, bool silent = true)
|
||||||
|
{
|
||||||
|
if (HasComp<BypassInteractionChecksComponent>(user))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (!canInteract)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
var ev = new StorageInteractAttemptEvent(silent);
|
||||||
|
RaiseLocalEvent(storage, ref ev);
|
||||||
|
|
||||||
|
return !ev.Cancelled;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Plays a clientside pickup animation for the specified uid.
|
/// Plays a clientside pickup animation for the specified uid.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ using Robust.Shared.Audio;
|
|||||||
using Robust.Shared.Containers;
|
using Robust.Shared.Containers;
|
||||||
using Robust.Shared.GameStates;
|
using Robust.Shared.GameStates;
|
||||||
using Robust.Shared.Map;
|
using Robust.Shared.Map;
|
||||||
using Robust.Shared.Player;
|
|
||||||
using Robust.Shared.Prototypes;
|
using Robust.Shared.Prototypes;
|
||||||
using Robust.Shared.Serialization;
|
using Robust.Shared.Serialization;
|
||||||
|
|
||||||
@@ -228,6 +227,9 @@ namespace Content.Shared.Storage
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[ByRefEvent]
|
||||||
|
public record struct StorageInteractAttemptEvent(bool Silent, bool Cancelled = false);
|
||||||
|
|
||||||
[NetSerializable]
|
[NetSerializable]
|
||||||
[Serializable]
|
[Serializable]
|
||||||
public enum StorageVisuals : byte
|
public enum StorageVisuals : byte
|
||||||
|
|||||||
@@ -90,6 +90,7 @@
|
|||||||
- type: InventorySlots
|
- type: InventorySlots
|
||||||
- type: Loadout
|
- type: Loadout
|
||||||
prototypes: [ MobAghostGear ]
|
prototypes: [ MobAghostGear ]
|
||||||
|
- type: BypassInteractionChecks
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: ActionAGhostShowSolar
|
id: ActionAGhostShowSolar
|
||||||
|
|||||||
Reference in New Issue
Block a user