From 5b36a0d7041811cadc59604a8be08927b066693c Mon Sep 17 00:00:00 2001 From: FL-OZ <58238103+FL-OZ@users.noreply.github.com> Date: Thu, 28 May 2020 15:28:35 -0500 Subject: [PATCH] Sweeping changes/improvements to the microwave. (#997) Co-authored-by: FL-OZ Co-authored-by: Pieter-Jan Briers --- .../Kitchen/MicrowaveBoundUserInterface.cs | 270 ++++++++++++++++-- .../Components/Kitchen/MicrowaveMenu.cs | 231 --------------- .../Components/Kitchen/MicrowaveVisualizer.cs | 7 +- ...waveComponent.cs => MicrowaveComponent.cs} | 172 +++++------ .../EntitySystems/MicrowaveSystem.cs | 25 ++ .../Kitchen/SharedMicrowaveComponent.cs | 29 +- Resources/Prototypes/Entities/kitchen.yml | 4 +- Resources/Prototypes/Kitchen/meal_recipes.yml | 10 + 8 files changed, 392 insertions(+), 356 deletions(-) delete mode 100644 Content.Client/GameObjects/Components/Kitchen/MicrowaveMenu.cs rename Content.Server/GameObjects/Components/Kitchen/{KitchenMicrowaveComponent.cs => MicrowaveComponent.cs} (77%) create mode 100644 Content.Server/GameObjects/EntitySystems/MicrowaveSystem.cs diff --git a/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs b/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs index f7f34674fc..4fb4c8ce9f 100644 --- a/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs +++ b/Content.Client/GameObjects/Components/Kitchen/MicrowaveBoundUserInterface.cs @@ -1,4 +1,5 @@ -using Robust.Client.GameObjects.Components.UserInterface; +using System; +using Robust.Client.GameObjects.Components.UserInterface; using Content.Shared.Kitchen; using Robust.Shared.GameObjects.Components.UserInterface; using Robust.Shared.IoC; @@ -7,10 +8,14 @@ using Content.Shared.Chemistry; using Robust.Shared.GameObjects; using System.Collections.Generic; using Robust.Shared.Interfaces.GameObjects; - - using Robust.Client.GameObjects; +using Robust.Client.Graphics.Drawing; +using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; +using Robust.Client.UserInterface.CustomControls; +using Robust.Shared.Localization; +using Robust.Shared.Maths; + namespace Content.Client.GameObjects.Components.Kitchen { @@ -50,12 +55,11 @@ namespace Content.Client.GameObjects.Components.Kitchen new SharedMicrowaveComponent.MicrowaveVaporizeReagentIndexedMessage(_reagents[args.ItemIndex])); }; - _menu.OnCookTimeSelected += args => + _menu.OnCookTimeSelected += (args,buttonIndex) => { - var actualButton = args.Button as Button; - var newTime = (uint) int.Parse(actualButton.Text); - _menu.VisualCookTime = newTime; - SendMessage(new SharedMicrowaveComponent.MicrowaveSelectCookTimeMessage(newTime)); + var actualButton = (MicrowaveMenu.MicrowaveCookTimeButton) args.Button ; + var newTime = actualButton.CookTime; + SendMessage(new SharedMicrowaveComponent.MicrowaveSelectCookTimeMessage(buttonIndex,actualButton.CookTime)); }; } @@ -79,45 +83,259 @@ namespace Content.Client.GameObjects.Components.Kitchen { return; } - _menu.ToggleBusyDisableOverlayPanel(cstate.IsMicrowaveBusy); - RefreshContentsDisplay(cstate.ReagentsReagents, cstate.ContainedSolids); - + RefreshContentsDisplay(cstate.ReagentQuantities, cstate.ContainedSolids); + var currentlySelectedTimeButton = (Button) _menu.CookTimeButtonVbox.GetChild(cstate.ActiveButtonIndex); + currentlySelectedTimeButton.Pressed = true; + var label = cstate.ActiveButtonIndex <= 0 ? Loc.GetString("INSTANT") : cstate.CurrentCookTime.ToString(); + _menu._cookTimeInfoLabel.Text = $"{Loc.GetString("COOK TIME")}: {label}"; } - - private void RefreshContentsDisplay(IReadOnlyList reagents, List solids) + private void RefreshContentsDisplay(Solution.ReagentQuantity[] reagents, EntityUid[] containedSolids) { _reagents.Clear(); _menu.IngredientsListReagents.Clear(); - foreach (var reagent in reagents) + for (var i = 0; i < reagents.Length; i++) { - _prototypeManager.TryIndex(reagent.ReagentId, out ReagentPrototype proto); - var reagentAdded = _menu.IngredientsListReagents.AddItem($"{reagent.Quantity} {proto.Name}"); + _prototypeManager.TryIndex(reagents[i].ReagentId, out ReagentPrototype proto); + var reagentAdded = _menu.IngredientsListReagents.AddItem($"{reagents[i].Quantity} {proto.Name}"); var reagentIndex = _menu.IngredientsListReagents.IndexOf(reagentAdded); - _reagents.Add(reagentIndex, reagent); + _reagents.Add(reagentIndex, reagents[i]); } _solids.Clear(); _menu.IngredientsList.Clear(); - foreach (var entityID in solids) + for (var j = 0; j < containedSolids.Length; j++) { - if (!_entityManager.TryGetEntity(entityID, out var entity)) + if (!_entityManager.TryGetEntity(containedSolids[j], out var entity)) { return; } - - if (!entity.Deleted && entity.TryGetComponent(out IconComponent icon)) + if (entity.Deleted || !entity.TryGetComponent(out IconComponent icon)) { - var solidItem = _menu.IngredientsList.AddItem(entity.Name, icon.Icon.Default); - - var solidIndex = _menu.IngredientsList.IndexOf(solidItem); - _solids.Add(solidIndex, entityID); + continue; } - + var solidItem = _menu.IngredientsList.AddItem(entity.Name, icon.Icon.Default); + var solidIndex = _menu.IngredientsList.IndexOf(solidItem); + _solids.Add(solidIndex, containedSolids[j]); } } + + public class MicrowaveMenu : SS14Window + { + + public class MicrowaveCookTimeButton : Button + { + public uint CookTime; + } + + + protected override Vector2? CustomSize => (512, 256); + + private MicrowaveBoundUserInterface Owner { get; set; } + + public event Action OnCookTimeSelected; + + public Button StartButton { get; } + public Button EjectButton { get; } + + public PanelContainer TimerFacePlate { get; } + + public ButtonGroup CookTimeButtonGroup { get; } + public VBoxContainer CookTimeButtonVbox { get; } + + private VBoxContainer ButtonGridContainer { get; } + + private PanelContainer DisableCookingPanelOverlay { get; } + + + public ItemList IngredientsList { get; } + + public ItemList IngredientsListReagents { get; } + public Label _cookTimeInfoLabel { get; } + + public MicrowaveMenu(MicrowaveBoundUserInterface owner = null) + { + Owner = owner; + Title = Loc.GetString("Microwave"); + DisableCookingPanelOverlay = new PanelContainer + { + MouseFilter = MouseFilterMode.Stop, + PanelOverride = new StyleBoxFlat {BackgroundColor = Color.Black.WithAlpha(0.60f)}, + SizeFlagsHorizontal = SizeFlags.Fill, + SizeFlagsVertical = SizeFlags.Fill, + }; + + + var hSplit = new HBoxContainer + { + SizeFlagsHorizontal = SizeFlags.Fill, + SizeFlagsVertical = SizeFlags.Fill + }; + + IngredientsListReagents = new ItemList + { + SizeFlagsVertical = SizeFlags.FillExpand, + SizeFlagsHorizontal = SizeFlags.FillExpand, + SelectMode = ItemList.ItemListSelectMode.Button, + SizeFlagsStretchRatio = 2, + CustomMinimumSize = (100, 128) + }; + + IngredientsList = new ItemList + { + SizeFlagsVertical = SizeFlags.FillExpand, + SizeFlagsHorizontal = SizeFlags.FillExpand, + SelectMode = ItemList.ItemListSelectMode.Button, + SizeFlagsStretchRatio = 2, + CustomMinimumSize = (100, 128) + }; + + hSplit.AddChild(IngredientsListReagents); + //Padding between the lists. + hSplit.AddChild(new Control + { + CustomMinimumSize = (0, 5), + }); + + hSplit.AddChild(IngredientsList); + + var vSplit = new VBoxContainer + { + SizeFlagsVertical = SizeFlags.FillExpand, + SizeFlagsHorizontal = SizeFlags.FillExpand, + }; + + hSplit.AddChild(vSplit); + + ButtonGridContainer = new VBoxContainer + { + Align = BoxContainer.AlignMode.Center, + SizeFlagsStretchRatio = 3 + }; + + StartButton = new Button + { + Text = Loc.GetString("Start"), + TextAlign = Label.AlignMode.Center, + }; + + EjectButton = new Button + { + Text = Loc.GetString("Eject All Contents"), + ToolTip = Loc.GetString("This vaporizes all reagents, but ejects any solids."), + TextAlign = Label.AlignMode.Center, + }; + + ButtonGridContainer.AddChild(StartButton); + ButtonGridContainer.AddChild(EjectButton); + vSplit.AddChild(ButtonGridContainer); + + //Padding + vSplit.AddChild(new Control + { + CustomMinimumSize = (0, 15), + SizeFlagsVertical = SizeFlags.Fill, + }); + + CookTimeButtonGroup = new ButtonGroup(); + CookTimeButtonVbox = new VBoxContainer + { + SizeFlagsVertical = SizeFlags.FillExpand, + Align = BoxContainer.AlignMode.Center, + }; + + + var index = 0; + for (var i = 0; i <= 6; i++) + { + var newButton = new MicrowaveCookTimeButton + { + Text = index <= 0 ? Loc.GetString("INSTANT") : index.ToString(), + CookTime = (uint)index, + TextAlign = Label.AlignMode.Center, + ToggleMode = true, + Group = CookTimeButtonGroup, + }; + CookTimeButtonVbox.AddChild(newButton); + newButton.OnToggled += args => + { + OnCookTimeSelected?.Invoke(args, newButton.GetPositionInParent()); + + }; + index += 5; + } + + var cookTimeOneSecondButton = (Button) CookTimeButtonVbox.GetChild(0); + cookTimeOneSecondButton.Pressed = true; + + + _cookTimeInfoLabel = new Label + { + Text = Loc.GetString("COOK TIME: 1"), + Align = Label.AlignMode.Center, + Modulate = Color.White, + SizeFlagsVertical = SizeFlags.ShrinkCenter + }; + + var innerTimerPanel = new PanelContainer + { + SizeFlagsVertical = SizeFlags.FillExpand, + ModulateSelfOverride = Color.Red, + CustomMinimumSize = (100, 128), + PanelOverride = new StyleBoxFlat {BackgroundColor = Color.Black.WithAlpha(0.5f)}, + + Children = + { + new VBoxContainer + { + Children = + { + new PanelContainer + { + PanelOverride = new StyleBoxFlat() {BackgroundColor = Color.Gray.WithAlpha(0.2f)}, + + Children = + { + _cookTimeInfoLabel + } + }, + + new ScrollContainer() + { + SizeFlagsVertical = SizeFlags.FillExpand, + + Children = + { + CookTimeButtonVbox, + } + }, + } + } + } + }; + + TimerFacePlate = new PanelContainer() + { + SizeFlagsVertical = SizeFlags.FillExpand, + SizeFlagsHorizontal = SizeFlags.FillExpand, + Children = + { + innerTimerPanel + }, + }; + + vSplit.AddChild(TimerFacePlate); + Contents.AddChild(hSplit); + Contents.AddChild(DisableCookingPanelOverlay); + } + + public void ToggleBusyDisableOverlayPanel(bool shouldDisable) + { + DisableCookingPanelOverlay.Visible = shouldDisable; + } + } } } diff --git a/Content.Client/GameObjects/Components/Kitchen/MicrowaveMenu.cs b/Content.Client/GameObjects/Components/Kitchen/MicrowaveMenu.cs deleted file mode 100644 index b2f62fbcc5..0000000000 --- a/Content.Client/GameObjects/Components/Kitchen/MicrowaveMenu.cs +++ /dev/null @@ -1,231 +0,0 @@ -using System; -using Robust.Client.Graphics.Drawing; -using Robust.Client.UserInterface; -using Robust.Client.UserInterface.Controls; -using Robust.Client.UserInterface.CustomControls; -using Robust.Shared.Localization; -using Robust.Shared.Maths; - -namespace Content.Client.GameObjects.Components.Kitchen -{ - public class MicrowaveMenu : SS14Window - { - protected override Vector2? CustomSize => (512, 256); - - private MicrowaveBoundUserInterface Owner { get; set; } - - public event Action OnCookTimeSelected; - - public uint VisualCookTime = 1; - - public Button StartButton { get;} - public Button EjectButton { get;} - - public PanelContainer TimerFacePlate { get; } - - public ButtonGroup CookTimeButtonGroup { get; } - private VBoxContainer CookTimeButtonVbox { get; } - - private VBoxContainer ButtonGridContainer { get; } - - private PanelContainer DisableCookingPanelOverlay { get;} - - - public ItemList IngredientsList { get;} - - public ItemList IngredientsListReagents { get; } - private Label _cookTimeInfoLabel { get; } - - public MicrowaveMenu(MicrowaveBoundUserInterface owner = null) - { - Owner = owner; - Title = Loc.GetString("Microwave"); - DisableCookingPanelOverlay = new PanelContainer - { - MouseFilter = MouseFilterMode.Stop, - PanelOverride = new StyleBoxFlat {BackgroundColor = Color.Black.WithAlpha(0.60f)}, - SizeFlagsHorizontal = SizeFlags.Fill, - SizeFlagsVertical = SizeFlags.Fill, - - }; - - - var hSplit = new HBoxContainer - { - SizeFlagsHorizontal = SizeFlags.Fill, - SizeFlagsVertical = SizeFlags.Fill - }; - - IngredientsListReagents = new ItemList - { - SizeFlagsVertical = SizeFlags.FillExpand, - SizeFlagsHorizontal = SizeFlags.FillExpand, - SelectMode = ItemList.ItemListSelectMode.Button, - SizeFlagsStretchRatio = 2, - CustomMinimumSize = (100,128) - }; - - IngredientsList = new ItemList - { - SizeFlagsVertical = SizeFlags.FillExpand, - SizeFlagsHorizontal = SizeFlags.FillExpand, - SelectMode = ItemList.ItemListSelectMode.Button, - SizeFlagsStretchRatio = 2, - CustomMinimumSize = (100,128) - }; - - hSplit.AddChild(IngredientsListReagents); - //Padding between the lists. - hSplit.AddChild(new Control - { - CustomMinimumSize = (0,5), - }); - - hSplit.AddChild(IngredientsList); - - var vSplit = new VBoxContainer - { - SizeFlagsVertical = SizeFlags.FillExpand, - SizeFlagsHorizontal = SizeFlags.FillExpand, - }; - - hSplit.AddChild(vSplit); - - ButtonGridContainer = new VBoxContainer - { - Align = BoxContainer.AlignMode.Center, - SizeFlagsStretchRatio = 3 - }; - - StartButton = new Button - { - Text = Loc.GetString("Start"), - TextAlign = Label.AlignMode.Center, - - }; - - EjectButton = new Button - { - Text = Loc.GetString("Eject All Contents"), - ToolTip = Loc.GetString("This vaporizes all reagents, but ejects any solids."), - TextAlign = Label.AlignMode.Center, - }; - - ButtonGridContainer.AddChild(StartButton); - ButtonGridContainer.AddChild(EjectButton); - vSplit.AddChild(ButtonGridContainer); - - //Padding - vSplit.AddChild(new Control - { - CustomMinimumSize = (0, 15), - SizeFlagsVertical = SizeFlags.Fill, - }); - - CookTimeButtonGroup = new ButtonGroup(); - CookTimeButtonVbox = new VBoxContainer - { - SizeFlagsVertical = SizeFlags.FillExpand, - Align = BoxContainer.AlignMode.Center, - }; - - - var index = 0; - for (var i = 0; i <= 12; i++) - { - var newButton = new Button - { - Text = (index <= 0 ? 1 : index).ToString(), - TextAlign = Label.AlignMode.Center, - ToggleMode = true, - Group = CookTimeButtonGroup, - }; - CookTimeButtonVbox.AddChild(newButton); - newButton.OnToggled += args => - { - OnCookTimeSelected?.Invoke(args); - _cookTimeInfoLabel.Text = $"{Loc.GetString("COOK TIME")}: {VisualCookTime}"; - }; - index+=5; - } - - var cookTimeOneSecondButton = (Button)CookTimeButtonVbox.GetChild(0); - cookTimeOneSecondButton.Pressed = true; - - - _cookTimeInfoLabel = new Label - { - Text = Loc.GetString($"COOK TIME: {VisualCookTime}"), - Align = Label.AlignMode.Center, - Modulate = Color.White, - SizeFlagsVertical = SizeFlags.ShrinkCenter - }; - - var innerTimerPanel = new PanelContainer - { - SizeFlagsVertical = SizeFlags.FillExpand, - ModulateSelfOverride = Color.Red, - CustomMinimumSize = (100, 128), - PanelOverride = new StyleBoxFlat {BackgroundColor = Color.Black.WithAlpha(0.5f)}, - - Children = - { - - new VBoxContainer - { - - Children = - { - - new PanelContainer - { - PanelOverride = new StyleBoxFlat(){BackgroundColor = Color.Gray.WithAlpha(0.2f)}, - - Children = - { - _cookTimeInfoLabel - } - }, - - new ScrollContainer() - { - SizeFlagsVertical = SizeFlags.FillExpand, - - Children = - { - CookTimeButtonVbox, - } - }, - - } - } - - - } - }; - - TimerFacePlate = new PanelContainer() - { - SizeFlagsVertical = SizeFlags.FillExpand, - SizeFlagsHorizontal = SizeFlags.FillExpand, - Children = - { - - innerTimerPanel - }, - }; - - vSplit.AddChild(TimerFacePlate); - Contents.AddChild(hSplit); - Contents.AddChild(DisableCookingPanelOverlay); - - } - - public void ToggleBusyDisableOverlayPanel(bool shouldDisable) - { - DisableCookingPanelOverlay.Visible = shouldDisable; - } - - - } -} diff --git a/Content.Client/GameObjects/Components/Kitchen/MicrowaveVisualizer.cs b/Content.Client/GameObjects/Components/Kitchen/MicrowaveVisualizer.cs index 1591670f16..b15a061845 100644 --- a/Content.Client/GameObjects/Components/Kitchen/MicrowaveVisualizer.cs +++ b/Content.Client/GameObjects/Components/Kitchen/MicrowaveVisualizer.cs @@ -13,7 +13,6 @@ namespace Content.Client.GameObjects.Components.Kitchen public sealed class MicrowaveVisualizer : AppearanceVisualizer { private SoundComponent _soundComponent; - private const string MicrowaveSoundLoop = "/Audio/machines/microwave_loop.ogg"; public override void OnChangeData(AppearanceComponent component) { @@ -38,8 +37,9 @@ namespace Content.Client.GameObjects.Components.Kitchen var audioParams = AudioParams.Default; audioParams.Loop = true; var schedSound = new ScheduledSound(); - schedSound.Filename = MicrowaveSoundLoop; + schedSound.Filename = "/Audio/machines/microwave_loop.ogg"; schedSound.AudioParams = audioParams; + _soundComponent.StopAllSounds(); _soundComponent.AddScheduledSound(schedSound); break; @@ -51,11 +51,8 @@ namespace Content.Client.GameObjects.Components.Kitchen var glowingPartsVisible = !(component.TryGetData(PowerDeviceVisuals.Powered, out bool powered) && !powered); sprite.LayerSetVisible(MicrowaveVisualizerLayers.BaseUnlit, glowingPartsVisible); - - } - private enum MicrowaveVisualizerLayers { Base, diff --git a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs b/Content.Server/GameObjects/Components/Kitchen/MicrowaveComponent.cs similarity index 77% rename from Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs rename to Content.Server/GameObjects/Components/Kitchen/MicrowaveComponent.cs index ade3d36fd4..88e6b6d95a 100644 --- a/Content.Server/GameObjects/Components/Kitchen/KitchenMicrowaveComponent.cs +++ b/Content.Server/GameObjects/Components/Kitchen/MicrowaveComponent.cs @@ -5,7 +5,6 @@ using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.ViewVariables; using Content.Server.GameObjects.Components.Chemistry; -using Content.Server.GameObjects.Components.Nutrition; using Content.Shared.Chemistry; using Robust.Shared.Serialization; using Robust.Shared.Interfaces.GameObjects; @@ -21,7 +20,6 @@ using Robust.Server.GameObjects.Components.UserInterface; using Robust.Server.Interfaces.GameObjects; using Robust.Shared.Localization; using Content.Server.Interfaces; -using Content.Server.Utility; using Robust.Shared.Audio; using Content.Server.Interfaces.GameObjects; using Content.Server.Interfaces.Chat; @@ -32,7 +30,7 @@ namespace Content.Server.GameObjects.Components.Kitchen { [RegisterComponent] [ComponentReference(typeof(IActivate))] - public class KitchenMicrowaveComponent : SharedMicrowaveComponent, IActivate, IInteractUsing, ISolutionChange, ISuicideAct + public class MicrowaveComponent : SharedMicrowaveComponent, IActivate, IInteractUsing, ISolutionChange { #pragma warning disable 649 [Dependency] private readonly IEntitySystemManager _entitySystemManager; @@ -62,25 +60,22 @@ namespace Content.Server.GameObjects.Components.Kitchen /// For right now, I don't think any recipe cook time should be greater than 60 seconds. /// [ViewVariables] - private uint _currentCookTimerTime { get; set; } = 1; + private uint _currentCookTimerTime = 1; #endregion - private bool Powered => _powerDevice.Powered; - - private bool HasContents => _solution.ReagentList.Count > 0 || _storage.ContainedEntities.Count > 0; - - void ISolutionChange.SolutionChanged(SolutionChangeEventArgs eventArgs) => UpdateUserInterface(); + private bool _powered => _powerDevice.Powered; + private bool _hasContents => _solution.ReagentList.Count > 0 || _storage.ContainedEntities.Count > 0; + private bool _uiDirty = true; + private bool _lostPower = false; + private int _currentCookTimeButtonIndex = 0; + void ISolutionChange.SolutionChanged(SolutionChangeEventArgs eventArgs) => _uiDirty = true; private AudioSystem _audioSystem; - private AppearanceComponent _appearance; private PowerDeviceComponent _powerDevice; - private BoundUserInterface _userInterface; - private Container _storage; - public override void ExposeData(ObjectSerializer serializer) { base.ExposeData(serializer); @@ -109,7 +104,7 @@ namespace Content.Server.GameObjects.Components.Kitchen private void UserInterfaceOnReceiveMessage(ServerBoundUserInterfaceMessage message) { - if (!Powered || _busy) + if (!_powered || _busy) { return; } @@ -119,43 +114,74 @@ namespace Content.Server.GameObjects.Components.Kitchen case MicrowaveStartCookMessage msg : wzhzhzh(); break; - case MicrowaveEjectMessage msg : - if (HasContents) + if (_hasContents) { VaporizeReagents(); EjectSolids(); ClickSound(); - UpdateUserInterface(); + _uiDirty = true; } - break; - case MicrowaveEjectSolidIndexedMessage msg: - if (HasContents) + if (_hasContents) { - EjectSolidWithIndex(msg.EntityID); + EjectSolid(msg.EntityID); ClickSound(); - UpdateUserInterface(); + _uiDirty = true; } break; case MicrowaveVaporizeReagentIndexedMessage msg: - if (HasContents) + if (_hasContents) { - VaporizeReagentWithReagentQuantity(msg.ReagentQuantity); + VaporizeReagentQuantity(msg.ReagentQuantity); ClickSound(); - UpdateUserInterface(); + _uiDirty = true; } break; case MicrowaveSelectCookTimeMessage msg: - _currentCookTimerTime = msg.newCookTime; + _currentCookTimeButtonIndex = msg.ButtonIndex; + _currentCookTimerTime = msg.NewCookTime; ClickSound(); - UpdateUserInterface(); + _uiDirty = true; break; } } + public void OnUpdate() + { + + if (!_powered) + { + //TODO:If someone cuts power currently, microwave magically keeps going. FIX IT! + SetAppearance(MicrowaveVisualState.Idle); + } + + if (_busy && !_powered) + { + //we lost power while we were cooking/busy! + _lostPower = true; + VaporizeReagents(); + EjectSolids(); + _busy = false; + _uiDirty = true; + } + + if (_uiDirty) + { + _userInterface.SetState(new MicrowaveUpdateUserInterfaceState + ( + _solution.Solution.Contents.ToArray(), + _storage.ContainedEntities.Select(item => item.Uid).ToArray(), + _busy, + _currentCookTimeButtonIndex, + _currentCookTimerTime + )); + _uiDirty = false; + } + } + private void SetAppearance(MicrowaveVisualState state) { if (_appearance != null || Owner.TryGetComponent(out _appearance)) @@ -165,42 +191,29 @@ namespace Content.Server.GameObjects.Components.Kitchen } - private void UpdateUserInterface() - { - var solidsVisualList = new List(); - foreach(var item in _storage.ContainedEntities) - { - solidsVisualList.Add(item.Uid); - } - - _userInterface.SetState(new MicrowaveUpdateUserInterfaceState(_solution.Solution.Contents, solidsVisualList, _busy)); - } - void IActivate.Activate(ActivateEventArgs eventArgs) { - if (!eventArgs.User.TryGetComponent(out IActorComponent actor) || !Powered) + if (!eventArgs.User.TryGetComponent(out IActorComponent actor) || !_powered) { return; } - - UpdateUserInterface(); + _uiDirty = true; _userInterface.Open(actor.playerSession); - } public bool InteractUsing(InteractUsingEventArgs eventArgs) { + if (!_powered) + { + _notifyManager.PopupMessage(Owner.Transform.GridPosition, eventArgs.User, + Loc.GetString("It has no power!")); + return false; + } + var itemEntity = eventArgs.User.GetComponent().GetActiveHand.Owner; if(itemEntity.TryGetComponent(out var attackPourable)) { - //Get target and check if it can be poured into - if (!Owner.TryGetComponent(out var mySolution) - || !mySolution.CanPourIn) - { - return false; - } - if (!itemEntity.TryGetComponent(out var attackSolution) || !attackSolution.CanPourOut) { @@ -208,7 +221,7 @@ namespace Content.Server.GameObjects.Components.Kitchen } //Get transfer amount. May be smaller than _transferAmount if not enough room - var realTransferAmount = ReagentUnit.Min(attackPourable.TransferAmount, mySolution.EmptyVolume); + var realTransferAmount = ReagentUnit.Min(attackPourable.TransferAmount, _solution.EmptyVolume); if (realTransferAmount <= 0) //Special message if container is full { _notifyManager.PopupMessage(Owner.Transform.GridPosition, eventArgs.User, @@ -218,7 +231,7 @@ namespace Content.Server.GameObjects.Components.Kitchen //Move units from attackSolution to targetSolution var removedSolution = attackSolution.SplitSolution(realTransferAmount); - if (!mySolution.TryAddSolution(removedSolution)) + if (!_solution.TryAddSolution(removedSolution)) { return false; } @@ -228,24 +241,18 @@ namespace Content.Server.GameObjects.Components.Kitchen return true; } - if (!itemEntity.TryGetComponent(typeof(FoodComponent), out var food)) - { - - _notifyManager.PopupMessage(Owner, eventArgs.User, "That won't work!"); - return false; - } - + itemEntity.TryGetComponent(typeof(ItemComponent), out var food); var ent = food.Owner; //Get the entity of the ItemComponent. _storage.Insert(ent); - UpdateUserInterface(); + _uiDirty = true; return true; - } - //This is required. It's 'cook'. + // ReSharper disable once InconsistentNaming + // ReSharper disable once IdentifierTypo private void wzhzhzh() { - if (!HasContents) + if (!_hasContents) { return; } @@ -267,25 +274,23 @@ namespace Content.Server.GameObjects.Components.Kitchen // Check recipes FoodRecipePrototype recipeToCook = null; - foreach(var r in _recipeManager.Recipes) + foreach (var r in _recipeManager.Recipes.Where(r => CanSatisfyRecipe(r, solidsDict))) { - if (!CanSatisfyRecipe(r, solidsDict)) - { - continue; - } - recipeToCook = r; } var goodMeal = (recipeToCook != null) && - (_currentCookTimerTime == (uint)recipeToCook.CookTime) ? true : false; + (_currentCookTimerTime == (uint)recipeToCook.CookTime); SetAppearance(MicrowaveVisualState.Cooking); - _audioSystem.Play(_startCookingSound,Owner, AudioParams.Default); + _audioSystem.Play(_startCookingSound, Owner, AudioParams.Default); Timer.Spawn((int)(_currentCookTimerTime * _cookTimeMultiplier), () => { - + if (_lostPower) + { + return; + } if (goodMeal) { SubtractContents(recipeToCook); @@ -296,14 +301,19 @@ namespace Content.Server.GameObjects.Components.Kitchen VaporizeSolids(); } - var entityToSpawn = goodMeal ? recipeToCook.Result : _badRecipeName; - _entityManager.SpawnEntity(entityToSpawn, Owner.Transform.GridPosition); - _audioSystem.Play(_cookingCompleteSound,Owner, AudioParams.Default); + if (recipeToCook != null) + { + var entityToSpawn = goodMeal ? recipeToCook.Result : _badRecipeName; + _entityManager.SpawnEntity(entityToSpawn, Owner.Transform.GridPosition); + } + _audioSystem.Play(_cookingCompleteSound, Owner, AudioParams.Default.WithVolume(-1f)); SetAppearance(MicrowaveVisualState.Idle); _busy = false; - UpdateUserInterface(); + + _uiDirty = true; }); - UpdateUserInterface(); + _lostPower = false; + _uiDirty = true; } private void VaporizeReagents() @@ -311,7 +321,7 @@ namespace Content.Server.GameObjects.Components.Kitchen _solution.RemoveAllSolution(); } - private void VaporizeReagentWithReagentQuantity(Solution.ReagentQuantity reagentQuantity) + private void VaporizeReagentQuantity(Solution.ReagentQuantity reagentQuantity) { _solution.TryRemoveReagent(reagentQuantity.ReagentId, reagentQuantity.Quantity); } @@ -335,7 +345,7 @@ namespace Content.Server.GameObjects.Components.Kitchen } } - private void EjectSolidWithIndex(EntityUid entityID) + private void EjectSolid(EntityUid entityID) { if (_entityManager.EntityExists(entityID)) { @@ -402,9 +412,7 @@ namespace Content.Server.GameObjects.Components.Kitchen private void ClickSound() { - - _audioSystem.Play("/Audio/machines/machine_switch.ogg",Owner, AudioParams.Default.WithVolume(-2f)); - + _audioSystem.Play("/Audio/machines/machine_switch.ogg",Owner,AudioParams.Default.WithVolume(-2f)); } public SuicideKind Suicide(IEntity victim, IChatManager chat) @@ -423,7 +431,7 @@ namespace Content.Server.GameObjects.Components.Kitchen chat.EntityMe(victim, Loc.GetPluralString("is trying to cook {0:their} head!", "is trying to cook {0:their} heads!", headCount, victim)); _currentCookTimerTime = 10; ClickSound(); - UpdateUserInterface(); + _uiDirty = true; wzhzhzh(); return SuicideKind.Heat; } diff --git a/Content.Server/GameObjects/EntitySystems/MicrowaveSystem.cs b/Content.Server/GameObjects/EntitySystems/MicrowaveSystem.cs new file mode 100644 index 0000000000..0e5c1f782d --- /dev/null +++ b/Content.Server/GameObjects/EntitySystems/MicrowaveSystem.cs @@ -0,0 +1,25 @@ +using Content.Server.GameObjects.Components.Kitchen; +using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.Systems; + +namespace Content.Server.GameObjects.EntitySystems +{ + public class MicrowaveSystem : EntitySystem + { + public override void Initialize() + { + base.Initialize(); + EntityQuery = new TypeEntityQuery(typeof(MicrowaveComponent)); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + foreach (var entity in RelevantEntities) + { + var comp = entity.GetComponent(); + comp.OnUpdate(); + } + } + } +} diff --git a/Content.Shared/Kitchen/SharedMicrowaveComponent.cs b/Content.Shared/Kitchen/SharedMicrowaveComponent.cs index cc53465caa..ba8ae5c499 100644 --- a/Content.Shared/Kitchen/SharedMicrowaveComponent.cs +++ b/Content.Shared/Kitchen/SharedMicrowaveComponent.cs @@ -55,28 +55,35 @@ namespace Content.Shared.Kitchen [Serializable, NetSerializable] public class MicrowaveSelectCookTimeMessage : BoundUserInterfaceMessage { - public uint newCookTime; - public MicrowaveSelectCookTimeMessage(uint inputTime) + public int ButtonIndex; + public uint NewCookTime; + public MicrowaveSelectCookTimeMessage(int buttonIndex, uint inputTime) { - newCookTime = inputTime; + ButtonIndex = buttonIndex; + NewCookTime = inputTime; } } } - - [NetSerializable, Serializable] public class MicrowaveUpdateUserInterfaceState : BoundUserInterfaceState { - public readonly IReadOnlyList ReagentsReagents; - public readonly List ContainedSolids; + public Solution.ReagentQuantity[] ReagentQuantities; + public EntityUid[] ContainedSolids; public bool IsMicrowaveBusy; - public MicrowaveUpdateUserInterfaceState(IReadOnlyList reagents, List solids, bool busyStatus) + public int ActiveButtonIndex; + public uint CurrentCookTime; + + public MicrowaveUpdateUserInterfaceState(Solution.ReagentQuantity[] reagents, EntityUid[] containedSolids, + bool isMicrowaveBusy, int activeButtonIndex, uint currentCookTime) { - ReagentsReagents = reagents; - ContainedSolids = solids; - IsMicrowaveBusy = busyStatus; + ReagentQuantities = reagents; + ContainedSolids = containedSolids; + IsMicrowaveBusy = isMicrowaveBusy; + ActiveButtonIndex = activeButtonIndex; + CurrentCookTime = currentCookTime; } + } [Serializable, NetSerializable] diff --git a/Resources/Prototypes/Entities/kitchen.yml b/Resources/Prototypes/Entities/kitchen.yml index e615972cde..7d2f69b370 100644 --- a/Resources/Prototypes/Entities/kitchen.yml +++ b/Resources/Prototypes/Entities/kitchen.yml @@ -24,7 +24,7 @@ - type: Collidable shapes: - !type:PhysShapeAabb - bounds: "-0.25,-0.4,0.25,0.4" + bounds: "-0.16,-0.3,0.16,0.3" layer: - Opaque - Impassable @@ -34,12 +34,14 @@ - type: Sprite netsync: false sprite: Objects/Kitchen/microwave.rsi + drawdepth: Items layers: - state: mw0 map: ["enum.MicrowaveVisualizerLayers.Base"] - state: mw_unlit shader: unshaded map: ["enum.MicrowaveVisualizerLayers.BaseUnlit"] + - type: PowerDevice - type: Icon sprite: Objects/Kitchen/microwave.rsi diff --git a/Resources/Prototypes/Kitchen/meal_recipes.yml b/Resources/Prototypes/Kitchen/meal_recipes.yml index 2b01387c45..766e0a89bd 100644 --- a/Resources/Prototypes/Kitchen/meal_recipes.yml +++ b/Resources/Prototypes/Kitchen/meal_recipes.yml @@ -10,6 +10,16 @@ solids: FoodMeat: 1 +- type: microwaveMealRecipe + id: RecipeClownBurger + name: Clownburger Recipe + result: FoodClownBurger + time: 5 + reagents: + chem.Flour: 5 + solids: + MaskClown: 1 + - type: microwaveMealRecipe id: RecipeTofuBurger name: Tofu Burger Recipe