diff --git a/Content.Server/Power/Components/CablePlacerComponent.cs b/Content.Server/Power/Components/CablePlacerComponent.cs index d054654692..de80a1df4d 100644 --- a/Content.Server/Power/Components/CablePlacerComponent.cs +++ b/Content.Server/Power/Components/CablePlacerComponent.cs @@ -1,69 +1,20 @@ -using System.Threading.Tasks; -using Content.Server.Stack; -using Content.Shared.ActionBlocker; -using Content.Shared.Interaction; -using Content.Shared.Interaction.Helpers; -using Content.Shared.Maps; using Robust.Shared.GameObjects; -using Robust.Shared.IoC; -using Robust.Shared.Map; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization.Manager.Attributes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; using Robust.Shared.ViewVariables; namespace Content.Server.Power.Components { - [RegisterComponent] - internal class CablePlacerComponent : Component, IAfterInteract + [RegisterComponent, ComponentProtoName("CablePlacer")] + public sealed class CablePlacerComponent : Component { - [Dependency] private readonly IEntityManager _entMan = default!; - [Dependency] private readonly IMapManager _mapManager = default!; - - /// - public override string Name => "CablePlacer"; - [ViewVariables] - [DataField("cablePrototypeID")] - private string? _cablePrototypeID = "CableHV"; + [DataField("cablePrototypeID", customTypeSerializer:typeof(PrototypeIdSerializer))] + public string? CablePrototypeId = "CableHV"; [ViewVariables] [DataField("blockingWireType")] - private CableType _blockingCableType = CableType.HighVoltage; - - /// - async Task IAfterInteract.AfterInteract(AfterInteractEventArgs eventArgs) - { - if (!EntitySystem.Get().CanInteract(eventArgs.User)) - return false; - - if (_cablePrototypeID == null) - return false; - - if (!eventArgs.InRangeUnobstructed(ignoreInsideBlocker: true, popup: true)) - return false; - - if(!_mapManager.TryGetGrid(eventArgs.ClickLocation.GetGridId(_entMan), out var grid)) - return false; - - var snapPos = grid.TileIndicesFor(eventArgs.ClickLocation); - var tileDef = grid.GetTileRef(snapPos).Tile.GetContentTileDefinition(); - - if(!tileDef.IsSubFloor || !tileDef.Sturdy) - return false; - - foreach (var anchored in grid.GetAnchoredEntities(snapPos)) - { - if (_entMan.TryGetComponent(anchored, out var wire) && wire.CableType == _blockingCableType) - { - return false; - } - } - - if (_entMan.TryGetComponent(Owner, out var stack) - && !EntitySystem.Get().Use(Owner, 1, stack)) - return false; - - _entMan.SpawnEntity(_cablePrototypeID, grid.GridTileToLocal(snapPos)); - return true; - } + public CableType BlockingCableType = CableType.HighVoltage; } } diff --git a/Content.Server/Power/EntitySystems/CableSystem.Placer.cs b/Content.Server/Power/EntitySystems/CableSystem.Placer.cs new file mode 100644 index 0000000000..eec06141ff --- /dev/null +++ b/Content.Server/Power/EntitySystems/CableSystem.Placer.cs @@ -0,0 +1,47 @@ +using Content.Server.Power.Components; +using Content.Server.Stack; +using Content.Shared.Interaction; +using Content.Shared.Interaction.Helpers; +using Content.Shared.Maps; +using Robust.Shared.GameObjects; + +namespace Content.Server.Power.EntitySystems; + +public sealed partial class CableSystem +{ + private void InitializeCablePlacer() + { + SubscribeLocalEvent(OnCablePlacerAfterInteract); + } + + private void OnCablePlacerAfterInteract(EntityUid uid, CablePlacerComponent component, AfterInteractEvent args) + { + if (args.Handled) return; + + if (component.CablePrototypeId == null) return; + + if (!args.InRangeUnobstructed(ignoreInsideBlocker: true, popup: true)) + return; + + if(!_mapManager.TryGetGrid(args.ClickLocation.GetGridId(EntityManager), out var grid)) + return; + + var snapPos = grid.TileIndicesFor(args.ClickLocation); + var tileDef = (ContentTileDefinition) _tileManager[grid.GetTileRef(snapPos).Tile.TypeId]; + + if (!tileDef.IsSubFloor || !tileDef.Sturdy) + return; + + foreach (var anchored in grid.GetAnchoredEntities(snapPos)) + { + if (TryComp(anchored, out var wire) && wire.CableType == component.BlockingCableType) + return; + } + + if (TryComp(component.Owner, out var stack) && !_stack.Use(component.Owner, 1, stack)) + return; + + EntityManager.SpawnEntity(component.CablePrototypeId, grid.GridTileToLocal(snapPos)); + args.Handled = true; + } +} diff --git a/Content.Server/Power/EntitySystems/CableSystem.cs b/Content.Server/Power/EntitySystems/CableSystem.cs index 7da6d3e0e1..81e1e50f57 100644 --- a/Content.Server/Power/EntitySystems/CableSystem.cs +++ b/Content.Server/Power/EntitySystems/CableSystem.cs @@ -1,21 +1,29 @@ using Content.Server.Electrocution; using Content.Server.Power.Components; +using Content.Server.Stack; using Content.Server.Tools; +using Content.Shared.ActionBlocker; using Content.Shared.Interaction; using Robust.Shared.GameObjects; using Robust.Shared.IoC; +using Robust.Shared.Map; namespace Content.Server.Power.EntitySystems; -public class CableSystem : EntitySystem +public sealed partial class CableSystem : EntitySystem { + [Dependency] private readonly IMapManager _mapManager = default!; + [Dependency] private readonly ITileDefinitionManager _tileManager = default!; [Dependency] private readonly ToolSystem _toolSystem = default!; + [Dependency] private readonly StackSystem _stack = default!; [Dependency] private readonly ElectrocutionSystem _electrocutionSystem = default!; public override void Initialize() { base.Initialize(); + InitializeCablePlacer(); + SubscribeLocalEvent(OnInteractUsing); SubscribeLocalEvent(OnCableCut); SubscribeLocalEvent(OnAnchorChanged);