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 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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user