using Content.Shared.Chemistry.Reagent; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; using Content.Shared.Containers.ItemSlots; using Content.Shared.Materials; using Robust.Shared.Serialization; using Robust.Shared.Audio; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; namespace Content.Shared._Sunrise.CopyMachine; [RegisterComponent, NetworkedComponent, AutoGenerateComponentState, AutoGenerateComponentPause] public sealed partial class CopyMachineComponent : Component { /// /// Максимальное количество заданий в очереди принтера /// [ViewVariables(VVAccess.ReadWrite)] public int MaxQueueSize = 5; [DataField, AutoNetworkedField] public CopyMachineJobView? CurrentJobView; [DataField] public SoundSpecifier PrintSound { get; set; } = new SoundPathSpecifier("/Audio/Machines/printer.ogg"); /// Время выполнения одной печати, копии(в секундах) [DataField] [ViewVariables(VVAccess.ReadWrite)] public float JobDuration = 4f; /// /// Очередь заданий на печать или копирование /// public Queue<(CopyMachineJobType Type, string? TemplateId)> JobQueue = new(); /// /// Идёт ли сейчас выполнение задания /// [ViewVariables] public bool IsProcessing = false; /// /// ID слота для копируемой бумаги /// public const string CopySlotId = "paper_copy"; /// /// Слот для вставляемого листа бумаги, который можно скопировать /// [DataField(required: true)] public ItemSlot CopySlot = new(); /// /// Прототип материала бумаги (используется для проверки количества бумаги в принтере) /// [DataField] [ViewVariables(VVAccess.ReadWrite)] public ProtoId PaperMaterial = "officePaper"; /// /// Прототип сущности бумаги, которую принтер создаёт при печати /// [DataField] public EntProtoId PaperProtoId = "Paper"; /// /// Прототип реагента чернил, используемых принтером /// [DataField] [ViewVariables(VVAccess.ReadWrite)] public ProtoId IncReagentProto = "Inc"; /// /// Название раствора с чернилами внутри принтера /// [DataField] public string Solution = string.Empty; /// /// Сколько чернил тратится на печать одного листа /// [DataField] public int IncCost = 1; /// /// Сколько материала бумаги тратится на один лист (в условных единицах материала) /// [DataField] public int PaperCost = 100; /// /// Доступные шаблоны документов для печати /// [DataField] public List> Templates = new(); /// /// Время, когда можно начать следующий принт (серверное время) /// [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoPausedField] public TimeSpan NextPrintTime = TimeSpan.Zero; [Serializable, NetSerializable] public sealed record PrinterJobView(string Type, string? TemplateId); }