using System; using Content.Server.UserInterface; using Content.Server.WireHacking; using Content.Shared.Sound; using Content.Shared.VendingMachines; using Robust.Server.GameObjects; using Robust.Shared.GameObjects; using Robust.Shared.Serialization.Manager.Attributes; using Robust.Shared.ViewVariables; using Content.Server.VendingMachines.systems; using static Content.Shared.Wires.SharedWiresComponent; namespace Content.Server.VendingMachines { [RegisterComponent] public sealed class VendingMachineComponent : SharedVendingMachineComponent, IWires { public bool Ejecting; public TimeSpan AnimationDuration = TimeSpan.Zero; [DataField("pack")] public string PackPrototypeId = string.Empty; public string SpriteName = ""; public bool Broken; /// /// When true, will forcefully throw any object it dispenses /// [DataField("speedLimiter")] public bool CanShoot = false; [DataField("soundVend")] // Grabbed from: https://github.com/discordia-space/CEV-Eris/blob/f702afa271136d093ddeb415423240a2ceb212f0/sound/machines/vending_drop.ogg public SoundSpecifier SoundVend = new SoundPathSpecifier("/Audio/Machines/machine_vend.ogg"); [DataField("soundDeny")] // Yoinked from: https://github.com/discordia-space/CEV-Eris/blob/35bbad6764b14e15c03a816e3e89aa1751660ba9/sound/machines/Custom_deny.ogg public SoundSpecifier SoundDeny = new SoundPathSpecifier("/Audio/Machines/custom_deny.ogg"); [ViewVariables] public BoundUserInterface? UserInterface => Owner.GetUIOrNull(VendingMachineUiKey.Key); public float NonLimitedEjectForce = 7.5f; public float NonLimitedEjectRange = 5f; public enum Wires { /// /// Shoots a random item when pulsed. /// Limiter } public void RegisterWires(WiresComponent.WiresBuilder builder) { builder.CreateWire(Wires.Limiter); } public void WiresUpdate(WiresUpdateEventArgs args) { var identifier = (Wires) args.Identifier; if (identifier == Wires.Limiter && args.Action == WiresAction.Pulse) { EntitySystem.Get().EjectRandom(this.Owner, true, this); } } } public sealed class WiresUpdateEventArgs : EventArgs { public readonly object Identifier; public readonly WiresAction Action; public WiresUpdateEventArgs(object identifier, WiresAction action) { Identifier = identifier; Action = action; } } public interface IWires { void RegisterWires(WiresComponent.WiresBuilder builder); void WiresUpdate(WiresUpdateEventArgs args); } }