diff --git a/Glamourer/Designs/DesignBase.cs b/Glamourer/Designs/DesignBase.cs index 7602f80..f4e7e28 100644 --- a/Glamourer/Designs/DesignBase.cs +++ b/Glamourer/Designs/DesignBase.cs @@ -33,26 +33,26 @@ public class DesignBase internal DesignBase(CustomizeService customize, in DesignData designData, EquipFlag equipFlags, CustomizeFlag customizeFlags) { - _designData = designData; - ApplyCustomize = customizeFlags & CustomizeFlagExtensions.AllRelevant; - ApplyEquip = equipFlags & EquipFlagExtensions.All; - _designFlags = 0; - CustomizeSet = SetCustomizationSet(customize); + _designData = designData; + ApplyCustomize = customizeFlags & CustomizeFlagExtensions.AllRelevant; + ApplyEquip = equipFlags & EquipFlagExtensions.All; + _designFlags = 0; + CustomizeSet = SetCustomizationSet(customize); } internal DesignBase(DesignBase clone) { - _designData = clone._designData; - CustomizeSet = clone.CustomizeSet; - ApplyCustomize = clone.ApplyCustomizeRaw; - ApplyEquip = clone.ApplyEquip & EquipFlagExtensions.All; - _designFlags = clone._designFlags & (DesignFlags)0x0F; + _designData = clone._designData; + CustomizeSet = clone.CustomizeSet; + ApplyCustomize = clone.ApplyCustomizeRaw; + ApplyEquip = clone.ApplyEquip & EquipFlagExtensions.All; + _designFlags = clone._designFlags & (DesignFlags)0x0F; } /// Ensure that the customization set is updated when the design data changes. internal void SetDesignData(CustomizeService customize, in DesignData other) { - _designData = other; + _designData = other; CustomizeSet = SetCustomizationSet(customize); } @@ -68,8 +68,8 @@ public class DesignBase WriteProtected = 0x10, } - private CustomizeFlag _applyCustomize = CustomizeFlagExtensions.AllRelevant; - public CustomizeSet CustomizeSet { get; private set; } + private CustomizeFlag _applyCustomize = CustomizeFlagExtensions.AllRelevant; + public CustomizeSet CustomizeSet { get; private set; } internal CustomizeFlag ApplyCustomize { @@ -90,7 +90,7 @@ public class DesignBase return false; _designData.Customize = customize; - CustomizeSet = customizeService.Manager.GetSet(customize.Clan, customize.Gender); + CustomizeSet = customizeService.Manager.GetSet(customize.Clan, customize.Gender); return true; } @@ -485,7 +485,7 @@ public class DesignBase design._designData.Customize.Race = race; design._designData.Customize.Clan = clan; design._designData.Customize.Gender = gender; - design.CustomizeSet = design.SetCustomizationSet(customizations); + design.CustomizeSet = design.SetCustomizationSet(customizations); design.SetApplyCustomize(CustomizeIndex.Race, json[CustomizeIndex.Race.ToString()]?["Apply"]?.ToObject() ?? false); design.SetApplyCustomize(CustomizeIndex.Clan, json[CustomizeIndex.Clan.ToString()]?["Apply"]?.ToObject() ?? false); design.SetApplyCustomize(CustomizeIndex.Gender, json[CustomizeIndex.Gender.ToString()]?["Apply"]?.ToObject() ?? false); @@ -495,7 +495,7 @@ public class DesignBase { var tok = json[idx.ToString()]; var data = (CustomizeValue)(tok?["Value"]?.ToObject() ?? 0); - if (set.IsAvailable(idx)) + if (set.IsAvailable(idx) && design._designData.Customize.BodyType == 1) PrintWarning(CustomizeService.ValidateCustomizeValue(set, design._designData.Customize.Face, idx, data, out data, allowUnknown)); var apply = tok?["Apply"]?.ToObject() ?? false; diff --git a/Glamourer/GameData/CustomizeSet.cs b/Glamourer/GameData/CustomizeSet.cs index bc4e7a3..7c98903 100644 --- a/Glamourer/GameData/CustomizeSet.cs +++ b/Glamourer/GameData/CustomizeSet.cs @@ -297,5 +297,5 @@ public static class CustomizationSetExtensions { /// Return only the available customizations in this set and Clan or Gender. public static CustomizeFlag FixApplication(this CustomizeFlag flag, CustomizeSet set) - => flag & (set.SettingAvailable | CustomizeFlag.Clan | CustomizeFlag.Gender); + => flag & (set.SettingAvailable | CustomizeFlag.Clan | CustomizeFlag.Gender | CustomizeFlag.BodyType); } diff --git a/Glamourer/GameData/CustomizeSetFactory.cs b/Glamourer/GameData/CustomizeSetFactory.cs index 22d465b..90cae8d 100644 --- a/Glamourer/GameData/CustomizeSetFactory.cs +++ b/Glamourer/GameData/CustomizeSetFactory.cs @@ -91,7 +91,7 @@ internal class CustomizeSetFactory( var npcCustomizations = new HashSet<(CustomizeIndex, CustomizeValue)>(); _npcCustomizeSet.Awaiter.Wait(); - foreach (var customize in _npcCustomizeSet.Select(s => s.Customize).Where(c => c.Clan == race && c.Gender == gender)) + foreach (var customize in _npcCustomizeSet.Select(s => s.Customize).Where(c => c.Clan == race && c.Gender == gender && c.BodyType.Value == 1)) { foreach (var customizeIndex in customizeIndices) { diff --git a/Glamourer/GameData/NpcCustomizeSet.cs b/Glamourer/GameData/NpcCustomizeSet.cs index de70bd9..bcd6c54 100644 --- a/Glamourer/GameData/NpcCustomizeSet.cs +++ b/Glamourer/GameData/NpcCustomizeSet.cs @@ -256,8 +256,7 @@ public class NpcCustomizeSet : IAsyncDataContainer, IReadOnlyList customize.SetByIndex(24, (CustomizeValue)bnpcCustomize.FacePaint); customize.SetByIndex(25, (CustomizeValue)bnpcCustomize.FacePaintColor); - if (customize.BodyType.Value != 1 - || !CustomizeManager.Races.Contains(customize.Race) + if (!CustomizeManager.Races.Contains(customize.Race) || !CustomizeManager.Clans.Contains(customize.Clan) || !CustomizeManager.Genders.Contains(customize.Gender)) return (false, CustomizeArray.Default); @@ -299,8 +298,7 @@ public class NpcCustomizeSet : IAsyncDataContainer, IReadOnlyList customize.SetByIndex(24, (CustomizeValue)enpcBase.FacePaint); customize.SetByIndex(25, (CustomizeValue)enpcBase.FacePaintColor); - if (customize.BodyType.Value != 1 - || !CustomizeManager.Races.Contains(customize.Race) + if (!CustomizeManager.Races.Contains(customize.Race) || !CustomizeManager.Clans.Contains(customize.Clan) || !CustomizeManager.Genders.Contains(customize.Gender)) return (false, CustomizeArray.Default); diff --git a/Glamourer/Gui/Tabs/DebugTab/DebugTab.cs b/Glamourer/Gui/Tabs/DebugTab/DebugTab.cs index 52c7b53..ffe6945 100644 --- a/Glamourer/Gui/Tabs/DebugTab/DebugTab.cs +++ b/Glamourer/Gui/Tabs/DebugTab/DebugTab.cs @@ -1,20 +1,14 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Numerics; -using Dalamud.Interface.Utility; using ImGuiNET; -using Microsoft.Extensions.DependencyInjection; -using OtterGui; using OtterGui.Raii; +using OtterGui.Services; using OtterGui.Widgets; -using ImGuiClip = Dalamud.Interface.Utility.ImGuiClip; namespace Glamourer.Gui.Tabs.DebugTab; -public unsafe class DebugTab(IServiceProvider _provider) : ITab +public unsafe class DebugTab(ServiceManager manager) : ITab { - private readonly Configuration _config = _provider.GetRequiredService(); + private readonly Configuration _config = manager.GetService(); public bool IsVisible => _config.DebugMode; @@ -24,11 +18,11 @@ public unsafe class DebugTab(IServiceProvider _provider) : ITab private readonly DebugTabHeader[] _headers = [ - DebugTabHeader.CreateInterop(_provider), - DebugTabHeader.CreateGameData(_provider), - DebugTabHeader.CreateDesigns(_provider), - DebugTabHeader.CreateState(_provider), - DebugTabHeader.CreateUnlocks(_provider), + DebugTabHeader.CreateInterop(manager.Provider!), + DebugTabHeader.CreateGameData(manager.Provider!), + DebugTabHeader.CreateDesigns(manager.Provider!), + DebugTabHeader.CreateState(manager.Provider!), + DebugTabHeader.CreateUnlocks(manager.Provider!), ]; public void DrawContent() @@ -37,55 +31,12 @@ public unsafe class DebugTab(IServiceProvider _provider) : ITab if (!child) return; + if (ImGui.CollapsingHeader("General")) + { + manager.Timers.Draw("Timers"); + } + foreach (var header in _headers) header.Draw(); } - - public static void DrawInputModelSet(bool withWeapon, ref int setId, ref int secondaryId, ref int variant) - { - ImGui.SetNextItemWidth(100 * ImGuiHelpers.GlobalScale); - ImGui.InputInt("##SetId", ref setId, 0, 0); - if (withWeapon) - { - ImGui.SameLine(); - ImGui.SetNextItemWidth(100 * ImGuiHelpers.GlobalScale); - ImGui.InputInt("##TypeId", ref secondaryId, 0, 0); - } - - ImGui.SameLine(); - ImGui.SetNextItemWidth(100 * ImGuiHelpers.GlobalScale); - ImGui.InputInt("##Variant", ref variant, 0, 0); - } - - public static void DrawNameTable(string label, ref string filter, IEnumerable<(uint, string)> names) - { - using var _ = ImRaii.PushId(label); - using var tree = ImRaii.TreeNode(label); - if (!tree) - return; - - var resetScroll = ImGui.InputTextWithHint("##filter", "Filter...", ref filter, 256); - var height = ImGui.GetTextLineHeightWithSpacing() + 2 * ImGui.GetStyle().CellPadding.Y; - using var table = ImRaii.Table("##table", 2, ImGuiTableFlags.RowBg | ImGuiTableFlags.ScrollY | ImGuiTableFlags.BordersOuter, - new Vector2(-1, 10 * height)); - if (!table) - return; - - if (resetScroll) - ImGui.SetScrollY(0); - ImGui.TableSetupColumn("1", ImGuiTableColumnFlags.WidthFixed, 50 * ImGuiHelpers.GlobalScale); - ImGui.TableSetupColumn("2", ImGuiTableColumnFlags.WidthStretch); - ImGui.TableNextColumn(); - var skips = ImGuiClip.GetNecessarySkips(height); - ImGui.TableNextColumn(); - var f = filter; - var remainder = ImGuiClip.FilteredClippedDraw(names.Select(p => (p.Item1.ToString("D5"), p.Item2)), skips, - p => p.Item1.Contains(f) || p.Item2.Contains(f, StringComparison.OrdinalIgnoreCase), - p => - { - ImGuiUtil.DrawTableColumn(p.Item1); - ImGuiUtil.DrawTableColumn(p.Item2); - }); - ImGuiClip.DrawEndDummy(remainder, height); - } } diff --git a/Glamourer/Gui/Tabs/DebugTab/DebugTabHeader.cs b/Glamourer/Gui/Tabs/DebugTab/DebugTabHeader.cs index 7c50f4d..b61b4a6 100644 --- a/Glamourer/Gui/Tabs/DebugTab/DebugTabHeader.cs +++ b/Glamourer/Gui/Tabs/DebugTab/DebugTabHeader.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using ImGuiNET; using Microsoft.Extensions.DependencyInjection; using OtterGui.Raii; -using OtterGui.Services; using Penumbra.GameData.Gui.Debug; namespace Glamourer.Gui.Tabs.DebugTab; diff --git a/Glamourer/Gui/Tabs/DebugTab/NpcAppearancePanel.cs b/Glamourer/Gui/Tabs/DebugTab/NpcAppearancePanel.cs index cede0f3..e0c7aa8 100644 --- a/Glamourer/Gui/Tabs/DebugTab/NpcAppearancePanel.cs +++ b/Glamourer/Gui/Tabs/DebugTab/NpcAppearancePanel.cs @@ -17,7 +17,8 @@ using ImGuiClip = OtterGui.ImGuiClip; namespace Glamourer.Gui.Tabs.DebugTab; -public class NpcAppearancePanel(NpcCombo _npcCombo, StateManager _state, ObjectManager _objectManager, DesignConverter _designConverter) : IGameDataDrawer +public class NpcAppearancePanel(NpcCombo _npcCombo, StateManager _state, ObjectManager _objectManager, DesignConverter _designConverter) + : IGameDataDrawer { public string Label => "NPC Appearance"; @@ -25,20 +26,23 @@ public class NpcAppearancePanel(NpcCombo _npcCombo, StateManager _state, ObjectM public bool Disabled => false; - private string _npcFilter = string.Empty; + private string _npcFilter = string.Empty; private bool _customizeOrGear; public void Draw() { ImGui.Checkbox("Compare Customize (or Gear)", ref _customizeOrGear); ImGui.SetNextItemWidth(ImGui.GetContentRegionAvail().X); - ImGui.InputTextWithHint("##npcFilter", "Filter...", ref _npcFilter, 64); + var resetScroll = ImGui.InputTextWithHint("##npcFilter", "Filter...", ref _npcFilter, 64); using var table = ImRaii.Table("npcs", 5, ImGuiTableFlags.RowBg | ImGuiTableFlags.ScrollY | ImGuiTableFlags.SizingFixedFit, new Vector2(-1, 400 * ImGuiHelpers.GlobalScale)); if (!table) return; + if (resetScroll) + ImGui.SetScrollY(0); + ImGui.TableSetupColumn("Button", ImGuiTableColumnFlags.WidthFixed); ImGui.TableSetupColumn("Name", ImGuiTableColumnFlags.WidthFixed, ImGuiHelpers.GlobalScale * 300); ImGui.TableSetupColumn("Kind", ImGuiTableColumnFlags.WidthFixed);