Move PlaceableSurfaceComponent usages to PlaceableSurfaceSystem (#28384)

* Move placeable check to PlaceableSurfaceSystem

This check stops entities from being inserted into a storage entity
when it has a PlaceableSurfaceComponent.

The entity is instead placed on top of the entity like a table.

* Move SetPlaceable to PlaceableSurfaceSystem

* Update to transform system and consolidate code

* Fix interaction with storage that has a placeable component

* deadlock

---------

Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>
This commit is contained in:
ShadowCommander
2024-09-19 00:42:49 -07:00
committed by GitHub
parent bdd0561254
commit 3fc9f96b75
4 changed files with 31 additions and 8 deletions

View File

@@ -1,6 +1,7 @@
using System.Numerics; using System.Numerics;
using Content.Shared.Hands.EntitySystems; using Content.Shared.Hands.EntitySystems;
using Content.Shared.Interaction; using Content.Shared.Interaction;
using Content.Shared.Storage;
using Content.Shared.Storage.Components; using Content.Shared.Storage.Components;
namespace Content.Shared.Placeable; namespace Content.Shared.Placeable;
@@ -8,12 +9,16 @@ namespace Content.Shared.Placeable;
public sealed class PlaceableSurfaceSystem : EntitySystem public sealed class PlaceableSurfaceSystem : EntitySystem
{ {
[Dependency] private readonly SharedHandsSystem _handsSystem = default!; [Dependency] private readonly SharedHandsSystem _handsSystem = default!;
[Dependency] private readonly SharedTransformSystem _transformSystem = default!;
public override void Initialize() public override void Initialize()
{ {
base.Initialize(); base.Initialize();
SubscribeLocalEvent<PlaceableSurfaceComponent, AfterInteractUsingEvent>(OnAfterInteractUsing); SubscribeLocalEvent<PlaceableSurfaceComponent, AfterInteractUsingEvent>(OnAfterInteractUsing);
SubscribeLocalEvent<PlaceableSurfaceComponent, StorageInteractUsingAttemptEvent>(OnStorageInteractUsingAttempt);
SubscribeLocalEvent<PlaceableSurfaceComponent, StorageAfterOpenEvent>(OnStorageAfterOpen);
SubscribeLocalEvent<PlaceableSurfaceComponent, StorageAfterCloseEvent>(OnStorageAfterClose);
} }
public void SetPlaceable(EntityUid uid, bool isPlaceable, PlaceableSurfaceComponent? surface = null) public void SetPlaceable(EntityUid uid, bool isPlaceable, PlaceableSurfaceComponent? surface = null)
@@ -21,6 +26,9 @@ public sealed class PlaceableSurfaceSystem : EntitySystem
if (!Resolve(uid, ref surface, false)) if (!Resolve(uid, ref surface, false))
return; return;
if (surface.IsPlaceable == isPlaceable)
return;
surface.IsPlaceable = isPlaceable; surface.IsPlaceable = isPlaceable;
Dirty(uid, surface); Dirty(uid, surface);
} }
@@ -59,11 +67,24 @@ public sealed class PlaceableSurfaceSystem : EntitySystem
if (!_handsSystem.TryDrop(args.User, args.Used)) if (!_handsSystem.TryDrop(args.User, args.Used))
return; return;
if (surface.PlaceCentered) _transformSystem.SetCoordinates(args.Used,
Transform(args.Used).LocalPosition = Transform(uid).LocalPosition + surface.PositionOffset; surface.PlaceCentered ? Transform(uid).Coordinates.Offset(surface.PositionOffset) : args.ClickLocation);
else
Transform(args.Used).Coordinates = args.ClickLocation;
args.Handled = true; args.Handled = true;
} }
private void OnStorageInteractUsingAttempt(Entity<PlaceableSurfaceComponent> ent, ref StorageInteractUsingAttemptEvent args)
{
args.Cancelled = true;
}
private void OnStorageAfterOpen(Entity<PlaceableSurfaceComponent> ent, ref StorageAfterOpenEvent args)
{
SetPlaceable(ent.Owner, true, ent.Comp);
}
private void OnStorageAfterClose(Entity<PlaceableSurfaceComponent> ent, ref StorageAfterCloseEvent args)
{
SetPlaceable(ent.Owner, false, ent.Comp);
}
} }

View File

@@ -487,9 +487,6 @@ public abstract class SharedEntityStorageSystem : EntitySystem
} }
} }
if (TryComp<PlaceableSurfaceComponent>(uid, out var surface))
_placeableSurface.SetPlaceable(uid, component.Open, surface);
_appearance.SetData(uid, StorageVisuals.Open, component.Open); _appearance.SetData(uid, StorageVisuals.Open, component.Open);
_appearance.SetData(uid, StorageVisuals.HasContents, component.Contents.ContainedEntities.Count > 0); _appearance.SetData(uid, StorageVisuals.HasContents, component.Contents.ContainedEntities.Count > 0);
} }

View File

@@ -364,7 +364,9 @@ public abstract class SharedStorageSystem : EntitySystem
if (args.Handled || !CanInteract(args.User, (uid, storageComp), storageComp.ClickInsert, false)) if (args.Handled || !CanInteract(args.User, (uid, storageComp), storageComp.ClickInsert, false))
return; return;
if (HasComp<PlaceableSurfaceComponent>(uid)) var attemptEv = new StorageInteractUsingAttemptEvent();
RaiseLocalEvent(uid, ref attemptEv);
if (attemptEv.Cancelled)
return; return;
PlayerInsertHeldEntity((uid, storageComp), args.User); PlayerInsertHeldEntity((uid, storageComp), args.User);

View File

@@ -238,6 +238,9 @@ namespace Content.Shared.Storage
[ByRefEvent] [ByRefEvent]
public record struct StorageInteractAttemptEvent(bool Silent, bool Cancelled = false); public record struct StorageInteractAttemptEvent(bool Silent, bool Cancelled = false);
[ByRefEvent]
public record struct StorageInteractUsingAttemptEvent(bool Cancelled = false);
[NetSerializable] [NetSerializable]
[Serializable] [Serializable]
public enum StorageVisuals : byte public enum StorageVisuals : byte