From 9c2aaef73a28a5a599e133cfb8739530a1478fa4 Mon Sep 17 00:00:00 2001 From: Vera Aguilera Puerto <6766154+Zumorica@users.noreply.github.com> Date: Sun, 3 Jan 2021 17:20:17 +0100 Subject: [PATCH] Makes accept cloning message use Eui (#2910) --- .../AcceptCloningBoundUserInterface.cs | 45 ------------------- .../Components/Observer/AcceptCloningEui.cs | 41 +++++++++++++++++ .../{ => Observer}/AcceptCloningWindow.cs | 18 +++++--- .../Components/Medical/CloningPodComponent.cs | 19 +++----- .../Medical/MedicalScannerComponent.cs | 14 ++---- .../Components/Mobs/MindComponent.cs | 42 ----------------- .../Components/Observer/AcceptCloningEui.cs | 38 ++++++++++++++++ .../ChemMaster/SharedChemMasterComponent.cs | 4 +- .../Observer/AcceptCloningEuiMessage.cs | 24 ++++++++++ .../SharedAcceptCloningComponent.cs | 36 --------------- .../Entities/Mobs/Species/human.yml | 2 - 11 files changed, 129 insertions(+), 154 deletions(-) delete mode 100644 Content.Client/GameObjects/Components/AcceptCloningBoundUserInterface.cs create mode 100644 Content.Client/GameObjects/Components/Observer/AcceptCloningEui.cs rename Content.Client/GameObjects/Components/{ => Observer}/AcceptCloningWindow.cs (71%) create mode 100644 Content.Server/GameObjects/Components/Observer/AcceptCloningEui.cs create mode 100644 Content.Shared/GameObjects/Components/Observer/AcceptCloningEuiMessage.cs delete mode 100644 Content.Shared/GameObjects/Components/SharedAcceptCloningComponent.cs diff --git a/Content.Client/GameObjects/Components/AcceptCloningBoundUserInterface.cs b/Content.Client/GameObjects/Components/AcceptCloningBoundUserInterface.cs deleted file mode 100644 index 9b38059110..0000000000 --- a/Content.Client/GameObjects/Components/AcceptCloningBoundUserInterface.cs +++ /dev/null @@ -1,45 +0,0 @@ -using Content.Shared.GameObjects.Components; -using JetBrains.Annotations; -using Robust.Client.GameObjects.Components.UserInterface; - -namespace Content.Client.GameObjects.Components -{ - [UsedImplicitly] - public class AcceptCloningBoundUserInterface : BoundUserInterface - { - - public AcceptCloningBoundUserInterface(ClientUserInterfaceComponent owner, object uiKey) : base(owner, uiKey) - { - } - - private AcceptCloningWindow _window; - - protected override void Open() - { - base.Open(); - - _window = new AcceptCloningWindow(); - _window.OnClose += Close; - _window.DenyButton.OnPressed += _ => _window.Close(); - _window.ConfirmButton.OnPressed += _ => - { - SendMessage( - new SharedAcceptCloningComponent.UiButtonPressedMessage( - SharedAcceptCloningComponent.UiButton.Accept)); - _window.Close(); - }; - _window.OpenCentered(); - } - - protected override void Dispose(bool disposing) - { - base.Dispose(disposing); - - if (disposing) - { - _window?.Dispose(); - } - } - - } -} diff --git a/Content.Client/GameObjects/Components/Observer/AcceptCloningEui.cs b/Content.Client/GameObjects/Components/Observer/AcceptCloningEui.cs new file mode 100644 index 0000000000..f274871f46 --- /dev/null +++ b/Content.Client/GameObjects/Components/Observer/AcceptCloningEui.cs @@ -0,0 +1,41 @@ +using Content.Client.Eui; +using Content.Shared.GameObjects.Components.Medical; +using Content.Shared.GameObjects.Components.Observer; +using JetBrains.Annotations; + +namespace Content.Client.GameObjects.Components.Observer +{ + [UsedImplicitly] + public class AcceptCloningEui : BaseEui + { + private readonly AcceptCloningWindow _window; + + public AcceptCloningEui() + { + _window = new AcceptCloningWindow(); + + _window.DenyButton.OnPressed += _ => + { + SendMessage(new AcceptCloningChoiceMessage(AcceptCloningUiButton.Deny)); + _window.Close(); + }; + + _window.AcceptButton.OnPressed += _ => + { + SendMessage(new AcceptCloningChoiceMessage(AcceptCloningUiButton.Accept)); + _window.Close(); + }; + } + + public override void Opened() + { + _window.OpenCentered(); + } + + public override void Closed() + { + _window.Close(); + } + + } +} diff --git a/Content.Client/GameObjects/Components/AcceptCloningWindow.cs b/Content.Client/GameObjects/Components/Observer/AcceptCloningWindow.cs similarity index 71% rename from Content.Client/GameObjects/Components/AcceptCloningWindow.cs rename to Content.Client/GameObjects/Components/Observer/AcceptCloningWindow.cs index 1731cc9676..ef1f39b881 100644 --- a/Content.Client/GameObjects/Components/AcceptCloningWindow.cs +++ b/Content.Client/GameObjects/Components/Observer/AcceptCloningWindow.cs @@ -1,14 +1,15 @@ #nullable enable +using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; using Robust.Shared.Localization; -namespace Content.Client.GameObjects.Components +namespace Content.Client.GameObjects.Components.Observer { public sealed class AcceptCloningWindow : SS14Window { public readonly Button DenyButton; - public readonly Button ConfirmButton; + public readonly Button AcceptButton; public AcceptCloningWindow() { @@ -23,18 +24,25 @@ namespace Content.Client.GameObjects.Components { Children = { - (new Label + (new Label() { - Text = Loc.GetString("You are being cloned! Transfer your soul to the clone body?") + Text = Loc.GetString("You are being cloned!\nTransfer your soul to the clone body?") }), new HBoxContainer { + Align = BoxContainer.AlignMode.Center, Children = { - (ConfirmButton = new Button + (AcceptButton = new Button { Text = Loc.GetString("Yes"), }), + + (new Control() + { + CustomMinimumSize = (20, 0) + }), + (DenyButton = new Button { Text = Loc.GetString("No"), diff --git a/Content.Server/GameObjects/Components/Medical/CloningPodComponent.cs b/Content.Server/GameObjects/Components/Medical/CloningPodComponent.cs index eea9446d34..dc56625e60 100644 --- a/Content.Server/GameObjects/Components/Medical/CloningPodComponent.cs +++ b/Content.Server/GameObjects/Components/Medical/CloningPodComponent.cs @@ -1,5 +1,6 @@ #nullable enable using System; +using Content.Server.Eui; using Content.Server.GameObjects.Components.Mobs; using Content.Server.GameObjects.Components.Observer; using Content.Server.GameObjects.Components.Power.ApcNetComponents; @@ -35,6 +36,7 @@ namespace Content.Server.GameObjects.Components.Medical { [Dependency] private readonly IServerPreferencesManager _prefsManager = null!; [Dependency] private readonly IPlayerManager _playerManager = null!; + [Dependency] private readonly EuiManager _euiManager = null!; [ViewVariables] private bool Powered => !Owner.TryGetComponent(out PowerReceiverComponent? receiver) || receiver.Powered; @@ -179,9 +181,11 @@ namespace Content.Server.GameObjects.Components.Medical _bodyContainer.Insert(mob); _capturedMind = mind; - Owner.EntityManager.EventBus.RaiseEvent(EventSource.Local, - new CloningStartedMessage(_capturedMind)); _status = CloningPodStatus.NoMind; + + var acceptMessage = new AcceptCloningEui(mob); + _euiManager.OpenEui(acceptMessage, client); + UpdateAppearance(); break; @@ -201,17 +205,6 @@ namespace Content.Server.GameObjects.Components.Medical } } - public class CloningStartedMessage : EntitySystemMessage - { - public CloningStartedMessage(Mind capturedMind) - { - CapturedMind = capturedMind; - } - - public Mind CapturedMind { get; } - } - - private HumanoidCharacterProfile GetPlayerProfileAsync(NetUserId userId) { return (HumanoidCharacterProfile) _prefsManager.GetPreferences(userId).SelectedCharacter; diff --git a/Content.Server/GameObjects/Components/Medical/MedicalScannerComponent.cs b/Content.Server/GameObjects/Components/Medical/MedicalScannerComponent.cs index 8013453635..b5c5f8d9ee 100644 --- a/Content.Server/GameObjects/Components/Medical/MedicalScannerComponent.cs +++ b/Content.Server/GameObjects/Components/Medical/MedicalScannerComponent.cs @@ -38,7 +38,6 @@ namespace Content.Server.GameObjects.Components.Medical public class MedicalScannerComponent : SharedMedicalScannerComponent, IActivate, IDragDropOn, IDestroyAct { [Dependency] private readonly IGameTiming _gameTiming = default!; - [Dependency] private readonly IPlayerManager _playerManager = null!; private static readonly TimeSpan InternalOpenAttemptDelay = TimeSpan.FromSeconds(0.5); private TimeSpan _lastInternalOpenAttempt; @@ -280,16 +279,11 @@ namespace Content.Server.GameObjects.Components.Medical { //TODO: Show a 'ERROR: Body is completely devoid of soul' if no Mind owns the entity. var cloningSystem = EntitySystem.Get(); - cloningSystem.AddToDnaScans(_playerManager - .GetPlayersBy(playerSession => - { - var mindOwnedMob = playerSession.ContentData()?.Mind?.OwnedEntity; - return mindOwnedMob != null && mindOwnedMob == - _bodyContainer.ContainedEntity; - }).Single() - .ContentData() - ?.Mind); + if (!_bodyContainer.ContainedEntity.TryGetComponent(out MindComponent? mind) || !mind.HasMind) + break; + + cloningSystem.AddToDnaScans(mind.Mind); } break; diff --git a/Content.Server/GameObjects/Components/Mobs/MindComponent.cs b/Content.Server/GameObjects/Components/Mobs/MindComponent.cs index 76640dd2bf..649bee206f 100644 --- a/Content.Server/GameObjects/Components/Mobs/MindComponent.cs +++ b/Content.Server/GameObjects/Components/Mobs/MindComponent.cs @@ -59,48 +59,6 @@ namespace Content.Server.GameObjects.Components.Mobs [ViewVariables(VVAccess.ReadWrite)] public bool GhostOnShutdown { get; set; } - [ViewVariables] - private BoundUserInterface? UserInterface => - Owner.GetUIOrNull(SharedAcceptCloningComponent.AcceptCloningUiKey.Key); - - - public override void Initialize() - { - base.Initialize(); - Owner.EntityManager.EventBus.SubscribeEvent( - EventSource.Local, this, - HandleCloningStartedMessage); - - if (UserInterface != null) - { - UserInterface.OnReceiveMessage += OnUiAcceptCloningMessage; - } - } - - private void HandleCloningStartedMessage(CloningPodComponent.CloningStartedMessage ev) - { - if (ev.CapturedMind == Mind) - { - UserInterface?.Open(Mind.Session); - } - } - - private void OnUiAcceptCloningMessage(ServerBoundUserInterfaceMessage obj) - { - if (obj.Message is not SharedAcceptCloningComponent.UiButtonPressedMessage) return; - if (Mind != null) - { - Owner.EntityManager.EventBus.RaiseEvent(EventSource.Local, new GhostComponent.GhostReturnMessage(Mind)); - } - } - - public override void OnRemove() - { - base.OnRemove(); - Owner.EntityManager.EventBus.UnsubscribeEvent(EventSource.Local, this); - if (UserInterface != null) UserInterface.OnReceiveMessage -= OnUiAcceptCloningMessage; - } - /// /// Don't call this unless you know what the hell you're doing. /// Use instead. diff --git a/Content.Server/GameObjects/Components/Observer/AcceptCloningEui.cs b/Content.Server/GameObjects/Components/Observer/AcceptCloningEui.cs new file mode 100644 index 0000000000..fda157ed76 --- /dev/null +++ b/Content.Server/GameObjects/Components/Observer/AcceptCloningEui.cs @@ -0,0 +1,38 @@ +#nullable enable +using Content.Server.Eui; +using Content.Server.GameObjects.Components.Mobs; +using Content.Server.Players; +using Content.Shared.Eui; +using Content.Shared.GameObjects.Components.Observer; +using Robust.Server.Interfaces.Player; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Log; + +namespace Content.Server.GameObjects.Components.Observer +{ + public class AcceptCloningEui : BaseEui + { + private readonly IEntity _newMob; + + public AcceptCloningEui(IEntity newMob) + { + _newMob = newMob; + } + + public override void HandleMessage(EuiMessageBase msg) + { + base.HandleMessage(msg); + + if (msg is not AcceptCloningChoiceMessage choice + || choice.Button == AcceptCloningUiButton.Deny + || _newMob.Deleted) + { + Close(); + return; + } + + Player.ContentData()?.Mind?.TransferTo(_newMob); + Close(); + } + } +} diff --git a/Content.Shared/GameObjects/Components/Chemistry/ChemMaster/SharedChemMasterComponent.cs b/Content.Shared/GameObjects/Components/Chemistry/ChemMaster/SharedChemMasterComponent.cs index 43d1584381..8aed76f83b 100644 --- a/Content.Shared/GameObjects/Components/Chemistry/ChemMaster/SharedChemMasterComponent.cs +++ b/Content.Shared/GameObjects/Components/Chemistry/ChemMaster/SharedChemMasterComponent.cs @@ -2,6 +2,8 @@ using System; using System.Collections.Generic; using Content.Shared.Chemistry; +using Content.Shared.GameObjects.Components.Medical; +using Content.Shared.GameObjects.Components.Observer; using Robust.Shared.GameObjects; using Robust.Shared.GameObjects.Components.UserInterface; using Robust.Shared.Serialization; @@ -102,7 +104,7 @@ namespace Content.Shared.GameObjects.Components.Chemistry.ChemMaster } /// - /// Used in to specify which button was pressed. + /// Used in to specify which button was pressed. /// public enum UiAction { diff --git a/Content.Shared/GameObjects/Components/Observer/AcceptCloningEuiMessage.cs b/Content.Shared/GameObjects/Components/Observer/AcceptCloningEuiMessage.cs new file mode 100644 index 0000000000..64bedec346 --- /dev/null +++ b/Content.Shared/GameObjects/Components/Observer/AcceptCloningEuiMessage.cs @@ -0,0 +1,24 @@ +using System; +using Content.Shared.Eui; +using Robust.Shared.Serialization; + +namespace Content.Shared.GameObjects.Components.Observer +{ + [Serializable, NetSerializable] + public enum AcceptCloningUiButton + { + Deny, + Accept, + } + + [Serializable, NetSerializable] + public class AcceptCloningChoiceMessage : EuiMessageBase + { + public readonly AcceptCloningUiButton Button; + + public AcceptCloningChoiceMessage(AcceptCloningUiButton button) + { + Button = button; + } + } +} diff --git a/Content.Shared/GameObjects/Components/SharedAcceptCloningComponent.cs b/Content.Shared/GameObjects/Components/SharedAcceptCloningComponent.cs deleted file mode 100644 index 94383004c5..0000000000 --- a/Content.Shared/GameObjects/Components/SharedAcceptCloningComponent.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using Robust.Shared.GameObjects; -using Robust.Shared.GameObjects.Components.UserInterface; -using Robust.Shared.Serialization; - -namespace Content.Shared.GameObjects.Components -{ - public class SharedAcceptCloningComponent : Component - { - public override string Name => "AcceptCloning"; - - [Serializable, NetSerializable] - public enum AcceptCloningUiKey - { - Key - } - - [Serializable, NetSerializable] - public enum UiButton - { - Accept - } - - [Serializable, NetSerializable] - public class UiButtonPressedMessage : BoundUserInterfaceMessage - { - public readonly UiButton Button; - - public UiButtonPressedMessage(UiButton button) - { - Button = button; - } - } - - } -} diff --git a/Resources/Prototypes/Entities/Mobs/Species/human.yml b/Resources/Prototypes/Entities/Mobs/Species/human.yml index eea4b34452..1837d88b4c 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/human.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/human.yml @@ -195,8 +195,6 @@ interfaces: - key: enum.StrippingUiKey.Key type: StrippableBoundUserInterface - - key: enum.AcceptCloningUiKey.Key - type: AcceptCloningBoundUserInterface - type: Puller - type: Butcherable meat: FoodMeat