From ecdfab0a1980e1cebb7a7f43baa2b5eff00bc491 Mon Sep 17 00:00:00 2001 From: Anna Clemens Date: Mon, 23 Aug 2021 13:20:39 -0400 Subject: [PATCH] refactor: move to net5 --- Quest Map/Commands.cs | 4 +- Quest Map/DalamudPlugin.cs | 20 ---- Quest Map/FodyWeavers.xml | 3 - Quest Map/Node.cs | 6 +- Quest Map/Plugin.cs | 39 +++++-- Quest Map/PluginUi.cs | 106 ++++++++++-------- Quest Map/Quest Map.csproj | 21 ++-- Quest Map/Quest Map.yaml | 5 + Quest Map/QuestData.cs | 4 +- Quest Map/Quests.cs | 18 +-- icon.png | Bin 0 -> 37587 bytes icon.svg | 217 +++++++++++++++++++++++++++++++++++++ 12 files changed, 340 insertions(+), 103 deletions(-) delete mode 100644 Quest Map/DalamudPlugin.cs delete mode 100644 Quest Map/FodyWeavers.xml mode change 100644 => 100755 Quest Map/Quest Map.csproj create mode 100644 icon.png create mode 100755 icon.svg diff --git a/Quest Map/Commands.cs b/Quest Map/Commands.cs index 073a777..bbd9859 100644 --- a/Quest Map/Commands.cs +++ b/Quest Map/Commands.cs @@ -8,13 +8,13 @@ namespace QuestMap { internal Commands(Plugin plugin) { this.Plugin = plugin; - this.Plugin.Interface.CommandManager.AddHandler("/quests", new CommandInfo(this.OnCommand) { + this.Plugin.CommandManager.AddHandler("/quests", new CommandInfo(this.OnCommand) { HelpMessage = "Show Quest Map", }); } public void Dispose() { - this.Plugin.Interface.CommandManager.RemoveHandler("/quests"); + this.Plugin.CommandManager.RemoveHandler("/quests"); } private void OnCommand(string command, string args) { diff --git a/Quest Map/DalamudPlugin.cs b/Quest Map/DalamudPlugin.cs deleted file mode 100644 index 0dfaf40..0000000 --- a/Quest Map/DalamudPlugin.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Dalamud.Plugin; - -namespace QuestMap { - // ReSharper disable once UnusedType.Global - public class DalamudPlugin : IDalamudPlugin { - internal const string PluginName = "Quest Map"; - - public string Name => PluginName; - - private Plugin? Plugin { get; set; } - - public void Initialize(DalamudPluginInterface pluginInterface) { - this.Plugin = new Plugin(pluginInterface); - } - - public void Dispose() { - this.Plugin?.Dispose(); - } - } -} diff --git a/Quest Map/FodyWeavers.xml b/Quest Map/FodyWeavers.xml deleted file mode 100644 index e5727bf..0000000 --- a/Quest Map/FodyWeavers.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Quest Map/Node.cs b/Quest Map/Node.cs index 62606b2..344a24a 100644 --- a/Quest Map/Node.cs +++ b/Quest Map/Node.cs @@ -152,15 +152,15 @@ namespace QuestMap { internal static IEnumerable PreviousQuests(this Quest quest) { if (quest.PreviousQuest0.Row != 0) { - yield return quest.PreviousQuest0.Value; + yield return quest.PreviousQuest0.Value!; } if (quest.PreviousQuest1.Row != 0) { - yield return quest.PreviousQuest1.Value; + yield return quest.PreviousQuest1.Value!; } if (quest.PreviousQuest2.Row != 0) { - yield return quest.PreviousQuest2.Value; + yield return quest.PreviousQuest2.Value!; } } } diff --git a/Quest Map/Plugin.cs b/Quest Map/Plugin.cs index f35b386..8dfbbef 100644 --- a/Quest Map/Plugin.cs +++ b/Quest Map/Plugin.cs @@ -1,21 +1,44 @@ -using System; -using System.Threading.Channels; +using System.Threading.Channels; +using Dalamud.Data; +using Dalamud.Game.ClientState; +using Dalamud.Game.Command; +using Dalamud.Game.Gui; +using Dalamud.Game.Text.SeStringHandling; +using Dalamud.IoC; using Dalamud.Plugin; -using Microsoft.Msagl.Core.Layout; using XivCommon; namespace QuestMap { - internal class Plugin : IDisposable { - internal DalamudPluginInterface Interface { get; } + // ReSharper disable once ClassNeverInstantiated.Global + internal class Plugin : IDalamudPlugin { + public string Name => "Quest Map"; + + [PluginService] + internal DalamudPluginInterface Interface { get; init; } = null!; + + [PluginService] + internal ClientState ClientState { get; init; } = null!; + + [PluginService] + internal CommandManager CommandManager { get; init; } = null!; + + [PluginService] + internal DataManager DataManager { get; init; } = null!; + + [PluginService] + internal GameGui GameGui { get; init; } = null!; + + [PluginService] + internal SeStringManager SeStringManager { get; init; } = null!; + internal XivCommonBase Common { get; } internal Configuration Config { get; } internal Quests Quests { get; } internal PluginUi Ui { get; } private Commands Commands { get; } - internal Plugin(DalamudPluginInterface pluginInterface) { - this.Interface = pluginInterface; - this.Common = new XivCommonBase(pluginInterface); + public Plugin() { + this.Common = new XivCommonBase(); this.Config = this.Interface.GetPluginConfig() as Configuration ?? new Configuration(); var graphChannel = Channel.CreateUnbounded(); diff --git a/Quest Map/PluginUi.cs b/Quest Map/PluginUi.cs index 3159c6d..a3da52a 100644 --- a/Quest Map/PluginUi.cs +++ b/Quest Map/PluginUi.cs @@ -60,20 +60,20 @@ namespace QuestMap { this.Refilter(); - this.Plugin.Interface.UiBuilder.OnBuildUi += this.Draw; - this.Plugin.Interface.UiBuilder.OnOpenConfigUi += this.OpenConfig; + this.Plugin.Interface.UiBuilder.Draw += this.Draw; + this.Plugin.Interface.UiBuilder.OpenConfigUi += this.OpenConfig; } public void Dispose() { - this.Plugin.Interface.UiBuilder.OnOpenConfigUi -= this.OpenConfig; - this.Plugin.Interface.UiBuilder.OnBuildUi -= this.Draw; + this.Plugin.Interface.UiBuilder.OpenConfigUi -= this.OpenConfig; + this.Plugin.Interface.UiBuilder.Draw -= this.Draw; foreach (var icon in this.Icons.Values) { icon.Dispose(); } } - private void OpenConfig(object sender, EventArgs e) { + private void OpenConfig() { this.Show = true; } @@ -81,7 +81,7 @@ namespace QuestMap { this.FilteredQuests.Clear(); var filterLower = this._filter.ToLowerInvariant(); - var filtered = this.Plugin.Interface.Data.GetExcelSheet() + var filtered = this.Plugin.DataManager.GetExcelSheet()! .Where(quest => { if (quest.Name.ToString().Length == 0) { return false; @@ -198,7 +198,7 @@ namespace QuestMap { ImGui.SetNextWindowSize(new Vector2(675, 600), ImGuiCond.FirstUseEver); - if (!ImGui.Begin(DalamudPlugin.PluginName, ref this.Show, ImGuiWindowFlags.MenuBar)) { + if (!ImGui.Begin(this.Plugin.Name, ref this.Show, ImGuiWindowFlags.MenuBar)) { ImGui.End(); return; } @@ -357,7 +357,7 @@ namespace QuestMap { var remove = 0u; foreach (var id in this.InfoWindows) { - var quest = this.Plugin.Interface.Data.GetExcelSheet().GetRow(id); + var quest = this.Plugin.DataManager.GetExcelSheet()!.GetRow(id); if (quest == null) { continue; } @@ -393,13 +393,15 @@ namespace QuestMap { ImGui.PopFont(); } - TextureWrap GetIcon(uint id) { + TextureWrap? GetIcon(uint id) { if (this.Icons.TryGetValue(id, out var wrap)) { return wrap; } - wrap = this.Plugin.Interface.Data.GetImGuiTextureIcon(this.Plugin.Interface.ClientState.ClientLanguage, (int) id); - this.Icons[id] = wrap; + wrap = this.Plugin.DataManager.GetImGuiTextureIcon(this.Plugin.ClientState.ClientLanguage, id); + if (wrap != null) { + this.Icons[id] = wrap; + } return wrap; } @@ -408,13 +410,19 @@ namespace QuestMap { if (quest.Icon != 0) { var header = GetIcon(quest.Icon); - textWrap = header.Width; - ImGui.Image(header.ImGuiHandle, new Vector2(header.Width, header.Height)); + if (header != null) { + textWrap = header.Width; + ImGui.Image(header.ImGuiHandle, new Vector2(header.Width, header.Height)); + } } var rewards = new List(); - var paramGrow = this.Plugin.Interface.Data.GetExcelSheet().GetRow(quest.ClassJobLevel0); - var xp = quest.ExpFactor * paramGrow.ScaledQuestXP * paramGrow.QuestExpModifier / 100; + var paramGrow = this.Plugin.DataManager.GetExcelSheet()!.GetRow(quest.ClassJobLevel0); + var xp = 0; + if (paramGrow != null) { + xp = quest.ExpFactor * paramGrow.ScaledQuestXP * paramGrow.QuestExpModifier / 100; + } + if (xp > 0) { rewards.Add($"Exp: {xp:N0}"); } @@ -437,17 +445,23 @@ namespace QuestMap { ImGui.TextUnformatted(label); - var maxHeight = items.Select(entry => GetIcon(entry.icon)).Max(image => image.Height); + var maxHeight = items + .Select(entry => GetIcon(entry.icon)) + .Where(image => image != null) + .Max(image => image!.Height); var originalY = ImGui.GetCursorPosY(); foreach (var (name, icon, qty) in items) { var image = GetIcon(icon); - if (image.Height < maxHeight) { - ImGui.SetCursorPosY(originalY + (maxHeight - image.Height) / 2f); + if (image != null) { + if (image.Height < maxHeight) { + ImGui.SetCursorPosY(originalY + (maxHeight - image.Height) / 2f); + } + + ImGui.Image(image.ImGuiHandle, new Vector2(image.Width, image.Height)); + Util.Tooltip(name.ToString()); } - ImGui.Image(image.ImGuiHandle, new Vector2(image.Width, image.Height)); - Util.Tooltip(name.ToString()); if (qty > 1) { var oldSpacing = ImGui.GetStyle().ItemSpacing; ImGui.GetStyle().ItemSpacing = new Vector2(2, 0); @@ -478,12 +492,12 @@ namespace QuestMap { var amount = quest.ItemCountCatalyst[i]; if (catalyst.Row != 0) { - additionalRewards.Add((this.Convert(catalyst.Value.Name), catalyst.Value.Icon, amount)); + additionalRewards.Add((this.Convert(catalyst.Value!.Name), catalyst.Value.Icon, amount)); } } foreach (var generalAction in quest.GeneralActionReward.Where(row => row.Row != 0)) { - additionalRewards.Add((this.Convert(generalAction.Value.Name), (uint) generalAction.Value.Icon, 1)); + additionalRewards.Add((this.Convert(generalAction.Value!.Name), (uint) generalAction.Value.Icon, 1)); } if (this.Plugin.Quests.ActionRewards.TryGetValue(quest.RowId, out var action)) { @@ -495,7 +509,7 @@ namespace QuestMap { } if (quest.OtherReward.Row != 0) { - additionalRewards.Add((this.Convert(quest.OtherReward.Value.Name), quest.OtherReward.Value.Icon, 1)); + additionalRewards.Add((this.Convert(quest.OtherReward.Value!.Name), quest.OtherReward.Value.Icon, 1)); } if (quest.ReputationReward > 0) { @@ -506,7 +520,7 @@ namespace QuestMap { } if (quest.TomestoneReward > 0) { - var tomestone = this.Plugin.Interface.Data.GetExcelSheet().First(row => row.Tomestones.Row == quest.TomestoneReward); + var tomestone = this.Plugin.DataManager.GetExcelSheet()!.FirstOrDefault(row => row.Tomestones.Row == quest.TomestoneReward); var item = tomestone?.Item?.Value; if (item != null) { additionalRewards.Add((this.Convert(item.Name), item.Icon, quest.TomestoneCountReward)); @@ -519,9 +533,9 @@ namespace QuestMap { quest.ItemReward0 .Zip(quest.ItemCountReward0, (id, qty) => (id, qty)) .Where(entry => entry.id != 0) - .Select(entry => (item: this.Plugin.Interface.Data.GetExcelSheet().GetRow(entry.id), entry.qty)) + .Select(entry => (item: this.Plugin.DataManager.GetExcelSheet()!.GetRow(entry.id), entry.qty)) .Where(entry => entry.item != null) - .Select(entry => (this.Convert(entry.item.Name), (uint) entry.item.Icon, entry.qty)) + .Select(entry => (this.Convert(entry.item!.Name), (uint) entry.item.Icon, entry.qty)) .Concat(additionalRewards) ); @@ -532,7 +546,7 @@ namespace QuestMap { .Where(entry => entry.row.Row != 0) .Select(entry => (item: entry.row.Value, entry.qty)) .Where(entry => entry.item != null) - .Select(entry => (this.Convert(entry.item.Name), (uint) entry.item.Icon, entry.qty)) + .Select(entry => (this.Convert(entry.item!.Name), (uint) entry.item.Icon, entry.qty)) ); } @@ -543,8 +557,10 @@ namespace QuestMap { var icon = instance.ContentType.Value?.Icon ?? 0; if (icon > 0) { var image = GetIcon(icon); - ImGui.Image(image.ImGuiHandle, new Vector2(image.Width, image.Height)); - Util.Tooltip(this.Convert(instance.Name).ToString()); + if (image != null) { + ImGui.Image(image.ImGuiHandle, new Vector2(image.Width, image.Height)); + Util.Tooltip(this.Convert(instance.Name).ToString()); + } } else { ImGui.TextUnformatted(this.Convert(instance.Name).ToString()); } @@ -557,34 +573,37 @@ namespace QuestMap { ImGui.TextUnformatted("Beast tribe"); var image = GetIcon(tribe.Icon); - ImGui.Image(image.ImGuiHandle, new Vector2(image.Width, image.Height)); - Util.Tooltip(this.Convert(tribe.Name).ToString()); + if (image != null) { + ImGui.Image(image.ImGuiHandle, new Vector2(image.Width, image.Height)); + Util.Tooltip(this.Convert(tribe.Name).ToString()); + } ImGui.Separator(); } var id = quest.RowId & 0xFFFF; - var lang = this.Plugin.Interface.ClientState.ClientLanguage switch { + var lang = this.Plugin.ClientState.ClientLanguage switch { ClientLanguage.English => Language.English, ClientLanguage.Japanese => Language.Japanese, ClientLanguage.German => Language.German, ClientLanguage.French => Language.French, _ => Language.English, }; - var path = $"quest/{id.ToString("00000").Substring(0, 3)}/{quest.Id.RawString.ToLowerInvariant()}"; + var path = $"quest/{id.ToString("00000")[..3]}/{quest.Id.RawString.ToLowerInvariant()}"; // FIXME: this is gross, but lumina caches incorrectly - this.Plugin.Interface.Data.Excel.RemoveSheetFromCache(); - var sheet = this.Plugin.Interface.Data.Excel.GetType() - .GetMethod("GetSheet", BindingFlags.Instance | BindingFlags.NonPublic) - ?.MakeGenericMethod(typeof(QuestData)) + this.Plugin.DataManager.Excel.RemoveSheetFromCache(); + var sheet = this.Plugin.DataManager.Excel.GetType() + .GetMethod("GetSheet", BindingFlags.Instance | BindingFlags.NonPublic)? // ReSharper disable once ConstantConditionalAccessQualifier - ?.Invoke(this.Plugin.Interface.Data.Excel, new object?[] { + .MakeGenericMethod(typeof(QuestData))? + // ReSharper disable once ConstantConditionalAccessQualifier + .Invoke(this.Plugin.DataManager.Excel, new object?[] { path, lang, null, }) as ExcelSheet; // default to english if reflection failed - sheet ??= this.Plugin.Interface.Data.Excel.GetSheet(path); + sheet ??= this.Plugin.DataManager.Excel.GetSheet(path); var firstData = sheet?.GetRow(0); if (firstData != null) { ImGui.PushTextWrapPos(textWrap); @@ -600,18 +619,17 @@ namespace QuestMap { } var mapLink = new MapLinkPayload( - this.Plugin.Interface.Data, level.Territory.Row, level.Map.Row, (int) (level.X * 1_000f), (int) (level.Z * 1_000f) ); - this.Plugin.Interface.Framework.Gui.OpenMapWithMapLink(mapLink); + this.Plugin.GameGui.OpenMapWithMapLink(mapLink); } - var issuer = this.Plugin.Interface.Data.GetExcelSheet().GetRow(quest.IssuerStart)?.Singular ?? "Unknown"; - var target = this.Plugin.Interface.Data.GetExcelSheet().GetRow(quest.TargetEnd)?.Singular ?? "Unknown"; + var issuer = this.Plugin.DataManager.GetExcelSheet()!.GetRow(quest.IssuerStart)?.Singular ?? "Unknown"; + var target = this.Plugin.DataManager.GetExcelSheet()!.GetRow(quest.TargetEnd)?.Singular ?? "Unknown"; ImGui.TextUnformatted(issuer); ImGui.PushFont(UiBuilder.IconFont); ImGui.SameLine(); @@ -877,7 +895,7 @@ namespace QuestMap { private static readonly byte[] NewLinePayload = { 0x02, 0x10, 0x01, 0x03 }; private SeString Convert(Lumina.Text.SeString lumina) { - var se = this.Plugin.Interface.SeStringManager.Parse(lumina.RawData.ToArray()); + var se = this.Plugin.SeStringManager.Parse(lumina.RawData.ToArray()); for (var i = 0; i < se.Payloads.Count; i++) { switch (se.Payloads[i].Type) { case PayloadType.Unknown: diff --git a/Quest Map/Quest Map.csproj b/Quest Map/Quest Map.csproj old mode 100644 new mode 100755 index 4c9758c..f77a4f5 --- a/Quest Map/Quest Map.csproj +++ b/Quest Map/Quest Map.csproj @@ -1,12 +1,14 @@ - net48 + net5-windows QuestMap 1.3.0 enable latest true + true + false @@ -30,22 +32,17 @@ $(AppData)\XIVLauncher\addon\Hooks\dev\Lumina.Excel.dll False - - $(AppData)\XIVLauncher\addon\Hooks\dev\System.Memory.dll - False - - - D:\code\XivCommon\XivCommon\bin\Release\net48\XivCommon.dll - - - - + - + + + + + diff --git a/Quest Map/Quest Map.yaml b/Quest Map/Quest Map.yaml index b4b7313..e2da8fd 100644 --- a/Quest Map/Quest Map.yaml +++ b/Quest Map/Quest Map.yaml @@ -1,5 +1,6 @@ name: Quest Map author: ascclemens +punchline: Explore quests and their rewards. description: |- Explore quests and their rewards. - Search for quest names or their rewards, including instances, @@ -7,3 +8,7 @@ description: |- - See an interactive map of quest requirements and unlocks. - Open a quest info window even for quests you haven't completed. - Open quest starting locations on the map or open quests in the journal. + + Icons: treasure map by Anthony Ledoux from the Noun Project and + locked book by Anthony Ledoux from the Noun Project +repo_url: https://git.sr.ht/~jkcclemens/QuestMap diff --git a/Quest Map/QuestData.cs b/Quest Map/QuestData.cs index 1719fc0..c6ea11b 100644 --- a/Quest Map/QuestData.cs +++ b/Quest Map/QuestData.cs @@ -17,8 +17,8 @@ namespace QuestMap { public override void PopulateData(RowParser parser, GameData gameData, Language language) { base.PopulateData(parser, gameData, language); - this.Id = parser.ReadColumn(0); - this.Text = parser.ReadColumn(1); + this.Id = parser.ReadColumn(0)!; + this.Text = parser.ReadColumn(1)!; } } } diff --git a/Quest Map/Quests.cs b/Quest Map/Quests.cs index 6edd1f7..c2fd1cc 100644 --- a/Quest Map/Quests.cs +++ b/Quest Map/Quests.cs @@ -41,7 +41,7 @@ namespace QuestMap { var linkedInstances = new HashSet(); var allQuests = new Dictionary(); - foreach (var quest in this.Plugin.Interface.Data.GetExcelSheet()) { + foreach (var quest in this.Plugin.DataManager.GetExcelSheet()!) { if (quest.Name.RawString.Length == 0 || quest.RowId == 65536) { continue; } @@ -49,11 +49,11 @@ namespace QuestMap { allQuests[quest.RowId] = quest; if (quest.EmoteReward.Row != 0) { - emoteRewards[quest.RowId] = quest.EmoteReward.Value; + emoteRewards[quest.RowId] = quest.EmoteReward.Value!; } foreach (var row in quest.ItemReward0.Where(item => item != 0)) { - var item = this.Plugin.Interface.Data.GetExcelSheet().GetRow(row); + var item = this.Plugin.DataManager.GetExcelSheet()!.GetRow(row); if (item == null) { continue; } @@ -80,11 +80,11 @@ namespace QuestMap { itemRewards[quest.RowId] = rewards; } - rewards.Add(item); + rewards.Add(item!); } if (quest.ActionReward.Row != 0) { - actionRewards[quest.RowId] = quest.ActionReward.Value; + actionRewards[quest.RowId] = quest.ActionReward.Value!; } var instances = this.InstanceUnlocks(quest, linkedInstances); @@ -96,7 +96,7 @@ namespace QuestMap { } if (quest.BeastTribe.Row != 0 && !quest.IsRepeatable && quest.BeastReputationRank.Row == 0) { - beastRewards[quest.RowId] = quest.BeastTribe.Value; + beastRewards[quest.RowId] = quest.BeastTribe.Value!; } var jobReward = this.JobUnlocks(quest); @@ -259,7 +259,7 @@ namespace QuestMap { var unlocks = new HashSet(); if (quest.InstanceContentUnlock.Row != 0) { - var cfc = this.Plugin.Interface.Data.GetExcelSheet().FirstOrDefault(cfc => cfc.Content == quest.InstanceContentUnlock.Row && cfc.ContentLinkType == 1); + var cfc = this.Plugin.DataManager.GetExcelSheet()!.FirstOrDefault(cfc => cfc.Content == quest.InstanceContentUnlock.Row && cfc.ContentLinkType == 1); if (cfc != null && cfc.UnlockQuest.Row == 0) { unlocks.Add(cfc); } @@ -274,7 +274,7 @@ namespace QuestMap { // var content = this.Plugin.Interface.Data.GetExcelSheet().GetRow(key); - var cfc = this.Plugin.Interface.Data.GetExcelSheet().FirstOrDefault(cfc => cfc.Content == key && cfc.ContentLinkType == 1); + var cfc = this.Plugin.DataManager.GetExcelSheet()!.FirstOrDefault(cfc => cfc.Content == key && cfc.ContentLinkType == 1); if (cfc == null || cfc.UnlockQuest.Row != 0 || others.Contains(cfc)) { continue; } @@ -306,7 +306,7 @@ namespace QuestMap { .arg; return jobId == 0 ? null - : this.Plugin.Interface.Data.GetExcelSheet().GetRow(jobId); + : this.Plugin.DataManager.GetExcelSheet()!.GetRow(jobId); } } } diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf4f3c58f08d14265fec4429178893c1fb99e23 GIT binary patch literal 37587 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 literal 0 HcmV?d00001 diff --git a/icon.svg b/icon.svg new file mode 100755 index 0000000..6282ff8 --- /dev/null +++ b/icon.svg @@ -0,0 +1,217 @@ + + + + + Magic set RTE + + + + Magic set RTE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +