reagentgrinder ecs & xamlui (#4347)
* started converting grinder to ecs * finished reagentcontainer ecs refactored bui converted ui to xaml * adds handling * fixes handling * oopsie Co-authored-by: Paul <ritter.paul1+git@googlemail.com>
This commit is contained in:
15
Content.Client/Kitchen/UI/GrinderMenu.xaml
Normal file
15
Content.Client/Kitchen/UI/GrinderMenu.xaml
Normal file
@@ -0,0 +1,15 @@
|
||||
<SS14Window xmlns="https://spacestation14.io"
|
||||
xmlns:ui="clr-namespace:Content.Client.Kitchen.UI"
|
||||
Title="{Loc grinder-menu-title}" MinSize="512 256" SetSize="512 256">
|
||||
<BoxContainer Orientation="Horizontal">
|
||||
<BoxContainer Orientation="Vertical" VerticalAlignment="Center">
|
||||
<Button Name="GrindButton" Text="{Loc grinder-menu-grind-button}" TextAlign="Center" MinSize="64 64"/>
|
||||
<Control MinSize="0 16"/>
|
||||
<Button Name="JuiceButton" Text="{Loc grinder-menu-juice-button}" TextAlign="Center" MinSize="64 64"/>
|
||||
</BoxContainer>
|
||||
<Control MinSize="16 0"/>
|
||||
<ui:LabelledContentBox Name="ChamberContentBox" LabelText="{Loc grinder-menu-chamber-content-box-label}" ButtonText="{Loc grinder-menu-chamber-content-box-button}" VerticalExpand="True" HorizontalExpand="True" SizeFlagsStretchRatio="2"/>
|
||||
<Control MinSize="8 0"/>
|
||||
<ui:LabelledContentBox Name="BeakerContentBox" LabelText="{Loc grinder-menu-beaker-content-box-label}" ButtonText="{Loc grinder-menu-beaker-content-box-button}" VerticalExpand="True" HorizontalExpand="True" SizeFlagsStretchRatio="2"/>
|
||||
</BoxContainer>
|
||||
</SS14Window>
|
||||
131
Content.Client/Kitchen/UI/GrinderMenu.xaml.cs
Normal file
131
Content.Client/Kitchen/UI/GrinderMenu.xaml.cs
Normal file
@@ -0,0 +1,131 @@
|
||||
using System.Collections.Generic;
|
||||
using Content.Shared.Chemistry.Reagent;
|
||||
using Content.Shared.Chemistry.Solution;
|
||||
using Content.Shared.Kitchen.Components;
|
||||
using Robust.Client.AutoGenerated;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.UserInterface.Controls;
|
||||
using Robust.Client.UserInterface.CustomControls;
|
||||
using Robust.Client.UserInterface.XAML;
|
||||
using Robust.Shared.GameObjects;
|
||||
using Robust.Shared.Localization;
|
||||
using Robust.Shared.Maths;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Client.Kitchen.UI
|
||||
{
|
||||
[GenerateTypedNameReferences]
|
||||
public partial class GrinderMenu : SS14Window
|
||||
{
|
||||
private readonly IEntityManager _entityManager;
|
||||
private readonly IPrototypeManager _prototypeManager ;
|
||||
private readonly ReagentGrinderBoundUserInterface _owner;
|
||||
|
||||
private readonly Dictionary<int, EntityUid> _chamberVisualContents = new();
|
||||
|
||||
public GrinderMenu(ReagentGrinderBoundUserInterface owner, IEntityManager entityManager, IPrototypeManager prototypeManager)
|
||||
{
|
||||
RobustXamlLoader.Load(this);
|
||||
_entityManager = entityManager;
|
||||
_prototypeManager = prototypeManager;
|
||||
_owner = owner;
|
||||
GrindButton.OnPressed += owner.StartGrinding;
|
||||
JuiceButton.OnPressed += owner.StartJuicing;
|
||||
ChamberContentBox.EjectButton.OnPressed += owner.EjectAll;
|
||||
BeakerContentBox.EjectButton.OnPressed += owner.EjectBeaker;
|
||||
ChamberContentBox.BoxContents.OnItemSelected += OnChamberBoxContentsItemSelected;
|
||||
BeakerContentBox.BoxContents.SelectMode = ItemList.ItemListSelectMode.None;
|
||||
}
|
||||
|
||||
private void OnChamberBoxContentsItemSelected(ItemList.ItemListSelectedEventArgs args)
|
||||
{
|
||||
_owner.EjectChamberContent(_chamberVisualContents[args.ItemIndex]);
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
|
||||
_chamberVisualContents.Clear();
|
||||
GrindButton.OnPressed -= _owner.StartGrinding;
|
||||
JuiceButton.OnPressed -= _owner.StartJuicing;
|
||||
ChamberContentBox.EjectButton.OnPressed -= _owner.EjectAll;
|
||||
BeakerContentBox.EjectButton.OnPressed -= _owner.EjectBeaker;
|
||||
ChamberContentBox.BoxContents.OnItemSelected -= OnChamberBoxContentsItemSelected;
|
||||
}
|
||||
|
||||
public void UpdateState(ReagentGrinderInterfaceState state)
|
||||
{
|
||||
BeakerContentBox.EjectButton.Disabled = !state.HasBeakerIn;
|
||||
ChamberContentBox.EjectButton.Disabled = state.ChamberContents.Length <= 0;
|
||||
GrindButton.Disabled = !state.CanGrind || !state.Powered;
|
||||
JuiceButton.Disabled = !state.CanJuice || !state.Powered;
|
||||
RefreshContentsDisplay(state.ReagentQuantities, state.ChamberContents, state.HasBeakerIn);
|
||||
}
|
||||
|
||||
public void HandleMessage(BoundUserInterfaceMessage message)
|
||||
{
|
||||
switch (message)
|
||||
{
|
||||
case SharedReagentGrinderComponent.ReagentGrinderWorkStartedMessage workStarted:
|
||||
GrindButton.Disabled = true;
|
||||
GrindButton.Modulate = workStarted.GrinderProgram == SharedReagentGrinderComponent.GrinderProgram.Grind ? Color.Green : Color.White;
|
||||
JuiceButton.Disabled = true;
|
||||
JuiceButton.Modulate = workStarted.GrinderProgram == SharedReagentGrinderComponent.GrinderProgram.Juice ? Color.Green : Color.White;
|
||||
BeakerContentBox.EjectButton.Disabled = true;
|
||||
ChamberContentBox.EjectButton.Disabled = true;
|
||||
break;
|
||||
case SharedReagentGrinderComponent.ReagentGrinderWorkCompleteMessage doneMessage:
|
||||
GrindButton.Disabled = false;
|
||||
JuiceButton.Disabled = false;
|
||||
GrindButton.Modulate = Color.White;
|
||||
JuiceButton.Modulate = Color.White;
|
||||
BeakerContentBox.EjectButton.Disabled = false;
|
||||
ChamberContentBox.EjectButton.Disabled = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void RefreshContentsDisplay(IList<Solution.ReagentQuantity>? reagents, IReadOnlyList<EntityUid> containedSolids, bool isBeakerAttached)
|
||||
{
|
||||
//Refresh chamber contents
|
||||
_chamberVisualContents.Clear();
|
||||
|
||||
ChamberContentBox.BoxContents.Clear();
|
||||
foreach (var uid in containedSolids)
|
||||
{
|
||||
if (!_entityManager.TryGetEntity(uid, out var entity))
|
||||
{
|
||||
return;
|
||||
}
|
||||
var texture = entity.GetComponent<SpriteComponent>().Icon?.Default;
|
||||
|
||||
var solidItem = ChamberContentBox.BoxContents.AddItem(entity.Name, texture);
|
||||
var solidIndex = ChamberContentBox.BoxContents.IndexOf(solidItem);
|
||||
_chamberVisualContents.Add(solidIndex, uid);
|
||||
}
|
||||
|
||||
//Refresh beaker contents
|
||||
BeakerContentBox.BoxContents.Clear();
|
||||
//if no beaker is attached use this guard to prevent hitting a null reference.
|
||||
if (!isBeakerAttached || reagents == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//Looks like we have a beaker attached.
|
||||
if (reagents.Count <= 0)
|
||||
{
|
||||
BeakerContentBox.BoxContents.AddItem(Loc.GetString("grinder-menu-beaker-content-box-is-empty"));
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (var reagent in reagents)
|
||||
{
|
||||
var reagentName = _prototypeManager.TryIndex(reagent.ReagentId, out ReagentPrototype? proto) ? Loc.GetString($"{reagent.Quantity} {proto.Name}") : "???";
|
||||
BeakerContentBox.BoxContents.AddItem(reagentName);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
7
Content.Client/Kitchen/UI/LabelledContentBox.xaml
Normal file
7
Content.Client/Kitchen/UI/LabelledContentBox.xaml
Normal file
@@ -0,0 +1,7 @@
|
||||
<customControls:BoxContainer Orientation="Vertical" xmlns:customControls="https://spacestation14.io">
|
||||
<customControls:SplitContainer Orientation="Horizontal">
|
||||
<customControls:Label Name="Label" Align="Center"/>
|
||||
<customControls:Button Name="Button" TextAlign="Center"/>
|
||||
</customControls:SplitContainer>
|
||||
<customControls:ItemList Name="ItemList" VerticalExpand="True" HorizontalExpand="True" SelectMode="Button" SizeFlagsStretchRatio="2" MinSize="100 128"/>
|
||||
</customControls:BoxContainer>
|
||||
15
Content.Client/Kitchen/UI/LabelledContentBox.xaml.cs
Normal file
15
Content.Client/Kitchen/UI/LabelledContentBox.xaml.cs
Normal file
@@ -0,0 +1,15 @@
|
||||
using Robust.Client.AutoGenerated;
|
||||
using Robust.Client.UserInterface.Controls;
|
||||
|
||||
namespace Content.Client.Kitchen.UI
|
||||
{
|
||||
[GenerateTypedNameReferences]
|
||||
public partial class LabelledContentBox : BoxContainer
|
||||
{
|
||||
public string? LabelText { get => Label.Text; set => Label.Text = value; }
|
||||
public string? ButtonText { get => Button.Text; set => Button.Text = value; }
|
||||
|
||||
public ItemList BoxContents => ItemList;
|
||||
public Button EjectButton => Button;
|
||||
}
|
||||
}
|
||||
@@ -1,17 +1,10 @@
|
||||
using System.Collections.Generic;
|
||||
using Content.Shared.Chemistry.Reagent;
|
||||
using Content.Shared.Kitchen.Components;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.UserInterface;
|
||||
using Robust.Client.UserInterface.Controls;
|
||||
using Robust.Client.UserInterface.CustomControls;
|
||||
using Robust.Shared.GameObjects;
|
||||
using Robust.Shared.IoC;
|
||||
using Robust.Shared.Localization;
|
||||
using Robust.Shared.Maths;
|
||||
using Robust.Shared.Prototypes;
|
||||
using static Content.Shared.Chemistry.Solution.Solution;
|
||||
using static Robust.Client.UserInterface.Controls.BoxContainer;
|
||||
|
||||
namespace Content.Client.Kitchen.UI
|
||||
{
|
||||
@@ -21,8 +14,6 @@ namespace Content.Client.Kitchen.UI
|
||||
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
||||
|
||||
private GrinderMenu? _menu;
|
||||
private readonly Dictionary<int, EntityUid> _chamberVisualContents = new();
|
||||
private readonly Dictionary<int, ReagentQuantity> _beakerVisualContents = new();
|
||||
|
||||
public ReagentGrinderBoundUserInterface(ClientUserInterfaceComponent owner, object uiKey) : base(owner, uiKey) { }
|
||||
|
||||
@@ -30,22 +21,9 @@ namespace Content.Client.Kitchen.UI
|
||||
{
|
||||
base.Open();
|
||||
|
||||
_menu = new GrinderMenu(this);
|
||||
_menu = new GrinderMenu(this, _entityManager, _prototypeManager);
|
||||
_menu.OpenCentered();
|
||||
_menu.OnClose += Close;
|
||||
_menu.GrindButton.OnPressed += args => SendMessage(new SharedReagentGrinderComponent.ReagentGrinderGrindStartMessage());
|
||||
_menu.JuiceButton.OnPressed += args => SendMessage(new SharedReagentGrinderComponent.ReagentGrinderJuiceStartMessage());
|
||||
_menu.ChamberContentBox.EjectButton.OnPressed += args => SendMessage(new SharedReagentGrinderComponent.ReagentGrinderEjectChamberAllMessage());
|
||||
_menu.BeakerContentBox.EjectButton.OnPressed += args => SendMessage(new SharedReagentGrinderComponent.ReagentGrinderEjectBeakerMessage());
|
||||
_menu.ChamberContentBox.BoxContents.OnItemSelected += args =>
|
||||
{
|
||||
SendMessage(new SharedReagentGrinderComponent.ReagentGrinderEjectChamberContentMessage(_chamberVisualContents[args.ItemIndex]));
|
||||
};
|
||||
|
||||
_menu.BeakerContentBox.BoxContents.OnItemSelected += args =>
|
||||
{
|
||||
SendMessage(new SharedReagentGrinderComponent.ReagentGrinderVaporizeReagentIndexedMessage(_beakerVisualContents[args.ItemIndex]));
|
||||
};
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
@@ -56,8 +34,6 @@ namespace Content.Client.Kitchen.UI
|
||||
return;
|
||||
}
|
||||
|
||||
_chamberVisualContents?.Clear();
|
||||
_beakerVisualContents?.Clear();
|
||||
_menu?.Dispose();
|
||||
}
|
||||
|
||||
@@ -69,243 +45,19 @@ namespace Content.Client.Kitchen.UI
|
||||
return;
|
||||
}
|
||||
|
||||
if (_menu == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_menu.BeakerContentBox.EjectButton.Disabled = !cState.HasBeakerIn;
|
||||
_menu.ChamberContentBox.EjectButton.Disabled = cState.ChamberContents.Length <= 0;
|
||||
_menu.GrindButton.Disabled = !cState.CanGrind || !cState.Powered;
|
||||
_menu.JuiceButton.Disabled = !cState.CanJuice || !cState.Powered;
|
||||
RefreshContentsDisplay(cState.ReagentQuantities, cState.ChamberContents, cState.HasBeakerIn);
|
||||
_menu?.UpdateState(cState);
|
||||
}
|
||||
|
||||
protected override void ReceiveMessage(BoundUserInterfaceMessage message)
|
||||
{
|
||||
base.ReceiveMessage(message);
|
||||
|
||||
if (_menu == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
switch (message)
|
||||
{
|
||||
case SharedReagentGrinderComponent.ReagentGrinderWorkStartedMessage workStarted:
|
||||
_menu.GrindButton.Disabled = true;
|
||||
_menu.GrindButton.Modulate = workStarted.GrinderProgram == SharedReagentGrinderComponent.GrinderProgram.Grind ? Color.Green : Color.White;
|
||||
_menu.JuiceButton.Disabled = true;
|
||||
_menu.JuiceButton.Modulate = workStarted.GrinderProgram == SharedReagentGrinderComponent.GrinderProgram.Juice ? Color.Green : Color.White;
|
||||
_menu.BeakerContentBox.EjectButton.Disabled = true;
|
||||
_menu.ChamberContentBox.EjectButton.Disabled = true;
|
||||
break;
|
||||
case SharedReagentGrinderComponent.ReagentGrinderWorkCompleteMessage doneMessage:
|
||||
_menu.GrindButton.Disabled = false;
|
||||
_menu.JuiceButton.Disabled = false;
|
||||
_menu.GrindButton.Modulate = Color.White;
|
||||
_menu.JuiceButton.Modulate = Color.White;
|
||||
_menu.BeakerContentBox.EjectButton.Disabled = false;
|
||||
_menu.ChamberContentBox.EjectButton.Disabled = false;
|
||||
break;
|
||||
}
|
||||
_menu?.HandleMessage(message);
|
||||
}
|
||||
|
||||
private void RefreshContentsDisplay(IList<ReagentQuantity>? reagents, IReadOnlyList<EntityUid> containedSolids, bool isBeakerAttached)
|
||||
{
|
||||
//Refresh chamber contents
|
||||
_chamberVisualContents.Clear();
|
||||
|
||||
if (_menu == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_menu.ChamberContentBox.BoxContents.Clear();
|
||||
foreach (var uid in containedSolids)
|
||||
{
|
||||
if (!_entityManager.TryGetEntity(uid, out var entity))
|
||||
{
|
||||
return;
|
||||
}
|
||||
var texture = entity.GetComponent<SpriteComponent>().Icon?.Default;
|
||||
|
||||
var solidItem = _menu.ChamberContentBox.BoxContents.AddItem(entity.Name, texture);
|
||||
var solidIndex = _menu.ChamberContentBox.BoxContents.IndexOf(solidItem);
|
||||
_chamberVisualContents.Add(solidIndex, uid);
|
||||
}
|
||||
|
||||
//Refresh beaker contents
|
||||
_beakerVisualContents.Clear();
|
||||
_menu.BeakerContentBox.BoxContents.Clear();
|
||||
//if no beaker is attached use this guard to prevent hitting a null reference.
|
||||
if (!isBeakerAttached || reagents == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//Looks like we have a beaker attached.
|
||||
if (reagents.Count <= 0)
|
||||
{
|
||||
_menu.BeakerContentBox.BoxContents.AddItem(Loc.GetString("grinder-menu-beaker-content-box-is-empty"));
|
||||
}
|
||||
else
|
||||
{
|
||||
for (var i = 0; i < reagents.Count; i++)
|
||||
{
|
||||
var goodIndex = _prototypeManager.TryIndex(reagents[i].ReagentId, out ReagentPrototype? proto);
|
||||
var reagentName = goodIndex ? Loc.GetString($"{reagents[i].Quantity} {proto!.Name}") : "???";
|
||||
var reagentAdded = _menu.BeakerContentBox.BoxContents.AddItem(reagentName);
|
||||
var reagentIndex = _menu.BeakerContentBox.BoxContents.IndexOf(reagentAdded);
|
||||
_beakerVisualContents.Add(reagentIndex, reagents[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class GrinderMenu : SS14Window
|
||||
{
|
||||
/*The contents of the chamber and beaker will both be vertical scroll rectangles.
|
||||
* Will have a vsplit to split the g/j buttons from the contents menu.
|
||||
* |--------------------------------\
|
||||
* | | Chamber [E] Beaker [E] |
|
||||
* | [G] | | | | | |
|
||||
* | | | | | | |
|
||||
* | | | | | | |
|
||||
* | [J] | |-----| |-----| |
|
||||
* | | |
|
||||
* \---------------------------------/
|
||||
*
|
||||
*/
|
||||
|
||||
private ReagentGrinderBoundUserInterface Owner { get; set; }
|
||||
|
||||
//We'll need 4 buttons, grind, juice, eject beaker, eject the chamber contents.
|
||||
//The other 2 are referenced in the Open function.
|
||||
public Button GrindButton { get; }
|
||||
public Button JuiceButton { get; }
|
||||
|
||||
public LabelledContentBox ChamberContentBox { get; }
|
||||
public LabelledContentBox BeakerContentBox { get; }
|
||||
|
||||
public sealed class LabelledContentBox : VBoxContainer
|
||||
{
|
||||
public string? LabelText { get; set; }
|
||||
|
||||
public ItemList BoxContents { get; set; }
|
||||
|
||||
public Button EjectButton { get; set; }
|
||||
|
||||
private Label _label;
|
||||
|
||||
public LabelledContentBox(string labelText, string buttonText)
|
||||
{
|
||||
_label = new Label
|
||||
{
|
||||
Text = labelText,
|
||||
Align = Label.AlignMode.Center,
|
||||
};
|
||||
|
||||
EjectButton = new Button
|
||||
{
|
||||
Text = buttonText,
|
||||
TextAlign = Label.AlignMode.Center,
|
||||
};
|
||||
|
||||
var vSplit = new HSplitContainer
|
||||
{
|
||||
Children =
|
||||
{
|
||||
_label,
|
||||
EjectButton
|
||||
}
|
||||
};
|
||||
|
||||
AddChild(vSplit);
|
||||
BoxContents = new ItemList
|
||||
{
|
||||
VerticalExpand = true,
|
||||
HorizontalExpand = true,
|
||||
SelectMode = ItemList.ItemListSelectMode.Button,
|
||||
SizeFlagsStretchRatio = 2,
|
||||
MinSize = (100, 128)
|
||||
};
|
||||
AddChild(BoxContents);
|
||||
}
|
||||
}
|
||||
|
||||
public GrinderMenu(ReagentGrinderBoundUserInterface owner)
|
||||
{
|
||||
SetSize = MinSize = (512, 256);
|
||||
Owner = owner;
|
||||
Title = Loc.GetString("grinder-menu-title");
|
||||
|
||||
var hSplit = new BoxContainer
|
||||
{
|
||||
Orientation = LayoutOrientation.Horizontal
|
||||
};
|
||||
|
||||
var vBoxGrindJuiceButtonPanel = new BoxContainer
|
||||
{
|
||||
Orientation = LayoutOrientation.Vertical,
|
||||
VerticalAlignment = VAlignment.Center
|
||||
};
|
||||
|
||||
GrindButton = new Button
|
||||
{
|
||||
Text = Loc.GetString("grinder-menu-grind-button"),
|
||||
TextAlign = Label.AlignMode.Center,
|
||||
MinSize = (64, 64)
|
||||
};
|
||||
|
||||
JuiceButton = new Button
|
||||
{
|
||||
Text = Loc.GetString("grinder-menu-juice-button"),
|
||||
TextAlign = Label.AlignMode.Center,
|
||||
MinSize = (64, 64)
|
||||
};
|
||||
|
||||
vBoxGrindJuiceButtonPanel.AddChild(GrindButton);
|
||||
//inner button padding
|
||||
vBoxGrindJuiceButtonPanel.AddChild(new Control
|
||||
{
|
||||
MinSize = (0, 16),
|
||||
});
|
||||
vBoxGrindJuiceButtonPanel.AddChild(JuiceButton);
|
||||
|
||||
ChamberContentBox = new LabelledContentBox(Loc.GetString("grinder-menu-chamber-content-box-label"), Loc.GetString("grinder-menu-chamber-content-box-button"))
|
||||
{
|
||||
//Modulate = Color.Red,
|
||||
VerticalExpand = true,
|
||||
HorizontalExpand = true,
|
||||
SizeFlagsStretchRatio = 2,
|
||||
|
||||
};
|
||||
|
||||
BeakerContentBox = new LabelledContentBox(Loc.GetString("grinder-menu-beaker-content-box-label"), Loc.GetString("grinder-menu-beaker-content-box-button"))
|
||||
{
|
||||
//Modulate = Color.Blue,
|
||||
VerticalExpand = true,
|
||||
HorizontalExpand = true,
|
||||
SizeFlagsStretchRatio = 2,
|
||||
};
|
||||
|
||||
hSplit.AddChild(vBoxGrindJuiceButtonPanel);
|
||||
|
||||
//Padding between the g/j buttons panel and the itemlist boxes panel.
|
||||
hSplit.AddChild(new Control
|
||||
{
|
||||
MinSize = (16, 0),
|
||||
});
|
||||
hSplit.AddChild(ChamberContentBox);
|
||||
|
||||
//Padding between the two itemlists.
|
||||
hSplit.AddChild(new Control
|
||||
{
|
||||
MinSize = (8, 0),
|
||||
});
|
||||
hSplit.AddChild(BeakerContentBox);
|
||||
Contents.AddChild(hSplit);
|
||||
}
|
||||
}
|
||||
public void StartGrinding(BaseButton.ButtonEventArgs? args = null) => SendMessage(new SharedReagentGrinderComponent.ReagentGrinderGrindStartMessage());
|
||||
public void StartJuicing(BaseButton.ButtonEventArgs? args = null) => SendMessage(new SharedReagentGrinderComponent.ReagentGrinderJuiceStartMessage());
|
||||
public void EjectAll(BaseButton.ButtonEventArgs? args = null) => SendMessage(new SharedReagentGrinderComponent.ReagentGrinderEjectChamberAllMessage());
|
||||
public void EjectBeaker(BaseButton.ButtonEventArgs? args = null) => SendMessage(new SharedReagentGrinderComponent.ReagentGrinderEjectBeakerMessage());
|
||||
public void EjectChamberContent(EntityUid uid) => SendMessage(new SharedReagentGrinderComponent.ReagentGrinderEjectChamberContentMessage(uid));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user