From 46317f1e7fa965d39260958895d6bd863e9485fd Mon Sep 17 00:00:00 2001 From: Ottermandias Date: Tue, 25 Jul 2023 14:36:20 +0200 Subject: [PATCH] Don't apply old glamourer designs to non-humans. --- Glamourer/Api/GlamourerIpc.Apply.cs | 17 +++++++++-------- Glamourer/Designs/DesignConverter.cs | 11 ++++++----- Glamourer/Gui/Tabs/ActorTab/ActorPanel.cs | 2 +- Glamourer/Gui/Tabs/DebugTab.cs | 2 +- .../Tabs/DesignTab/DesignFileSystemSelector.cs | 2 +- Glamourer/Gui/Tabs/DesignTab/DesignPanel.cs | 2 +- 6 files changed, 19 insertions(+), 17 deletions(-) diff --git a/Glamourer/Api/GlamourerIpc.Apply.cs b/Glamourer/Api/GlamourerIpc.Apply.cs index efc203c..8ffa0f6 100644 --- a/Glamourer/Api/GlamourerIpc.Apply.cs +++ b/Glamourer/Api/GlamourerIpc.Apply.cs @@ -45,28 +45,29 @@ public partial class GlamourerIpc public void ApplyAll(string base64, string characterName) - => ApplyDesign(_designConverter.FromBase64(base64, true, true), FindActors(characterName)); + => ApplyDesign(_designConverter.FromBase64(base64, true, true, out var version), FindActors(characterName), version); public void ApplyAllToCharacter(string base64, Character? character) - => ApplyDesign(_designConverter.FromBase64(base64, true, true), FindActors(character)); + => ApplyDesign(_designConverter.FromBase64(base64, true, true, out var version), FindActors(character), version); public void ApplyOnlyEquipment(string base64, string characterName) - => ApplyDesign(_designConverter.FromBase64(base64, false, true), FindActors(characterName)); + => ApplyDesign(_designConverter.FromBase64(base64, false, true, out var version), FindActors(characterName), version); public void ApplyOnlyEquipmentToCharacter(string base64, Character? character) - => ApplyDesign(_designConverter.FromBase64(base64, false, true), FindActors(character)); + => ApplyDesign(_designConverter.FromBase64(base64, false, true, out var version), FindActors(character), version); public void ApplyOnlyCustomization(string base64, string characterName) - => ApplyDesign(_designConverter.FromBase64(base64, true, false), FindActors(characterName)); + => ApplyDesign(_designConverter.FromBase64(base64, true, false, out var version), FindActors(characterName), version); public void ApplyOnlyCustomizationToCharacter(string base64, Character? character) - => ApplyDesign(_designConverter.FromBase64(base64, true, false), FindActors(character)); + => ApplyDesign(_designConverter.FromBase64(base64, true, false, out var version), FindActors(character), version); - private void ApplyDesign(DesignBase? design, IEnumerable actors) + private void ApplyDesign(DesignBase? design, IEnumerable actors, byte version) { if (design == null) return; + var hasModelId = version >= 3; _objects.Update(); foreach (var id in actors) { @@ -77,7 +78,7 @@ public partial class GlamourerIpc continue; } - if (state.CanUnlock(0xDEADBEEF)) + if ((hasModelId || state.ModelData.ModelId == 0) &&state.CanUnlock(0xDEADBEEF)) { _stateManager.ApplyDesign(design, state, StateChanged.Source.Ipc, 0xDEADBEEF); state.Lock(0xDEADBEEF); diff --git a/Glamourer/Designs/DesignConverter.cs b/Glamourer/Designs/DesignConverter.cs index 3b88500..df2a201 100644 --- a/Glamourer/Designs/DesignConverter.cs +++ b/Glamourer/Designs/DesignConverter.cs @@ -61,14 +61,15 @@ public class DesignConverter return design; } - public DesignBase? FromBase64(string base64, bool customize, bool equip) + public DesignBase? FromBase64(string base64, bool customize, bool equip, out byte version) { - var bytes = System.Convert.FromBase64String(base64); - DesignBase ret; + version = 0; try { - switch (bytes[0]) + var bytes = System.Convert.FromBase64String(base64); + version = bytes[0]; + switch (version) { case (byte)'{': var jObj1 = JObject.Parse(Encoding.UTF8.GetString(bytes)); @@ -82,7 +83,7 @@ public class DesignConverter ret.MigrateBase64(_customize, _items, base64); break; case Version: - var version = bytes.DecompressToString(out var decompressed); + version = bytes.DecompressToString(out var decompressed); var jObj2 = JObject.Parse(decompressed); Debug.Assert(version == Version); ret = jObj2["Identifier"] != null diff --git a/Glamourer/Gui/Tabs/ActorTab/ActorPanel.cs b/Glamourer/Gui/Tabs/ActorTab/ActorPanel.cs index cde10a7..7ad83a3 100644 --- a/Glamourer/Gui/Tabs/ActorTab/ActorPanel.cs +++ b/Glamourer/Gui/Tabs/ActorTab/ActorPanel.cs @@ -316,7 +316,7 @@ public class ActorPanel try { var text = ImGui.GetClipboardText(); - var design = _converter.FromBase64(text, true, true) ?? throw new Exception("The clipboard did not contain valid data."); + var design = _converter.FromBase64(text, true, true, out _) ?? throw new Exception("The clipboard did not contain valid data."); _stateManager.ApplyDesign(design, _state!, StateChanged.Source.Manual); } catch (Exception ex) diff --git a/Glamourer/Gui/Tabs/DebugTab.cs b/Glamourer/Gui/Tabs/DebugTab.cs index 8392b57..f4b966c 100644 --- a/Glamourer/Gui/Tabs/DebugTab.cs +++ b/Glamourer/Gui/Tabs/DebugTab.cs @@ -1038,7 +1038,7 @@ public unsafe class DebugTab : ITab _version = _clipboardData.Decompress(out _dataUncompressed); _textUncompressed = Encoding.UTF8.GetString(_dataUncompressed); _json = JObject.Parse(_textUncompressed); - _tmpDesign = _designConverter.FromBase64(_clipboardText, true, true); + _tmpDesign = _designConverter.FromBase64(_clipboardText, true, true, out _); } catch (Exception ex) { diff --git a/Glamourer/Gui/Tabs/DesignTab/DesignFileSystemSelector.cs b/Glamourer/Gui/Tabs/DesignTab/DesignFileSystemSelector.cs index 02c9750..110f256 100644 --- a/Glamourer/Gui/Tabs/DesignTab/DesignFileSystemSelector.cs +++ b/Glamourer/Gui/Tabs/DesignTab/DesignFileSystemSelector.cs @@ -178,7 +178,7 @@ public sealed class DesignFileSystemSelector : FileSystemSelector