diff --git a/Content.Client/UserInterface/CharacterSetupGui.cs b/Content.Client/UserInterface/CharacterSetupGui.cs index 631e5ad55a..d93c8b7a59 100644 --- a/Content.Client/UserInterface/CharacterSetupGui.cs +++ b/Content.Client/UserInterface/CharacterSetupGui.cs @@ -149,7 +149,7 @@ namespace Content.Client.UserInterface PanelOverride = new StyleBoxFlat {BackgroundColor = StyleNano.NanoGold}, CustomMinimumSize = (2, 0) }); - _humanoidProfileEditor = new HumanoidProfileEditor(preferencesManager, prototypeManager); + _humanoidProfileEditor = new HumanoidProfileEditor(preferencesManager, prototypeManager, entityManager); _humanoidProfileEditor.OnProfileChanged += newProfile => { UpdateUI(); }; hBox.AddChild(_humanoidProfileEditor); @@ -158,6 +158,15 @@ namespace Content.Client.UserInterface preferencesManager.OnServerDataLoaded += UpdateUI; } + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + if (!disposing) + return; + + _preferencesManager.OnServerDataLoaded -= UpdateUI; + } + public void Save() => _humanoidProfileEditor.Save(); private void UpdateUI() @@ -283,7 +292,9 @@ namespace Content.Client.UserInterface protected override void Dispose(bool disposing) { base.Dispose(disposing); - if (!disposing) return; + if (!disposing) + return; + _previewDummy.Delete(); _previewDummy = null; } diff --git a/Content.Client/UserInterface/HumanoidProfileEditor.cs b/Content.Client/UserInterface/HumanoidProfileEditor.cs index 8aa4d74254..b6aca525ae 100644 --- a/Content.Client/UserInterface/HumanoidProfileEditor.cs +++ b/Content.Client/UserInterface/HumanoidProfileEditor.cs @@ -1,22 +1,25 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Content.Client.GameObjects.Components; +using Content.Client.GameObjects.Components; +using Content.Client.GameObjects.Components.Mobs; using Content.Client.Interfaces; -using Content.Shared; using Content.Shared.GameTicking; using Content.Shared.Preferences; using Content.Shared.Roles; +using Robust.Client.GameObjects; using Robust.Client.Graphics.Drawing; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; using Robust.Client.Utility; +using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Interfaces.Random; using Robust.Shared.IoC; using Robust.Shared.Localization; +using Robust.Shared.Map; using Robust.Shared.Maths; using Robust.Shared.Prototypes; using Robust.Shared.Utility; +using System; +using System.Collections.Generic; +using System.Linq; namespace Content.Client.UserInterface { @@ -43,17 +46,25 @@ namespace Content.Client.UserInterface private readonly OptionButton _preferenceUnavailableButton; private readonly List _antagPreferences; + private readonly IEntity _previewDummy; + private readonly SpriteView _previewSprite; + private readonly SpriteView _previewSpriteSide; + private bool _isDirty; public int CharacterSlot; public HumanoidCharacterProfile Profile; public event Action OnProfileChanged; - public HumanoidProfileEditor(IClientPreferencesManager preferencesManager, IPrototypeManager prototypeManager) + public HumanoidProfileEditor(IClientPreferencesManager preferencesManager, IPrototypeManager prototypeManager, IEntityManager entityManager) { _random = IoCManager.Resolve(); _preferencesManager = preferencesManager; + var hbox = new HBoxContainer(); + AddChild(hbox); + + #region Left var margin = new MarginContainer { MarginTopOverride = 10, @@ -61,7 +72,7 @@ namespace Content.Client.UserInterface MarginLeftOverride = 10, MarginRightOverride = 10 }; - AddChild(margin); + hbox.AddChild(margin); var vBox = new VBoxContainer(); margin.AddChild(vBox); @@ -98,7 +109,7 @@ namespace Content.Client.UserInterface { SizeFlagsVertical = SizeFlags.FillExpand }; - var nameLabel = new Label {Text = Loc.GetString("Name:")}; + var nameLabel = new Label { Text = Loc.GetString("Name:") }; _nameEdit = new LineEdit { CustomMinimumSize = (270, 0), @@ -119,7 +130,7 @@ namespace Content.Client.UserInterface #endregion Name - var tabContainer = new TabContainer {SizeFlagsVertical = SizeFlags.FillExpand}; + var tabContainer = new TabContainer { SizeFlagsVertical = SizeFlags.FillExpand }; vBox.AddChild(tabContainer); #region Appearance @@ -141,7 +152,7 @@ namespace Content.Client.UserInterface { var panel = HighlightedContainer(); var hBox = new HBoxContainer(); - var sexLabel = new Label {Text = Loc.GetString("Sex:")}; + var sexLabel = new Label { Text = Loc.GetString("Sex:") }; var sexButtonGroup = new ButtonGroup(); @@ -171,8 +182,8 @@ namespace Content.Client.UserInterface { var panel = HighlightedContainer(); var hBox = new HBoxContainer(); - var ageLabel = new Label {Text = Loc.GetString("Age:")}; - _ageEdit = new LineEdit {CustomMinimumSize = (40, 0)}; + var ageLabel = new Label { Text = Loc.GetString("Age:") }; + _ageEdit = new LineEdit { CustomMinimumSize = (40, 0) }; _ageEdit.OnTextChanged += args => { if (!int.TryParse(args.Text, out var newAge)) @@ -348,7 +359,7 @@ namespace Content.Client.UserInterface foreach (var antag in prototypeManager.EnumeratePrototypes().OrderBy(a => a.Name)) { - if(!antag.SetPreference) + if (!antag.SetPreference) { continue; } @@ -410,6 +421,71 @@ namespace Content.Client.UserInterface #endregion Save + #endregion + + #region Right + + margin = new MarginContainer + { + MarginTopOverride = 10, + MarginBottomOverride = 10, + MarginLeftOverride = 10, + MarginRightOverride = 10 + }; + hbox.AddChild(margin); + + vBox = new VBoxContainer() + { + SizeFlagsVertical = SizeFlags.FillExpand, + SizeFlagsHorizontal = SizeFlags.FillExpand, + }; + hbox.AddChild(vBox); + + #region Preview + + _previewDummy = entityManager.SpawnEntity("HumanMob_Dummy", MapCoordinates.Nullspace); + var sprite = _previewDummy.GetComponent(); + + // Front + var box = new Control() + { + SizeFlagsHorizontal = SizeFlags.Fill, + SizeFlagsVertical = SizeFlags.FillExpand, + SizeFlagsStretchRatio = 1f, + }; + vBox.AddChild(box); + _previewSprite = new SpriteView + { + Sprite = sprite, + Scale = (6, 6), + OverrideDirection = Direction.South, + SizeFlagsVertical = SizeFlags.ShrinkCenter, + SizeFlagsStretchRatio = 1 + }; + box.AddChild(_previewSprite); + + // Side + box = new Control() + { + SizeFlagsHorizontal = SizeFlags.Fill, + SizeFlagsVertical = SizeFlags.FillExpand, + SizeFlagsStretchRatio = 1f, + }; + vBox.AddChild(box); + _previewSpriteSide = new SpriteView + { + Sprite = sprite, + Scale = (6, 6), + OverrideDirection = Direction.East, + SizeFlagsVertical = SizeFlags.ShrinkCenter, + SizeFlagsStretchRatio = 1 + }; + box.AddChild(_previewSpriteSide); + + #endregion + + #endregion + if (preferencesManager.ServerDataLoaded) { LoadServerData(); @@ -420,6 +496,16 @@ namespace Content.Client.UserInterface IsDirty = false; } + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + if (!disposing) + return; + + _previewDummy.Delete(); + _preferencesManager.OnServerDataLoaded -= LoadServerData; + } + private void LoadServerData() { Profile = (HumanoidCharacterProfile) _preferencesManager.Preferences.SelectedCharacter; @@ -458,6 +544,7 @@ namespace Content.Client.UserInterface set { _isDirty = value; + UpdatePreview(); UpdateSaveButton(); } } @@ -503,6 +590,12 @@ namespace Content.Client.UserInterface _saveButton.Disabled = Profile is null || !IsDirty; } + private void UpdatePreview() + { + _previewDummy.GetComponent().UpdateFromProfile(Profile); + LobbyCharacterPreviewPanel.GiveDummyJobClothes(_previewDummy, Profile); + } + public void UpdateControls() { if (Profile is null) return; @@ -514,6 +607,8 @@ namespace Content.Client.UserInterface UpdateJobPriorities(); UpdateAntagPreferences(); + UpdatePreview(); + _preferenceUnavailableButton.SelectId((int) Profile.PreferenceUnavailable); }