-
Notifications
You must be signed in to change notification settings - Fork 0
/
ResizeUtil.cs
103 lines (90 loc) · 3.27 KB
/
ResizeUtil.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
using System.Collections.Frozen;
using FFXIVClientStructs.FFXIV.Component.GUI;
namespace MinimapMarkerMagnitude;
internal static class ResizeUtil
{
internal static void CompileIconSizes()
{
Services.CompiledSizeOverrides = Services.Config.IconGroups
.Where(x => x.Enabled)
.SelectMany(x => x.GroupIconIds, (group, iconId) => new { iconId, group.GroupScale })
.GroupBy(x => x.iconId)
.ToFrozenDictionary(x => x.First().iconId, x => x.First().GroupScale);
}
internal static unsafe void ResizeIcons(bool reset = false)
{
var unitBase = (AtkUnitBase*)Services.GameGui.GetAddonByName("_NaviMap");
if (unitBase is null || unitBase->UldManager.NodeListCount < 19) return;
var iconNodeList = unitBase->GetNodeById(18)->GetAsAtkComponentNode();
for (var i = 0; i < iconNodeList->Component->UldManager.NodeListCount; i++)
{
var componentNode = iconNodeList->Component->UldManager.NodeList[i]->GetAsAtkComponentNode();
if (componentNode is null) continue;
var collisionNode = componentNode->Component->UldManager.SearchNodeById(7);
var offScreenArrow = componentNode->Component->GetImageNodeById(4);
var iconNode = componentNode->Component->GetImageNodeById(3);
var heightMarkerNode = componentNode->Component->GetImageNodeById(2);
if (collisionNode is null || iconNode is null || heightMarkerNode is null) continue;
var imageNode = iconNode->GetAsAtkImageNode();
if (imageNode is null) continue;
if (GetIconId(imageNode->PartsList->Parts[0].UldAsset) is not { } iconId || iconId == uint.MaxValue)
{
continue;
}
if (reset || IsBannedIcon(iconId))
{
SetScale(collisionNode, iconNode, heightMarkerNode, 1.0f);
continue;
}
if (!componentNode->AtkResNode.IsVisible())
{
continue;
}
if (!Services.SeenIcons.Contains(iconId))
{
if (iconId > 200_000)
{
Services.PluginLog.Warning($"Found iconId {iconId} over 200,000");
}
Services.SeenIcons.Add(iconId);
Services.SeenIcons.Save();
}
if (Services.Config.ResizeOffMapIcons && offScreenArrow is not null)
{
SetScale(collisionNode, iconNode, heightMarkerNode, Services.Config.DefaultOffMapIconScalar * GetIconScale(iconId));
}
else
{
SetScale(collisionNode, iconNode, heightMarkerNode, GetIconScale(iconId));
}
}
}
private static unsafe void SetScale(AtkResNode* collisionNode, AtkResNode* iconNode, AtkResNode* heightMarkerNode, float scale)
{
iconNode->SetScale(scale, scale);
heightMarkerNode->SetScale(scale, scale);
collisionNode->SetScale(scale, scale);
collisionNode->SetPositionFloat((1 - scale) * 16, (1 - scale) * 16);
}
private static unsafe uint? GetIconId(AtkUldAsset* uldAsset)
{
var res = uldAsset->AtkTexture.Resource;
if (res is null) return null;
return res->IconId;
}
internal static bool IsBannedIcon(uint iconId) => iconId switch
{
>= 60409 and <= 60411 => true, // quest search areas
60457 => true, // map transition
>= 60495 and <= 60498 => true, // more quest search areas
60566 => true, // another search area?
_ => false,
};
private static float GetIconScale(uint iconId)
{
if (IsBannedIcon(iconId)) return 1.0f;
return Services.CompiledSizeOverrides.TryGetValue(iconId, out var size)
? size
: Services.Config.DefaultMinimapIconScale;
}
}