]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Add auto modes to reagent grinder (#26290)
authorCrotalus <Crotalus@users.noreply.github.com>
Fri, 29 Mar 2024 06:30:50 +0000 (07:30 +0100)
committerGitHub <noreply@github.com>
Fri, 29 Mar 2024 06:30:50 +0000 (17:30 +1100)
* Add auto-mode to reagent grinder

* Remove redundant stuff with DataField

* Use margin instead of dummy control

* Resolve grinder component

Content.Client/Kitchen/UI/GrinderMenu.xaml
Content.Client/Kitchen/UI/GrinderMenu.xaml.cs
Content.Client/Kitchen/UI/ReagentGrinderBoundUserInterface.cs
Content.Server/Kitchen/Components/ReagentGrinderComponent.cs
Content.Server/Kitchen/EntitySystems/ReagentGrinderSystem.cs
Content.Shared/Kitchen/SharedReagentGrinder.cs
Resources/Locale/en-US/kitchen/components/reagent-grinder-component.ftl

index b83128d004a13d4309eca395482c80add8dac177..dacddd0df687504dce136f04e0eb48c0b7019107 100644 (file)
@@ -3,10 +3,12 @@
             xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
             Title="{Loc grinder-menu-title}" MinSize="768 256">
     <BoxContainer Orientation="Horizontal">
-        <BoxContainer Orientation="Vertical" VerticalAlignment="Top" Margin="8">
-            <Button Name="GrindButton" Text="{Loc grinder-menu-grind-button}" TextAlign="Center" MinSize="64 48"/>
-            <Control MinSize="0 16"/>
-            <Button Name="JuiceButton" Text="{Loc grinder-menu-juice-button}" TextAlign="Center" MinSize="64 48"/>
+        <BoxContainer Orientation="Vertical" VerticalAlignment="Top" Margin="8" MinWidth="100">
+            <Label Text="{Loc grinder-menu-auto-label}" HorizontalAlignment="Center"/>
+            <Button Name="AutoModeButton" Text="{Loc grinder-menu-auto-button}" TextAlign="Center" MinSize="64 48" Margin="0 0 0 16" />
+            <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>
 
         <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"/>
index 6e4b7a76180871680cf66805155fc19c8a668b55..f97d8a7330214633b50105a5d3ab142ff00906fc 100644 (file)
@@ -24,6 +24,7 @@ namespace Content.Client.Kitchen.UI
             _entityManager = entityManager;
             _prototypeManager = prototypeManager;
             _owner = owner;
+            AutoModeButton.OnPressed += owner.ToggleAutoMode;
             GrindButton.OnPressed += owner.StartGrinding;
             JuiceButton.OnPressed += owner.StartJuicing;
             ChamberContentBox.EjectButton.OnPressed += owner.EjectAll;
@@ -56,6 +57,19 @@ namespace Content.Client.Kitchen.UI
             GrindButton.Disabled = !state.CanGrind || !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.
             RefreshContentsDisplay(state.ReagentQuantities, _entityManager.GetEntityArray(state.ChamberContents), state.HasBeakerIn);
         }
index 39b85c261b38ca908ccd8a06abe349772d4e6f68..e6f108b3050e03988c6309bfd069fa38ddb7bec8 100644 (file)
@@ -52,6 +52,11 @@ namespace Content.Client.Kitchen.UI
             _menu?.HandleMessage(message);
         }
 
