From 1a4bacf0b7e97574c01015cb892c9f05895ee734 Mon Sep 17 00:00:00 2001 From: Ottermandias Date: Wed, 11 Jan 2023 12:36:33 +0100 Subject: [PATCH] Add fix for unimplemented but listed hairstyle. --- .../Customization/CustomizationOptions.cs | 11 +- Glamourer.GameData/Util/IconStorage.cs | 114 ++++++++++-------- 2 files changed, 75 insertions(+), 50 deletions(-) diff --git a/Glamourer.GameData/Customization/CustomizationOptions.cs b/Glamourer.GameData/Customization/CustomizationOptions.cs index 0830457..abad5ea 100644 --- a/Glamourer.GameData/Customization/CustomizationOptions.cs +++ b/Glamourer.GameData/Customization/CustomizationOptions.cs @@ -63,9 +63,14 @@ namespace Glamourer.Customization continue; var hairRow = _customizeSheet.GetRow(customizeIdx); - hairList.Add(hairRow != null - ? new Customization(CustomizationId.Hairstyle, hairRow.FeatureID, hairRow.Icon, (ushort) hairRow.RowId) - : new Customization(CustomizationId.Hairstyle, (byte) i, customizeIdx, 0)); + if (hairRow == null) + { + hairList.Add(new Customization(CustomizationId.Hairstyle, (byte)i, customizeIdx)); + } + else if (_icons.IconExists(hairRow.Icon)) + { + hairList.Add(new Customization(CustomizationId.Hairstyle, hairRow.FeatureID, hairRow.Icon, (ushort)hairRow.RowId)); + } } return hairList.ToArray(); diff --git a/Glamourer.GameData/Util/IconStorage.cs b/Glamourer.GameData/Util/IconStorage.cs index 0d6d37e..4199609 100644 --- a/Glamourer.GameData/Util/IconStorage.cs +++ b/Glamourer.GameData/Util/IconStorage.cs @@ -1,59 +1,79 @@ using System; using System.Collections.Generic; using Dalamud.Data; +using Dalamud.Logging; using Dalamud.Plugin; using Dalamud.Utility; using ImGuiScene; using Lumina.Data.Files; -namespace Glamourer.Util +namespace Glamourer.Util; + +public class IconStorage : IDisposable { - public class IconStorage : IDisposable + private readonly DalamudPluginInterface _pi; + private readonly DataManager _gameData; + private readonly Dictionary _icons; + + public IconStorage(DalamudPluginInterface pi, DataManager gameData, int size = 0) { - private readonly DalamudPluginInterface _pi; - private readonly DataManager _gameData; - private readonly Dictionary _icons; - - public IconStorage(DalamudPluginInterface pi, DataManager gameData, int size = 0) - { - _pi = pi; - _gameData = gameData; - _icons = new Dictionary(size); - } - - public TextureWrap this[int id] - => LoadIcon(id); - - private TexFile? LoadIconHq(uint id) - { - var path = $"ui/icon/{id / 1000 * 1000:000000}/{id:000000}_hr1.tex"; - return _gameData.GetFile(path); - } - - public TextureWrap LoadIcon(int id) - => LoadIcon((uint) id); - - public TextureWrap LoadIcon(uint id) - { - if (_icons.TryGetValue(id, out var ret)) - return ret; - - var icon = LoadIconHq(id) ?? _gameData.GetIcon(id)!; - var iconData = icon.GetRgbaImageData(); - - ret = _pi.UiBuilder.LoadImageRaw(iconData, icon.Header.Width, icon.Header.Height, 4); - _icons[id] = ret; - return ret; - } - - public void Dispose() - { - foreach (var icon in _icons.Values) - icon.Dispose(); - _icons.Clear(); - } - - ~IconStorage() - => Dispose(); + _pi = pi; + _gameData = gameData; + _icons = new Dictionary(size); } + + public TextureWrap this[int id] + => LoadIcon(id); + + private static string HqPath(uint id) + => $"ui/icon/{id / 1000 * 1000:000000}/{id:000000}_hr1.tex"; + + private static string NormalPath(uint id) + => $"ui/icon/{id / 1000 * 1000:000000}/{id:000000}.tex"; + + private TexFile? LoadIconHq(uint id) + => _gameData.GetFile(HqPath(id)); + + public bool IconExists(uint id) + => _gameData.FileExists(HqPath(id)) || _gameData.FileExists(NormalPath(id)); + + public TextureWrap LoadIcon(int id) + => LoadIcon((uint)id); + + public TextureWrap LoadIcon(uint id) + { + if (_icons.TryGetValue(id, out var ret)) + return ret; + + var icon = LoadIconHq(id) ?? _gameData.GetIcon(id)!; + if (icon == null) + { + PluginLog.Warning($"No icon with id {id} could be found."); + ret = _pi.UiBuilder.LoadImageRaw(new byte[] + { + 0, + 0, + 0, + 0, + }, 1, 1, 4); + } + else + { + var iconData = icon.GetRgbaImageData(); + ret = _pi.UiBuilder.LoadImageRaw(iconData, icon.Header.Width, icon.Header.Height, 4); + } + + _icons[id] = ret; + return ret; + } + + public void Dispose() + { + foreach (var icon in _icons.Values) + icon.Dispose(); + _icons.Clear(); + } + + ~IconStorage() + => Dispose(); }