diff --git a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs b/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs index dcfd38ad77..7f75a3bb70 100644 --- a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs +++ b/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs @@ -79,9 +79,15 @@ namespace Content.Client.Preferences.UI private readonly List _speciesList; private readonly List _antagPreferences; - private EntityUid _previewDummy; private Control _previewSpriteControl => CSpriteViewFront; private Control _previewSpriteSideControl => CSpriteViewSide; + + private EntityUid? _previewDummy; + + /// + /// Used to avoid unnecessarily re-creating the entity. + /// + private string? _lastSpecies; private SpriteView? _previewSprite; private SpriteView? _previewSpriteSide; @@ -487,42 +493,63 @@ namespace Content.Client.Preferences.UI if (!disposing) return; - _entMan.DeleteEntity(_previewDummy); + if (_previewDummy != null) + _entMan.DeleteEntity(_previewDummy.Value); + _preferencesManager.OnServerDataLoaded -= LoadServerData; } private void RebuildSpriteView() { - var dollProto = _prototypeManager.Index(Profile?.Species ?? SpeciesManager.DefaultSpecies).DollPrototype; - _previewDummy = _entMan.SpawnEntity(dollProto, MapCoordinates.Nullspace); + var species = Profile?.Species ?? SpeciesManager.DefaultSpecies; - var sprite = _entMan.GetComponent(_previewDummy); - - _previewSpriteControl.DisposeAllChildren(); - - // Front - _previewSprite = new SpriteView + if (_lastSpecies != species) { - Sprite = sprite, - Scale = (6, 6), - OverrideDirection = Direction.South, - VerticalAlignment = VAlignment.Center, - SizeFlagsStretchRatio = 1 - }; - _previewSpriteControl.AddChild(_previewSprite); + var dollProto = _prototypeManager.Index(species).DollPrototype; - _previewSpriteSideControl.DisposeAllChildren(); + if (_previewDummy != null) + _entMan.DeleteEntity(_previewDummy!.Value); - // Side - _previewSpriteSide = new SpriteView + _previewDummy = _entMan.SpawnEntity(dollProto, MapCoordinates.Nullspace); + _lastSpecies = species; + } + + var sprite = _entMan.GetComponent(_previewDummy!.Value); + + if (_previewSprite == null) { - Sprite = sprite, - Scale = (6, 6), - OverrideDirection = Direction.East, - VerticalAlignment = VAlignment.Center, - SizeFlagsStretchRatio = 1 - }; - _previewSpriteSideControl.AddChild(_previewSpriteSide); + // Front + _previewSprite = new SpriteView + { + Sprite = sprite, + Scale = (6, 6), + OverrideDirection = Direction.South, + VerticalAlignment = VAlignment.Center, + SizeFlagsStretchRatio = 1 + }; + _previewSpriteControl.AddChild(_previewSprite); + } + else + { + _previewSprite.Sprite = sprite; + } + + if (_previewSpriteSide == null) + { + _previewSpriteSide = new SpriteView + { + Sprite = sprite, + Scale = (6, 6), + OverrideDirection = Direction.East, + VerticalAlignment = VAlignment.Center, + SizeFlagsStretchRatio = 1 + }; + _previewSpriteSideControl.AddChild(_previewSpriteSide); + } + else + { + _previewSpriteSide.Sprite = sprite; + } } private void LoadServerData() @@ -732,8 +759,8 @@ namespace Content.Client.Preferences.UI return; RebuildSpriteView(); - EntitySystem.Get().UpdateFromProfile(_previewDummy, Profile); - LobbyCharacterPreviewPanel.GiveDummyJobClothes(_previewDummy, Profile); + EntitySystem.Get().UpdateFromProfile(_previewDummy!.Value, Profile); + LobbyCharacterPreviewPanel.GiveDummyJobClothes(_previewDummy!.Value, Profile); } public void UpdateControls()