From 5e6f797af472ae0f019f318753fe2791401402b0 Mon Sep 17 00:00:00 2001 From: Ottermandias Date: Wed, 21 Jun 2023 01:01:41 +0200 Subject: [PATCH] . --- Glamourer/Designs/Design.cs | 68 +++++++++++++++++++++- Glamourer/Designs/DesignBase64Migration.cs | 6 +- Glamourer/State/StateManager.cs | 3 +- 3 files changed, 69 insertions(+), 8 deletions(-) diff --git a/Glamourer/Designs/Design.cs b/Glamourer/Designs/Design.cs index bba2ab6..aacf603 100644 --- a/Glamourer/Designs/Design.cs +++ b/Glamourer/Designs/Design.cs @@ -35,6 +35,46 @@ public class Design : ISavable internal DesignData DesignData; + /// Unconditionally apply a design to a designdata. + /// Whether a redraw is required for the changes to take effect. + public bool ApplyDesign(ref DesignData data) + { + var modelChanged = data.ModelId != DesignData.ModelId; + data.ModelId = DesignData.ModelId; + + CustomizeFlag customizeFlags = 0; + foreach (var index in Enum.GetValues()) + { + if (!DoApplyCustomize(index)) + continue; + + if (data.Customize.Set(index, DesignData.Customize[index])) + customizeFlags |= index.ToFlag(); + } + + foreach (var slot in EquipSlotExtensions.EqdpSlots.Append(EquipSlot.MainHand).Append(EquipSlot.OffHand)) + { + if (DoApplyEquip(slot)) + data.SetItem(slot, DesignData.Item(slot)); + + if (DoApplyStain(slot)) + data.SetStain(slot, DesignData.Stain(slot)); + } + + if (DoApplyHatVisible()) + data.SetHatVisible(DesignData.IsHatVisible()); + + if (DoApplyVisorToggle()) + data.SetVisor(DesignData.IsVisorToggled()); + + if (DoApplyWeaponVisible()) + data.SetWeaponVisible(DesignData.IsWeaponVisible()); + + if (DoApplyWetness()) + data.SetIsWet(DesignData.IsWet()); + return modelChanged || customizeFlags.RequiresRedraw(); + } + #endregion #region Application Data @@ -45,7 +85,8 @@ public class Design : ISavable ApplyHatVisible = 0x01, ApplyVisorState = 0x02, ApplyWeaponVisible = 0x04, - WriteProtected = 0x08, + ApplyWetness = 0x08, + WriteProtected = 0x10, } internal CustomizeFlag ApplyCustomize = CustomizeFlagExtensions.All; @@ -61,6 +102,9 @@ public class Design : ISavable public bool DoApplyWeaponVisible() => _designFlags.HasFlag(DesignFlags.ApplyWeaponVisible); + public bool DoApplyWetness() + => _designFlags.HasFlag(DesignFlags.ApplyWetness); + public bool WriteProtected() => _designFlags.HasFlag(DesignFlags.WriteProtected); @@ -94,6 +138,16 @@ public class Design : ISavable return true; } + public bool SetApplyWetness(bool value) + { + var newFlag = value ? _designFlags | DesignFlags.ApplyWetness : _designFlags & ~DesignFlags.ApplyWetness; + if (newFlag == _designFlags) + return false; + + _designFlags = newFlag; + return true; + } + public bool SetWriteProtected(bool value) { var newFlag = value ? _designFlags | DesignFlags.WriteProtected : _designFlags & ~DesignFlags.WriteProtected; @@ -209,7 +263,12 @@ public class Design : ISavable }; } - ret["IsWet"] = DesignData.IsWet(); + ret["Wetness"] = new JObject() + { + ["Value"] = DesignData.IsWet(), + ["Apply"] = DoApplyWetness(), + }; + return ret; } @@ -368,7 +427,9 @@ public class Design : ISavable design.SetApplyCustomize(idx, apply); } - design.DesignData.SetIsWet(json["IsWet"]?.ToObject() ?? false); + var wetness = QuadBool.FromJObject(json["Wetness"], "Value", "Apply", QuadBool.NullFalse); + design.DesignData.SetIsWet(wetness.ForcedValue); + design.SetApplyWetness(wetness.Enabled); } #endregion @@ -403,6 +464,7 @@ public class Design : ISavable SetApplyHatVisible(applyHat); SetApplyVisorToggle(applyVisor); SetApplyWeaponVisible(applyWeapon); + SetApplyWetness(DesignData.IsWet()); } // diff --git a/Glamourer/Designs/DesignBase64Migration.cs b/Glamourer/Designs/DesignBase64Migration.cs index 763ab7c..58d9f54 100644 --- a/Glamourer/Designs/DesignBase64Migration.cs +++ b/Glamourer/Designs/DesignBase64Migration.cs @@ -25,9 +25,9 @@ public static class DesignBase64Migration byte applicationFlags; ushort equipFlagsS; var bytes = Convert.FromBase64String(base64); - applyHat = false; - applyVisor = false; - applyWeapon = false; + applyHat = false; + applyVisor = false; + applyWeapon = false; var data = new DesignData(); switch (bytes[0]) { diff --git a/Glamourer/State/StateManager.cs b/Glamourer/State/StateManager.cs index e1f76f2..c20b47c 100644 --- a/Glamourer/State/StateManager.cs +++ b/Glamourer/State/StateManager.cs @@ -10,7 +10,7 @@ using Glamourer.Interop; using Glamourer.Interop.Penumbra; using Glamourer.Interop.Structs; using Glamourer.Services; -using OtterGui.Classes; +using Glamourer.Structs; using Penumbra.GameData.Actors; using Penumbra.GameData.Enums; using Penumbra.GameData.Structs; @@ -29,7 +29,6 @@ public class StateManager : IReadOnlyDictionary private readonly Dictionary _states = new(); - public StateManager(ActorService actors, ItemManager items, CustomizationService customizations, VisorService visor, StateChanged @event, PenumbraService penumbra) {