+        public void ToggleAutoMode(BaseButton.ButtonEventArgs args)
+        {
+            SendMessage(new ReagentGrinderToggleAutoModeMessage());
+        }
+
         public void StartGrinding(BaseButton.ButtonEventArgs? _ = null)
         {
             SendMessage(new ReagentGrinderStartMessage(GrinderProgram.Grind));
index 27834aa5735cd4eabebd43c3be330289269dd5ef..5bbbe2dc8daca9373597e0b890af2026fe23d0ad 100644 (file)
@@ -13,24 +13,27 @@ namespace Content.Server.Kitchen.Components
     [Access(typeof(ReagentGrinderSystem)), RegisterComponent]
     public sealed partial class ReagentGrinderComponent : Component
     {
-        [DataField, ViewVariables(VVAccess.ReadWrite)]
+        [DataField]
         public int StorageMaxEntities = 6;
 
-        [DataField("workTime"), ViewVariables(VVAccess.ReadWrite)]
+        [DataField]
         public TimeSpan WorkTime = TimeSpan.FromSeconds(3.5); // Roughly matches the grind/juice sounds.
 
-        [DataField, ViewVariables(VVAccess.ReadWrite)]
+        [DataField]
         public float WorkTimeMultiplier = 1;
 
-        [DataField("clickSound"), ViewVariables(VVAccess.ReadWrite)]
+        [DataField]
         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");
 
-        [DataField("juiceSound"), ViewVariables(VVAccess.ReadWrite)]
+        [DataField]
         public SoundSpecifier JuiceSound { get; set; } = new SoundPathSpecifier("/Audio/Machines/juicer.ogg");
 
+        [DataField]
+        public GrinderAutoMode AutoMode = GrinderAutoMode.Off;
+
         public EntityUid? AudioStream;
     }
 
index 07f8849b4a973da500c893f7a611dfb2a7dce76e..e8ee4539860d612e16c0cb9d64cac6aa3282ed15 100644 (file)
@@ -53,11 +53,19 @@ namespace Content.Server.Kitchen.EntitySystems
             SubscribeLocalEvent<ReagentGrinderComponent, EntRemovedFromContainerMessage>(OnContainerModified);
             SubscribeLocalEvent<ReagentGrinderComponent, ContainerIsRemovingAttemptEvent>(OnEntRemoveAttempt);
 
+            SubscribeLocalEvent<ReagentGrinderComponent, ReagentGrinderToggleAutoModeMessage>(OnToggleAutoModeMessage);
             SubscribeLocalEvent<ReagentGrinderComponent, ReagentGrinderStartMessage>(OnStartMessage);
             SubscribeLocalEvent<ReagentGrinderComponent, ReagentGrinderEjectChamberAllMessage>(OnEjectChamberAllMessage);
             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)
         {
             base.Update(frameTime);
@@ -148,6 +156,12 @@ namespace Content.Server.Kitchen.EntitySystems
 
             var outputContainer = _itemSlotsSystem.GetItemOrNull(uid, SharedReagentGrinder.BeakerSlotId);
             _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)
@@ -185,6 +199,10 @@ namespace Content.Server.Kitchen.EntitySystems
 
         private void UpdateUiState(EntityUid uid)
         {
+            ReagentGrinderComponent? grinderComp = null;
+            if (!Resolve(uid, ref grinderComp))
+                return;
+
             var inputContainer = _containerSystem.EnsureContainer<Container>(uid, SharedReagentGrinder.InputContainerId);
             var outputContainer = _itemSlotsSystem.GetItemOrNull(uid, SharedReagentGrinder.BeakerSlotId);
             Solution? containerSolution = null;
@@ -206,6 +224,7 @@ namespace Content.Server.Kitchen.EntitySystems
                 this.IsPowered(uid, EntityManager),
                 canJuice,
                 canGrind,
+                grinderComp.AutoMode,
                 GetNetEntityArray(inputContainer.ContainedEntities.ToArray()),
                 containerSolution?.Contents.ToArray()
             );
index f5d679c293df2d25661ffd9053db61016d2c55e5..579db239c800ab7490043c742da23aeb1c346879 100644 (file)
@@ -10,6 +10,12 @@ namespace Content.Shared.Kitchen
         public static string InputContainerId = "inputContainer";
     }
 
+    [Serializable, NetSerializable]
+    public sealed class ReagentGrinderToggleAutoModeMessage : BoundUserInterfaceMessage
+    {
+        public ReagentGrinderToggleAutoModeMessage() { }
+    }
+
     [Serializable, NetSerializable]
     public sealed class ReagentGrinderStartMessage : BoundUserInterfaceMessage
     {
@@ -75,6 +81,13 @@ namespace Content.Shared.Kitchen
         Key
     }
 
+    public enum GrinderAutoMode : byte
+    {
+        Off,
+        Grind,
+        Juice
+    }
+
     [NetSerializable, Serializable]
     public sealed class ReagentGrinderInterfaceState : BoundUserInterfaceState
     {
@@ -85,13 +98,16 @@ namespace Content.Shared.Kitchen
         public bool CanGrind;
         public NetEntity[] ChamberContents;
         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;
             HasBeakerIn = hasBeaker;
             Powered = powered;
             CanJuice = canJuice;
             CanGrind = canGrind;
+            AutoMode = autoMode;
             ChamberContents = chamberContents;
             ReagentQuantities = heldBeakerContents;
         }
index 30af6e9872e058ff9ee3fd0d8fe73734b4e4b733..8a3ca9eef8593428cdb360493075e925164d1445 100644 (file)
@@ -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-grind-button = Grind
 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-button = Eject Contents
 grinder-menu-beaker-content-box-label = Beaker