using Content.Shared.Construction.EntitySystems;
using Content.Shared.Tools;
+using Robust.Shared.GameStates;
+using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
namespace Content.Shared.Construction.Components
{
- [RegisterComponent, Access(typeof(AnchorableSystem))]
+ [RegisterComponent, Access(typeof(AnchorableSystem)), NetworkedComponent, AutoGenerateComponentState]
public sealed partial class AnchorableComponent : Component
{
- [DataField("tool", customTypeSerializer: typeof(PrototypeIdSerializer<ToolQualityPrototype>))]
- public string Tool { get; private set; } = "Anchoring";
+ [DataField]
+ public ProtoId<ToolQualityPrototype> Tool { get; private set; } = "Anchoring";
- [DataField("snap")]
+ [DataField, AutoNetworkedField]
+ public AnchorableFlags Flags = AnchorableFlags.Anchorable | AnchorableFlags.Unanchorable;
+
+ [DataField]
[ViewVariables(VVAccess.ReadWrite)]
public bool Snap { get; private set; } = true;
/// Base delay to use for anchoring.
/// </summary>
[ViewVariables(VVAccess.ReadWrite)]
- [DataField("delay")]
+ [DataField]
public float Delay = 1f;
}
+ [Flags]
+ public enum AnchorableFlags : byte
+ {
+ None = 0,
+ Anchorable = 1 << 0,
+ Unanchorable = 1 << 1,
+ }
+
public abstract class BaseAnchoredAttemptEvent : CancellableEntityEventArgs
{
public EntityUid User { get; }
if (!Valid(uid, userUid, usingUid, false))
return;
+ // Log unanchor attempt (server only)
+ _adminLogger.Add(LogType.Anchor, LogImpact.Low, $"{ToPrettyString(userUid):user} is trying to unanchor {ToPrettyString(uid):entity} from {transform.Coordinates:targetlocation}");
+
_tool.UseTool(usingUid, userUid, uid, anchorable.Delay, usingTool.Qualities, new TryUnanchorCompletedEvent());
}
if (transform.Anchored)
{
TryUnAnchor(uid, userUid, usingUid, anchorable, transform, usingTool);
-
- // Log unanchor attempt (server only)
- _adminLogger.Add(LogType.Anchor, LogImpact.Low, $"{ToPrettyString(userUid):user} is trying to unanchor {ToPrettyString(uid):entity} from {transform.Coordinates:targetlocation}");
}
else
{
TryAnchor(uid, userUid, usingUid, anchorable, transform, pullable, usingTool);
-
- // Log anchor attempt (server only)
- _adminLogger.Add(LogType.Anchor, LogImpact.Low, $"{ToPrettyString(userUid):user} is trying to anchor {ToPrettyString(uid):entity} to {transform.Coordinates:targetlocation}");
}
}
if (!Valid(uid, userUid, usingUid, true, anchorable, usingTool))
return;
+ // Log anchor attempt (server only)
+ _adminLogger.Add(LogType.Anchor, LogImpact.Low, $"{ToPrettyString(userUid):user} is trying to anchor {ToPrettyString(uid):entity} to {transform.Coordinates:targetlocation}");
+
if (TryComp<PhysicsComponent>(uid, out var anchorBody) &&
!TileFree(transform.Coordinates, anchorBody))
{
if (!Resolve(usingUid, ref usingTool))
return false;
+ if (anchoring && (anchorable.Flags & AnchorableFlags.Anchorable) == 0x0)
+ return false;
+
+ if (!anchoring && (anchorable.Flags & AnchorableFlags.Unanchorable) == 0x0)
+ return false;
+
BaseAnchoredAttemptEvent attempt =
anchoring ? new AnchorAttemptEvent(userUid, usingUid) : new UnanchorAttemptEvent(userUid, usingUid);