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:
@@ -1,6 +1,7 @@
|
||||
using System.Numerics;
|
||||
using Content.Shared.Hands.EntitySystems;
|
||||
using Content.Shared.Interaction;
|
||||
using Content.Shared.Storage;
|
||||
using Content.Shared.Storage.Components;
|
||||
|
||||
namespace Content.Shared.Placeable;
|
||||
@@ -8,12 +9,16 @@ namespace Content.Shared.Placeable;
|
||||
public sealed class PlaceableSurfaceSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly SharedHandsSystem _handsSystem = default!;
|
||||
[Dependency] private readonly SharedTransformSystem _transformSystem = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
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)
|
||||
@@ -21,6 +26,9 @@ public sealed class PlaceableSurfaceSystem : EntitySystem
|
||||
if (!Resolve(uid, ref surface, false))
|
||||
return;
|
||||
|
||||
if (surface.IsPlaceable == isPlaceable)
|
||||
return;
|
||||
|
||||
surface.IsPlaceable = isPlaceable;
|
||||
Dirty(uid, surface);
|
||||
}
|
||||
@@ -59,11 +67,24 @@ public sealed class PlaceableSurfaceSystem : EntitySystem
|
||||
if (!_handsSystem.TryDrop(args.User, args.Used))
|
||||
return;
|
||||
|
||||
if (surface.PlaceCentered)
|
||||
Transform(args.Used).LocalPosition = Transform(uid).LocalPosition + surface.PositionOffset;
|
||||
else
|
||||
Transform(args.Used).Coordinates = args.ClickLocation;
|
||||
_transformSystem.SetCoordinates(args.Used,
|
||||
surface.PlaceCentered ? Transform(uid).Coordinates.Offset(surface.PositionOffset) : args.ClickLocation);
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.HasContents, component.Contents.ContainedEntities.Count > 0);
|
||||
}
|
||||
|
||||
@@ -364,7 +364,9 @@ public abstract class SharedStorageSystem : EntitySystem
|
||||
if (args.Handled || !CanInteract(args.User, (uid, storageComp), storageComp.ClickInsert, false))
|
||||
return;
|
||||
|
||||
if (HasComp<PlaceableSurfaceComponent>(uid))
|
||||
var attemptEv = new StorageInteractUsingAttemptEvent();
|
||||
RaiseLocalEvent(uid, ref attemptEv);
|
||||
if (attemptEv.Cancelled)
|
||||
return;
|
||||
|
||||
PlayerInsertHeldEntity((uid, storageComp), args.User);
|
||||
|
||||
@@ -238,6 +238,9 @@ namespace Content.Shared.Storage
|
||||
[ByRefEvent]
|
||||
public record struct StorageInteractAttemptEvent(bool Silent, bool Cancelled = false);
|
||||
|
||||
[ByRefEvent]
|
||||
public record struct StorageInteractUsingAttemptEvent(bool Cancelled = false);
|
||||
|
||||
[NetSerializable]
|
||||
[Serializable]
|
||||
public enum StorageVisuals : byte
|
||||
|
||||
Reference in New Issue
Block a user