From b5f816c8157c91f76c371c2c6e559c8324e82b2c Mon Sep 17 00:00:00 2001
From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
Date: Sat, 29 Jan 2022 22:45:57 +1100
Subject: [PATCH] ECS CablePlacer (#6371)
---
.../Power/Components/CablePlacerComponent.cs | 63 +++----------------
.../Power/EntitySystems/CableSystem.Placer.cs | 47 ++++++++++++++
.../Power/EntitySystems/CableSystem.cs | 10 ++-
3 files changed, 63 insertions(+), 57 deletions(-)
create mode 100644 Content.Server/Power/EntitySystems/CableSystem.Placer.cs
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);