Add auto modes to reagent grinder (#26290)
* Add auto-mode to reagent grinder * Remove redundant stuff with DataField * Use margin instead of dummy control * Resolve grinder component
This commit is contained in:
@@ -3,10 +3,12 @@
|
|||||||
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
|
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
|
||||||
Title="{Loc grinder-menu-title}" MinSize="768 256">
|
Title="{Loc grinder-menu-title}" MinSize="768 256">
|
||||||
<BoxContainer Orientation="Horizontal">
|
<BoxContainer Orientation="Horizontal">
|
||||||
<BoxContainer Orientation="Vertical" VerticalAlignment="Top" Margin="8">
|
<BoxContainer Orientation="Vertical" VerticalAlignment="Top" Margin="8" MinWidth="100">
|
||||||
<Button Name="GrindButton" Text="{Loc grinder-menu-grind-button}" TextAlign="Center" MinSize="64 48"/>
|
<Label Text="{Loc grinder-menu-auto-label}" HorizontalAlignment="Center"/>
|
||||||
<Control MinSize="0 16"/>
|
<Button Name="AutoModeButton" Text="{Loc grinder-menu-auto-button}" TextAlign="Center" MinSize="64 48" Margin="0 0 0 16" />
|
||||||
<Button Name="JuiceButton" Text="{Loc grinder-menu-juice-button}" TextAlign="Center" MinSize="64 48"/>
|
<Label Text="{Loc grinder-menu-manual-label}" HorizontalAlignment="Center"/>
|
||||||
|
<Button Name="GrindButton" Text="{Loc grinder-menu-grind-button}" TextAlign="Center" MinSize="64 48" Margin="0 0 0 16" />
|
||||||
|
<Button Name="JuiceButton" Text="{Loc grinder-menu-juice-button}" TextAlign="Center" MinSize="64 48" />
|
||||||
</BoxContainer>
|
</BoxContainer>
|
||||||
|
|
||||||
<ui:LabelledContentBox Name="ChamberContentBox" LabelText="{Loc grinder-menu-chamber-content-box-label}" ButtonText="{Loc grinder-menu-chamber-content-box-button}" VerticalExpand="True" HorizontalExpand="True" Margin="8" SizeFlagsStretchRatio="2"/>
|
<ui:LabelledContentBox Name="ChamberContentBox" LabelText="{Loc grinder-menu-chamber-content-box-label}" ButtonText="{Loc grinder-menu-chamber-content-box-button}" VerticalExpand="True" HorizontalExpand="True" Margin="8" SizeFlagsStretchRatio="2"/>
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ namespace Content.Client.Kitchen.UI
|
|||||||
_entityManager = entityManager;
|
_entityManager = entityManager;
|
||||||
_prototypeManager = prototypeManager;
|
_prototypeManager = prototypeManager;
|
||||||
_owner = owner;
|
_owner = owner;
|
||||||
|
AutoModeButton.OnPressed += owner.ToggleAutoMode;
|
||||||
GrindButton.OnPressed += owner.StartGrinding;
|
GrindButton.OnPressed += owner.StartGrinding;
|
||||||
JuiceButton.OnPressed += owner.StartJuicing;
|
JuiceButton.OnPressed += owner.StartJuicing;
|
||||||
ChamberContentBox.EjectButton.OnPressed += owner.EjectAll;
|
ChamberContentBox.EjectButton.OnPressed += owner.EjectAll;
|
||||||
@@ -56,6 +57,19 @@ namespace Content.Client.Kitchen.UI
|
|||||||
GrindButton.Disabled = !state.CanGrind || !state.Powered;
|
GrindButton.Disabled = !state.CanGrind || !state.Powered;
|
||||||
JuiceButton.Disabled = !state.CanJuice || !state.Powered;
|
JuiceButton.Disabled = !state.CanJuice || !state.Powered;
|
||||||
|
|
||||||
|
switch (state.AutoMode)
|
||||||
|
{
|
||||||
|
case GrinderAutoMode.Grind:
|
||||||
|
AutoModeButton.Text = Loc.GetString("grinder-menu-grind-button");
|
||||||
|
break;
|
||||||
|
case GrinderAutoMode.Juice:
|
||||||
|
AutoModeButton.Text = Loc.GetString("grinder-menu-juice-button");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
AutoModeButton.Text = Loc.GetString("grinder-menu-auto-button-off");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
// TODO move this to a component state and ensure the net ids.
|
// TODO move this to a component state and ensure the net ids.
|
||||||
RefreshContentsDisplay(state.ReagentQuantities, _entityManager.GetEntityArray(state.ChamberContents), state.HasBeakerIn);
|
RefreshContentsDisplay(state.ReagentQuantities, _entityManager.GetEntityArray(state.ChamberContents), state.HasBeakerIn);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,6 +52,11 @@ namespace Content.Client.Kitchen.UI
|
|||||||
_menu?.HandleMessage(message);
|
_menu?.HandleMessage(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void ToggleAutoMode(BaseButton.ButtonEventArgs args)
|
||||||
|
{
|
||||||
|
SendMessage(new ReagentGrinderToggleAutoModeMessage());
|
||||||
|
}
|
||||||
|
|
||||||
public void StartGrinding(BaseButton.ButtonEventArgs? _ = null)
|
public void StartGrinding(BaseButton.ButtonEventArgs? _ = null)
|
||||||
{
|
{
|
||||||
SendMessage(new ReagentGrinderStartMessage(GrinderProgram.Grind));
|
SendMessage(new ReagentGrinderStartMessage(GrinderProgram.Grind));
|
||||||
|
|||||||
@@ -13,24 +13,27 @@ namespace Content.Server.Kitchen.Components
|
|||||||
[Access(typeof(ReagentGrinderSystem)), RegisterComponent]
|
[Access(typeof(ReagentGrinderSystem)), RegisterComponent]
|
||||||
public sealed partial class ReagentGrinderComponent : Component
|
public sealed partial class ReagentGrinderComponent : Component
|
||||||
{
|
{
|
||||||
[DataField, ViewVariables(VVAccess.ReadWrite)]
|
[DataField]
|
||||||
public int StorageMaxEntities = 6;
|
public int StorageMaxEntities = 6;
|
||||||
|
|
||||||
[DataField("workTime"), ViewVariables(VVAccess.ReadWrite)]
|
[DataField]
|
||||||
public TimeSpan WorkTime = TimeSpan.FromSeconds(3.5); // Roughly matches the grind/juice sounds.
|
public TimeSpan WorkTime = TimeSpan.FromSeconds(3.5); // Roughly matches the grind/juice sounds.
|
||||||
|
|
||||||
[DataField, ViewVariables(VVAccess.ReadWrite)]
|
[DataField]
|
||||||
public float WorkTimeMultiplier = 1;
|
public float WorkTimeMultiplier = 1;
|
||||||
|
|
||||||
[DataField("clickSound"), ViewVariables(VVAccess.ReadWrite)]
|
[DataField]
|
||||||
public SoundSpecifier ClickSound { get; set; } = new SoundPathSpecifier("/Audio/Machines/machine_switch.ogg");
|
public SoundSpecifier ClickSound { get; set; } = new SoundPathSpecifier("/Audio/Machines/machine_switch.ogg");
|
||||||
|
|
||||||
[DataField("grindSound"), ViewVariables(VVAccess.ReadWrite)]
|
[DataField]
|
||||||
public SoundSpecifier GrindSound { get; set; } = new SoundPathSpecifier("/Audio/Machines/blender.ogg");
|
public SoundSpecifier GrindSound { get; set; } = new SoundPathSpecifier("/Audio/Machines/blender.ogg");
|
||||||
|
|
||||||
[DataField("juiceSound"), ViewVariables(VVAccess.ReadWrite)]
|
[DataField]
|
||||||
public SoundSpecifier JuiceSound { get; set; } = new SoundPathSpecifier("/Audio/Machines/juicer.ogg");
|
public SoundSpecifier JuiceSound { get; set; } = new SoundPathSpecifier("/Audio/Machines/juicer.ogg");
|
||||||
|
|
||||||
|
[DataField]
|
||||||
|
public GrinderAutoMode AutoMode = GrinderAutoMode.Off;
|
||||||
|
|
||||||
public EntityUid? AudioStream;
|
public EntityUid? AudioStream;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -53,11 +53,19 @@ namespace Content.Server.Kitchen.EntitySystems
|
|||||||
SubscribeLocalEvent<ReagentGrinderComponent, EntRemovedFromContainerMessage>(OnContainerModified);
|
SubscribeLocalEvent<ReagentGrinderComponent, EntRemovedFromContainerMessage>(OnContainerModified);
|
||||||
SubscribeLocalEvent<ReagentGrinderComponent, ContainerIsRemovingAttemptEvent>(OnEntRemoveAttempt);
|
SubscribeLocalEvent<ReagentGrinderComponent, ContainerIsRemovingAttemptEvent>(OnEntRemoveAttempt);
|
||||||
|
|
||||||
|
SubscribeLocalEvent<ReagentGrinderComponent, ReagentGrinderToggleAutoModeMessage>(OnToggleAutoModeMessage);
|
||||||
SubscribeLocalEvent<ReagentGrinderComponent, ReagentGrinderStartMessage>(OnStartMessage);
|
SubscribeLocalEvent<ReagentGrinderComponent, ReagentGrinderStartMessage>(OnStartMessage);
|
||||||
SubscribeLocalEvent<ReagentGrinderComponent, ReagentGrinderEjectChamberAllMessage>(OnEjectChamberAllMessage);
|
SubscribeLocalEvent<ReagentGrinderComponent, ReagentGrinderEjectChamberAllMessage>(OnEjectChamberAllMessage);
|
||||||
SubscribeLocalEvent<ReagentGrinderComponent, ReagentGrinderEjectChamberContentMessage>(OnEjectChamberContentMessage);
|
SubscribeLocalEvent<ReagentGrinderComponent, ReagentGrinderEjectChamberContentMessage>(OnEjectChamberContentMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnToggleAutoModeMessage(Entity<ReagentGrinderComponent> entity, ref ReagentGrinderToggleAutoModeMessage message)
|
||||||
|
{
|
||||||
|
entity.Comp.AutoMode = (GrinderAutoMode) (((byte) entity.Comp.AutoMode + 1) % Enum.GetValues(typeof(GrinderAutoMode)).Length);
|
||||||
|
|
||||||
|
UpdateUiState(entity);
|
||||||
|
}
|
||||||
|
|
||||||
public override void Update(float frameTime)
|
public override void Update(float frameTime)
|
||||||
{
|
{
|
||||||
base.Update(frameTime);
|
base.Update(frameTime);
|
||||||
@@ -148,6 +156,12 @@ namespace Content.Server.Kitchen.EntitySystems
|
|||||||
|
|
||||||
var outputContainer = _itemSlotsSystem.GetItemOrNull(uid, SharedReagentGrinder.BeakerSlotId);
|
var outputContainer = _itemSlotsSystem.GetItemOrNull(uid, SharedReagentGrinder.BeakerSlotId);
|
||||||
_appearanceSystem.SetData(uid, ReagentGrinderVisualState.BeakerAttached, outputContainer.HasValue);
|
_appearanceSystem.SetData(uid, ReagentGrinderVisualState.BeakerAttached, outputContainer.HasValue);
|
||||||
|
|
||||||
|
if (reagentGrinder.AutoMode != GrinderAutoMode.Off && !HasComp<ActiveReagentGrinderComponent>(uid))
|
||||||
|
{
|
||||||
|
var program = reagentGrinder.AutoMode == GrinderAutoMode.Grind ? GrinderProgram.Grind : GrinderProgram.Juice;
|
||||||
|
DoWork(uid, reagentGrinder, program);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnInteractUsing(Entity<ReagentGrinderComponent> entity, ref InteractUsingEvent args)
|
private void OnInteractUsing(Entity<ReagentGrinderComponent> entity, ref InteractUsingEvent args)
|
||||||
@@ -185,6 +199,10 @@ namespace Content.Server.Kitchen.EntitySystems
|
|||||||
|
|
||||||
private void UpdateUiState(EntityUid uid)
|
private void UpdateUiState(EntityUid uid)
|
||||||
{
|
{
|
||||||
|
ReagentGrinderComponent? grinderComp = null;
|
||||||
|
if (!Resolve(uid, ref grinderComp))
|
||||||
|
return;
|
||||||
|
|
||||||
var inputContainer = _containerSystem.EnsureContainer<Container>(uid, SharedReagentGrinder.InputContainerId);
|
var inputContainer = _containerSystem.EnsureContainer<Container>(uid, SharedReagentGrinder.InputContainerId);
|
||||||
var outputContainer = _itemSlotsSystem.GetItemOrNull(uid, SharedReagentGrinder.BeakerSlotId);
|
var outputContainer = _itemSlotsSystem.GetItemOrNull(uid, SharedReagentGrinder.BeakerSlotId);
|
||||||
Solution? containerSolution = null;
|
Solution? containerSolution = null;
|
||||||
@@ -206,6 +224,7 @@ namespace Content.Server.Kitchen.EntitySystems
|
|||||||
this.IsPowered(uid, EntityManager),
|
this.IsPowered(uid, EntityManager),
|
||||||
canJuice,
|
canJuice,
|
||||||
canGrind,
|
canGrind,
|
||||||
|
grinderComp.AutoMode,
|
||||||
GetNetEntityArray(inputContainer.ContainedEntities.ToArray()),
|
GetNetEntityArray(inputContainer.ContainedEntities.ToArray()),
|
||||||
containerSolution?.Contents.ToArray()
|
containerSolution?.Contents.ToArray()
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -10,6 +10,12 @@ namespace Content.Shared.Kitchen
|
|||||||
public static string InputContainerId = "inputContainer";
|
public static string InputContainerId = "inputContainer";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Serializable, NetSerializable]
|
||||||
|
public sealed class ReagentGrinderToggleAutoModeMessage : BoundUserInterfaceMessage
|
||||||
|
{
|
||||||
|
public ReagentGrinderToggleAutoModeMessage() { }
|
||||||
|
}
|
||||||
|
|
||||||
[Serializable, NetSerializable]
|
[Serializable, NetSerializable]
|
||||||
public sealed class ReagentGrinderStartMessage : BoundUserInterfaceMessage
|
public sealed class ReagentGrinderStartMessage : BoundUserInterfaceMessage
|
||||||
{
|
{
|
||||||
@@ -75,6 +81,13 @@ namespace Content.Shared.Kitchen
|
|||||||
Key
|
Key
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum GrinderAutoMode : byte
|
||||||
|
{
|
||||||
|
Off,
|
||||||
|
Grind,
|
||||||
|
Juice
|
||||||
|
}
|
||||||
|
|
||||||
[NetSerializable, Serializable]
|
[NetSerializable, Serializable]
|
||||||
public sealed class ReagentGrinderInterfaceState : BoundUserInterfaceState
|
public sealed class ReagentGrinderInterfaceState : BoundUserInterfaceState
|
||||||
{
|
{
|
||||||
@@ -85,13 +98,16 @@ namespace Content.Shared.Kitchen
|
|||||||
public bool CanGrind;
|
public bool CanGrind;
|
||||||
public NetEntity[] ChamberContents;
|
public NetEntity[] ChamberContents;
|
||||||
public ReagentQuantity[]? ReagentQuantities;
|
public ReagentQuantity[]? ReagentQuantities;
|
||||||
public ReagentGrinderInterfaceState(bool isBusy, bool hasBeaker, bool powered, bool canJuice, bool canGrind, NetEntity[] chamberContents, ReagentQuantity[]? heldBeakerContents)
|
public GrinderAutoMode AutoMode;
|
||||||
|
|
||||||
|
public ReagentGrinderInterfaceState(bool isBusy, bool hasBeaker, bool powered, bool canJuice, bool canGrind, GrinderAutoMode autoMode, NetEntity[] chamberContents, ReagentQuantity[]? heldBeakerContents)
|
||||||
{
|
{
|
||||||
IsBusy = isBusy;
|
IsBusy = isBusy;
|
||||||
HasBeakerIn = hasBeaker;
|
HasBeakerIn = hasBeaker;
|
||||||
Powered = powered;
|
Powered = powered;
|
||||||
CanJuice = canJuice;
|
CanJuice = canJuice;
|
||||||
CanGrind = canGrind;
|
CanGrind = canGrind;
|
||||||
|
AutoMode = autoMode;
|
||||||
ChamberContents = chamberContents;
|
ChamberContents = chamberContents;
|
||||||
ReagentQuantities = heldBeakerContents;
|
ReagentQuantities = heldBeakerContents;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,9 @@ reagent-grinder-component-cannot-put-entity-message = You can't put this in the
|
|||||||
grinder-menu-title = All-In-One Grinder 3000
|
grinder-menu-title = All-In-One Grinder 3000
|
||||||
grinder-menu-grind-button = Grind
|
grinder-menu-grind-button = Grind
|
||||||
grinder-menu-juice-button = Juice
|
grinder-menu-juice-button = Juice
|
||||||
|
grinder-menu-auto-label = Auto mode
|
||||||
|
grinder-menu-auto-button-off = Off
|
||||||
|
grinder-menu-manual-label = Manual mode
|
||||||
grinder-menu-chamber-content-box-label = Chamber
|
grinder-menu-chamber-content-box-label = Chamber
|
||||||
grinder-menu-chamber-content-box-button = Eject Contents
|
grinder-menu-chamber-content-box-button = Eject Contents
|
||||||
grinder-menu-beaker-content-box-label = Beaker
|
grinder-menu-beaker-content-box-label = Beaker
|
||||||
|
|||||||
Reference in New Issue
Block a user