using System.Threading.Tasks; using Content.Server.Electrocution; using Content.Server.Stack; using Content.Server.Tools; using Content.Shared.Interaction; using Content.Shared.Tools; using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Serialization.Manager.Attributes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; using Robust.Shared.ViewVariables; namespace Content.Server.Power.Components { /// /// Allows the attached entity to be destroyed by a cutting tool, dropping a piece of cable. /// [RegisterComponent] public class CableComponent : Component, IInteractUsing { public override string Name => "Cable"; [ViewVariables] [DataField("cableDroppedOnCutPrototype")] private string? _cableDroppedOnCutPrototype = "CableHVStack1"; [DataField("cuttingQuality", customTypeSerializer:typeof(PrototypeIdSerializer))] private string _cuttingQuality = "Cutting"; /// /// Checked by to determine if there is /// already a cable of a type on a tile. /// [ViewVariables] public CableType CableType => _cableType; [DataField("cableType")] private CableType _cableType = CableType.HighVoltage; async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { if (_cableDroppedOnCutPrototype == null) return false; if (!await EntitySystem.Get().UseTool(eventArgs.Using, eventArgs.User, Owner, 0f, 0.25f, _cuttingQuality)) return false; if (EntitySystem.Get().TryDoElectrifiedAct(Owner, eventArgs.User)) return false; IoCManager.Resolve().DeleteEntity(Owner); var droppedEnt = IoCManager.Resolve().SpawnEntity(_cableDroppedOnCutPrototype, eventArgs.ClickLocation); // TODO: Literally just use a prototype that has a single thing in the stack, it's not that complicated... if (IoCManager.Resolve().TryGetComponent(droppedEnt, out var stack)) EntitySystem.Get().SetCount(droppedEnt, 1, stack); return true; } } public enum CableType { HighVoltage, MediumVoltage, Apc, } }