Add fix for unimplemented but listed hairstyle.

This commit is contained in:
Ottermandias 2023-01-11 12:36:33 +01:00
parent 9e7c5e9a89
commit 1a4bacf0b7
2 changed files with 75 additions and 50 deletions

View file

@ -63,9 +63,14 @@ namespace Glamourer.Customization
continue; continue;
var hairRow = _customizeSheet.GetRow(customizeIdx); var hairRow = _customizeSheet.GetRow(customizeIdx);
hairList.Add(hairRow != null if (hairRow == null)
? new Customization(CustomizationId.Hairstyle, hairRow.FeatureID, hairRow.Icon, (ushort) hairRow.RowId) {
: new Customization(CustomizationId.Hairstyle, (byte) i, customizeIdx, 0)); 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(); return hairList.ToArray();

View file

@ -1,59 +1,79 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Dalamud.Data; using Dalamud.Data;
using Dalamud.Logging;
using Dalamud.Plugin; using Dalamud.Plugin;
using Dalamud.Utility; using Dalamud.Utility;
using ImGuiScene; using ImGuiScene;
using Lumina.Data.Files; 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<uint, TextureWrap> _icons;
public IconStorage(DalamudPluginInterface pi, DataManager gameData, int size = 0)
{ {
private readonly DalamudPluginInterface _pi; _pi = pi;
private readonly DataManager _gameData; _gameData = gameData;
private readonly Dictionary<uint, TextureWrap> _icons; _icons = new Dictionary<uint, TextureWrap>(size);
public IconStorage(DalamudPluginInterface pi, DataManager gameData, int size = 0)
{
_pi = pi;
_gameData = gameData;
_icons = new Dictionary<uint, TextureWrap>(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<TexFile>(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();
} }
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<TexFile>(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();
} }