Files
tbd-station-14/Content.Shared/Chemistry/SharedReagentDispenser.cs
pathetic meowmeow 5a0e0524ca Make reagent dispensers gridinv-based instead of pseudo-listinv (#34205)
This simplifies the code and makes the experience of examining contents
easier without the reagent dispenser UI, as well as adding the possibility
for dispensers to have items of heterogeneous sizes in them, which would
allow configuring reagent dispensers to accept smaller containers such
as beakers or vials in order to allow for more types of smaller quantities
of reagents, or other flexibilities brought by using a standard storage
component.
2025-05-09 23:49:05 -04:00

149 lines
5.1 KiB
C#

using Content.Shared.Chemistry.Reagent;
using Content.Shared.FixedPoint;
using Content.Shared.Storage;
using Robust.Shared.Serialization;
namespace Content.Shared.Chemistry
{
/// <summary>
/// This class holds constants that are shared between client and server.
/// </summary>
public sealed class SharedReagentDispenser
{
public const string OutputSlotName = "beakerSlot";
}
[Serializable, NetSerializable]
public sealed class ReagentDispenserSetDispenseAmountMessage : BoundUserInterfaceMessage
{
public readonly ReagentDispenserDispenseAmount ReagentDispenserDispenseAmount;
public ReagentDispenserSetDispenseAmountMessage(ReagentDispenserDispenseAmount amount)
{
ReagentDispenserDispenseAmount = amount;
}
/// <summary>
/// Create a new instance from interpreting a String as an integer,
/// throwing an exception if it is unable to parse.
/// </summary>
public ReagentDispenserSetDispenseAmountMessage(String s)
{
switch (s)
{
case "1":
ReagentDispenserDispenseAmount = ReagentDispenserDispenseAmount.U1;
break;
case "5":
ReagentDispenserDispenseAmount = ReagentDispenserDispenseAmount.U5;
break;
case "10":
ReagentDispenserDispenseAmount = ReagentDispenserDispenseAmount.U10;
break;
case "15":
ReagentDispenserDispenseAmount = ReagentDispenserDispenseAmount.U15;
break;
case "20":
ReagentDispenserDispenseAmount = ReagentDispenserDispenseAmount.U20;
break;
case "25":
ReagentDispenserDispenseAmount = ReagentDispenserDispenseAmount.U25;
break;
case "30":
ReagentDispenserDispenseAmount = ReagentDispenserDispenseAmount.U30;
break;
case "50":
ReagentDispenserDispenseAmount = ReagentDispenserDispenseAmount.U50;
break;
case "100":
ReagentDispenserDispenseAmount = ReagentDispenserDispenseAmount.U100;
break;
default:
throw new Exception($"Cannot convert the string `{s}` into a valid ReagentDispenser DispenseAmount");
}
}
}
[Serializable, NetSerializable]
public sealed class ReagentDispenserDispenseReagentMessage : BoundUserInterfaceMessage
{
public readonly ItemStorageLocation StorageLocation;
public ReagentDispenserDispenseReagentMessage(ItemStorageLocation storageLocation)
{
StorageLocation = storageLocation;
}
}
/// <summary>
/// Message sent by the user interface to ask the reagent dispenser to eject a container
/// </summary>
[Serializable, NetSerializable]
public sealed class ReagentDispenserEjectContainerMessage : BoundUserInterfaceMessage
{
public readonly ItemStorageLocation StorageLocation;
public ReagentDispenserEjectContainerMessage(ItemStorageLocation storageLocation)
{
StorageLocation = storageLocation;
}
}
[Serializable, NetSerializable]
public sealed class ReagentDispenserClearContainerSolutionMessage : BoundUserInterfaceMessage
{
}
public enum ReagentDispenserDispenseAmount
{
U1 = 1,
U5 = 5,
U10 = 10,
U15 = 15,
U20 = 20,
U25 = 25,
U30 = 30,
U50 = 50,
U100 = 100,
}
[Serializable, NetSerializable]
public sealed class ReagentInventoryItem(ItemStorageLocation storageLocation, string reagentLabel, FixedPoint2 quantity, Color reagentColor)
{
public ItemStorageLocation StorageLocation = storageLocation;
public string ReagentLabel = reagentLabel;
public FixedPoint2 Quantity = quantity;
public Color ReagentColor = reagentColor;
}
[Serializable, NetSerializable]
public sealed class ReagentDispenserBoundUserInterfaceState : BoundUserInterfaceState
{
public readonly ContainerInfo? OutputContainer;
public readonly NetEntity? OutputContainerEntity;
/// <summary>
/// A list of the reagents which this dispenser can dispense.
/// </summary>
public readonly List<ReagentInventoryItem> Inventory;
public readonly ReagentDispenserDispenseAmount SelectedDispenseAmount;
public ReagentDispenserBoundUserInterfaceState(ContainerInfo? outputContainer, NetEntity? outputContainerEntity, List<ReagentInventoryItem> inventory, ReagentDispenserDispenseAmount selectedDispenseAmount)
{
OutputContainer = outputContainer;
OutputContainerEntity = outputContainerEntity;
Inventory = inventory;
SelectedDispenseAmount = selectedDispenseAmount;
}
}
[Serializable, NetSerializable]
public enum ReagentDispenserUiKey
{
Key
}
}