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:
DrSmugleaf
2024-05-23 18:23:55 -07:00
committed by GitHub
parent 5cb914e4a6
commit 594a898260
6 changed files with 52 additions and 32 deletions

View File

@@ -0,0 +1,6 @@
using Robust.Shared.GameStates;
namespace Content.Shared.Interaction.Components;
[RegisterComponent, NetworkedComponent]
public sealed partial class BypassInteractionChecksComponent : Component;

View File

@@ -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);
} }
} }

View File

@@ -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)

View File

@@ -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>

View File

@@ -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

View File

@@ -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