using System; using System.Collections.Generic; using Content.Shared.Cloning; using Content.Shared.Containers.ItemSlots; using Content.Shared.FixedPoint; using Robust.Shared.GameObjects; using Robust.Shared.Serialization; using Robust.Shared.Serialization.Manager.Attributes; namespace Content.Shared.Chemistry.Components { /// /// Shared class for ChemMasterComponent. Provides a way for entities to split reagents from a beaker and produce pills and bottles via a user interface. /// [Virtual] public class SharedChemMasterComponent : Component { [DataField("beakerSlot")] public ItemSlot BeakerSlot = new(); public const string SolutionName = "buffer"; [Serializable, NetSerializable] public sealed class ChemMasterBoundUserInterfaceState : BoundUserInterfaceState { public readonly bool HasPower; public readonly bool HasBeaker; public readonly FixedPoint2 BeakerCurrentVolume; public readonly FixedPoint2 BeakerMaxVolume; public readonly string ContainerName; public readonly string Label; /// /// A list of the reagents and their amounts within the beaker/reagent container, if applicable. /// public readonly IReadOnlyList ContainerReagents; /// /// A list of the reagents and their amounts within the buffer, if applicable. /// public readonly IReadOnlyList BufferReagents; public readonly string DispenserName; public readonly bool BufferModeTransfer; public readonly FixedPoint2 BufferCurrentVolume; public readonly uint SelectedPillType; public ChemMasterBoundUserInterfaceState(bool hasPower, bool hasBeaker, FixedPoint2 beakerCurrentVolume, FixedPoint2 beakerMaxVolume, string containerName, string label, string dispenserName, IReadOnlyList containerReagents, IReadOnlyList bufferReagents, bool bufferModeTransfer, FixedPoint2 bufferCurrentVolume, uint selectedPillType) { HasPower = hasPower; HasBeaker = hasBeaker; BeakerCurrentVolume = beakerCurrentVolume; BeakerMaxVolume = beakerMaxVolume; ContainerName = containerName; Label = label; DispenserName = dispenserName; ContainerReagents = containerReagents; BufferReagents = bufferReagents; BufferModeTransfer = bufferModeTransfer; BufferCurrentVolume = bufferCurrentVolume; SelectedPillType = selectedPillType; } } /// /// Message data sent from client to server when a ChemMaster ui button is pressed. /// [Serializable, NetSerializable] public sealed class UiActionMessage : BoundUserInterfaceMessage { public readonly UiAction Action; public readonly FixedPoint2 Amount; public readonly string Id = ""; public readonly bool IsBuffer; public readonly string Label = ""; public readonly uint PillType; public readonly int PillAmount; public readonly int BottleAmount; public UiActionMessage(UiAction action, FixedPoint2? amount, string? id, bool? isBuffer, string? label, uint? pillType, int? pillAmount, int? bottleAmount) { Action = action; if (Action == UiAction.ChemButton) { Amount = amount.GetValueOrDefault(); if (id == null) { Id = "null"; } else { Id = id; } IsBuffer = isBuffer.GetValueOrDefault(); } else { PillAmount = pillAmount.GetValueOrDefault(); PillType = pillType.GetValueOrDefault(); BottleAmount = bottleAmount.GetValueOrDefault(); if (label == null) { Label = "null"; } else { Label = label; } } } } [Serializable, NetSerializable] public enum ChemMasterUiKey { Key } /// /// Used in to specify which button was pressed. /// public enum UiAction { Eject, Transfer, Discard, ChemButton, CreatePills, CreateBottles, SetPillType } } }